├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug.yml │ ├── config.yml │ └── feature.yml ├── dependabot.yml ├── pull_request_template.md └── workflows │ ├── check.yml │ ├── code-coverage-test.yml │ ├── pgxn-release.yml │ ├── postgresql-12-build.yml │ ├── postgresql-12-pgdg-package.yml │ ├── postgresql-12-pmm.yaml │ ├── postgresql-12-ppg-package.yml │ ├── postgresql-13-build.yml │ ├── postgresql-13-pgdg-package.yml │ ├── postgresql-13-pmm.yaml │ ├── postgresql-13-ppg-package.yml │ ├── postgresql-14-build.yml │ ├── postgresql-14-pgdg-package.yml │ ├── postgresql-14-pmm.yaml │ ├── postgresql-14-ppg-package.yml │ ├── postgresql-15-build.yml │ ├── postgresql-15-pgdg-package.yml │ ├── postgresql-15-pmm.yaml │ ├── postgresql-15-ppg-package.yml │ ├── postgresql-16-build.yml │ ├── postgresql-16-pgdg-package.yml │ ├── postgresql-16-ppg-package.yml │ ├── postgresql-17-build.yml │ ├── postgresql-17-pgdg-package.yml │ └── scorecard.yml ├── .gitignore ├── .licenserc.yaml ├── CONTRIBUTING.md ├── LICENSE ├── META.json ├── Makefile ├── README.md ├── SECURITY.md ├── code-of-conduct.md ├── debian ├── changelog ├── compat ├── control ├── control.in ├── copyright ├── pgversions ├── rules └── source │ ├── format │ └── lintian-overrides ├── guc.c ├── hash_query.c ├── meson.build ├── percona-packaging └── scripts │ └── pg_stat_monitor_builder.sh ├── pg_stat_monitor--1.0--2.0.sql ├── pg_stat_monitor--2.0--2.1.sql ├── pg_stat_monitor--2.0.sql ├── pg_stat_monitor.c ├── pg_stat_monitor.conf ├── pg_stat_monitor.control ├── pg_stat_monitor.h ├── regression ├── expected │ ├── application_name.out │ ├── application_name_unique.out │ ├── application_name_unique_1.out │ ├── basic.out │ ├── cmd_type.out │ ├── cmd_type_1.out │ ├── counters.out │ ├── database.out │ ├── different_parent_queries.out │ ├── error.out │ ├── error_1.out │ ├── error_2.out │ ├── error_insert.out │ ├── error_insert_1.out │ ├── functions.out │ ├── functions_1.out │ ├── guc.out │ ├── guc_1.out │ ├── guc_2.out │ ├── histogram.out │ ├── histogram_1.out │ ├── histogram_2.out │ ├── level_tracking.out │ ├── level_tracking_1.out │ ├── level_tracking_2.out │ ├── pgsm_query_id.out │ ├── pgsm_query_id_1.out │ ├── relations.out │ ├── relations_1.out │ ├── rows.out │ ├── tags.out │ ├── top_query.out │ ├── top_query_1.out │ ├── user.out │ └── version.out └── sql │ ├── application_name.sql │ ├── application_name_unique.sql │ ├── basic.sql │ ├── cmd_type.sql │ ├── counters.sql │ ├── database.sql │ ├── different_parent_queries.sql │ ├── error.sql │ ├── error_insert.sql │ ├── functions.sql │ ├── guc.sql │ ├── histogram.sql │ ├── level_tracking.sql │ ├── pgsm_query_id.sql │ ├── relations.sql │ ├── rows.sql │ ├── state.sql │ ├── tags.sql │ ├── top_query.sql │ ├── user.sql │ └── version.sql ├── rpm └── pg-stat-monitor.spec ├── scripts ├── data_1.sql └── data_2.sql ├── t ├── 001_settings_default.pl ├── 002_settings_pgsm_track_planning.pl ├── 003_settings_pgms_extract_comments.pl ├── 004_settings_pgsm_track.pl ├── 005_settings_pgsm_enable_query_plan.pl ├── 006_settings_pgsm_overflow_target.pl ├── 007_settings_pgsm_query_shared_buffer.pl ├── 008_settings_pgsm_histogram_buckets.pl ├── 009_settings_pgsm_histogram_max.pl ├── 010_settings_pgsm_histogram_min.pl ├── 011_settings_pgsm_bucket_time.pl ├── 012_settings_pgsm_max_buckets.pl ├── 013_settings_pgsm_normalized_query.pl ├── 014_settings_pgsm_track_utility.pl ├── 015_settings_pgsm_query_max_len.pl ├── 016_settings_pgsm_max.pl ├── 017_execution_stats.pl ├── 018_column_names.pl ├── 019_insufficient_shared_space.pl ├── 020_buffer_overflow.pl ├── 021_misc_1.pl ├── 022_misc_2.pl ├── 023_missing_queries.pl ├── 024_check_timings.pl ├── 025_compare_pgss.pl ├── 026_shared_blocks.pl ├── 027_local_blocks.pl ├── 028_temp_block.pl ├── 029_bucket_done.pl ├── 030_histogram.pl ├── 031_query_stat.pl ├── 032_multiple_extensions.pl ├── 033_stats_since.pl ├── expected │ ├── 001_settings_default.out │ ├── 001_settings_default.out.12 │ ├── 003_settings_pgms_extract_comments.out │ ├── 004_settings_pgsm_track.out │ ├── 005_settings_pgsm_enable_query_plan.out │ ├── 006_settings_pgsm_overflow_target.out │ ├── 007_settings_pgsm_query_shared_buffer.out │ ├── 007_settings_pgsm_query_shared_buffer.out.15 │ ├── 007_settings_pgsm_query_shared_buffer.out.16 │ ├── 007_settings_pgsm_query_shared_buffer.out.17 │ ├── 008_settings_pgsm_histogram_buckets.out │ ├── 009_settings_pgsm_histogram_max.out │ ├── 010_settings_pgsm_histogram_min.out │ ├── 011_settings_pgsm_bucket_time.out │ ├── 012_settings_pgsm_max_buckets.out │ ├── 013_settings_pgsm_normalized_query.out │ ├── 014_settings_pgsm_track_utility.out │ ├── 015_settings_pgsm_query_max_len.out │ ├── 016_settings_pgsm_max.out │ └── 031_query_stat.out └── pgsm.pm └── typedefs.list /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners 2 | # Order is important; the last matching pattern takes the most precedence. 3 | 4 | * @artemgavrilov @dutow 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: File a bug report 3 | labels: ["bug"] 4 | assignees: 5 | - artemgavrilov 6 | - dutow 7 | 8 | body: 9 | - type: markdown 10 | attributes: 11 | value: | 12 | Thanks for taking the time to fill out this bug report! Please provide as much information as possible, it will help us to address this problem faster. 13 | - type: textarea 14 | id: description 15 | attributes: 16 | label: Description 17 | description: Please describe the problem. 18 | validations: 19 | required: true 20 | - type: textarea 21 | id: expected 22 | attributes: 23 | label: Expected Results 24 | description: What did you expect to happen? 25 | validations: 26 | required: true 27 | - type: textarea 28 | id: actual 29 | attributes: 30 | label: Actual Results 31 | description: What actually happened? 32 | validations: 33 | required: true 34 | - type: textarea 35 | id: version 36 | attributes: 37 | label: Version 38 | description: What version of PostgreSQL and pg_stat_monitor are you running? 39 | placeholder: PostgreSQL 16.2, pg_stat_monitor v2.0.4 40 | validations: 41 | required: true 42 | - type: textarea 43 | id: steps 44 | attributes: 45 | label: Steps to reproduce 46 | description: Which steps do we need to take to reproduce this error? 47 | - type: textarea 48 | id: logs 49 | attributes: 50 | label: Relevant logs 51 | description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. 52 | render: Shell 53 | - type: checkboxes 54 | id: terms 55 | attributes: 56 | label: Code of Conduct 57 | description: By submitting this issue, you agree to follow [Percona Community Code of Conduct](https://github.com/percona/community/blob/main/content/contribute/coc.md) 58 | options: 59 | - label: I agree to follow Percona Community Code of Conduct 60 | required: true 61 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Forum 4 | url: https://forums.percona.com/ 5 | about: Please join our forums for general questions ans discussions. 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Suggest an idea for this project 3 | labels: ["feature"] 4 | assignees: 5 | - artemgavrilov 6 | - dutow 7 | 8 | body: 9 | - type: markdown 10 | attributes: 11 | value: | 12 | Thank you for suggesting an idea to make pg_stat_monitor better! Please complete the below form to ensure we have all the details to get things started. 13 | - type: textarea 14 | id: description 15 | attributes: 16 | label: Description 17 | description: Description of the feature and of the problem it solves. 18 | validations: 19 | required: true 20 | - type: textarea 21 | id: solution 22 | attributes: 23 | label: Suggested solution 24 | description: A concise description of your preferred solution. 25 | - type: textarea 26 | id: context 27 | attributes: 28 | label: Additional context 29 | description: Any information that may help. 30 | - type: checkboxes 31 | id: terms 32 | attributes: 33 | label: Code of Conduct 34 | description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/percona/community/blob/main/content/contribute/coc.md) 35 | options: 36 | - label: I agree to follow this project's Code of Conduct 37 | required: true 38 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: 2 3 | updates: 4 | - package-ecosystem: "github-actions" 5 | directory: "/" 6 | schedule: 7 | interval: "weekly" 8 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | PG-0 2 | 3 | ### Description 4 | 5 | 6 | 7 | ### Links 8 | 9 | 10 | -------------------------------------------------------------------------------- /.github/workflows/check.yml: -------------------------------------------------------------------------------- 1 | name: Checks 2 | on: 3 | pull_request: 4 | 5 | jobs: 6 | cppcheck: 7 | name: Cppcheck 8 | runs-on: ubuntu-22.04 9 | timeout-minutes: 5 10 | 11 | steps: 12 | - name: Checkout sources 13 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 14 | with: 15 | path: src/pg_stat_monitor 16 | 17 | - name: Checkout cppcheck sources 18 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 19 | with: 20 | repository: "danmar/cppcheck" 21 | ref: "2.13.4" 22 | path: src/cppcheck 23 | 24 | - name: Build and install cppcheck 25 | working-directory: src/cppcheck 26 | run: | 27 | mkdir build 28 | cd build 29 | cmake .. 30 | cmake --build . 31 | sudo cmake --install . 32 | 33 | - name: Execute linter check with cppcheck 34 | working-directory: src/pg_stat_monitor 35 | run: | 36 | set -x 37 | cppcheck --enable=all --inline-suppr --template='{file}:{line},{severity},{id},{message}' --error-exitcode=1 --suppress=missingIncludeSystem --suppress=missingInclude --suppress=unmatchedSuppression:pg_stat_monitor.c --check-config . 38 | 39 | format: 40 | name: Format 41 | runs-on: ubuntu-22.04 42 | timeout-minutes: 5 43 | 44 | steps: 45 | - name: Clone postgres repository 46 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 47 | with: 48 | repository: 'postgres/postgres' 49 | ref: 'REL_17_STABLE' 50 | 51 | - name: Checkout sources 52 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 53 | with: 54 | path: 'contrib/pg_stat_monitor' 55 | 56 | - name: Configure postgres 57 | run: ./configure 58 | 59 | - name: Install perltidy 60 | run: sudo cpan -T SHANCOCK/Perl-Tidy-20230309.tar.gz 61 | 62 | - name: Install pg_bsd_indent 63 | working-directory: src/tools/pg_bsd_indent 64 | run: sudo make install 65 | 66 | - name: Add pg_bsd_indent and pgindent to path 67 | run: | 68 | echo "/usr/local/pgsql/bin" >> $GITHUB_PATH 69 | echo "${{ github.workspace }}/src/tools/pgindent" >> $GITHUB_PATH 70 | 71 | - name: Format sources 72 | working-directory: contrib/pg_stat_monitor 73 | run: | 74 | make update-typedefs 75 | make indent 76 | 77 | - name: Check files are formatted and no source code changes 78 | working-directory: contrib/pg_stat_monitor 79 | run: | 80 | git status 81 | git diff --exit-code 82 | 83 | license: 84 | name: License 85 | runs-on: ubuntu-22.04 86 | timeout-minutes: 5 87 | 88 | steps: 89 | - name: Checkout sources 90 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 91 | 92 | - name: Check license headers 93 | uses: apache/skywalking-eyes/header@5c5b974209f0de5d905f37deb69369068ebfc15c # v0.7.0 94 | with: 95 | token: "" # Prevent comments 96 | -------------------------------------------------------------------------------- /.github/workflows/pgxn-release.yml: -------------------------------------------------------------------------------- 1 | name: PGXN 2 | on: 3 | workflow_dispatch: 4 | inputs: 5 | version: 6 | description: 'Version to release' 7 | required: true 8 | type: string 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | release: 15 | name: Release 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 10 18 | container: pgxn/pgxn-tools 19 | steps: 20 | - name: Validate version tag 21 | run: '[[ ${{ inputs.version }} =~ ^[0-9]+.[0-9]+.[0-9]+ ]]' 22 | shell: bash 23 | 24 | - name: Check out 25 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 26 | with: 27 | ref: '${{ inputs.version }}' 28 | 29 | - name: Bundle 30 | id: bundle 31 | run: pgxn-bundle 32 | 33 | - name: Upload 34 | env: 35 | PGXN_USERNAME: percona 36 | PGXN_PASSWORD: ${{ secrets.PGXN_PERCONA }} 37 | run: pgxn-release 38 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-12-pgdg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-12-pgdg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-12-pgdg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | 19 | steps: 20 | - name: Clone pg_stat_monitor repository 21 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 22 | with: 23 | path: 'src/pg_stat_monitor' 24 | 25 | - name: Delete old postgresql files 26 | run: | 27 | sudo apt-get update 28 | sudo apt purge postgresql-client-common postgresql-common \ 29 | postgresql postgresql* 30 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev \ 31 | zlib1g-dev libssl-dev libpam0g-dev python3-dev bison flex \ 32 | libipc-run-perl wget -y 33 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 34 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 35 | /etc/postgresql 36 | sudo rm -f /usr/bin/pg_config 37 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 38 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 39 | 40 | - name: Install PG Distribution Postgresql 12 41 | run: | 42 | sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt \ 43 | $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' 44 | sudo wget --quiet -O - \ 45 | https://www.postgresql.org/media/keys/ACCC4CF8.asc | 46 | sudo apt-key add - 47 | sudo apt-get -y update 48 | sudo apt-get -y install postgresql-12 postgresql-server-dev-12 49 | 50 | - name: Change src owner to postgres 51 | run: | 52 | sudo chmod o+rx ~ 53 | sudo chown -R postgres:postgres src 54 | 55 | - name: Build pg_stat_monitor 56 | run: | 57 | sudo -u postgres bash -c 'make USE_PGXS=1' 58 | sudo make USE_PGXS=1 install 59 | working-directory: src/pg_stat_monitor 60 | 61 | - name: Start pg_stat_monitor_tests 62 | run: | 63 | sudo service postgresql stop 64 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 65 | sudo tee -a /etc/postgresql/12/main/postgresql.conf 66 | sudo service postgresql start 67 | sudo psql -V 68 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 69 | echo $PG_TEST_PORT_DIR 70 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 71 | working-directory: src/pg_stat_monitor 72 | 73 | - name: Change dir permissions on fail 74 | if: ${{ failure() }} 75 | run: | 76 | sudo chmod -R ugo+rwx t 77 | sudo chmod -R ugo+rwx tmp_check 78 | exit 2 # regenerate error so that we can upload files in next step 79 | working-directory: src/pg_stat_monitor 80 | 81 | - name: Upload logs on fail 82 | if: ${{ failure() }} 83 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 84 | with: 85 | name: Regressions diff and postgresql log 86 | path: | 87 | src/pg_stat_monitor/regression.diffs 88 | src/pg_stat_monitor/regression.out 89 | src/pg_stat_monitor/logfile 90 | src/pg_stat_monitor/t/results/ 91 | src/pg_stat_monitor/tmp_check/log/ 92 | !src/pg_stat_monitor/tmp_check/**/archives/* 93 | !src/pg_stat_monitor/tmp_check/**/backup/* 94 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 95 | !src/pg_stat_monitor/tmp_check/**/archives/ 96 | !src/pg_stat_monitor/tmp_check/**/backup/ 97 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 98 | if-no-files-found: warn 99 | retention-days: 3 100 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-12-pmm.yaml: -------------------------------------------------------------------------------- 1 | name: postgresql-12-pmm-integration 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-12-pgsm-pmm-integration-test 16 | runs-on: ubuntu-latest 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone QA Integration repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | repository: 'Percona-Lab/qa-integration' 23 | ref: 'main' 24 | 25 | # print branch and Repo name 26 | - name: Get branch and Repo Name 27 | run: echo 'The branch and Repo Name is' ${{ github.head_ref }} ${{ github.actor }}/pg_stat_monitor 28 | 29 | - name: "Set TARGET_BRANCH variable for a PR run" 30 | if: github.event_name == 'pull_request' 31 | run: echo "TARGET_BRANCH=${{ github.event.pull_request.base.ref }}" >> $GITHUB_ENV 32 | 33 | - name: "Set TARGET_BRANCH variable for a PUSH run" 34 | if: github.event_name == 'push' 35 | run: echo "TARGET_BRANCH=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV 36 | 37 | - name: Run PMM & PGSM Setup, E2E Tests 38 | run: bash -xe ./pmm_pgsm_setup/pmm_pgsm_setup.sh --pgsql-version=12 --pgstat-monitor-branch=${{ env.TARGET_BRANCH }} 39 | 40 | - name: Get PMM-Agent Logs from the Container 41 | if: success() || failure() # run this step even if previous step failed 42 | run: docker exec pgsql_pgsm_12 cat pmm-agent.log > ./pmm-ui-tests/tests/output/pmm-agent.log 43 | 44 | - name: Upload Tests Artifacts 45 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 46 | if: success() || failure() # run this step even if previous step failed 47 | with: 48 | name: tests-artifact 49 | path: ./pmm-ui-tests/tests/output/ 50 | if-no-files-found: ignore # 'warn' or 'ignore' are also available, defaults to `warn` 51 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-13-pgdg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-13-pgdg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-13-pgdg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev \ 30 | zlib1g-dev libssl-dev libpam0g-dev python3-dev bison flex \ 31 | libipc-run-perl wget -y 32 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 33 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 34 | /etc/postgresql 35 | sudo rm -f /usr/bin/pg_config 36 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 37 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 38 | 39 | - name: Install PG Distribution Postgresql 13 40 | run: | 41 | sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt \ 42 | $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' 43 | sudo wget --quiet -O - \ 44 | https://www.postgresql.org/media/keys/ACCC4CF8.asc | 45 | sudo apt-key add - 46 | sudo apt update 47 | sudo apt -y install postgresql-13 postgresql-server-dev-13 48 | 49 | - name: Change src owner to postgres 50 | run: | 51 | sudo chmod o+rx ~ 52 | sudo chown -R postgres:postgres src 53 | 54 | - name: Build pg_stat_monitor 55 | run: | 56 | sudo -u postgres bash -c 'make USE_PGXS=1' 57 | sudo make USE_PGXS=1 install 58 | working-directory: src/pg_stat_monitor 59 | 60 | - name: Start pg_stat_monitor_tests 61 | run: | 62 | sudo service postgresql stop 63 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 64 | sudo tee -a /etc/postgresql/13/main/postgresql.conf 65 | sudo service postgresql start 66 | sudo psql -V 67 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 68 | echo $PG_TEST_PORT_DIR 69 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 70 | working-directory: src/pg_stat_monitor 71 | 72 | - name: Change dir permissions on fail 73 | if: ${{ failure() }} 74 | run: | 75 | sudo chmod -R ugo+rwx t 76 | sudo chmod -R ugo+rwx tmp_check 77 | exit 2 # regenerate error so that we can upload files in next step 78 | working-directory: src/pg_stat_monitor 79 | 80 | - name: Upload logs on fail 81 | if: ${{ failure() }} 82 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 83 | with: 84 | name: Regressions diff and postgresql log 85 | path: | 86 | src/pg_stat_monitor/regression.diffs 87 | src/pg_stat_monitor/regression.out 88 | src/pg_stat_monitor/logfile 89 | src/pg_stat_monitor/t/results/ 90 | src/pg_stat_monitor/tmp_check/log/ 91 | !src/pg_stat_monitor/tmp_check/**/archives/* 92 | !src/pg_stat_monitor/tmp_check/**/backup/* 93 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 94 | !src/pg_stat_monitor/tmp_check/**/archives/ 95 | !src/pg_stat_monitor/tmp_check/**/backup/ 96 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 97 | if-no-files-found: warn 98 | retention-days: 3 99 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-13-pmm.yaml: -------------------------------------------------------------------------------- 1 | name: postgresql-13-pmm-integration 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-13-pgsm-pmm-integration-test 16 | runs-on: ubuntu-latest 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone QA Integration repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | repository: 'Percona-Lab/qa-integration' 23 | ref: 'main' 24 | 25 | # print branch and Repo name 26 | - name: Get branch and Repo Name 27 | run: echo 'The branch and Repo Name is' ${{ github.head_ref }} ${{ github.actor }}/pg_stat_monitor 28 | 29 | - name: "Set TARGET_BRANCH variable for a PR run" 30 | if: github.event_name == 'pull_request' 31 | run: echo "TARGET_BRANCH=${{ github.event.pull_request.base.ref }}" >> $GITHUB_ENV 32 | 33 | - name: "Set TARGET_BRANCH variable for a PUSH run" 34 | if: github.event_name == 'push' 35 | run: echo "TARGET_BRANCH=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV 36 | 37 | - name: Run PMM & PGSM Setup, E2E Tests 38 | run: bash -xe ./pmm_pgsm_setup/pmm_pgsm_setup.sh --pgsql-version=13 --pgstat-monitor-branch=${{ env.TARGET_BRANCH }} 39 | 40 | - name: Get PMM-Agent Logs from the Container 41 | if: success() || failure() # run this step even if previous step failed 42 | run: docker exec pgsql_pgsm_13 cat pmm-agent.log > ./pmm-ui-tests/tests/output/pmm-agent.log 43 | 44 | - name: Upload Tests Artifacts 45 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 46 | if: success() || failure() # run this step even if previous step failed 47 | with: 48 | name: tests-artifact 49 | path: ./pmm-ui-tests/tests/output/ 50 | if-no-files-found: ignore # 'warn' or 'ignore' are also available, defaults to `warn` 51 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-13-ppg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-13-ppg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-13-ppg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev \ 30 | zlib1g-dev libssl-dev libpam0g-dev python3-dev bison flex \ 31 | libipc-run-perl wget 32 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 33 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 34 | /etc/postgresql 35 | sudo rm -f /usr/bin/pg_config 36 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 37 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 38 | 39 | - name: Install percona-release script 40 | run: | 41 | sudo apt-get -y update 42 | sudo apt-get -y upgrade 43 | sudo apt-get install -y wget gnupg2 curl lsb-release 44 | sudo wget \ 45 | https://repo.percona.com/apt/percona-release_latest.generic_all.deb 46 | sudo dpkg -i percona-release_latest.generic_all.deb 47 | 48 | - name: Install Percona Distribution Postgresql 13 & Extensions 49 | run: | 50 | sudo percona-release setup ppg-13 51 | sudo apt-get update -y 52 | sudo apt-get install -y percona-postgresql-13 \ 53 | percona-postgresql-contrib percona-postgresql-server-dev-all \ 54 | percona-pgpool2 libpgpool2 percona-postgresql-13-pgaudit \ 55 | percona-postgresql-13-pgaudit-dbgsym percona-postgresql-13-repack \ 56 | percona-postgresql-13-repack-dbgsym percona-pgaudit13-set-user \ 57 | percona-pgaudit13-set-user-dbgsym percona-postgresql-13-postgis-3 \ 58 | percona-postgresql-13-postgis-3-scripts \ 59 | percona-postgresql-postgis-scripts percona-postgresql-postgis \ 60 | percona-postgis 61 | 62 | - name: Change src owner to postgres 63 | run: | 64 | sudo chmod o+rx ~ 65 | sudo chown -R postgres:postgres src 66 | 67 | - name: Build pg_stat_monitor 68 | run: | 69 | sudo -u postgres bash -c 'make USE_PGXS=1' 70 | sudo make USE_PGXS=1 install 71 | working-directory: src/pg_stat_monitor 72 | 73 | - name: Start pg_stat_monitor_tests 74 | run: | 75 | sudo service postgresql stop 76 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 77 | sudo tee -a /etc/postgresql/13/main/postgresql.conf 78 | sudo service postgresql start 79 | sudo psql -V 80 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 81 | echo $PG_TEST_PORT_DIR 82 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 83 | working-directory: src/pg_stat_monitor 84 | 85 | - name: Change dir permissions on fail 86 | if: ${{ failure() }} 87 | run: | 88 | sudo chmod -R ugo+rwx t 89 | sudo chmod -R ugo+rwx tmp_check 90 | exit 2 # regenerate error so that we can upload files in next step 91 | working-directory: src/pg_stat_monitor 92 | 93 | - name: Upload logs on fail 94 | if: ${{ failure() }} 95 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 96 | with: 97 | name: Regressions diff and postgresql log 98 | path: | 99 | src/pg_stat_monitor/regression.diffs 100 | src/pg_stat_monitor/regression.out 101 | src/pg_stat_monitor/logfile 102 | src/pg_stat_monitor/t/results/ 103 | src/pg_stat_monitor/tmp_check/log/ 104 | !src/pg_stat_monitor/tmp_check/**/archives/* 105 | !src/pg_stat_monitor/tmp_check/**/backup/* 106 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 107 | !src/pg_stat_monitor/tmp_check/**/archives/ 108 | !src/pg_stat_monitor/tmp_check/**/backup/ 109 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 110 | if-no-files-found: warn 111 | retention-days: 3 112 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-14-pgdg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-14-pgdg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-14-pgdg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev wget \ 30 | zlib1g-dev libssl-dev libpam0g-dev bison flex libipc-run-perl 31 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 32 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 33 | /etc/postgresql 34 | sudo rm -f /usr/bin/pg_config 35 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 36 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 37 | 38 | - name: Install PG Distribution Postgresql 14 39 | run: | 40 | sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt \ 41 | $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' 42 | sudo wget --quiet -O - \ 43 | https://www.postgresql.org/media/keys/ACCC4CF8.asc | 44 | sudo apt-key add - 45 | sudo apt update 46 | sudo apt -y install postgresql-14 postgresql-server-dev-14 47 | 48 | - name: Change src owner to postgres 49 | run: | 50 | sudo chmod o+rx ~ 51 | sudo chown -R postgres:postgres src 52 | 53 | - name: Build pg_stat_monitor 54 | run: | 55 | sudo -u postgres bash -c 'make USE_PGXS=1' 56 | sudo make USE_PGXS=1 install 57 | working-directory: src/pg_stat_monitor 58 | 59 | - name: Start pg_stat_monitor_tests 60 | run: | 61 | sudo service postgresql stop 62 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 63 | sudo tee -a /etc/postgresql/14/main/postgresql.conf 64 | sudo service postgresql start 65 | sudo psql -V 66 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 67 | echo $PG_TEST_PORT_DIR 68 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 69 | working-directory: src/pg_stat_monitor 70 | 71 | - name: Change dir permissions on fail 72 | if: ${{ failure() }} 73 | run: | 74 | sudo chmod -R ugo+rwx t 75 | sudo chmod -R ugo+rwx tmp_check 76 | exit 2 # regenerate error so that we can upload files in next step 77 | working-directory: src/pg_stat_monitor 78 | 79 | - name: Upload logs on fail 80 | if: ${{ failure() }} 81 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 82 | with: 83 | name: Regressions diff and postgresql log 84 | path: | 85 | src/pg_stat_monitor/regression.diffs 86 | src/pg_stat_monitor/regression.out 87 | src/pg_stat_monitor/logfile 88 | src/pg_stat_monitor/t/results/ 89 | src/pg_stat_monitor/tmp_check/log/ 90 | !src/pg_stat_monitor/tmp_check/**/archives/* 91 | !src/pg_stat_monitor/tmp_check/**/backup/* 92 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 93 | !src/pg_stat_monitor/tmp_check/**/archives/ 94 | !src/pg_stat_monitor/tmp_check/**/backup/ 95 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 96 | if-no-files-found: warn 97 | retention-days: 3 98 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-14-pmm.yaml: -------------------------------------------------------------------------------- 1 | name: postgresql-14-pmm-integration 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-14-pgsm-pmm-integration-test 16 | runs-on: ubuntu-latest 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone QA Integration repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | repository: 'Percona-Lab/qa-integration' 23 | ref: 'main' 24 | 25 | # print branch and Repo name 26 | - name: Get branch and Repo Name 27 | run: echo 'The branch and Repo Name is' ${{ github.head_ref }} ${{ github.actor }}/pg_stat_monitor 28 | 29 | - name: "Set TARGET_BRANCH variable for a PR run" 30 | if: github.event_name == 'pull_request' 31 | run: echo "TARGET_BRANCH=${{ github.event.pull_request.base.ref }}" >> $GITHUB_ENV 32 | 33 | - name: "Set TARGET_BRANCH variable for a PUSH run" 34 | if: github.event_name == 'push' 35 | run: echo "TARGET_BRANCH=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV 36 | 37 | - name: Run PMM & PGSM Setup, E2E Tests 38 | run: bash -xe ./pmm_pgsm_setup/pmm_pgsm_setup.sh --pgsql-version=14 --pgstat-monitor-branch=${{ env.TARGET_BRANCH }} 39 | 40 | - name: Get PMM-Agent Logs from the Container 41 | if: success() || failure() # run this step even if previous step failed 42 | run: docker exec pgsql_pgsm_14 cat pmm-agent.log > ./pmm-ui-tests/tests/output/pmm-agent.log 43 | 44 | - name: Upload Tests Artifacts 45 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 46 | if: success() || failure() # run this step even if previous step failed 47 | with: 48 | name: tests-artifact 49 | path: ./pmm-ui-tests/tests/output/ 50 | if-no-files-found: ignore # 'warn' or 'ignore' are also available, defaults to `warn` 51 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-14-ppg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-14-ppg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-14-ppg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev \ 30 | zlib1g-dev libssl-dev libpam0g-dev python3-dev bison flex \ 31 | libipc-run-perl wget 32 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 33 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 34 | /etc/postgresql 35 | sudo rm -f /usr/bin/pg_config 36 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 37 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 38 | 39 | - name: Install percona-release script 40 | run: | 41 | sudo apt-get -y update 42 | sudo apt-get -y upgrade 43 | sudo apt-get install -y wget gnupg2 curl lsb-release 44 | sudo wget \ 45 | https://repo.percona.com/apt/percona-release_latest.generic_all.deb 46 | sudo dpkg -i percona-release_latest.generic_all.deb 47 | 48 | - name: Install Percona Distribution Postgresql 14 & Extensions 49 | run: | 50 | sudo percona-release setup ppg-14 51 | sudo apt-get update -y 52 | sudo apt-get install -y percona-postgresql-14 \ 53 | percona-postgresql-contrib percona-postgresql-server-dev-all \ 54 | percona-pgpool2 libpgpool2 percona-postgresql-14-pgaudit \ 55 | percona-postgresql-14-pgaudit-dbgsym percona-postgresql-14-repack \ 56 | percona-postgresql-14-repack-dbgsym percona-pgaudit14-set-user \ 57 | percona-pgaudit14-set-user-dbgsym percona-postgresql-14-postgis-3 \ 58 | percona-postgresql-14-postgis-3-scripts \ 59 | percona-postgresql-postgis-scripts percona-postgresql-postgis \ 60 | percona-postgis 61 | 62 | - name: Change src owner to postgres 63 | run: | 64 | sudo chmod o+rx ~ 65 | sudo chown -R postgres:postgres src 66 | 67 | - name: Build pg_stat_monitor 68 | run: | 69 | sudo -u postgres bash -c 'make USE_PGXS=1' 70 | sudo make USE_PGXS=1 install 71 | working-directory: src/pg_stat_monitor 72 | 73 | - name: Start pg_stat_monitor_tests 74 | run: | 75 | sudo service postgresql stop 76 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 77 | sudo tee -a /etc/postgresql/14/main/postgresql.conf 78 | sudo service postgresql start 79 | sudo psql -V 80 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 81 | echo $PG_TEST_PORT_DIR 82 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 83 | working-directory: src/pg_stat_monitor 84 | 85 | - name: Change dir permissions on fail 86 | if: ${{ failure() }} 87 | run: | 88 | sudo chmod -R ugo+rwx t 89 | sudo chmod -R ugo+rwx tmp_check 90 | exit 2 # regenerate error so that we can upload files in next step 91 | working-directory: src/pg_stat_monitor 92 | 93 | - name: Upload logs on fail 94 | if: ${{ failure() }} 95 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 96 | with: 97 | name: Regressions diff and postgresql log 98 | path: | 99 | src/pg_stat_monitor/regression.diffs 100 | src/pg_stat_monitor/regression.out 101 | src/pg_stat_monitor/logfile 102 | src/pg_stat_monitor/t/results/ 103 | src/pg_stat_monitor/tmp_check/log/ 104 | !src/pg_stat_monitor/tmp_check/**/archives/* 105 | !src/pg_stat_monitor/tmp_check/**/backup/* 106 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 107 | !src/pg_stat_monitor/tmp_check/**/archives/ 108 | !src/pg_stat_monitor/tmp_check/**/backup/ 109 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 110 | if-no-files-found: warn 111 | retention-days: 3 112 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-15-pgdg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-15-pgdg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-15-pgdg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev wget \ 30 | zlib1g-dev libssl-dev libpam0g-dev bison flex libipc-run-perl 31 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 32 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 33 | /etc/postgresql 34 | sudo rm -f /usr/bin/pg_config 35 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 36 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 37 | 38 | - name: Install PG Distribution Postgresql 15 39 | run: | 40 | sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt \ 41 | $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' 42 | sudo wget --quiet -O - \ 43 | https://www.postgresql.org/media/keys/ACCC4CF8.asc | 44 | sudo apt-key add - 45 | sudo apt update 46 | sudo apt -y install postgresql-15 postgresql-server-dev-15 47 | 48 | - name: Change src owner to postgres 49 | run: | 50 | sudo chmod o+rx ~ 51 | sudo chown -R postgres:postgres src 52 | 53 | - name: Build pg_stat_monitor 54 | run: | 55 | sudo -u postgres bash -c 'make USE_PGXS=1' 56 | sudo make USE_PGXS=1 install 57 | working-directory: src/pg_stat_monitor 58 | 59 | - name: Start pg_stat_monitor_tests 60 | run: | 61 | sudo service postgresql stop 62 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 63 | sudo tee -a /etc/postgresql/15/main/postgresql.conf 64 | sudo service postgresql start 65 | sudo psql -V 66 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 67 | echo $PG_TEST_PORT_DIR 68 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 69 | working-directory: src/pg_stat_monitor 70 | 71 | - name: Change dir permissions on fail 72 | if: ${{ failure() }} 73 | run: | 74 | sudo chmod -R ugo+rwx t 75 | sudo chmod -R ugo+rwx tmp_check 76 | exit 2 # regenerate error so that we can upload files in next step 77 | working-directory: src/pg_stat_monitor 78 | 79 | - name: Upload logs on fail 80 | if: ${{ failure() }} 81 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 82 | with: 83 | name: Regressions diff and postgresql log 84 | path: | 85 | src/pg_stat_monitor/regression.diffs 86 | src/pg_stat_monitor/regression.out 87 | src/pg_stat_monitor/logfile 88 | src/pg_stat_monitor/t/results/ 89 | src/pg_stat_monitor/tmp_check/log/ 90 | !src/pg_stat_monitor/tmp_check/**/archives/* 91 | !src/pg_stat_monitor/tmp_check/**/backup/* 92 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 93 | !src/pg_stat_monitor/tmp_check/**/archives/ 94 | !src/pg_stat_monitor/tmp_check/**/backup/ 95 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 96 | if-no-files-found: warn 97 | retention-days: 3 98 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-15-pmm.yaml: -------------------------------------------------------------------------------- 1 | name: postgresql-15-pmm-integration 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-15-pgsm-pmm-integration-test 16 | runs-on: ubuntu-latest 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone QA Integration repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | repository: 'Percona-Lab/qa-integration' 23 | ref: 'main' 24 | 25 | # print branch and Repo name 26 | - name: Get branch and Repo Name 27 | run: echo 'The branch and Repo Name is' ${{ github.head_ref }} ${{ github.actor }}/pg_stat_monitor 28 | 29 | - name: "Set TARGET_BRANCH variable for a PR run" 30 | if: github.event_name == 'pull_request' 31 | run: echo "TARGET_BRANCH=${{ github.event.pull_request.base.ref }}" >> $GITHUB_ENV 32 | 33 | - name: "Set TARGET_BRANCH variable for a PUSH run" 34 | if: github.event_name == 'push' 35 | run: echo "TARGET_BRANCH=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV 36 | 37 | - name: Run PMM & PGSM Setup, E2E Tests 38 | run: bash -xe ./pmm_pgsm_setup/pmm_pgsm_setup.sh --pgsql-version=15 --pgstat-monitor-branch=${{ env.TARGET_BRANCH }} 39 | 40 | - name: Get PMM-Agent Logs from the Container 41 | if: success() || failure() # run this step even if previous step failed 42 | run: docker exec pgsql_pgsm_15 cat pmm-agent.log > ./pmm-ui-tests/tests/output/pmm-agent.log 43 | 44 | - name: Upload Tests Artifacts 45 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 46 | if: success() || failure() # run this step even if previous step failed 47 | with: 48 | name: tests-artifact 49 | path: ./pmm-ui-tests/tests/output/ 50 | if-no-files-found: ignore # 'warn' or 'ignore' are also available, defaults to `warn` 51 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-15-ppg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-15-ppg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-15-ppg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev \ 30 | zlib1g-dev libssl-dev libpam0g-dev python3-dev bison flex \ 31 | libipc-run-perl wget 32 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 33 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 34 | /etc/postgresql 35 | sudo rm -f /usr/bin/pg_config 36 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 37 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 38 | 39 | - name: Install percona-release script 40 | run: | 41 | sudo apt-get -y update 42 | sudo apt-get -y upgrade 43 | sudo apt-get install -y wget gnupg2 curl lsb-release 44 | sudo wget \ 45 | https://repo.percona.com/apt/percona-release_latest.generic_all.deb 46 | sudo dpkg -i percona-release_latest.generic_all.deb 47 | 48 | - name: Install Percona Distribution Postgresql 15 & Extensions 49 | run: | 50 | sudo percona-release setup ppg-15 51 | sudo apt-get update -y 52 | sudo apt-get install -y percona-postgresql-15 \ 53 | percona-postgresql-contrib percona-postgresql-server-dev-all \ 54 | percona-pgpool2 libpgpool2 percona-postgresql-15-pgaudit \ 55 | percona-postgresql-15-pgaudit-dbgsym percona-postgresql-15-repack \ 56 | percona-postgresql-15-repack-dbgsym percona-pgaudit15-set-user \ 57 | percona-pgaudit15-set-user-dbgsym percona-postgresql-15-postgis-3 \ 58 | percona-postgresql-15-postgis-3-scripts \ 59 | percona-postgresql-postgis-scripts percona-postgresql-postgis \ 60 | percona-postgis 61 | 62 | - name: Change src owner to postgres 63 | run: | 64 | sudo chmod o+rx ~ 65 | sudo chown -R postgres:postgres src 66 | 67 | - name: Build pg_stat_monitor 68 | run: | 69 | sudo -u postgres bash -c 'make USE_PGXS=1' 70 | sudo make USE_PGXS=1 install 71 | working-directory: src/pg_stat_monitor 72 | 73 | - name: Start pg_stat_monitor_tests 74 | run: | 75 | sudo service postgresql stop 76 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 77 | sudo tee -a /etc/postgresql/15/main/postgresql.conf 78 | sudo service postgresql start 79 | sudo psql -V 80 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 81 | echo $PG_TEST_PORT_DIR 82 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 83 | working-directory: src/pg_stat_monitor 84 | 85 | - name: Change dir permissions on fail 86 | if: ${{ failure() }} 87 | run: | 88 | sudo chmod -R ugo+rwx t 89 | sudo chmod -R ugo+rwx tmp_check 90 | exit 2 # regenerate error so that we can upload files in next step 91 | working-directory: src/pg_stat_monitor 92 | 93 | - name: Upload logs on fail 94 | if: ${{ failure() }} 95 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 96 | with: 97 | name: Regressions diff and postgresql log 98 | path: | 99 | src/pg_stat_monitor/regression.diffs 100 | src/pg_stat_monitor/regression.out 101 | src/pg_stat_monitor/logfile 102 | src/pg_stat_monitor/t/results/ 103 | src/pg_stat_monitor/tmp_check/log/ 104 | !src/pg_stat_monitor/tmp_check/**/archives/* 105 | !src/pg_stat_monitor/tmp_check/**/backup/* 106 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 107 | !src/pg_stat_monitor/tmp_check/**/archives/ 108 | !src/pg_stat_monitor/tmp_check/**/backup/ 109 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 110 | if-no-files-found: warn 111 | retention-days: 3 112 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-16-pgdg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-16-pgdg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-16-pgdg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev wget \ 30 | zlib1g-dev libssl-dev libpam0g-dev bison flex libipc-run-perl 31 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 32 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 33 | /etc/postgresql 34 | sudo rm -f /usr/bin/pg_config 35 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 36 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 37 | 38 | - name: Install PG Distribution Postgresql 16 39 | run: | 40 | sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt \ 41 | $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' 42 | sudo wget --quiet -O - \ 43 | https://www.postgresql.org/media/keys/ACCC4CF8.asc | 44 | sudo apt-key add - 45 | sudo apt update 46 | sudo apt -y install postgresql-16 postgresql-server-dev-16 47 | 48 | - name: Change src owner to postgres 49 | run: | 50 | sudo chmod o+rx ~ 51 | sudo chown -R postgres:postgres src 52 | 53 | - name: Build pg_stat_monitor 54 | run: | 55 | sudo -u postgres bash -c 'make USE_PGXS=1' 56 | sudo make USE_PGXS=1 install 57 | working-directory: src/pg_stat_monitor 58 | 59 | - name: Start pg_stat_monitor_tests 60 | run: | 61 | sudo service postgresql stop 62 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 63 | sudo tee -a /etc/postgresql/16/main/postgresql.conf 64 | sudo service postgresql start 65 | sudo psql -V 66 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 67 | echo $PG_TEST_PORT_DIR 68 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 69 | working-directory: src/pg_stat_monitor 70 | 71 | - name: Change dir permissions on fail 72 | if: ${{ failure() }} 73 | run: | 74 | sudo chmod -R ugo+rwx t 75 | sudo chmod -R ugo+rwx tmp_check 76 | exit 2 # regenerate error so that we can upload files in next step 77 | working-directory: src/pg_stat_monitor 78 | 79 | - name: Upload logs on fail 80 | if: ${{ failure() }} 81 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 82 | with: 83 | name: Regressions diff and postgresql log 84 | path: | 85 | src/pg_stat_monitor/regression.diffs 86 | src/pg_stat_monitor/regression.out 87 | src/pg_stat_monitor/logfile 88 | src/pg_stat_monitor/t/results/ 89 | src/pg_stat_monitor/tmp_check/log/ 90 | !src/pg_stat_monitor/tmp_check/**/archives/* 91 | !src/pg_stat_monitor/tmp_check/**/backup/* 92 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 93 | !src/pg_stat_monitor/tmp_check/**/archives/ 94 | !src/pg_stat_monitor/tmp_check/**/backup/ 95 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 96 | if-no-files-found: warn 97 | retention-days: 3 98 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-16-ppg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-16-ppg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-16-ppg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev \ 30 | zlib1g-dev libssl-dev libpam0g-dev python3-dev bison flex \ 31 | libipc-run-perl wget 32 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 33 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 34 | /etc/postgresql 35 | sudo rm -f /usr/bin/pg_config 36 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 37 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 38 | 39 | - name: Install percona-release script 40 | run: | 41 | sudo apt-get -y update 42 | sudo apt-get -y upgrade 43 | sudo apt-get install -y wget gnupg2 curl lsb-release 44 | sudo wget \ 45 | https://repo.percona.com/apt/percona-release_latest.generic_all.deb 46 | sudo dpkg -i percona-release_latest.generic_all.deb 47 | 48 | - name: Install Percona Distribution Postgresql 16 & Extensions 49 | run: | 50 | sudo percona-release setup ppg-16 51 | sudo apt-get update -y 52 | sudo apt-get install -y percona-postgresql-16 \ 53 | percona-postgresql-contrib percona-postgresql-server-dev-all \ 54 | percona-pgpool2 libpgpool2 percona-postgresql-16-pgaudit \ 55 | percona-postgresql-16-pgaudit-dbgsym percona-postgresql-16-repack \ 56 | percona-postgresql-16-repack-dbgsym percona-pgaudit16-set-user \ 57 | percona-pgaudit16-set-user-dbgsym percona-postgresql-16-postgis-3 \ 58 | percona-postgresql-16-postgis-3-scripts \ 59 | percona-postgresql-postgis-scripts percona-postgresql-postgis \ 60 | percona-postgis 61 | 62 | - name: Change src owner to postgres 63 | run: | 64 | sudo chmod o+rx ~ 65 | sudo chown -R postgres:postgres src 66 | 67 | - name: Build pg_stat_monitor 68 | run: | 69 | sudo -u postgres bash -c 'make USE_PGXS=1' 70 | sudo make USE_PGXS=1 install 71 | working-directory: src/pg_stat_monitor 72 | 73 | - name: Start pg_stat_monitor_tests 74 | run: | 75 | sudo service postgresql stop 76 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 77 | sudo tee -a /etc/postgresql/16/main/postgresql.conf 78 | sudo service postgresql start 79 | sudo psql -V 80 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 81 | echo $PG_TEST_PORT_DIR 82 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 83 | working-directory: src/pg_stat_monitor 84 | 85 | - name: Change dir permissions on fail 86 | if: ${{ failure() }} 87 | run: | 88 | sudo chmod -R ugo+rwx t 89 | sudo chmod -R ugo+rwx tmp_check 90 | exit 2 # regenerate error so that we can upload files in next step 91 | working-directory: src/pg_stat_monitor 92 | 93 | - name: Upload logs on fail 94 | if: ${{ failure() }} 95 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 96 | with: 97 | name: Regressions diff and postgresql log 98 | path: | 99 | src/pg_stat_monitor/regression.diffs 100 | src/pg_stat_monitor/regression.out 101 | src/pg_stat_monitor/logfile 102 | src/pg_stat_monitor/t/results/ 103 | src/pg_stat_monitor/tmp_check/log/ 104 | !src/pg_stat_monitor/tmp_check/**/archives/* 105 | !src/pg_stat_monitor/tmp_check/**/backup/* 106 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 107 | !src/pg_stat_monitor/tmp_check/**/archives/ 108 | !src/pg_stat_monitor/tmp_check/**/backup/ 109 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 110 | if-no-files-found: warn 111 | retention-days: 3 112 | -------------------------------------------------------------------------------- /.github/workflows/postgresql-17-pgdg-package.yml: -------------------------------------------------------------------------------- 1 | name: postgresql-17-pgdg-package 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - '[0-9]+.[0-9]+.[0-9]+*' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | name: pg-17-pgdg-package-test 16 | runs-on: ubuntu-22.04 17 | timeout-minutes: 30 18 | steps: 19 | - name: Clone pg_stat_monitor repository 20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 21 | with: 22 | path: 'src/pg_stat_monitor' 23 | 24 | - name: Delete old postgresql files 25 | run: | 26 | sudo apt-get update 27 | sudo apt purge postgresql-client-common postgresql-common \ 28 | postgresql postgresql* 29 | sudo apt-get install -y libreadline6-dev systemtap-sdt-dev wget \ 30 | zlib1g-dev libssl-dev libpam0g-dev bison flex libipc-run-perl 31 | sudo rm -rf /var/lib/postgresql /var/log/postgresql /etc/postgresql \ 32 | /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql \ 33 | /etc/postgresql 34 | sudo rm -f /usr/bin/pg_config 35 | sudo /usr/bin/perl -MCPAN -e 'install IPC::Run' 36 | sudo /usr/bin/perl -MCPAN -e 'install Text::Trim' 37 | 38 | - name: Install PG Distribution Postgresql 17 39 | run: | 40 | sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt \ 41 | $(lsb_release -cs)-pgdg main 17" > /etc/apt/sources.list.d/pgdg.list' 42 | sudo wget --quiet -O - \ 43 | https://www.postgresql.org/media/keys/ACCC4CF8.asc | 44 | sudo apt-key add - 45 | sudo apt update 46 | sudo apt -y install postgresql-17 postgresql-server-dev-17 47 | 48 | - name: Change src owner to postgres 49 | run: | 50 | sudo chmod o+rx ~ 51 | sudo chown -R postgres:postgres src 52 | 53 | - name: Build pg_stat_monitor 54 | run: | 55 | sudo -u postgres bash -c 'make USE_PGXS=1' 56 | sudo make USE_PGXS=1 install 57 | working-directory: src/pg_stat_monitor 58 | 59 | - name: Start pg_stat_monitor_tests 60 | run: | 61 | sudo service postgresql stop 62 | echo "shared_preload_libraries = 'pg_stat_monitor'" | 63 | sudo tee -a /etc/postgresql/17/main/postgresql.conf 64 | sudo service postgresql start 65 | sudo psql -V 66 | export PG_TEST_PORT_DIR=${GITHUB_WORKSPACE}/src/pg_stat_monitor 67 | echo $PG_TEST_PORT_DIR 68 | sudo -E -u postgres bash -c 'make installcheck USE_PGXS=1' 69 | working-directory: src/pg_stat_monitor 70 | 71 | - name: Change dir permissions on fail 72 | if: ${{ failure() }} 73 | run: | 74 | sudo chmod -R ugo+rwx t 75 | sudo chmod -R ugo+rwx tmp_check 76 | exit 2 # regenerate error so that we can upload files in next step 77 | working-directory: src/pg_stat_monitor 78 | 79 | - name: Upload logs on fail 80 | if: ${{ failure() }} 81 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 82 | with: 83 | name: Regressions diff and postgresql log 84 | path: | 85 | src/pg_stat_monitor/regression.diffs 86 | src/pg_stat_monitor/regression.out 87 | src/pg_stat_monitor/logfile 88 | src/pg_stat_monitor/t/results/ 89 | src/pg_stat_monitor/tmp_check/log/ 90 | !src/pg_stat_monitor/tmp_check/**/archives/* 91 | !src/pg_stat_monitor/tmp_check/**/backup/* 92 | !src/pg_stat_monitor/tmp_check/**/pgdata/* 93 | !src/pg_stat_monitor/tmp_check/**/archives/ 94 | !src/pg_stat_monitor/tmp_check/**/backup/ 95 | !src/pg_stat_monitor/tmp_check/**/pgdata/ 96 | if-no-files-found: warn 97 | retention-days: 3 98 | -------------------------------------------------------------------------------- /.github/workflows/scorecard.yml: -------------------------------------------------------------------------------- 1 | name: Scorecard 2 | on: 3 | # To guarantee Maintained check is occasionally updated. See 4 | # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained 5 | schedule: 6 | - cron: "24 3 * * 1" 7 | push: 8 | branches: 9 | - main 10 | 11 | # Declare default permissions as read only. 12 | permissions: read-all 13 | 14 | jobs: 15 | analysis: 16 | name: Analysis 17 | runs-on: ubuntu-latest 18 | permissions: 19 | # Needed to upload the results to code-scanning dashboard. 20 | security-events: write 21 | # Needed to publish results and get a badge (see publish_results below). 22 | id-token: write 23 | 24 | steps: 25 | - name: Checkout code 26 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 27 | with: 28 | persist-credentials: false 29 | 30 | - name: Run analysis 31 | uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 32 | with: 33 | results_file: results.sarif 34 | results_format: sarif 35 | publish_results: true 36 | 37 | - name: Upload results 38 | uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 39 | with: 40 | name: SARIF file 41 | path: results.sarif 42 | retention-days: 5 43 | 44 | # Upload the results to GitHub's code scanning dashboard (optional). 45 | - name: "Upload to code-scanning" 46 | uses: github/codeql-action/upload-sarif@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 47 | with: 48 | sarif_file: results.sarif 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.app 34 | *.i*86 35 | *.x86_64 36 | *.hex 37 | 38 | # Debug files 39 | *.dSYM/ 40 | *.su 41 | *.idb 42 | *.pdb 43 | 44 | # Kernel Module Compile Results 45 | *.mod* 46 | *.cmd 47 | .tmp_versions/ 48 | .deps/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | 54 | ## IDE 55 | .idea 56 | 57 | ## DS_Store 58 | *.DS_Store 59 | 60 | ## .vscode 61 | .vscode/ 62 | .vscode/* 63 | 64 | # tools files 65 | typedefs-full.list 66 | -------------------------------------------------------------------------------- /.licenserc.yaml: -------------------------------------------------------------------------------- 1 | header: 2 | paths: 3 | - "**/*.c" 4 | - "**/*.h" 5 | license: 6 | pattern: | 7 | .*\.(c|h) 8 | .* 9 | 10 | Portions Copyright © 2018-2024, Percona LLC and/or its affiliates 11 | 12 | Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group 13 | 14 | Portions Copyright (c) 1994, The Regents of the University of California 15 | 16 | IDENTIFICATION 17 | contrib/pg_stat_monitor/.*\.(c|h) 18 | 19 | comment: never 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | pg_stat_monitor - Statistics collector for PostgreSQL. 3 | 4 | Portions Copyright © 2018-2020, Percona LLC and/or its affiliates 5 | 6 | Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group 7 | 8 | Portions Copyright (c) 1994, The Regents of the University of California 9 | 10 | Permission to use, copy, modify, and distribute this software and its 11 | documentation for any purpose, without fee, and without a written agreement is 12 | hereby granted, provided that the above copyright notice and this paragraph and 13 | the following two paragraphs appear in all copies. 14 | 15 | IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR DIRECT, 16 | INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, 17 | ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE 18 | COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | 20 | THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT 21 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 22 | PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND 23 | THE COPYRIGHT HOLDER HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, 24 | UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 25 | -------------------------------------------------------------------------------- /META.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pg_stat_monitor", 3 | "abstract": "PostgreSQL Query Performance Monitoring Tool", 4 | "description": "pg_stat_monitor is a PostgreSQL Query Performance Monitoring tool, based on PostgreSQL's contrib module pg_stat_statements. PostgreSQL’s pg_stat_statements provides the basic statistics, which is sometimes not enough. The major shortcoming in pg_stat_statements is that it accumulates all the queries and their statistics and does not provide aggregated statistics nor histogram information. In this case, a user would need to calculate the aggregates, which is quite an expensive operation.", 5 | "version": "2.1.1", 6 | "maintainer": [ 7 | "Artem Gavrilov ", 8 | "Diego dos Santos Fronza " 9 | ], 10 | "license": { 11 | "PostgreSQL": "https://www.postgresql.org/about/licence" 12 | }, 13 | "provides": { 14 | "pg_stat_monitor": { 15 | "abstract": "PostgreSQL Query Performance Monitoring Tool", 16 | "file": "pg_stat_monitor--2.0--2.1.sql", 17 | "docfile": "README.md", 18 | "version": "2.1.1" 19 | } 20 | }, 21 | "prereqs": { 22 | "runtime": { 23 | "requires": { 24 | "PostgreSQL": "12.0.0" 25 | } 26 | } 27 | }, 28 | "resources": { 29 | "homepage": "https://github.com/percona/pg_stat_monitor", 30 | "bugtracker": { 31 | "web": "https://perconadev.atlassian.net/jira/software/c/projects/PG/issues" 32 | }, 33 | "repository": { 34 | "url": "https://github.com/percona/pg_stat_monitor.git", 35 | "web": "https://github.com/percona/pg_stat_monitor", 36 | "type": "git" 37 | } 38 | }, 39 | "generated_by": "Artem Gavrilov", 40 | "meta-spec": { 41 | "version": "1.0.0", 42 | "url": "http://pgxn.org/meta/spec.txt" 43 | }, 44 | "tags": [ 45 | "monitoring", 46 | "statistics-collector", 47 | "statistics" 48 | ] 49 | } 50 | 51 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # contrib/pg_stat_monitor/Makefile 2 | 3 | MODULE_big = pg_stat_monitor 4 | OBJS = hash_query.o guc.o pg_stat_monitor.o $(WIN32RES) 5 | 6 | EXTENSION = pg_stat_monitor 7 | DATA = pg_stat_monitor--2.0.sql pg_stat_monitor--1.0--2.0.sql pg_stat_monitor--2.0--2.1.sql 8 | 9 | PGFILEDESC = "pg_stat_monitor - execution statistics of SQL statements" 10 | 11 | LDFLAGS_SL += $(filter -lm, $(LIBS)) 12 | 13 | TAP_TESTS = 1 14 | REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_monitor/pg_stat_monitor.conf --inputdir=regression 15 | REGRESS = basic version guc pgsm_query_id functions counters relations database error_insert application_name application_name_unique top_query different_parent_queries cmd_type error rows tags user level_tracking 16 | 17 | # Disabled because these tests require "shared_preload_libraries=pg_stat_statements", 18 | # which typical installcheck users do not have (e.g. buildfarm clients). 19 | # NO_INSTALLCHECK = 1 20 | 21 | PG_CONFIG ?= pg_config 22 | 23 | ifdef USE_PGXS 24 | MAJORVERSION := $(shell $(PG_CONFIG) --version | awk {'print $$2'} | cut -f1 -d".") 25 | PGXS := $(shell $(PG_CONFIG) --pgxs) 26 | include $(PGXS) 27 | else 28 | subdir = contrib/pg_stat_monitor 29 | top_builddir = ../.. 30 | include $(top_builddir)/src/Makefile.global 31 | include $(top_srcdir)/contrib/contrib-global.mk 32 | endif 33 | 34 | # Fetches typedefs list for PostgreSQL core and merges it with typedefs defined in this project. 35 | # https://wiki.postgresql.org/wiki/Running_pgindent_on_non-core_code_or_development_code 36 | update-typedefs: 37 | wget -q -O - "https://buildfarm.postgresql.org/cgi-bin/typedefs.pl?branch=REL_17_STABLE" | cat - typedefs.list | sort | uniq > typedefs-full.list 38 | 39 | # Indents projects sources. 40 | indent: 41 | pgindent --typedefs=typedefs-full.list . 42 | 43 | .PHONY: update-typedefs indent -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | pg_stat_monitor project follows rolling release strategy. So all security updates go to new versions. 6 | 7 | ## Reporting a Vulnerability 8 | 9 | Please report any vulnerabilities to our project in [Jira](https://perconadev.atlassian.net/jira/software/c/projects/PG/issues). 10 | 11 | If the vulnerability is accepted and confirmed by our experts, you should normally expect us to deliver 12 | a version with a fix according to the timelines provided below: 13 | 14 | For Percona created software (our engineers wrote the code): 15 | 16 | - Low/Medium: 120 days 17 | - High: 90 days 18 | - Critical: ASAP but should not exceed 30 days 19 | 20 | For Non-Percona created software (upstream provided/packaged) from the time the vendor releases a patch: 21 | 22 | - Low/Medium: 2nd release from current version 23 | - High: Next release 24 | - Critical: Hotfix or no later than next release (our regular release cadence is once every month) 25 | -------------------------------------------------------------------------------- /code-of-conduct.md: -------------------------------------------------------------------------------- 1 | # Percona Code of Conduct 2 | 3 | All Percona Products follow the [Percona Community Code of Conduct](https://github.com/percona/community/blob/main/content/contribute/coc.md). 4 | 5 | If you notice any unacceptable behavior, let us know as soon as possible by writing to . We will respond within 48 hours. 6 | -------------------------------------------------------------------------------- /debian/changelog: -------------------------------------------------------------------------------- 1 | percona-pg-stat-monitor (0.0.1-1) unstable; urgency=medium 2 | 3 | * Initial build. 4 | 5 | -- Oleksandr Miroshnychenko Thu, 19 Dec 2019 19:20:11 +0100 6 | -------------------------------------------------------------------------------- /debian/compat: -------------------------------------------------------------------------------- 1 | 9 2 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: percona-pg-stat-monitor 2 | Section: database 3 | Priority: optional 4 | Maintainer: Percona Development Team 5 | Build-Depends: 6 | debhelper (>= 9), 7 | postgresql-server-dev-all (>= 153~) | percona-postgresql-server-dev-all (>= 153~), 8 | 9 | Package: percona-pg-stat-monitorPGVERSION 10 | Architecture: any 11 | Depends: 12 | postgresql-PGVERSION, 13 | ${misc:Depends}, 14 | ${shlibs:Depends}, 15 | Description: enhancement query planning and execution statistics collector 16 | The pg_stat_monitor is a Query Performance Monitoring tool for PostgreSQL. 17 | It attempts to provide a more holistic picture by providing much-needed query 18 | performance insights in a single view. 19 | . 20 | pg_stat_monitor provides improved insights that allow database users to 21 | understand query origins, execution, planning statistics and details, query 22 | information, and metadata. This significantly improves observability, enabling 23 | users to debug and tune query performance. pg_stat_monitor is developed on the 24 | basis of pg_stat_statements as its more advanced replacement. 25 | -------------------------------------------------------------------------------- /debian/control.in: -------------------------------------------------------------------------------- 1 | Source: percona-pg-stat-monitor 2 | Section: database 3 | Priority: optional 4 | Maintainer: Percona Development Team 5 | Build-Depends: 6 | debhelper (>= 9), 7 | postgresql-server-dev-all (>= 153~) | percona-postgresql-server-dev-all (>= 153~), 8 | 9 | Package: percona-pg-stat-monitorPGVERSION 10 | Architecture: any 11 | Depends: 12 | postgresql-PGVERSION, 13 | ${misc:Depends}, 14 | ${shlibs:Depends}, 15 | Description: enhancement query planning and execution statistics collector 16 | The pg_stat_monitor is a Query Performance Monitoring tool for PostgreSQL. 17 | It attempts to provide a more holistic picture by providing much-needed query 18 | performance insights in a single view. 19 | . 20 | pg_stat_monitor provides improved insights that allow database users to 21 | understand query origins, execution, planning statistics and details, query 22 | information, and metadata. This significantly improves observability, enabling 23 | users to debug and tune query performance. pg_stat_monitor is developed on the 24 | basis of pg_stat_statements as its more advanced replacement. 25 | -------------------------------------------------------------------------------- /debian/copyright: -------------------------------------------------------------------------------- 1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: pg_stat_monitor 3 | Source: https://github.com/percona/pg_stat_monitor 4 | 5 | Files: * 6 | Copyright: Portions Copyright © 2018-2021, Percona LLC and/or its affiliates 7 | Portions Copyright © 1996-2021, The PostgreSQL Global Development Group 8 | Portions Copyright © 1994, The Regents of the University of California 9 | 10 | License: PostgreSQL 11 | Permission to use, copy, modify, and distribute this software and its 12 | documentation for any purpose, without fee, and without a written agreement 13 | is hereby granted, provided that the above copyright notice and this 14 | paragraph and the following two paragraphs appear in all copies. 15 | . 16 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR 17 | DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING 18 | LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS 19 | DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE 20 | POSSIBILITY OF SUCH DAMAGE. 21 | . 22 | THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, 23 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 24 | AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 25 | ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO 26 | PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 27 | -------------------------------------------------------------------------------- /debian/pgversions: -------------------------------------------------------------------------------- 1 | 9.3+ 2 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | 3 | # Uncomment this to turn on verbose mode. 4 | #export DH_VERBOSE=1 5 | 6 | # Using pg_buildext 7 | include /usr/share/postgresql-common/pgxs_debian_control.mk 8 | 9 | export USE_PGXS=1 10 | 11 | %: 12 | dh $@ 13 | 14 | override_dh_builddeb: 15 | dh_builddeb -- -Zgzip 16 | 17 | override_dh_auto_build: 18 | +pg_buildext clean . build-%v 19 | +pg_buildext build . build-%v 20 | 21 | override_dh_auto_test: 22 | # nothing to do here 23 | 24 | override_dh_auto_install: 25 | +pg_buildext install . build-%v percona-pg-stat-monitor@@PG_REL@@ 26 | 27 | override_dh_installdocs: 28 | dh_installdocs --all README.* 29 | 30 | override_dh_auto_clean: 31 | rm -rf results/* regression.* 32 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (quilt) 2 | -------------------------------------------------------------------------------- /debian/source/lintian-overrides: -------------------------------------------------------------------------------- 1 | # don't bug people uploading from @work 2 | source: changelog-should-mention-nmu 3 | source: source-nmu-has-incorrect-version-number 4 | -------------------------------------------------------------------------------- /meson.build: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022-2023, PostgreSQL Global Development Group 2 | 3 | pg_stat_monitor_sources = files( 4 | 'pg_stat_monitor.c', 5 | ) 6 | 7 | pg_stat_monitor = shared_module('pg_stat_monitor', 8 | pg_stat_monitor_sources, 9 | kwargs: contrib_mod_args + { 10 | 'dependencies': contrib_mod_args['dependencies'], 11 | }, 12 | ) 13 | contrib_targets += pg_stat_monitor 14 | 15 | install_data( 16 | 'pg_stat_monitor.control', 17 | 'pg_stat_monitor--2.0.sql', 18 | 'pg_stat_monitor--1.0--2.0.sql', 19 | 'pg_stat_monitor--2.0--2.1.sql', 20 | kwargs: contrib_data_args, 21 | ) 22 | 23 | tests += { 24 | 'name': 'pg_stat_monitor', 25 | 'sd': meson.current_source_dir(), 26 | 'bd': meson.current_build_dir(), 27 | 'regress': { 28 | 'sql': [ 29 | 'application_name', 30 | 'application_name_unique', 31 | 'basic', 32 | 'cmd_type', 33 | 'counters', 34 | 'database', 35 | 'different_parent_queries' 36 | 'error_insert', 37 | 'error', 38 | 'functions', 39 | 'guc', 40 | 'histogram', 41 | 'level_tracking' 42 | 'pgsqm_query_id', 43 | 'relations', 44 | 'rows', 45 | 'state', 46 | 'tags', 47 | 'top_query', 48 | 'user', 49 | 'version' 50 | ], 51 | 'regress_args': ['--temp-config', files('pg_stat_monitor.conf')], 52 | # Disabled because these tests require 53 | # "shared_preload_libraries=pg_stat_monitor", which typical 54 | # runningcheck users do not have (e.g. buildfarm clients). 55 | 'runningcheck': false, 56 | }, 57 | } 58 | -------------------------------------------------------------------------------- /pg_stat_monitor.conf: -------------------------------------------------------------------------------- 1 | shared_preload_libraries = 'pg_stat_monitor' 2 | -------------------------------------------------------------------------------- /pg_stat_monitor.control: -------------------------------------------------------------------------------- 1 | # pg_stat_monitor extension 2 | comment = 'The pg_stat_monitor is a PostgreSQL Query Performance Monitoring tool, based on PostgreSQL contrib module pg_stat_statements. pg_stat_monitor provides aggregated statistics, client information, plan details including plan, and histogram information.' 3 | default_version = '2.1' 4 | module_pathname = '$libdir/pg_stat_monitor' 5 | relocatable = true 6 | -------------------------------------------------------------------------------- /regression/expected/application_name.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT 1 AS num; 9 | num 10 | ----- 11 | 1 12 | (1 row) 13 | 14 | SELECT query,application_name FROM pg_stat_monitor ORDER BY query COLLATE "C"; 15 | query | application_name 16 | --------------------------------+----------------------------- 17 | SELECT 1 AS num | pg_regress/application_name 18 | SELECT pg_stat_monitor_reset() | pg_regress/application_name 19 | (2 rows) 20 | 21 | SELECT pg_stat_monitor_reset(); 22 | pg_stat_monitor_reset 23 | ----------------------- 24 | 25 | (1 row) 26 | 27 | SELECT 1 AS num; 28 | num 29 | ----- 30 | 1 31 | (1 row) 32 | 33 | SET pg_stat_monitor.pgsm_track_application_names='no'; 34 | SELECT 1 AS num; 35 | num 36 | ----- 37 | 1 38 | (1 row) 39 | 40 | SELECT query,application_name FROM pg_stat_monitor ORDER BY query, application_name COLLATE "C"; 41 | query | application_name 42 | -------------------------------------------------------+----------------------------- 43 | SELECT 1 AS num | pg_regress/application_name 44 | SELECT 1 AS num | 45 | SELECT pg_stat_monitor_reset() | pg_regress/application_name 46 | SET pg_stat_monitor.pgsm_track_application_names='no' | 47 | (4 rows) 48 | 49 | SELECT pg_stat_monitor_reset(); 50 | pg_stat_monitor_reset 51 | ----------------------- 52 | 53 | (1 row) 54 | 55 | DROP EXTENSION pg_stat_monitor; 56 | -------------------------------------------------------------------------------- /regression/expected/application_name_unique.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SET application_name = 'naeem' ; 9 | SELECT 1 AS num; 10 | num 11 | ----- 12 | 1 13 | (1 row) 14 | 15 | SET application_name = 'psql' ; 16 | SELECT 1 AS num; 17 | num 18 | ----- 19 | 1 20 | (1 row) 21 | 22 | SELECT query,application_name FROM pg_stat_monitor ORDER BY query, application_name COLLATE "C"; 23 | query | application_name 24 | --------------------------------+------------------------------------ 25 | SELECT 1 AS num | naeem 26 | SELECT 1 AS num | psql 27 | SELECT pg_stat_monitor_reset() | pg_regress/application_name_unique 28 | SET application_name = 'naeem' | naeem 29 | SET application_name = 'psql' | psql 30 | (5 rows) 31 | 32 | SELECT pg_stat_monitor_reset(); 33 | pg_stat_monitor_reset 34 | ----------------------- 35 | 36 | (1 row) 37 | 38 | DROP EXTENSION pg_stat_monitor; 39 | -------------------------------------------------------------------------------- /regression/expected/application_name_unique_1.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SET application_name = 'naeem' ; 9 | SELECT 1 AS num; 10 | num 11 | ----- 12 | 1 13 | (1 row) 14 | 15 | SET application_name = 'psql' ; 16 | SELECT 1 AS num; 17 | num 18 | ----- 19 | 1 20 | (1 row) 21 | 22 | SELECT query,application_name FROM pg_stat_monitor ORDER BY query, application_name COLLATE "C"; 23 | query | application_name 24 | --------------------------------+------------------------------------ 25 | SELECT 1 AS num | naeem 26 | SELECT 1 AS num | psql 27 | SELECT pg_stat_monitor_reset() | pg_regress/application_name_unique 28 | (3 rows) 29 | 30 | SELECT pg_stat_monitor_reset(); 31 | pg_stat_monitor_reset 32 | ----------------------- 33 | 34 | (1 row) 35 | 36 | DROP EXTENSION pg_stat_monitor; 37 | -------------------------------------------------------------------------------- /regression/expected/basic.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT 1 AS num; 9 | num 10 | ----- 11 | 1 12 | (1 row) 13 | 14 | SELECT query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 15 | query 16 | -------------------------------- 17 | SELECT 1 AS num 18 | SELECT pg_stat_monitor_reset() 19 | (2 rows) 20 | 21 | SELECT pg_stat_monitor_reset(); 22 | pg_stat_monitor_reset 23 | ----------------------- 24 | 25 | (1 row) 26 | 27 | DROP EXTENSION pg_stat_monitor; 28 | -------------------------------------------------------------------------------- /regression/expected/cmd_type.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | CREATE TABLE t1 (a INTEGER); 9 | CREATE TABLE t2 (b INTEGER); 10 | INSERT INTO t1 VALUES(1); 11 | SELECT a FROM t1; 12 | a 13 | --- 14 | 1 15 | (1 row) 16 | 17 | UPDATE t1 SET a = 2; 18 | DELETE FROM t1; 19 | SELECT b FROM t2 FOR UPDATE; 20 | b 21 | --- 22 | (0 rows) 23 | 24 | TRUNCATE t1; 25 | DROP TABLE t1; 26 | DROP TABLE t2; 27 | SELECT query, cmd_type, cmd_type_text FROM pg_stat_monitor ORDER BY query COLLATE "C"; 28 | query | cmd_type | cmd_type_text 29 | --------------------------------+----------+--------------- 30 | CREATE TABLE t1 (a INTEGER) | 0 | 31 | CREATE TABLE t2 (b INTEGER) | 0 | 32 | DELETE FROM t1 | 4 | DELETE 33 | DROP TABLE t1 | 0 | 34 | DROP TABLE t2 | 0 | 35 | INSERT INTO t1 VALUES(1) | 3 | INSERT 36 | SELECT a FROM t1 | 1 | SELECT 37 | SELECT b FROM t2 FOR UPDATE | 1 | SELECT 38 | SELECT pg_stat_monitor_reset() | 1 | SELECT 39 | TRUNCATE t1 | 0 | 40 | UPDATE t1 SET a = 2 | 2 | UPDATE 41 | (11 rows) 42 | 43 | SELECT pg_stat_monitor_reset(); 44 | pg_stat_monitor_reset 45 | ----------------------- 46 | 47 | (1 row) 48 | 49 | DROP EXTENSION pg_stat_monitor; 50 | -------------------------------------------------------------------------------- /regression/expected/cmd_type_1.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | CREATE TABLE t1 (a INTEGER); 9 | CREATE TABLE t2 (b INTEGER); 10 | INSERT INTO t1 VALUES(1); 11 | SELECT a FROM t1; 12 | a 13 | --- 14 | 1 15 | (1 row) 16 | 17 | UPDATE t1 SET a = 2; 18 | DELETE FROM t1; 19 | SELECT b FROM t2 FOR UPDATE; 20 | b 21 | --- 22 | (0 rows) 23 | 24 | TRUNCATE t1; 25 | DROP TABLE t1; 26 | SELECT query, cmd_type, cmd_type_text FROM pg_stat_monitor ORDER BY query COLLATE "C"; 27 | query | cmd_type | cmd_type_text 28 | --------------------------------+----------+--------------- 29 | DELETE FROM t1 | 4 | DELETE 30 | INSERT INTO t1 VALUES(1) | 3 | INSERT 31 | SELECT a FROM t1 | 1 | SELECT 32 | SELECT b FROM t2 FOR UPDATE | 1 | SELECT 33 | SELECT pg_stat_monitor_reset() | 1 | SELECT 34 | UPDATE t1 SET a = 2 | 2 | UPDATE 35 | (6 rows) 36 | 37 | SELECT pg_stat_monitor_reset(); 38 | pg_stat_monitor_reset 39 | ----------------------- 40 | 41 | (1 row) 42 | 43 | DROP EXTENSION pg_stat_monitor; 44 | -------------------------------------------------------------------------------- /regression/expected/counters.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | Set pg_stat_monitor.pgsm_track='all'; 3 | SELECT pg_stat_monitor_reset(); 4 | pg_stat_monitor_reset 5 | ----------------------- 6 | 7 | (1 row) 8 | 9 | CREATE TABLE t1 (a INTEGER); 10 | CREATE TABLE t2 (b INTEGER); 11 | CREATE TABLE t3 (c INTEGER); 12 | CREATE TABLE t4 (d INTEGER); 13 | SELECT pg_stat_monitor_reset(); 14 | pg_stat_monitor_reset 15 | ----------------------- 16 | 17 | (1 row) 18 | 19 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 20 | a | b | c | d 21 | ---+---+---+--- 22 | (0 rows) 23 | 24 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 25 | a | b | c | d 26 | ---+---+---+--- 27 | (0 rows) 28 | 29 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 30 | a | b | c | d 31 | ---+---+---+--- 32 | (0 rows) 33 | 34 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 35 | a | b | c | d 36 | ---+---+---+--- 37 | (0 rows) 38 | 39 | SELECT query, sum(calls) as calls FROM pg_stat_monitor GROUP BY query ORDER BY query COLLATE "C"; 40 | query | calls 41 | ---------------------------------------------------------------------------------+------- 42 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a | 4 43 | SELECT pg_stat_monitor_reset() | 1 44 | (2 rows) 45 | 46 | SELECT pg_stat_monitor_reset(); 47 | pg_stat_monitor_reset 48 | ----------------------- 49 | 50 | (1 row) 51 | 52 | do $$ 53 | declare 54 | n integer:= 1; 55 | begin 56 | loop 57 | PERFORM a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 58 | exit when n = 1000; 59 | n := n + 1; 60 | end loop; 61 | end $$; 62 | SELECT query, sum(calls) as calls FROM pg_stat_monitor GROUP BY query ORDER BY query COLLATE "C"; 63 | query | calls 64 | ---------------------------------------------------------------------------------------------------+------- 65 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a | 1000 66 | SELECT pg_stat_monitor_reset() | 1 67 | do $$ +| 1 68 | declare +| 69 | n integer:= 1; +| 70 | begin +| 71 | loop +| 72 | PERFORM a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a;+| 73 | exit when n = 1000; +| 74 | n := n + 1; +| 75 | end loop; +| 76 | end $$ | 77 | (3 rows) 78 | 79 | DROP TABLE t1; 80 | DROP TABLE t2; 81 | DROP TABLE t3; 82 | DROP TABLE t4; 83 | DROP EXTENSION pg_stat_monitor; 84 | -------------------------------------------------------------------------------- /regression/expected/database.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | CREATE DATABASE db1; 3 | CREATE DATABASE db2; 4 | \c db1 5 | CREATE TABLE t1 (a int); 6 | CREATE TABLE t2 (b int); 7 | \c db2 8 | CREATE TABLE t3 (c int); 9 | CREATE TABLE t4 (d int); 10 | \c contrib_regression 11 | SELECT pg_stat_monitor_reset(); 12 | pg_stat_monitor_reset 13 | ----------------------- 14 | 15 | (1 row) 16 | 17 | \c db1 18 | SELECT * FROM t1,t2 WHERE t1.a = t2.b; 19 | a | b 20 | ---+--- 21 | (0 rows) 22 | 23 | \c db2 24 | SELECT * FROM t3,t4 WHERE t3.c = t4.d; 25 | c | d 26 | ---+--- 27 | (0 rows) 28 | 29 | \c contrib_regression 30 | DROP DATABASE db2; 31 | SELECT datname, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 32 | datname | query 33 | --------------------+--------------------------------------- 34 | contrib_regression | DROP DATABASE db2 35 | db1 | SELECT * FROM t1,t2 WHERE t1.a = t2.b 36 | db2 | SELECT * FROM t3,t4 WHERE t3.c = t4.d 37 | contrib_regression | SELECT pg_stat_monitor_reset() 38 | (4 rows) 39 | 40 | SELECT pg_stat_monitor_reset(); 41 | pg_stat_monitor_reset 42 | ----------------------- 43 | 44 | (1 row) 45 | 46 | \c db1 47 | DROP TABLE t1; 48 | DROP TABLE t2; 49 | \c contrib_regression 50 | DROP DATABASE db1; 51 | DROP EXTENSION pg_stat_monitor; 52 | -------------------------------------------------------------------------------- /regression/expected/different_parent_queries.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SET pg_stat_monitor.pgsm_track='all'; 3 | SELECT pg_stat_monitor_reset(); 4 | pg_stat_monitor_reset 5 | ----------------------- 6 | 7 | (1 row) 8 | 9 | CREATE OR REPLACE FUNCTION test() RETURNS VOID AS 10 | $$ 11 | BEGIN 12 | PERFORM 1 + 2; 13 | END; $$ language plpgsql; 14 | CREATE OR REPLACE FUNCTION test2() RETURNS VOID AS 15 | $$ 16 | BEGIN 17 | PERFORM 1 + 2; 18 | END; $$ language plpgsql; 19 | SELECT pg_stat_monitor_reset(); 20 | pg_stat_monitor_reset 21 | ----------------------- 22 | 23 | (1 row) 24 | 25 | SELECT test(); 26 | test 27 | ------ 28 | 29 | (1 row) 30 | 31 | SELECT test2(); 32 | test2 33 | ------- 34 | 35 | (1 row) 36 | 37 | SELECT 1 + 2; 38 | ?column? 39 | ---------- 40 | 3 41 | (1 row) 42 | 43 | SELECT left(query, 15) as query, calls, top_query, pgsm_query_id FROM pg_stat_monitor ORDER BY query, top_query COLLATE "C"; 44 | query | calls | top_query | pgsm_query_id 45 | -----------------+-------+-----------------+---------------------- 46 | SELECT 1 + 2 | 1 | SELECT test(); | 5193804135051352284 47 | SELECT 1 + 2 | 1 | SELECT test2(); | 5193804135051352284 48 | SELECT 1 + 2 | 1 | | 5193804135051352284 49 | SELECT pg_stat_ | 1 | | 689150021118383254 50 | SELECT test() | 1 | | -6801876889834540522 51 | SELECT test2() | 1 | | 369102705908374543 52 | (6 rows) 53 | 54 | DROP EXTENSION pg_stat_monitor; 55 | -------------------------------------------------------------------------------- /regression/expected/error.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT 1/0; -- divide by zero 9 | ERROR: division by zero 10 | SELECT * FROM unknown; -- unknown table 11 | ERROR: relation "unknown" does not exist 12 | LINE 1: SELECT * FROM unknown; 13 | ^ 14 | ELECET * FROM unknown; -- syntax error 15 | ERROR: syntax error at or near "ELECET" 16 | LINE 1: ELECET * FROM unknown; 17 | ^ 18 | do $$ 19 | BEGIN 20 | RAISE WARNING 'warning message'; 21 | END $$; 22 | WARNING: warning message 23 | SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C",elevel; 24 | query | elevel | sqlcode | message 25 | ----------------------------------+--------+---------+----------------------------------- 26 | ELECET * FROM unknown; | 20 | 42601 | syntax error at or near "ELECET" 27 | SELECT * FROM unknown; | 20 | 42P01 | relation "unknown" does not exist 28 | SELECT 1/0; | 20 | 22012 | division by zero 29 | SELECT pg_stat_monitor_reset() | 0 | | 30 | do $$ +| 0 | | 31 | BEGIN +| | | 32 | RAISE WARNING 'warning message';+| | | 33 | END $$ | | | 34 | do $$ +| 19 | 01000 | warning message 35 | BEGIN +| | | 36 | RAISE WARNING 'warning message';+| | | 37 | END $$; | | | 38 | (6 rows) 39 | 40 | SELECT pg_stat_monitor_reset(); 41 | pg_stat_monitor_reset 42 | ----------------------- 43 | 44 | (1 row) 45 | 46 | DROP EXTENSION pg_stat_monitor; 47 | -------------------------------------------------------------------------------- /regression/expected/error_1.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT 1/0; -- divide by zero 9 | ERROR: division by zero 10 | SELECT * FROM unknown; -- unknown table 11 | ERROR: relation "unknown" does not exist 12 | LINE 1: SELECT * FROM unknown; 13 | ^ 14 | ELECET * FROM unknown; -- syntax error 15 | ERROR: syntax error at or near "ELECET" 16 | LINE 1: ELECET * FROM unknown; 17 | ^ 18 | do $$ 19 | BEGIN 20 | RAISE WARNING 'warning message'; 21 | END $$; 22 | WARNING: warning message 23 | SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C",elevel; 24 | query | elevel | sqlcode | message 25 | ----------------------------------+--------+---------+----------------------------------- 26 | ELECET * FROM unknown; | 21 | 42601 | syntax error at or near "ELECET" 27 | SELECT * FROM unknown; | 21 | 42P01 | relation "unknown" does not exist 28 | SELECT 1/0; | 21 | 22012 | division by zero 29 | SELECT pg_stat_monitor_reset() | 0 | | 30 | do $$ +| 0 | | 31 | BEGIN +| | | 32 | RAISE WARNING 'warning message';+| | | 33 | END $$ | | | 34 | do $$ +| 19 | 01000 | warning message 35 | BEGIN +| | | 36 | RAISE WARNING 'warning message';+| | | 37 | END $$; | | | 38 | (6 rows) 39 | 40 | SELECT pg_stat_monitor_reset(); 41 | pg_stat_monitor_reset 42 | ----------------------- 43 | 44 | (1 row) 45 | 46 | DROP EXTENSION pg_stat_monitor; 47 | -------------------------------------------------------------------------------- /regression/expected/error_2.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT 1/0; -- divide by zero 9 | ERROR: division by zero 10 | SELECT * FROM unknown; -- unknown table 11 | ERROR: relation "unknown" does not exist 12 | LINE 1: SELECT * FROM unknown; 13 | ^ 14 | ELECET * FROM unknown; -- syntax error 15 | ERROR: syntax error at or near "ELECET" 16 | LINE 1: ELECET * FROM unknown; 17 | ^ 18 | do $$ 19 | BEGIN 20 | RAISE WARNING 'warning message'; 21 | END $$; 22 | WARNING: warning message 23 | SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C",elevel; 24 | query | elevel | sqlcode | message 25 | ----------------------------------+--------+---------+----------------------------------- 26 | ELECET * FROM unknown; | 20 | 42601 | syntax error at or near "ELECET" 27 | SELECT * FROM unknown; | 20 | 42P01 | relation "unknown" does not exist 28 | SELECT 1/0; | 20 | 22012 | division by zero 29 | SELECT pg_stat_monitor_reset() | 0 | | 30 | do $$ +| 0 | 01000 | warning message 31 | BEGIN +| | | 32 | RAISE WARNING 'warning message';+| | | 33 | END $$; | | | 34 | (5 rows) 35 | 36 | SELECT pg_stat_monitor_reset(); 37 | pg_stat_monitor_reset 38 | ----------------------- 39 | 40 | (1 row) 41 | 42 | DROP EXTENSION pg_stat_monitor; 43 | -------------------------------------------------------------------------------- /regression/expected/error_insert.out: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS Company; 2 | NOTICE: table "company" does not exist, skipping 3 | CREATE TABLE Company( 4 | ID INT PRIMARY KEY NOT NULL, 5 | NAME TEXT NOT NULL 6 | ); 7 | CREATE EXTENSION pg_stat_monitor; 8 | SELECT pg_stat_monitor_reset(); 9 | pg_stat_monitor_reset 10 | ----------------------- 11 | 12 | (1 row) 13 | 14 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); 15 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); 16 | ERROR: duplicate key value violates unique constraint "company_pkey" 17 | DETAIL: Key (id)=(1) already exists. 18 | DROP TABLE IF EXISTS Company; 19 | SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C",elevel; 20 | query | elevel | sqlcode | message 21 | -------------------------------------------------------+--------+---------+--------------------------------------------------------------- 22 | DROP TABLE IF EXISTS Company | 0 | | 23 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona') | 0 | | 24 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); | 21 | 23505 | duplicate key value violates unique constraint "company_pkey" 25 | SELECT pg_stat_monitor_reset() | 0 | | 26 | (4 rows) 27 | 28 | SELECT pg_stat_monitor_reset(); 29 | pg_stat_monitor_reset 30 | ----------------------- 31 | 32 | (1 row) 33 | 34 | DROP EXTENSION pg_stat_monitor; 35 | -------------------------------------------------------------------------------- /regression/expected/error_insert_1.out: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS Company; 2 | NOTICE: table "company" does not exist, skipping 3 | CREATE TABLE Company( 4 | ID INT PRIMARY KEY NOT NULL, 5 | NAME TEXT NOT NULL 6 | ); 7 | CREATE EXTENSION pg_stat_monitor; 8 | SELECT pg_stat_monitor_reset(); 9 | pg_stat_monitor_reset 10 | ----------------------- 11 | 12 | (1 row) 13 | 14 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); 15 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); 16 | ERROR: duplicate key value violates unique constraint "company_pkey" 17 | DETAIL: Key (id)=(1) already exists. 18 | DROP TABLE IF EXISTS Company; 19 | SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C",elevel; 20 | query | elevel | sqlcode | message 21 | -------------------------------------------------------+--------+---------+--------------------------------------------------------------- 22 | DROP TABLE IF EXISTS Company | 0 | | 23 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona') | 0 | | 24 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); | 20 | 23505 | duplicate key value violates unique constraint "company_pkey" 25 | SELECT pg_stat_monitor_reset() | 0 | | 26 | (4 rows) 27 | 28 | SELECT pg_stat_monitor_reset(); 29 | pg_stat_monitor_reset 30 | ----------------------- 31 | 32 | (1 row) 33 | 34 | DROP EXTENSION pg_stat_monitor; 35 | -------------------------------------------------------------------------------- /regression/expected/functions.out: -------------------------------------------------------------------------------- 1 | DROP ROLE IF EXISTS su; 2 | NOTICE: role "su" does not exist, skipping 3 | CREATE USER su WITH SUPERUSER; 4 | SET ROLE su; 5 | CREATE EXTENSION pg_stat_monitor; 6 | CREATE USER u1; 7 | SELECT pg_stat_monitor_reset(); 8 | pg_stat_monitor_reset 9 | ----------------------- 10 | 11 | (1 row) 12 | 13 | SELECT routine_schema, routine_name, routine_type, data_type FROM information_schema.routines WHERE routine_schema = 'public' ORDER BY routine_name COLLATE "C"; 14 | routine_schema | routine_name | routine_type | data_type 15 | ----------------+--------------------------+--------------+----------- 16 | public | decode_error_level | FUNCTION | text 17 | public | get_cmd_type | FUNCTION | text 18 | public | get_histogram_timings | FUNCTION | text 19 | public | histogram | FUNCTION | record 20 | public | pg_stat_monitor_internal | FUNCTION | record 21 | public | pg_stat_monitor_reset | FUNCTION | void 22 | public | pg_stat_monitor_version | FUNCTION | text 23 | public | pgsm_create_11_view | FUNCTION | integer 24 | public | pgsm_create_13_view | FUNCTION | integer 25 | public | pgsm_create_14_view | FUNCTION | integer 26 | public | pgsm_create_15_view | FUNCTION | integer 27 | public | pgsm_create_17_view | FUNCTION | integer 28 | public | pgsm_create_view | FUNCTION | integer 29 | public | range | FUNCTION | ARRAY 30 | (14 rows) 31 | 32 | SET ROLE u1; 33 | SELECT routine_schema, routine_name, routine_type, data_type FROM information_schema.routines WHERE routine_schema = 'public' ORDER BY routine_name COLLATE "C"; 34 | routine_schema | routine_name | routine_type | data_type 35 | ----------------+--------------------------+--------------+----------- 36 | public | decode_error_level | FUNCTION | text 37 | public | get_cmd_type | FUNCTION | text 38 | public | get_histogram_timings | FUNCTION | text 39 | public | histogram | FUNCTION | record 40 | public | pg_stat_monitor_internal | FUNCTION | record 41 | public | pg_stat_monitor_version | FUNCTION | text 42 | public | range | FUNCTION | ARRAY 43 | (7 rows) 44 | 45 | SET ROLE su; 46 | DROP USER u1; 47 | DROP EXTENSION pg_stat_monitor; 48 | DROP USER su; 49 | ERROR: current user cannot be dropped 50 | -------------------------------------------------------------------------------- /regression/expected/functions_1.out: -------------------------------------------------------------------------------- 1 | DROP ROLE IF EXISTS su; 2 | NOTICE: role "su" does not exist, skipping 3 | CREATE USER su WITH SUPERUSER; 4 | SET ROLE su; 5 | CREATE EXTENSION pg_stat_monitor; 6 | CREATE USER u1; 7 | SELECT pg_stat_monitor_reset(); 8 | pg_stat_monitor_reset 9 | ----------------------- 10 | 11 | (1 row) 12 | 13 | SELECT routine_schema, routine_name, routine_type, data_type FROM information_schema.routines WHERE routine_schema = 'public' ORDER BY routine_name COLLATE "C"; 14 | routine_schema | routine_name | routine_type | data_type 15 | ----------------+--------------------------+--------------+----------- 16 | public | decode_error_level | FUNCTION | text 17 | public | get_cmd_type | FUNCTION | text 18 | public | get_histogram_timings | FUNCTION | text 19 | public | histogram | FUNCTION | record 20 | public | pg_stat_monitor_internal | FUNCTION | record 21 | public | pg_stat_monitor_reset | FUNCTION | void 22 | public | pg_stat_monitor_version | FUNCTION | text 23 | public | pgsm_create_11_view | FUNCTION | integer 24 | public | pgsm_create_13_view | FUNCTION | integer 25 | public | pgsm_create_14_view | FUNCTION | integer 26 | public | pgsm_create_15_view | FUNCTION | integer 27 | public | pgsm_create_17_view | FUNCTION | integer 28 | public | pgsm_create_view | FUNCTION | integer 29 | public | range | FUNCTION | ARRAY 30 | (14 rows) 31 | 32 | SET ROLE u1; 33 | SELECT routine_schema, routine_name, routine_type, data_type FROM information_schema.routines WHERE routine_schema = 'public' ORDER BY routine_name COLLATE "C"; 34 | routine_schema | routine_name | routine_type | data_type 35 | ----------------+-------------------------+--------------+----------- 36 | public | histogram | FUNCTION | record 37 | public | pg_stat_monitor_reset | FUNCTION | void 38 | public | pg_stat_monitor_version | FUNCTION | text 39 | (3 rows) 40 | 41 | SET ROLE su; 42 | DROP USER u1; 43 | DROP EXTENSION pg_stat_monitor; 44 | -------------------------------------------------------------------------------- /regression/expected/guc.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT name 3 | , setting 4 | , unit 5 | , context 6 | , vartype 7 | , source 8 | , min_val 9 | , max_val 10 | , enumvals 11 | , boot_val 12 | , reset_val 13 | , pending_restart 14 | FROM pg_settings 15 | WHERE name LIKE 'pg_stat_monitor.%' 16 | ORDER 17 | BY name 18 | COLLATE "C"; 19 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 20 | ----------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- 21 | pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f 22 | pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f 23 | pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f 24 | pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f 25 | pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f 26 | pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f 27 | pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f 28 | pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f 29 | pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f 30 | pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f 31 | pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f 32 | pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f 33 | pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f 34 | pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f 35 | pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f 36 | pg_stat_monitor.pgsm_track_application_names | on | | user | bool | default | | | | on | on | f 37 | pg_stat_monitor.pgsm_track_planning | off | | user | bool | default | | | | off | off | f 38 | pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f 39 | (18 rows) 40 | 41 | DROP EXTENSION pg_stat_monitor; 42 | -------------------------------------------------------------------------------- /regression/expected/guc_1.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT name 3 | , setting 4 | , unit 5 | , context 6 | , vartype 7 | , source 8 | , min_val 9 | , max_val 10 | , enumvals 11 | , boot_val 12 | , reset_val 13 | , pending_restart 14 | FROM pg_settings 15 | WHERE name LIKE 'pg_stat_monitor.%' 16 | ORDER 17 | BY name 18 | COLLATE "C"; 19 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 20 | ----------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- 21 | pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f 22 | pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f 23 | pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f 24 | pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f 25 | pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f 26 | pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f 27 | pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f 28 | pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f 29 | pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f 30 | pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f 31 | pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f 32 | pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f 33 | pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f 34 | pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f 35 | pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f 36 | pg_stat_monitor.pgsm_track_application_names | on | | user | bool | default | | | | on | on | f 37 | pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f 38 | (17 rows) 39 | 40 | DROP EXTENSION pg_stat_monitor; 41 | -------------------------------------------------------------------------------- /regression/expected/guc_2.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT name 3 | , setting 4 | , unit 5 | , context 6 | , vartype 7 | , source 8 | , min_val 9 | , max_val 10 | , enumvals 11 | , boot_val 12 | , reset_val 13 | , pending_restart 14 | FROM pg_settings 15 | WHERE name LIKE 'pg_stat_monitor.%' 16 | ORDER 17 | BY name 18 | COLLATE "C"; 19 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 20 | ----------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- 21 | pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f 22 | pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f 23 | pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f 24 | pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f 25 | pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f 26 | pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f 27 | pg_stat_monitor.pgsm_histogram_max | 100000 | | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f 28 | pg_stat_monitor.pgsm_histogram_min | 1 | | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f 29 | pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f 30 | pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f 31 | pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f 32 | pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f 33 | pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f 34 | pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f 35 | pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f 36 | pg_stat_monitor.pgsm_track_application_names | on | | user | bool | default | | | | on | on | f 37 | pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f 38 | (17 rows) 39 | 40 | DROP EXTENSION pg_stat_monitor; 41 | -------------------------------------------------------------------------------- /regression/expected/histogram.out: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION generate_histogram() 2 | RETURNS TABLE ( 3 | range TEXT, freq INT, bar TEXT 4 | ) AS $$ 5 | Declare 6 | bucket_id integer; 7 | query_id text; 8 | BEGIN 9 | select bucket into bucket_id from pg_stat_monitor order by calls desc limit 1; 10 | select queryid into query_id from pg_stat_monitor order by calls desc limit 1; 11 | --RAISE INFO 'bucket_id %', bucket_id; 12 | --RAISE INFO 'query_id %', query_id; 13 | return query 14 | SELECT * FROM histogram(bucket_id, query_id) AS a(range TEXT, freq INT, bar TEXT); 15 | END; 16 | $$ LANGUAGE plpgsql; 17 | CREATE OR REPLACE FUNCTION run_pg_sleep(INTEGER) RETURNS VOID AS $$ 18 | DECLARE 19 | loops ALIAS FOR $1; 20 | BEGIN 21 | FOR i IN 1..loops LOOP 22 | --RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP; 23 | RAISE INFO 'Sleep % seconds', i; 24 | PERFORM pg_sleep(i); 25 | END LOOP; 26 | END; 27 | $$ LANGUAGE 'plpgsql' STRICT; 28 | CREATE EXTENSION pg_stat_monitor; 29 | SELECT pg_stat_monitor_reset(); 30 | pg_stat_monitor_reset 31 | ----------------------- 32 | 33 | (1 row) 34 | 35 | Set pg_stat_monitor.pgsm_track='all'; 36 | select run_pg_sleep(5); 37 | INFO: Sleep 1 seconds 38 | INFO: Sleep 2 seconds 39 | INFO: Sleep 3 seconds 40 | INFO: Sleep 4 seconds 41 | INFO: Sleep 5 seconds 42 | run_pg_sleep 43 | -------------- 44 | 45 | (1 row) 46 | 47 | SELECT substr(query, 0,50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; 48 | query | calls | resp_calls 49 | --------------------------------------+-------+----------------------- 50 | SELECT pg_sleep(i) | 5 | {0,0,0,0,0,0,3,2,0,0} 51 | SELECT pg_stat_monitor_reset() | 1 | {1,0,0,0,0,0,0,0,0,0} 52 | Set pg_stat_monitor.pgsm_track='all' | 1 | {1,0,0,0,0,0,0,0,0,0} 53 | select run_pg_sleep(5) | 1 | {0,0,0,0,0,0,0,0,1,0} 54 | (4 rows) 55 | 56 | select * from generate_histogram(); 57 | range | freq | bar 58 | --------------------+------+-------------------------------- 59 | (0 - 3)} | 0 | 60 | (3 - 10)} | 0 | 61 | (10 - 31)} | 0 | 62 | (31 - 100)} | 0 | 63 | (100 - 316)} | 0 | 64 | (316 - 1000)} | 0 | 65 | (1000 - 3162)} | 3 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 66 | (3162 - 10000)} | 2 | ■■■■■■■■■■■■■■■■■■■■ 67 | (10000 - 31622)} | 0 | 68 | (31622 - 100000)} | 0 | 69 | (10 rows) 70 | 71 | DROP EXTENSION pg_stat_monitor; 72 | -------------------------------------------------------------------------------- /regression/expected/histogram_1.out: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION generate_histogram() 2 | RETURNS TABLE ( 3 | range TEXT, freq INT, bar TEXT 4 | ) AS $$ 5 | Declare 6 | bucket_id integer; 7 | query_id text; 8 | BEGIN 9 | select bucket into bucket_id from pg_stat_monitor order by calls desc limit 1; 10 | select queryid into query_id from pg_stat_monitor order by calls desc limit 1; 11 | --RAISE INFO 'bucket_id %', bucket_id; 12 | --RAISE INFO 'query_id %', query_id; 13 | return query 14 | SELECT * FROM histogram(bucket_id, query_id) AS a(range TEXT, freq INT, bar TEXT); 15 | END; 16 | $$ LANGUAGE plpgsql; 17 | CREATE OR REPLACE FUNCTION run_pg_sleep(INTEGER) RETURNS VOID AS $$ 18 | DECLARE 19 | loops ALIAS FOR $1; 20 | BEGIN 21 | FOR i IN 1..loops LOOP 22 | --RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP; 23 | RAISE INFO 'Sleep % seconds', i; 24 | PERFORM pg_sleep(i); 25 | END LOOP; 26 | END; 27 | $$ LANGUAGE 'plpgsql' STRICT; 28 | CREATE EXTENSION pg_stat_monitor; 29 | SELECT pg_stat_monitor_reset(); 30 | pg_stat_monitor_reset 31 | ----------------------- 32 | 33 | (1 row) 34 | 35 | Set pg_stat_monitor.pgsm_track='all'; 36 | select run_pg_sleep(5); 37 | INFO: Sleep 1 seconds 38 | INFO: Sleep 2 seconds 39 | INFO: Sleep 3 seconds 40 | INFO: Sleep 4 seconds 41 | INFO: Sleep 5 seconds 42 | run_pg_sleep 43 | -------------- 44 | 45 | (1 row) 46 | 47 | SELECT substr(query, 0,50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; 48 | query | calls | resp_calls 49 | --------------------------------------+-------+----------------------- 50 | SELECT pg_sleep(i) | 2 | {0,0,0,0,0,0,2,0,0,0} 51 | SELECT pg_sleep(i) | 3 | {0,0,0,0,0,0,1,2,0,0} 52 | SELECT pg_stat_monitor_reset() | 1 | {1,0,0,0,0,0,0,0,0,0} 53 | Set pg_stat_monitor.pgsm_track='all' | 1 | {1,0,0,0,0,0,0,0,0,0} 54 | select run_pg_sleep(5) | 1 | {0,0,0,0,0,0,0,0,1,0} 55 | (5 rows) 56 | 57 | select * from generate_histogram(); 58 | range | freq | bar 59 | --------------------+------+-------------------------------- 60 | (0 - 3)} | 0 | 61 | (3 - 10)} | 0 | 62 | (10 - 31)} | 0 | 63 | (31 - 100)} | 0 | 64 | (100 - 316)} | 0 | 65 | (316 - 1000)} | 0 | 66 | (1000 - 3162)} | 1 | ■■■■■■■■■■■■■■■ 67 | (3162 - 10000)} | 2 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 68 | (10000 - 31622)} | 0 | 69 | (31622 - 100000)} | 0 | 70 | (10 rows) 71 | 72 | DROP EXTENSION pg_stat_monitor; 73 | -------------------------------------------------------------------------------- /regression/expected/histogram_2.out: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION generate_histogram() 2 | RETURNS TABLE ( 3 | range TEXT, freq INT, bar TEXT 4 | ) AS $$ 5 | Declare 6 | bucket_id integer; 7 | query_id text; 8 | BEGIN 9 | select bucket into bucket_id from pg_stat_monitor order by calls desc limit 1; 10 | select queryid into query_id from pg_stat_monitor order by calls desc limit 1; 11 | --RAISE INFO 'bucket_id %', bucket_id; 12 | --RAISE INFO 'query_id %', query_id; 13 | return query 14 | SELECT * FROM histogram(bucket_id, query_id) AS a(range TEXT, freq INT, bar TEXT); 15 | END; 16 | $$ LANGUAGE plpgsql; 17 | CREATE OR REPLACE FUNCTION run_pg_sleep(INTEGER) RETURNS VOID AS $$ 18 | DECLARE 19 | loops ALIAS FOR $1; 20 | BEGIN 21 | FOR i IN 1..loops LOOP 22 | --RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP; 23 | RAISE INFO 'Sleep % seconds', i; 24 | PERFORM pg_sleep(i); 25 | END LOOP; 26 | END; 27 | $$ LANGUAGE 'plpgsql' STRICT; 28 | CREATE EXTENSION pg_stat_monitor; 29 | SELECT pg_stat_monitor_reset(); 30 | pg_stat_monitor_reset 31 | ----------------------- 32 | 33 | (1 row) 34 | 35 | Set pg_stat_monitor.pgsm_track='all'; 36 | select run_pg_sleep(5); 37 | INFO: Sleep 1 seconds 38 | INFO: Sleep 2 seconds 39 | INFO: Sleep 3 seconds 40 | INFO: Sleep 4 seconds 41 | INFO: Sleep 5 seconds 42 | run_pg_sleep 43 | -------------- 44 | 45 | (1 row) 46 | 47 | SELECT substr(query, 0,50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; 48 | query | calls | resp_calls 49 | --------------------------------+-------+----------------------- 50 | SELECT pg_sleep(i) | 5 | {0,0,0,0,0,0,3,2,0,0} 51 | SELECT pg_stat_monitor_reset() | 1 | {1,0,0,0,0,0,0,0,0,0} 52 | select run_pg_sleep(5) | 1 | {0,0,0,0,0,0,0,0,1,0} 53 | (3 rows) 54 | 55 | select * from generate_histogram(); 56 | range | freq | bar 57 | --------------------+------+-------------------------------- 58 | (0 - 3)} | 0 | 59 | (3 - 10)} | 0 | 60 | (10 - 31)} | 0 | 61 | (31 - 100)} | 0 | 62 | (100 - 316)} | 0 | 63 | (316 - 1000)} | 0 | 64 | (1000 - 3162)} | 3 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 65 | (3162 - 10000)} | 2 | ■■■■■■■■■■■■■■■■■■■■ 66 | (10000 - 31622)} | 0 | 67 | (31622 - 100000)} | 0 | 68 | (10 rows) 69 | 70 | DROP EXTENSION pg_stat_monitor; 71 | -------------------------------------------------------------------------------- /regression/expected/level_tracking.out: -------------------------------------------------------------------------------- 1 | -- 2 | -- Statement level tracking 3 | -- 4 | SELECT setting::integer < 140000 AS skip_test FROM pg_settings where name = 'server_version_num' \gset 5 | \if :skip_test 6 | \quit 7 | -------------------------------------------------------------------------------- /regression/expected/pgsm_query_id.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | CREATE DATABASE db1; 3 | CREATE DATABASE db2; 4 | \c db1 5 | CREATE TABLE t1 (a int); 6 | CREATE TABLE t2 (b int); 7 | CREATE FUNCTION add(integer, integer) RETURNS integer 8 | AS 'select $1 + $2;' 9 | LANGUAGE SQL 10 | IMMUTABLE 11 | RETURNS NULL ON NULL INPUT; 12 | \c db2 13 | CREATE TABLE t1 (a int); 14 | CREATE TABLE t3 (c int); 15 | CREATE FUNCTION add(integer, integer) RETURNS integer 16 | AS 'select $1 + $2;' 17 | LANGUAGE SQL 18 | IMMUTABLE 19 | RETURNS NULL ON NULL INPUT; 20 | \c contrib_regression 21 | SELECT pg_stat_monitor_reset(); 22 | pg_stat_monitor_reset 23 | ----------------------- 24 | 25 | (1 row) 26 | 27 | \c db1 28 | SELECT * FROM t1; 29 | a 30 | --- 31 | (0 rows) 32 | 33 | SELECT *, ADD(1, 2) FROM t1; 34 | a | add 35 | ---+----- 36 | (0 rows) 37 | 38 | SELECT * FROM t2; 39 | b 40 | --- 41 | (0 rows) 42 | 43 | -- Check that spaces and comments do not generate a different pgsm_query_id 44 | SELECT * FROM t2 --WHATEVER; 45 | ; 46 | b 47 | --- 48 | (0 rows) 49 | 50 | SELECT * FROM t2 /* ... 51 | ... 52 | More comments to check for spaces. 53 | */ 54 | ; 55 | b 56 | --- 57 | (0 rows) 58 | 59 | \c db2 60 | SELECT * FROM t1; 61 | a 62 | --- 63 | (0 rows) 64 | 65 | SELECT *, ADD(1, 2) FROM t1; 66 | a | add 67 | ---+----- 68 | (0 rows) 69 | 70 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off; 71 | SELECT * FROM t3; 72 | c 73 | --- 74 | (0 rows) 75 | 76 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on; 77 | SELECT * FROM t3 where c = 20; 78 | c 79 | --- 80 | (0 rows) 81 | 82 | \c contrib_regression 83 | SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_query_id, query, datname; 84 | datname | pgsm_query_id | query | calls 85 | --------------------+---------------------+-----------------------------------------------------+------- 86 | contrib_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 87 | db1 | 1897482803466821995 | SELECT * FROM t2 | 3 88 | db1 | 1988437669671417938 | SELECT * FROM t1 | 1 89 | db2 | 1988437669671417938 | SELECT * FROM t1 | 1 90 | db1 | 2864453209316739369 | select $1 + $2 | 1 91 | db2 | 2864453209316739369 | select $1 + $2 | 1 92 | db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 93 | db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 94 | db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 95 | db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 96 | db2 | | SELECT * FROM t3 | 1 97 | db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 98 | (12 rows) 99 | 100 | SELECT pg_stat_monitor_reset(); 101 | pg_stat_monitor_reset 102 | ----------------------- 103 | 104 | (1 row) 105 | 106 | \c db1 107 | DROP TABLE t1; 108 | DROP TABLE t2; 109 | DROP FUNCTION ADD; 110 | \c db2 111 | DROP TABLE t1; 112 | DROP TABLE t3; 113 | DROP FUNCTION ADD; 114 | \c contrib_regression 115 | DROP DATABASE db1; 116 | DROP DATABASE db2; 117 | DROP EXTENSION pg_stat_monitor; 118 | -------------------------------------------------------------------------------- /regression/expected/pgsm_query_id_1.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | CREATE DATABASE db1; 3 | CREATE DATABASE db2; 4 | \c db1 5 | CREATE TABLE t1 (a int); 6 | CREATE TABLE t2 (b int); 7 | CREATE FUNCTION add(integer, integer) RETURNS integer 8 | AS 'select $1 + $2;' 9 | LANGUAGE SQL 10 | IMMUTABLE 11 | RETURNS NULL ON NULL INPUT; 12 | \c db2 13 | CREATE TABLE t1 (a int); 14 | CREATE TABLE t3 (c int); 15 | CREATE FUNCTION add(integer, integer) RETURNS integer 16 | AS 'select $1 + $2;' 17 | LANGUAGE SQL 18 | IMMUTABLE 19 | RETURNS NULL ON NULL INPUT; 20 | \c contrib_regression 21 | SELECT pg_stat_monitor_reset(); 22 | pg_stat_monitor_reset 23 | ----------------------- 24 | 25 | (1 row) 26 | 27 | \c db1 28 | SELECT * FROM t1; 29 | a 30 | --- 31 | (0 rows) 32 | 33 | SELECT *, ADD(1, 2) FROM t1; 34 | a | add 35 | ---+----- 36 | (0 rows) 37 | 38 | SELECT * FROM t2; 39 | b 40 | --- 41 | (0 rows) 42 | 43 | -- Check that spaces and comments do not generate a different pgsm_query_id 44 | SELECT * FROM t2 --WHATEVER; 45 | ; 46 | b 47 | --- 48 | (0 rows) 49 | 50 | SELECT * FROM t2 /* ... 51 | ... 52 | More comments to check for spaces. 53 | */ 54 | ; 55 | b 56 | --- 57 | (0 rows) 58 | 59 | \c db2 60 | SELECT * FROM t1; 61 | a 62 | --- 63 | (0 rows) 64 | 65 | SELECT *, ADD(1, 2) FROM t1; 66 | a | add 67 | ---+----- 68 | (0 rows) 69 | 70 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off; 71 | SELECT * FROM t3; 72 | c 73 | --- 74 | (0 rows) 75 | 76 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on; 77 | SELECT * FROM t3 where c = 20; 78 | c 79 | --- 80 | (0 rows) 81 | 82 | \c contrib_regression 83 | SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_query_id, query, datname; 84 | datname | pgsm_query_id | query | calls 85 | --------------------+---------------------+-----------------------------------------------------+------- 86 | contrib_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 87 | db1 | 1897482803466821995 | SELECT * FROM t2 | 3 88 | db1 | 1988437669671417938 | SELECT * FROM t1 | 1 89 | db2 | 1988437669671417938 | SELECT * FROM t1 | 1 90 | db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 91 | db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 92 | db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 93 | db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 94 | db2 | | SELECT * FROM t3 | 1 95 | db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 96 | (10 rows) 97 | 98 | SELECT pg_stat_monitor_reset(); 99 | pg_stat_monitor_reset 100 | ----------------------- 101 | 102 | (1 row) 103 | 104 | \c db1 105 | DROP TABLE t1; 106 | DROP TABLE t2; 107 | DROP FUNCTION ADD; 108 | \c db2 109 | DROP TABLE t1; 110 | DROP TABLE t3; 111 | DROP FUNCTION ADD; 112 | \c contrib_regression 113 | DROP DATABASE db1; 114 | DROP DATABASE db2; 115 | DROP EXTENSION pg_stat_monitor; 116 | -------------------------------------------------------------------------------- /regression/expected/tags.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | Set pg_stat_monitor.pgsm_extract_comments = 'yes'; 3 | SELECT pg_stat_monitor_reset(); 4 | pg_stat_monitor_reset 5 | ----------------------- 6 | 7 | (1 row) 8 | 9 | SELECT 1 AS num /* { "application", psql_app, "real_ip", 192.168.1.3) */; 10 | num 11 | ----- 12 | 1 13 | (1 row) 14 | 15 | SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C"; 16 | query | comments 17 | --------------------------------------------------------------------------+---------------------------------------------------------- 18 | SELECT 1 AS num /* { "application", psql_app, "real_ip", 192.168.1.3) */ | /* { "application", psql_app, "real_ip", 192.168.1.3) */ 19 | SELECT pg_stat_monitor_reset() | 20 | (2 rows) 21 | 22 | SELECT pg_stat_monitor_reset(); 23 | pg_stat_monitor_reset 24 | ----------------------- 25 | 26 | (1 row) 27 | 28 | DROP EXTENSION pg_stat_monitor; 29 | -------------------------------------------------------------------------------- /regression/expected/top_query.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SET pg_stat_monitor.pgsm_track='all'; 3 | SELECT pg_stat_monitor_reset(); 4 | pg_stat_monitor_reset 5 | ----------------------- 6 | 7 | (1 row) 8 | 9 | CREATE OR REPLACE FUNCTION add(int, int) RETURNS INTEGER AS 10 | $$ 11 | BEGIN 12 | return (select $1 + $2); 13 | END; $$ language plpgsql; 14 | CREATE OR REPLACE FUNCTION add2(int, int) RETURNS INTEGER AS 15 | $$ 16 | BEGIN 17 | return add($1,$2); 18 | END; 19 | $$ language plpgsql; 20 | SELECT add2(1,2); 21 | add2 22 | ------ 23 | 3 24 | (1 row) 25 | 26 | SELECT query, top_query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 27 | query | top_query 28 | --------------------------------------------------------------+------------------- 29 | (select $1 + $2) | SELECT add2(1,2); 30 | CREATE OR REPLACE FUNCTION add(int, int) RETURNS INTEGER AS +| 31 | $$ +| 32 | BEGIN +| 33 | return (select $1 + $2); +| 34 | END; $$ language plpgsql | 35 | CREATE OR REPLACE FUNCTION add2(int, int) RETURNS INTEGER AS+| 36 | $$ +| 37 | BEGIN +| 38 | return add($1,$2); +| 39 | END; +| 40 | $$ language plpgsql | 41 | SELECT add2(1,2) | 42 | SELECT pg_stat_monitor_reset() | 43 | (5 rows) 44 | 45 | SELECT pg_stat_monitor_reset(); 46 | pg_stat_monitor_reset 47 | ----------------------- 48 | 49 | (1 row) 50 | 51 | DROP EXTENSION pg_stat_monitor; 52 | -------------------------------------------------------------------------------- /regression/expected/top_query_1.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SET pg_stat_monitor.pgsm_track='all'; 3 | SELECT pg_stat_monitor_reset(); 4 | pg_stat_monitor_reset 5 | ----------------------- 6 | 7 | (1 row) 8 | 9 | CREATE OR REPLACE FUNCTION add(int, int) RETURNS INTEGER AS 10 | $$ 11 | BEGIN 12 | return (select $1 + $2); 13 | END; $$ language plpgsql; 14 | CREATE OR REPLACE FUNCTION add2(int, int) RETURNS INTEGER AS 15 | $$ 16 | BEGIN 17 | return add($1,$2); 18 | END; 19 | $$ language plpgsql; 20 | SELECT add2(1,2); 21 | add2 22 | ------ 23 | 3 24 | (1 row) 25 | 26 | SELECT query, top_query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 27 | query | top_query 28 | --------------------------------------------------------------+------------------- 29 | CREATE OR REPLACE FUNCTION add(int, int) RETURNS INTEGER AS +| 30 | $$ +| 31 | BEGIN +| 32 | return (select $1 + $2); +| 33 | END; $$ language plpgsql | 34 | CREATE OR REPLACE FUNCTION add2(int, int) RETURNS INTEGER AS+| 35 | $$ +| 36 | BEGIN +| 37 | return add($1,$2); +| 38 | END; +| 39 | $$ language plpgsql | 40 | SELECT (select $1 + $2) | SELECT add2(1,2); 41 | SELECT add2(1,2) | 42 | SELECT pg_stat_monitor_reset() | 43 | (5 rows) 44 | 45 | SELECT pg_stat_monitor_reset(); 46 | pg_stat_monitor_reset 47 | ----------------------- 48 | 49 | (1 row) 50 | 51 | DROP EXTENSION pg_stat_monitor; 52 | -------------------------------------------------------------------------------- /regression/expected/user.out: -------------------------------------------------------------------------------- 1 | CREATE USER su WITH SUPERUSER; 2 | ERROR: role "su" already exists 3 | SET ROLE su; 4 | CREATE EXTENSION pg_stat_monitor; 5 | CREATE USER u1; 6 | CREATE USER u2; 7 | GRANT ALL ON SCHEMA public TO u1; 8 | GRANT ALL ON SCHEMA public TO u2; 9 | SET ROLE su; 10 | SELECT pg_stat_monitor_reset(); 11 | pg_stat_monitor_reset 12 | ----------------------- 13 | 14 | (1 row) 15 | 16 | SET ROLE u1; 17 | SELECT pg_stat_monitor_reset(); 18 | ERROR: permission denied for function pg_stat_monitor_reset 19 | CREATE TABLE t1 (a int); 20 | SELECT * FROM t1; 21 | a 22 | --- 23 | (0 rows) 24 | 25 | SET ROLE u2; 26 | CREATE TABLE t2 (a int); 27 | SELECT * FROM t2; 28 | a 29 | --- 30 | (0 rows) 31 | 32 | DROP TABLE t2; 33 | SET ROLE su; 34 | DROP OWNED BY u2; 35 | DROP USER u2; 36 | SELECT username, query FROM pg_stat_monitor ORDER BY username, query COLLATE "C"; 37 | username | query 38 | ----------+--------------------------------- 39 | su | DROP OWNED BY u2 40 | su | DROP USER u2 41 | su | SELECT pg_stat_monitor_reset() 42 | su | SET ROLE su 43 | u1 | CREATE TABLE t1 (a int) 44 | u1 | SELECT * FROM t1 45 | u1 | SELECT pg_stat_monitor_reset(); 46 | u1 | SET ROLE u1 47 | u2 | CREATE TABLE t2 (a int) 48 | u2 | DROP TABLE t2 49 | u2 | SELECT * FROM t2 50 | u2 | SET ROLE u2 51 | (12 rows) 52 | 53 | SELECT pg_stat_monitor_reset(); 54 | pg_stat_monitor_reset 55 | ----------------------- 56 | 57 | (1 row) 58 | 59 | DROP TABLE t1; 60 | DROP OWNED BY u1; 61 | DROP USER u1; 62 | DROP EXTENSION pg_stat_monitor; 63 | SET ROLE NONE; 64 | DROP OWNED BY su; 65 | DROP USER su; 66 | -------------------------------------------------------------------------------- /regression/expected/version.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_version(); 3 | pg_stat_monitor_version 4 | ------------------------- 5 | 2.1.1 6 | (1 row) 7 | 8 | DROP EXTENSION pg_stat_monitor; 9 | -------------------------------------------------------------------------------- /regression/sql/application_name.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | 4 | SELECT 1 AS num; 5 | SELECT query,application_name FROM pg_stat_monitor ORDER BY query COLLATE "C"; 6 | SELECT pg_stat_monitor_reset(); 7 | 8 | SELECT 1 AS num; 9 | SET pg_stat_monitor.pgsm_track_application_names='no'; 10 | SELECT 1 AS num; 11 | SELECT query,application_name FROM pg_stat_monitor ORDER BY query, application_name COLLATE "C"; 12 | SELECT pg_stat_monitor_reset(); 13 | 14 | DROP EXTENSION pg_stat_monitor; 15 | -------------------------------------------------------------------------------- /regression/sql/application_name_unique.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | SET application_name = 'naeem' ; 4 | SELECT 1 AS num; 5 | SET application_name = 'psql' ; 6 | SELECT 1 AS num; 7 | SELECT query,application_name FROM pg_stat_monitor ORDER BY query, application_name COLLATE "C"; 8 | SELECT pg_stat_monitor_reset(); 9 | DROP EXTENSION pg_stat_monitor; 10 | -------------------------------------------------------------------------------- /regression/sql/basic.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | SELECT 1 AS num; 4 | SELECT query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 5 | SELECT pg_stat_monitor_reset(); 6 | DROP EXTENSION pg_stat_monitor; 7 | -------------------------------------------------------------------------------- /regression/sql/cmd_type.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | 3 | SELECT pg_stat_monitor_reset(); 4 | CREATE TABLE t1 (a INTEGER); 5 | CREATE TABLE t2 (b INTEGER); 6 | INSERT INTO t1 VALUES(1); 7 | SELECT a FROM t1; 8 | UPDATE t1 SET a = 2; 9 | DELETE FROM t1; 10 | SELECT b FROM t2 FOR UPDATE; 11 | TRUNCATE t1; 12 | DROP TABLE t1; 13 | DROP TABLE t2; 14 | SELECT query, cmd_type, cmd_type_text FROM pg_stat_monitor ORDER BY query COLLATE "C"; 15 | SELECT pg_stat_monitor_reset(); 16 | 17 | DROP EXTENSION pg_stat_monitor; 18 | -------------------------------------------------------------------------------- /regression/sql/counters.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | Set pg_stat_monitor.pgsm_track='all'; 3 | SELECT pg_stat_monitor_reset(); 4 | 5 | CREATE TABLE t1 (a INTEGER); 6 | CREATE TABLE t2 (b INTEGER); 7 | CREATE TABLE t3 (c INTEGER); 8 | CREATE TABLE t4 (d INTEGER); 9 | 10 | SELECT pg_stat_monitor_reset(); 11 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 12 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 13 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 14 | SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 15 | SELECT query, sum(calls) as calls FROM pg_stat_monitor GROUP BY query ORDER BY query COLLATE "C"; 16 | 17 | SELECT pg_stat_monitor_reset(); 18 | 19 | do $$ 20 | declare 21 | n integer:= 1; 22 | begin 23 | loop 24 | PERFORM a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; 25 | exit when n = 1000; 26 | n := n + 1; 27 | end loop; 28 | end $$; 29 | SELECT query, sum(calls) as calls FROM pg_stat_monitor GROUP BY query ORDER BY query COLLATE "C"; 30 | 31 | DROP TABLE t1; 32 | DROP TABLE t2; 33 | DROP TABLE t3; 34 | DROP TABLE t4; 35 | 36 | DROP EXTENSION pg_stat_monitor; 37 | -------------------------------------------------------------------------------- /regression/sql/database.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | 3 | CREATE DATABASE db1; 4 | CREATE DATABASE db2; 5 | 6 | \c db1 7 | CREATE TABLE t1 (a int); 8 | CREATE TABLE t2 (b int); 9 | 10 | \c db2 11 | CREATE TABLE t3 (c int); 12 | CREATE TABLE t4 (d int); 13 | 14 | \c contrib_regression 15 | SELECT pg_stat_monitor_reset(); 16 | \c db1 17 | SELECT * FROM t1,t2 WHERE t1.a = t2.b; 18 | 19 | \c db2 20 | SELECT * FROM t3,t4 WHERE t3.c = t4.d; 21 | 22 | \c contrib_regression 23 | DROP DATABASE db2; 24 | 25 | SELECT datname, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 26 | SELECT pg_stat_monitor_reset(); 27 | 28 | \c db1 29 | DROP TABLE t1; 30 | DROP TABLE t2; 31 | 32 | \c contrib_regression 33 | DROP DATABASE db1; 34 | DROP EXTENSION pg_stat_monitor; 35 | -------------------------------------------------------------------------------- /regression/sql/different_parent_queries.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SET pg_stat_monitor.pgsm_track='all'; 3 | SELECT pg_stat_monitor_reset(); 4 | 5 | CREATE OR REPLACE FUNCTION test() RETURNS VOID AS 6 | $$ 7 | BEGIN 8 | PERFORM 1 + 2; 9 | END; $$ language plpgsql; 10 | 11 | CREATE OR REPLACE FUNCTION test2() RETURNS VOID AS 12 | $$ 13 | BEGIN 14 | PERFORM 1 + 2; 15 | END; $$ language plpgsql; 16 | 17 | SELECT pg_stat_monitor_reset(); 18 | SELECT test(); 19 | SELECT test2(); 20 | 21 | SELECT 1 + 2; 22 | SELECT left(query, 15) as query, calls, top_query, pgsm_query_id FROM pg_stat_monitor ORDER BY query, top_query COLLATE "C"; 23 | 24 | DROP EXTENSION pg_stat_monitor; -------------------------------------------------------------------------------- /regression/sql/error.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | SELECT 1/0; -- divide by zero 4 | SELECT * FROM unknown; -- unknown table 5 | ELECET * FROM unknown; -- syntax error 6 | 7 | do $$ 8 | BEGIN 9 | RAISE WARNING 'warning message'; 10 | END $$; 11 | 12 | SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C",elevel; 13 | SELECT pg_stat_monitor_reset(); 14 | DROP EXTENSION pg_stat_monitor; 15 | -------------------------------------------------------------------------------- /regression/sql/error_insert.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS Company; 2 | 3 | CREATE TABLE Company( 4 | ID INT PRIMARY KEY NOT NULL, 5 | NAME TEXT NOT NULL 6 | ); 7 | 8 | 9 | CREATE EXTENSION pg_stat_monitor; 10 | SELECT pg_stat_monitor_reset(); 11 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); 12 | INSERT INTO Company(ID, Name) VALUES (1, 'Percona'); 13 | 14 | DROP TABLE IF EXISTS Company; 15 | SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C",elevel; 16 | SELECT pg_stat_monitor_reset(); 17 | DROP EXTENSION pg_stat_monitor; 18 | -------------------------------------------------------------------------------- /regression/sql/functions.sql: -------------------------------------------------------------------------------- 1 | DROP ROLE IF EXISTS su; 2 | CREATE USER su WITH SUPERUSER; 3 | SET ROLE su; 4 | 5 | CREATE EXTENSION pg_stat_monitor; 6 | CREATE USER u1; 7 | 8 | SELECT pg_stat_monitor_reset(); 9 | SELECT routine_schema, routine_name, routine_type, data_type FROM information_schema.routines WHERE routine_schema = 'public' ORDER BY routine_name COLLATE "C"; 10 | 11 | SET ROLE u1; 12 | SELECT routine_schema, routine_name, routine_type, data_type FROM information_schema.routines WHERE routine_schema = 'public' ORDER BY routine_name COLLATE "C"; 13 | 14 | SET ROLE su; 15 | DROP USER u1; 16 | DROP EXTENSION pg_stat_monitor; 17 | DROP USER su; 18 | -------------------------------------------------------------------------------- /regression/sql/guc.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | 3 | SELECT name 4 | , setting 5 | , unit 6 | , context 7 | , vartype 8 | , source 9 | , min_val 10 | , max_val 11 | , enumvals 12 | , boot_val 13 | , reset_val 14 | , pending_restart 15 | FROM pg_settings 16 | WHERE name LIKE 'pg_stat_monitor.%' 17 | ORDER 18 | BY name 19 | COLLATE "C"; 20 | 21 | DROP EXTENSION pg_stat_monitor; 22 | -------------------------------------------------------------------------------- /regression/sql/histogram.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION generate_histogram() 2 | RETURNS TABLE ( 3 | range TEXT, freq INT, bar TEXT 4 | ) AS $$ 5 | Declare 6 | bucket_id integer; 7 | query_id text; 8 | BEGIN 9 | select bucket into bucket_id from pg_stat_monitor order by calls desc limit 1; 10 | select queryid into query_id from pg_stat_monitor order by calls desc limit 1; 11 | --RAISE INFO 'bucket_id %', bucket_id; 12 | --RAISE INFO 'query_id %', query_id; 13 | return query 14 | SELECT * FROM histogram(bucket_id, query_id) AS a(range TEXT, freq INT, bar TEXT); 15 | END; 16 | $$ LANGUAGE plpgsql; 17 | 18 | CREATE OR REPLACE FUNCTION run_pg_sleep(INTEGER) RETURNS VOID AS $$ 19 | DECLARE 20 | loops ALIAS FOR $1; 21 | BEGIN 22 | FOR i IN 1..loops LOOP 23 | --RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP; 24 | RAISE INFO 'Sleep % seconds', i; 25 | PERFORM pg_sleep(i); 26 | END LOOP; 27 | END; 28 | $$ LANGUAGE 'plpgsql' STRICT; 29 | 30 | CREATE EXTENSION pg_stat_monitor; 31 | SELECT pg_stat_monitor_reset(); 32 | Set pg_stat_monitor.pgsm_track='all'; 33 | select run_pg_sleep(5); 34 | 35 | SELECT substr(query, 0,50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; 36 | 37 | select * from generate_histogram(); 38 | 39 | DROP EXTENSION pg_stat_monitor; 40 | -------------------------------------------------------------------------------- /regression/sql/pgsm_query_id.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | 3 | CREATE DATABASE db1; 4 | CREATE DATABASE db2; 5 | 6 | \c db1 7 | CREATE TABLE t1 (a int); 8 | CREATE TABLE t2 (b int); 9 | 10 | CREATE FUNCTION add(integer, integer) RETURNS integer 11 | AS 'select $1 + $2;' 12 | LANGUAGE SQL 13 | IMMUTABLE 14 | RETURNS NULL ON NULL INPUT; 15 | 16 | \c db2 17 | CREATE TABLE t1 (a int); 18 | CREATE TABLE t3 (c int); 19 | 20 | CREATE FUNCTION add(integer, integer) RETURNS integer 21 | AS 'select $1 + $2;' 22 | LANGUAGE SQL 23 | IMMUTABLE 24 | RETURNS NULL ON NULL INPUT; 25 | 26 | \c contrib_regression 27 | SELECT pg_stat_monitor_reset(); 28 | \c db1 29 | SELECT * FROM t1; 30 | SELECT *, ADD(1, 2) FROM t1; 31 | SELECT * FROM t2; 32 | -- Check that spaces and comments do not generate a different pgsm_query_id 33 | SELECT * FROM t2 --WHATEVER; 34 | ; 35 | SELECT * FROM t2 /* ... 36 | ... 37 | More comments to check for spaces. 38 | */ 39 | ; 40 | 41 | \c db2 42 | SELECT * FROM t1; 43 | SELECT *, ADD(1, 2) FROM t1; 44 | 45 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off; 46 | SELECT * FROM t3; 47 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on; 48 | SELECT * FROM t3 where c = 20; 49 | 50 | 51 | \c contrib_regression 52 | SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_query_id, query, datname; 53 | SELECT pg_stat_monitor_reset(); 54 | 55 | \c db1 56 | DROP TABLE t1; 57 | DROP TABLE t2; 58 | DROP FUNCTION ADD; 59 | 60 | \c db2 61 | DROP TABLE t1; 62 | DROP TABLE t3; 63 | DROP FUNCTION ADD; 64 | 65 | \c contrib_regression 66 | DROP DATABASE db1; 67 | DROP DATABASE db2; 68 | DROP EXTENSION pg_stat_monitor; 69 | -------------------------------------------------------------------------------- /regression/sql/relations.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | CREATE TABLE foo1(a int); 4 | CREATE TABLE foo2(b int); 5 | CREATE TABLE foo3(c int); 6 | CREATE TABLE foo4(d int); 7 | 8 | -- test the simple table names 9 | SELECT pg_stat_monitor_reset(); 10 | SELECT * FROM foo1; 11 | SELECT * FROM foo1, foo2; 12 | SELECT * FROM foo1, foo2, foo3; 13 | SELECT * FROM foo1, foo2, foo3, foo4; 14 | SELECT query, relations from pg_stat_monitor ORDER BY query collate "C"; 15 | SELECT pg_stat_monitor_reset(); 16 | 17 | 18 | -- test the schema qualified table 19 | CREATE SCHEMA sch1; 20 | CREATE SCHEMA sch2; 21 | CREATE SCHEMA sch3; 22 | CREATE SCHEMA sch4; 23 | 24 | CREATE TABLE sch1.foo1(a int); 25 | CREATE TABLE sch2.foo2(b int); 26 | CREATE TABLE sch3.foo3(c int); 27 | CREATE TABLE sch4.foo4(d int); 28 | 29 | SELECT pg_stat_monitor_reset(); 30 | SELECT * FROM sch1.foo1; 31 | SELECT * FROM sch1.foo1, sch2.foo2; 32 | SELECT * FROM sch1.foo1, sch2.foo2, sch3.foo3; 33 | SELECT * FROM sch1.foo1, sch2.foo2, sch3.foo3, sch4.foo4; 34 | SELECT query, relations from pg_stat_monitor ORDER BY query collate "C"; 35 | SELECT pg_stat_monitor_reset(); 36 | 37 | SELECT pg_stat_monitor_reset(); 38 | SELECT * FROM sch1.foo1, foo1; 39 | SELECT * FROM sch1.foo1, sch2.foo2, foo1, foo2; 40 | SELECT query, relations from pg_stat_monitor ORDER BY query; 41 | SELECT pg_stat_monitor_reset(); 42 | 43 | -- test the view 44 | CREATE VIEW v1 AS SELECT * from foo1; 45 | CREATE VIEW v2 AS SELECT * from foo1,foo2; 46 | CREATE VIEW v3 AS SELECT * from foo1,foo2,foo3; 47 | CREATE VIEW v4 AS SELECT * from foo1,foo2,foo3,foo4; 48 | 49 | SELECT pg_stat_monitor_reset(); 50 | SELECT * FROM v1; 51 | SELECT * FROM v1,v2; 52 | SELECT * FROM v1,v2,v3; 53 | SELECT * FROM v1,v2,v3,v4; 54 | SELECT query, relations from pg_stat_monitor ORDER BY query collate "C"; 55 | SELECT pg_stat_monitor_reset(); 56 | 57 | 58 | DROP VIEW v1; 59 | DROP VIEW v2; 60 | DROP VIEW v3; 61 | DROP VIEW v4; 62 | 63 | DROP TABLE foo1; 64 | DROP TABLE foo2; 65 | DROP TABLE foo3; 66 | DROP TABLE foo4; 67 | 68 | DROP TABLE sch1.foo1; 69 | DROP TABLE sch2.foo2; 70 | DROP TABLE sch3.foo3; 71 | DROP TABLE sch4.foo4; 72 | 73 | DROP SCHEMA sch1; 74 | DROP SCHEMA sch2; 75 | DROP SCHEMA sch3; 76 | DROP SCHEMA sch4; 77 | 78 | 79 | DROP EXTENSION pg_stat_monitor; 80 | -------------------------------------------------------------------------------- /regression/sql/rows.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | 3 | CREATE TABLE t1(a int); 4 | CREATE TABLE t2(b int); 5 | INSERT INTO t1 VALUES(generate_series(1,1000)); 6 | INSERT INTO t2 VALUES(generate_series(1,5000)); 7 | 8 | SELECT pg_stat_monitor_reset(); 9 | SELECT * FROM t1; 10 | SELECT * FROM t2; 11 | 12 | SELECT * FROM t1 LIMIT 10; 13 | SELECt * FROM t2 WHERE b % 2 = 0; 14 | 15 | SELECT query, rows FROM pg_stat_monitor ORDER BY query COLLATE "C"; 16 | SELECT pg_stat_monitor_reset(); 17 | 18 | DROP TABLE t1; 19 | DROP TABLE t2; 20 | DROP EXTENSION pg_stat_monitor; 21 | -------------------------------------------------------------------------------- /regression/sql/state.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | SELECT 1; 4 | SELECT 1/0; -- divide by zero 5 | 6 | SELECT query, state_code, state FROM pg_stat_monitor ORDER BY query COLLATE "C"; 7 | SELECT pg_stat_monitor_reset(); 8 | DROP EXTENSION pg_stat_monitor; 9 | -------------------------------------------------------------------------------- /regression/sql/tags.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | Set pg_stat_monitor.pgsm_extract_comments = 'yes'; 3 | SELECT pg_stat_monitor_reset(); 4 | SELECT 1 AS num /* { "application", psql_app, "real_ip", 192.168.1.3) */; 5 | SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C"; 6 | SELECT pg_stat_monitor_reset(); 7 | DROP EXTENSION pg_stat_monitor; 8 | -------------------------------------------------------------------------------- /regression/sql/top_query.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SET pg_stat_monitor.pgsm_track='all'; 3 | SELECT pg_stat_monitor_reset(); 4 | CREATE OR REPLACE FUNCTION add(int, int) RETURNS INTEGER AS 5 | $$ 6 | BEGIN 7 | return (select $1 + $2); 8 | END; $$ language plpgsql; 9 | 10 | CREATE OR REPLACE FUNCTION add2(int, int) RETURNS INTEGER AS 11 | $$ 12 | BEGIN 13 | return add($1,$2); 14 | END; 15 | $$ language plpgsql; 16 | 17 | SELECT add2(1,2); 18 | SELECT query, top_query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 19 | SELECT pg_stat_monitor_reset(); 20 | DROP EXTENSION pg_stat_monitor; 21 | -------------------------------------------------------------------------------- /regression/sql/user.sql: -------------------------------------------------------------------------------- 1 | CREATE USER su WITH SUPERUSER; 2 | 3 | SET ROLE su; 4 | CREATE EXTENSION pg_stat_monitor; 5 | 6 | CREATE USER u1; 7 | CREATE USER u2; 8 | 9 | GRANT ALL ON SCHEMA public TO u1; 10 | GRANT ALL ON SCHEMA public TO u2; 11 | 12 | SET ROLE su; 13 | SELECT pg_stat_monitor_reset(); 14 | 15 | SET ROLE u1; 16 | SELECT pg_stat_monitor_reset(); 17 | CREATE TABLE t1 (a int); 18 | SELECT * FROM t1; 19 | 20 | SET ROLE u2; 21 | CREATE TABLE t2 (a int); 22 | SELECT * FROM t2; 23 | DROP TABLE t2; 24 | 25 | SET ROLE su; 26 | 27 | DROP OWNED BY u2; 28 | DROP USER u2; 29 | 30 | SELECT username, query FROM pg_stat_monitor ORDER BY username, query COLLATE "C"; 31 | SELECT pg_stat_monitor_reset(); 32 | 33 | DROP TABLE t1; 34 | DROP OWNED BY u1; 35 | DROP USER u1; 36 | 37 | DROP EXTENSION pg_stat_monitor; 38 | 39 | SET ROLE NONE; 40 | 41 | DROP OWNED BY su; 42 | DROP USER su; 43 | -------------------------------------------------------------------------------- /regression/sql/version.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_version(); 3 | DROP EXTENSION pg_stat_monitor; 4 | -------------------------------------------------------------------------------- /rpm/pg-stat-monitor.spec: -------------------------------------------------------------------------------- 1 | %global sname percona-pg_stat_monitor 2 | %global pgrel @@PG_REL@@ 3 | %global rpm_release @@RPM_RELEASE@@ 4 | %global pginstdir /usr/pgsql-@@PG_REL@@/ 5 | 6 | Summary: Statistics collector for PostgreSQL 7 | Name: %{sname}%{pgrel} 8 | Version: @@VERSION@@ 9 | Release: %{rpm_release}%{?dist} 10 | License: PostgreSQL 11 | Source0: percona-pg-stat-monitor%{pgrel}-%{version}.tar.gz 12 | URL: https://github.com/Percona-Lab/pg_stat_monitor 13 | BuildRequires: percona-postgresql%{pgrel}-devel 14 | Requires: postgresql-server 15 | Provides: percona-pg-stat-monitor%{pgrel} 16 | Conflicts: percona-pg-stat-monitor%{pgrel} 17 | Obsoletes: percona-pg-stat-monitor%{pgrel} 18 | Epoch: 1 19 | Packager: Percona Development Team 20 | Vendor: Percona, Inc 21 | 22 | %description 23 | The pg_stat_monitor is statistics collector tool 24 | based on PostgreSQL's contrib module "pg_stat_statements". 25 | . 26 | pg_stat_monitor is developed on the basis of pg_stat_statments 27 | as more advanced replacement for pg_stat_statment. 28 | It provides all the features of pg_stat_statment plus its own feature set. 29 | 30 | 31 | %prep 32 | %setup -q -n percona-pg-stat-monitor%{pgrel}-%{version} 33 | 34 | 35 | %build 36 | sed -i 's:PG_CONFIG ?= pg_config:PG_CONFIG = /usr/pgsql-%{pgrel}/bin/pg_config:' Makefile 37 | %{__make} USE_PGXS=1 %{?_smp_mflags} 38 | 39 | 40 | %install 41 | %{__rm} -rf %{buildroot} 42 | %{__make} USE_PGXS=1 %{?_smp_mflags} install DESTDIR=%{buildroot} 43 | %{__install} -d %{buildroot}%{pginstdir}/share/extension 44 | %{__install} -m 755 README.md %{buildroot}%{pginstdir}/share/extension/README-pg_stat_monitor 45 | 46 | 47 | %clean 48 | %{__rm} -rf %{buildroot} 49 | 50 | 51 | %post -p /sbin/ldconfig 52 | 53 | 54 | %postun -p /sbin/ldconfig 55 | 56 | 57 | %files 58 | %defattr(755,root,root,755) 59 | %doc %{pginstdir}/share/extension/README-pg_stat_monitor 60 | %{pginstdir}/lib/pg_stat_monitor.so 61 | %{pginstdir}/share/extension/pg_stat_monitor--*.sql 62 | %{pginstdir}/share/extension/pg_stat_monitor.control 63 | %{pginstdir}/lib/bitcode/pg_stat_monitor*.bc 64 | %{pginstdir}/lib/bitcode/pg_stat_monitor/*.bc 65 | 66 | 67 | %changelog 68 | * Thu May 26 2022 Kai Wagner - 1.0.1-1 69 | - First patch release 70 | 71 | * Wed Nov 17 2021 Evgeniy Patlan - 1.0.0-1 72 | - Initial build 73 | -------------------------------------------------------------------------------- /t/001_settings_default.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get file name and CREATE out file name and dirs WHERE requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # CREATE new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # UPDATE postgresql.conf to include/load pg_stat_monitor library 20 | open my $conf, '>>', "$pgdata/postgresql.conf"; 21 | print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; 22 | close $conf; 23 | 24 | # Start server 25 | my $rt_value = $node->start; 26 | ok($rt_value == 1, "Start Server"); 27 | 28 | # CREATE EXTENSION and change out file permissions 29 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 30 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 31 | PGSM::append_to_file($stdout); 32 | 33 | # Run required commands/queries and dump output to out file. 34 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 35 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 36 | PGSM::append_to_file($stdout); 37 | 38 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name LIKE '%pg_stat_monitor%';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 39 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 40 | PGSM::append_to_file($stdout); 41 | 42 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT datname, substr(query,0,100) AS query, calls FROM pg_stat_monitor ORDER BY datname, query, calls DESC Limit 20;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 43 | ok($cmdret == 0, "SELECT XXX FROM pg_stat_monitor"); 44 | PGSM::append_to_file($stdout); 45 | 46 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name LIKE '%pg_stat_monitor%';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 47 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 48 | PGSM::append_to_file($stdout); 49 | 50 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 51 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 52 | PGSM::append_to_file($stdout); 53 | 54 | # DROP EXTENSION 55 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 56 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 57 | PGSM::append_to_file($stdout); 58 | 59 | # Stop the server 60 | $node->stop; 61 | 62 | # compare the expected and out file 63 | my $compare = PGSM->compare_results(); 64 | 65 | # Test/check if expected and result/out file match. If Yes, test passes. 66 | is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); 67 | 68 | # Done testing for this testcase file. 69 | done_testing(); 70 | -------------------------------------------------------------------------------- /t/003_settings_pgms_extract_comments.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get file name and CREATE out file name and dirs WHERE requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # CREATE new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # UPDATE postgresql.conf to include/load pg_stat_monitor library 20 | open my $conf, '>>', "$pgdata/postgresql.conf"; 21 | print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; 22 | print $conf "pg_stat_monitor.pgsm_extract_comments = 'yes'\n"; 23 | close $conf; 24 | 25 | # Start server 26 | my $rt_value = $node->start; 27 | ok($rt_value == 1, "Start Server"); 28 | 29 | # CREATE EXTENSION and change out file permissions 30 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 31 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 32 | PGSM::append_to_file($stdout); 33 | 34 | # Run required commands/queries and dump output to out file. 35 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 36 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 37 | PGSM::append_to_file($stdout); 38 | 39 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name = 'pg_stat_monitor.pgsm_extract_comments';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 40 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 41 | PGSM::append_to_file($stdout); 42 | 43 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT 1 AS num /* First comment */, 'John' AS Name /* Second comment*/;", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 44 | PGSM::append_to_file($stdout); 45 | 46 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C";', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 47 | PGSM::append_to_file($stdout); 48 | 49 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_extract_comments = 'no'\n"); 50 | $node->restart(); 51 | 52 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 53 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 54 | PGSM::append_to_file($stdout); 55 | 56 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name = 'pg_stat_monitor.pgsm_extract_comments';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 57 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 58 | PGSM::append_to_file($stdout); 59 | 60 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT 1 AS num /* First comment */, 'John' AS Name /* Second comment*/;", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 61 | PGSM::append_to_file($stdout); 62 | 63 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C";', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 64 | PGSM::append_to_file($stdout); 65 | 66 | # DROP EXTENSION 67 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 68 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 69 | PGSM::append_to_file($stdout); 70 | 71 | # Stop the server 72 | $node->stop; 73 | 74 | # compare the expected and out file 75 | my $compare = PGSM->compare_results(); 76 | 77 | # Test/check if expected and result/out file match. If Yes, test passes. 78 | is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); 79 | 80 | # Done testing for this testcase file. 81 | done_testing(); 82 | -------------------------------------------------------------------------------- /t/004_settings_pgsm_track.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get file name and CREATE out file name and dirs WHERE requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # CREATE new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # UPDATE postgresql.conf to include/load pg_stat_monitor library 20 | open my $conf, '>>', "$pgdata/postgresql.conf"; 21 | print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; 22 | print $conf "pg_stat_monitor.pgsm_track = 'none'\n"; 23 | close $conf; 24 | 25 | # Start server 26 | my $rt_value = $node->start; 27 | ok($rt_value == 1, "Start Server"); 28 | 29 | # CREATE EXTENSION and change out file permissions 30 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 31 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 32 | PGSM::append_to_file($stdout); 33 | 34 | # Run required commands/queries and dump output to out file. 35 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 36 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 37 | PGSM::append_to_file($stdout); 38 | 39 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_track';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 40 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 41 | PGSM::append_to_file($stdout); 42 | 43 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 44 | PGSM::append_to_file($stdout); 45 | 46 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_track = 'all'\n"); 47 | $node->restart(); 48 | 49 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_track';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 50 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 51 | PGSM::append_to_file($stdout); 52 | 53 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 54 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 55 | PGSM::append_to_file($stdout); 56 | 57 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_track = 'top'\n"); 58 | $node->restart(); 59 | 60 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_track';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 61 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 62 | PGSM::append_to_file($stdout); 63 | 64 | # DROP EXTENSION 65 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 66 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 67 | PGSM::append_to_file($stdout); 68 | 69 | # Stop the server 70 | $node->stop; 71 | 72 | # compare the expected and out file 73 | my $compare = PGSM->compare_results(); 74 | 75 | # Test/check if expected and result/out file match. If Yes, test passes. 76 | is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); 77 | 78 | # Done testing for this testcase file. 79 | done_testing(); 80 | -------------------------------------------------------------------------------- /t/006_settings_pgsm_overflow_target.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get file name and CREATE out file name and dirs WHERE requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # CREATE new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # UPDATE postgresql.conf to include/load pg_stat_monitor library 20 | open my $conf, '>>', "$pgdata/postgresql.conf"; 21 | print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; 22 | print $conf "pg_stat_monitor.pgsm_enable_overflow = false\n"; 23 | close $conf; 24 | 25 | # Start server 26 | my $rt_value = $node->start; 27 | ok($rt_value == 1, "Start Server"); 28 | 29 | # CREATE EXTENSION and change out file permissions 30 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 31 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 32 | PGSM::append_to_file($stdout); 33 | 34 | # Run required commands/queries and dump output to out file. 35 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 36 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 37 | PGSM::append_to_file($stdout); 38 | 39 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_enable_overflow';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 40 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 41 | PGSM::append_to_file($stdout); 42 | 43 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_enable_overflow = true\n"); 44 | $node->restart(); 45 | 46 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 47 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 48 | PGSM::append_to_file($stdout); 49 | 50 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_enable_overflow';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 51 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 52 | PGSM::append_to_file($stdout); 53 | 54 | # DROP EXTENSION 55 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 56 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 57 | PGSM::append_to_file($stdout); 58 | 59 | # Stop the server 60 | $node->stop; 61 | 62 | # compare the expected and out file 63 | my $compare = PGSM->compare_results(); 64 | 65 | # Test/check if expected and result/out file match. If Yes, test passes. 66 | is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); 67 | 68 | # Done testing for this testcase file. 69 | done_testing(); 70 | -------------------------------------------------------------------------------- /t/009_settings_pgsm_histogram_max.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get file name and CREATE out file name and dirs WHERE requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # CREATE new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # UPDATE postgresql.conf to include/load pg_stat_monitor library 20 | open my $conf, '>>', "$pgdata/postgresql.conf"; 21 | print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; 22 | print $conf "pg_stat_monitor.pgsm_histogram_max = 1\n"; 23 | close $conf; 24 | 25 | # Start server 26 | my $rt_value = $node->start; 27 | ok($rt_value == 1, "Start Server"); 28 | 29 | # CREATE EXTENSION and change out file permissions 30 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 31 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 32 | PGSM::append_to_file($stdout); 33 | 34 | # Run required commands/queries and dump output to out file. 35 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 36 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 37 | PGSM::append_to_file($stdout); 38 | 39 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_max';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 40 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 41 | PGSM::append_to_file($stdout); 42 | 43 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_histogram_max = 50\n"); 44 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_histogram_buckets = 3\n"); 45 | $node->restart(); 46 | 47 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 48 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 49 | PGSM::append_to_file($stdout); 50 | 51 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_max';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 52 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 53 | PGSM::append_to_file($stdout); 54 | 55 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_histogram_max = 1000\n"); 56 | $node->restart(); 57 | 58 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 59 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 60 | PGSM::append_to_file($stdout); 61 | 62 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_max';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 63 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 64 | PGSM::append_to_file($stdout); 65 | 66 | # DROP EXTENSION 67 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 68 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 69 | PGSM::append_to_file($stdout); 70 | 71 | # Stop the server 72 | $node->stop; 73 | 74 | # compare the expected and out file 75 | my $compare = PGSM->compare_results(); 76 | 77 | # Test/check if expected and result/out file match. If Yes, test passes. 78 | is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); 79 | 80 | # Done testing for this testcase file. 81 | done_testing(); 82 | -------------------------------------------------------------------------------- /t/010_settings_pgsm_histogram_min.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get file name and CREATE out file name and dirs WHERE requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # CREATE new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # UPDATE postgresql.conf to include/load pg_stat_monitor library 20 | open my $conf, '>>', "$pgdata/postgresql.conf"; 21 | print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; 22 | print $conf "pg_stat_monitor.pgsm_histogram_min = 1\n"; 23 | close $conf; 24 | 25 | # Start server 26 | my $rt_value = $node->start; 27 | ok($rt_value == 1, "Start Server"); 28 | 29 | # CREATE EXTENSION and change out file permissions 30 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 31 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 32 | PGSM::append_to_file($stdout); 33 | 34 | # Run required commands/queries and dump output to out file. 35 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 36 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 37 | PGSM::append_to_file($stdout); 38 | 39 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_min';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 40 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 41 | PGSM::append_to_file($stdout); 42 | 43 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_histogram_min = 20\n"); 44 | $node->restart(); 45 | 46 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 47 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 48 | PGSM::append_to_file($stdout); 49 | 50 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_min';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 51 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 52 | PGSM::append_to_file($stdout); 53 | 54 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_histogram_min = 100\n"); 55 | $node->restart(); 56 | 57 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 58 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 59 | PGSM::append_to_file($stdout); 60 | 61 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_min';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 62 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 63 | PGSM::append_to_file($stdout); 64 | 65 | # DROP EXTENSION 66 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 67 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 68 | PGSM::append_to_file($stdout); 69 | 70 | # Stop the server 71 | $node->stop; 72 | 73 | # compare the expected and out file 74 | my $compare = PGSM->compare_results(); 75 | 76 | # Test/check if expected and result/out file match. If Yes, test passes. 77 | is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); 78 | 79 | # Done testing for this testcase file. 80 | done_testing(); 81 | -------------------------------------------------------------------------------- /t/023_missing_queries.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # Tap test for PG-291 / eb4087be4e8cce8eb19d893d9a47975dd19039a0 bug fix. 4 | # 5 | # Before the fix, there were scenarios in which pg_stat_monitor could lose 6 | # queries (thus wrong call count/stats) when transitioning to a new bucket. 7 | # 8 | # The problem before the fix is DESCribed below: 9 | # 1. Say current active bucket number is 1. 10 | # 2. QueryID XYZ has call count (calls) = 4. 11 | # 3. QueryID also has a pending query (not yet finished). 12 | # 4. Bucket 1 timer expires, pg_stat_monitor moves to bucket 2. 13 | # 5. pg_stat_monitor moves only the pending QueryID XYZ to bucket 2. 14 | # 6. Remove QueryID XYZ FROM bucket 1 (all stats, calls=4, etc..). 15 | # 16 | # Since only the pending QueryID XYZ was moved to bucket 2, all 17 | # previous statistics for the same QueryID would have been incorrectly 18 | # removed FROM the previous bucket (1). 19 | # 20 | # PG-291 fixes the problem, by keeping finished queries in the previous bucket 21 | # and moving only the pending query to the new bucket. 22 | # 23 | # This test works AS follows: 24 | # 1. Set pg_stat_monitor bucket time to 14 seconds. 25 | # 2. Start PostgreSQL, reset pg_stat_monitor view. 26 | # 3. Execute "SELECT pg_sleep(5)" three times in a row. 27 | # It's expected that the first two queries execute and finish in the 28 | # first bucket, then the last query starts in the same bucket but is finished 29 | # in the next bucket. 30 | # We expect a total query count of 3 for this query, and it must exist in two 31 | # buckets. 32 | 33 | use strict; 34 | use warnings; 35 | use File::Basename; 36 | use File::Compare; 37 | use File::Copy; 38 | use Test::More; 39 | use lib 't'; 40 | use pgsm; 41 | 42 | # Get file name and CREATE out file name and dirs WHERE requried 43 | PGSM::setup_files_dir(basename($0)); 44 | 45 | # CREATE new PostgreSQL node and do initdb 46 | my $node = PGSM->pgsm_init_pg(); 47 | my $pgdata = $node->data_dir; 48 | 49 | $node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_stat_monitor'"); 50 | # Set bucket duration to 14 seconds so tests don't take too long. 51 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_bucket_time = 14"); 52 | 53 | # Start server 54 | my $rt_value = $node->start; 55 | ok($rt_value == 1, "Start Server"); 56 | 57 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 58 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 59 | 60 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 61 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 62 | 63 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_sleep(5)"); 64 | ok($cmdret == 0, "1 - SELECT pg_sleep(5)"); 65 | 66 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_sleep(5)"); 67 | ok($cmdret == 0, "2 - SELECT pg_sleep(5)"); 68 | 69 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_sleep(5)"); 70 | ok($cmdret == 0, "3 - SELECT pg_sleep(5)"); 71 | 72 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT bucket, queryid, calls, query FROM pg_stat_monitor;', extra_params => ['-a', '-Pformat=aligned']); 73 | ok($cmdret == 0, "Query pg_stat_monitor view"); 74 | 75 | sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s }; 76 | 77 | my $last_bucket = ""; 78 | my $bucket_cnt = 0; 79 | my $calls = 0; 80 | 81 | my @lines = split /\n/, $stdout; 82 | 83 | foreach my $line(@lines) { 84 | my @tokens = split /\|/, $line; 85 | my $bucket = trim($tokens[0]); 86 | my $queryid = trim($tokens[1]); 87 | my $ncalls = trim($tokens[2]); 88 | my $query = trim($tokens[3]); 89 | 90 | if ($query =~ "SELECT pg_sleep") { 91 | $calls += $ncalls; 92 | if ($bucket_cnt == 0) { 93 | $bucket_cnt += 1; 94 | $last_bucket = $bucket; 95 | } elsif ($bucket != $last_bucket) { 96 | $bucket_cnt += 1; 97 | $last_bucket = $bucket; 98 | } 99 | } 100 | } 101 | 102 | ok($calls == 3 || $calls == 2, "Check total query count is correct"); 103 | ok($bucket_cnt == 2 || $bucket_cnt == 1, "Check total bucket count is correct"); 104 | 105 | # Stop the server 106 | $node->stop; 107 | # Done testing for this testcase file. 108 | done_testing(); 109 | -------------------------------------------------------------------------------- /t/029_bucket_done.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get filename and create out file name and dirs where requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # Create new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # Update postgresql.conf to include/load pg_stat_monitor library 20 | $node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_stat_monitor'"); 21 | 22 | # Set change postgresql.conf for this test case. 23 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_bucket_time = 3"); 24 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_max_buckets = 3"); 25 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_normalized_query = yes"); 26 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_track = 'all'"); 27 | 28 | # Start server 29 | my $rt_value = $node->start; 30 | ok($rt_value == 1, "Start Server"); 31 | 32 | # Create EXTENSION and change out file permissions 33 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 34 | ok($cmdret == 0, "Create PGSM EXTENSION"); 35 | PGSM::append_to_debug_file($stdout); 36 | 37 | # Run 'SELECT pg_stat_monitor settings' and dump output to out file 38 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name LIKE '%pg_stat_monitor%';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 39 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 40 | PGSM::append_to_debug_file($stdout); 41 | 42 | # Run required commands/queries and dump output to out file. 43 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 44 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 45 | PGSM::append_to_debug_file($stdout); 46 | 47 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_sleep(3);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 48 | ok($cmdret == 0, "1 - Run pg_sleep(3)"); 49 | PGSM::append_to_debug_file($stdout); 50 | 51 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_sleep(3);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 52 | ok($cmdret == 0, "2 - Run pg_sleep(3)"); 53 | PGSM::append_to_debug_file($stdout); 54 | 55 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_sleep(3);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 56 | ok($cmdret == 0, "3 - Run pg_sleep(3)"); 57 | PGSM::append_to_debug_file($stdout); 58 | 59 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT SUM(calls) AS calls FROM pg_stat_monitor WHERE query LIKE '%sleep%' AND bucket_done = 't' GROUP BY calls;", extra_params => ['-t', '-Pformat=unaligned','-Ptuples_only=on']); 60 | ok($cmdret == 0, "Run query to get count where bucket is done."); 61 | ok($stdout == 2, "Compare: Calls count is 2"); 62 | PGSM::append_to_debug_file($stdout); 63 | 64 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT SUM(calls) AS calls FROM pg_stat_monitor WHERE query LIKE '%sleep%' AND bucket_done = 'f' GROUP BY calls;", extra_params => ['-t', '-Pformat=unaligned','-Ptuples_only=on']); 65 | ok($cmdret == 0, "Run query to get count where bucket is not done."); 66 | ok($stdout == 1, "Compare: Calls count is 1"); 67 | PGSM::append_to_debug_file($stdout); 68 | 69 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT bucket, bucket_done, query, calls AS calls FROM pg_stat_monitor ;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 70 | ok($cmdret == 0, "Print what is in pg_stat_monitor view"); 71 | PGSM::append_to_debug_file($stdout); 72 | 73 | # DROP EXTENSION 74 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 75 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 76 | PGSM::append_to_debug_file($stdout); 77 | 78 | # Stop the server 79 | $node->stop; 80 | 81 | # Done testing for this testcase file. 82 | done_testing(); 83 | -------------------------------------------------------------------------------- /t/031_query_stat.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Test::More; 9 | use lib 't'; 10 | use pgsm; 11 | 12 | # Get file name and CREATE out file name and dirs WHERE requried 13 | PGSM::setup_files_dir(basename($0)); 14 | 15 | # CREATE new PostgreSQL node and do initdb 16 | my $node = PGSM->pgsm_init_pg(); 17 | my $pgdata = $node->data_dir; 18 | 19 | # UPDATE postgresql.conf to include/load pg_stat_monitor library 20 | open my $conf, '>>', "$pgdata/postgresql.conf"; 21 | print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; 22 | print $conf "pg_stat_monitor.pgsm_bucket_time = 2147483647\n"; # Max value for this parameter 23 | print $conf "pg_stat_monitor.pgsm_max_buckets = 20000\n"; # Max value for this parameter 24 | close $conf; 25 | 26 | # Start server 27 | my $rt_value = $node->start; 28 | ok($rt_value == 1, "Start Server"); 29 | 30 | # CREATE EXTENSION and change out file permissions 31 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 32 | ok($cmdret == 0, "CREATE PGSM EXTENSION"); 33 | PGSM::append_to_file($stdout); 34 | 35 | # Run required commands/queries and dump output to out file. 36 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 37 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 38 | PGSM::append_to_file($stdout); 39 | 40 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT 1 AS num;", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 41 | ok($cmdret == 0, "Print results of a test query"); 42 | PGSM::append_to_file($stdout); 43 | 44 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C";', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 45 | ok($cmdret == 0, "Check query stats"); 46 | PGSM::append_to_file($stdout); 47 | 48 | # DROP EXTENSION 49 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 50 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 51 | PGSM::append_to_file($stdout); 52 | 53 | # Stop the server 54 | $node->stop; 55 | 56 | # compare the expected and out file 57 | my $compare = PGSM->compare_results(); 58 | 59 | # Test/check if expected and result/out file match. If Yes, test passes. 60 | is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); 61 | 62 | # Done testing for this testcase file. 63 | done_testing(); 64 | -------------------------------------------------------------------------------- /t/033_stats_since.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | use File::Basename; 6 | use File::Compare; 7 | use File::Copy; 8 | use Text::Trim qw(trim); 9 | use Test::More; 10 | use lib 't'; 11 | use pgsm; 12 | 13 | # Get filename and create out file name and dirs where requried 14 | PGSM::setup_files_dir(basename($0)); 15 | 16 | if ($PGSM::PG_MAJOR_VERSION <= 16) 17 | { 18 | plan skip_all => "pg_stat_monitor test cases for versions 16 and below."; 19 | } 20 | 21 | # Create new PostgreSQL node and do initdb 22 | my $node = PGSM->pgsm_init_pg(); 23 | my $pgdata = $node->data_dir; 24 | 25 | # Update postgresql.conf to include/load pg_stat_monitor library 26 | $node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_stat_monitor'"); 27 | 28 | # Set change postgresql.conf for this test case. 29 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_bucket_time = 1"); 30 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_max_buckets = 3"); 31 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_normalized_query = yes"); 32 | $node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_track = 'all'"); 33 | 34 | # Start server 35 | my $rt_value = $node->start; 36 | ok($rt_value == 1, "Start Server"); 37 | 38 | # Create EXTENSION and change out file permissions 39 | my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); 40 | ok($cmdret == 0, "Create PGSM EXTENSION"); 41 | PGSM::append_to_debug_file($stdout); 42 | 43 | # Run 'SELECT pg_stat_monitor settings' and dump output to out file 44 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name LIKE '%pg_stat_monitor%';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 45 | ok($cmdret == 0, "Print PGSM EXTENSION Settings"); 46 | PGSM::append_to_debug_file($stdout); 47 | 48 | # Run required commands/queries and dump output to out file. 49 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 50 | ok($cmdret == 0, "Reset PGSM EXTENSION"); 51 | PGSM::append_to_debug_file($stdout); 52 | 53 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_sleep(1);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 54 | ok($cmdret == 0, "1 - Run pg_sleep(1)"); 55 | PGSM::append_to_debug_file($stdout); 56 | 57 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_sleep(1);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 58 | ok($cmdret == 0, "2 - Run pg_sleep(1)"); 59 | PGSM::append_to_debug_file($stdout); 60 | 61 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_sleep(1);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 62 | ok($cmdret == 0, "3 - Run pg_sleep(1)"); 63 | PGSM::append_to_debug_file($stdout); 64 | 65 | # Check that we have more than one bucket 66 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT COUNT(bucket) != 0 AS PGSM FROM pg_stat_monitor WHERE query LIKE '%sleep%';", extra_params => ['-t', '-Pformat=unaligned','-Ptuples_only=on']); 67 | trim($stdout); 68 | is($stdout,'t',"Check: we have more that one bucket"); 69 | 70 | # Check that stats timestamps are different for each query/bucket 71 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT COUNT(DISTINCT stats_since) = COUNT(stats_since) AS PGSM FROM pg_stat_monitor WHERE query LIKE '%sleep%';", extra_params => ['-t', '-Pformat=unaligned','-Ptuples_only=on']); 72 | trim($stdout); 73 | is($stdout,'t',"Check: for every bucket stats_since should be unique"); 74 | 75 | # Check that minmax_stats_since always match stats_since 76 | ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT COUNT(*) AS ST FROM pg_stat_monitor WHERE query LIKE '%sleep%' AND stats_since != minmax_stats_since;", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); 77 | ok($stdout == 0, "Compare: Calls count is 1"); 78 | PGSM::append_to_debug_file($stdout); 79 | 80 | # DROP EXTENSION 81 | $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); 82 | ok($cmdret == 0, "DROP PGSM EXTENSION"); 83 | PGSM::append_to_debug_file($stdout); 84 | 85 | # Stop the server 86 | $node->stop; 87 | 88 | # Done testing for this testcase file. 89 | done_testing(); 90 | -------------------------------------------------------------------------------- /t/expected/003_settings_pgms_extract_comments.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name = 'pg_stat_monitor.pgsm_extract_comments'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | ---------------------------------------+---------+------+---------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_extract_comments | on | | user | bool | configuration file | | | | off | on | f 12 | (1 row) 13 | 14 | SELECT 1 AS num /* First comment */, 'John' AS Name /* Second comment*/; 15 | num | name 16 | -----+------ 17 | 1 | John 18 | (1 row) 19 | 20 | SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C"; 21 | query | comments 22 | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------ 23 | SELECT 1 AS num /* First comment */, 'John' AS Name /* Second comment*/ | /* First comment */, /* Second comment*/ 24 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name = 'pg_stat_monitor.pgsm_extract_comments' | 25 | SELECT pg_stat_monitor_reset() | 26 | (3 rows) 27 | 28 | SELECT pg_stat_monitor_reset(); 29 | pg_stat_monitor_reset 30 | ----------------------- 31 | 32 | (1 row) 33 | 34 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name = 'pg_stat_monitor.pgsm_extract_comments'; 35 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 36 | ---------------------------------------+---------+------+---------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 37 | pg_stat_monitor.pgsm_extract_comments | off | | user | bool | configuration file | | | | off | off | f 38 | (1 row) 39 | 40 | SELECT 1 AS num /* First comment */, 'John' AS Name /* Second comment*/; 41 | num | name 42 | -----+------ 43 | 1 | John 44 | (1 row) 45 | 46 | SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C"; 47 | query | comments 48 | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------- 49 | SELECT 1 AS num /* First comment */, 'John' AS Name /* Second comment*/ | 50 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name = 'pg_stat_monitor.pgsm_extract_comments' | 51 | SELECT pg_stat_monitor_reset() | 52 | (3 rows) 53 | 54 | DROP EXTENSION pg_stat_monitor; 55 | -------------------------------------------------------------------------------- /t/expected/004_settings_pgsm_track.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_track'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | ----------------------------+---------+------+---------+---------+--------------------+---------+---------+----------------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_track | none | | user | enum | configuration file | | | {none,top,all} | top | none | f 12 | (1 row) 13 | 14 | SELECT pg_stat_monitor_reset(); 15 | pg_stat_monitor_reset 16 | ----------------------- 17 | 18 | (1 row) 19 | 20 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_track'; 21 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 22 | ----------------------------+---------+------+---------+---------+--------------------+---------+---------+----------------+----------+-----------+----------------- 23 | pg_stat_monitor.pgsm_track | all | | user | enum | configuration file | | | {none,top,all} | top | all | f 24 | (1 row) 25 | 26 | SELECT pg_stat_monitor_reset(); 27 | pg_stat_monitor_reset 28 | ----------------------- 29 | 30 | (1 row) 31 | 32 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_track'; 33 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 34 | ----------------------------+---------+------+---------+---------+--------------------+---------+---------+----------------+----------+-----------+----------------- 35 | pg_stat_monitor.pgsm_track | top | | user | enum | configuration file | | | {none,top,all} | top | top | f 36 | (1 row) 37 | 38 | DROP EXTENSION pg_stat_monitor; 39 | -------------------------------------------------------------------------------- /t/expected/005_settings_pgsm_enable_query_plan.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_enable_query_plan'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | ----------------------------------------+---------+------+---------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_enable_query_plan | on | | user | bool | configuration file | | | | off | on | f 12 | (1 row) 13 | 14 | CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int); 15 | INSERT INTO TBL_0(key, txt_0, value_0) VALUES('000000', '846930886', 1804289383); 16 | SELECT key, txt_0, value_0 FROM TBL_0; 17 | key | txt_0 | value_0 18 | --------+-----------+------------ 19 | 000000 | 846930886 | 1804289383 20 | (1 row) 21 | 22 | SELECT key, txt_0, value_0 FROM TBL_0; 23 | key | txt_0 | value_0 24 | --------+-----------+------------ 25 | 000000 | 846930886 | 1804289383 26 | (1 row) 27 | 28 | UPDATE TBL_0 SET value_0 = 1681692777; 29 | SELECT substr(query, 0,50) AS query, calls, query_plan FROM pg_stat_monitor ORDER BY query,calls; 30 | query | calls | query_plan 31 | ---------------------------------------------------+-------+------------------------------------------------------------------- 32 | CREATE TABLE TBL_0(key text primary key, txt_0 te | 1 | 33 | INSERT INTO TBL_0(key, txt_0, value_0) VALUES('00 | 1 | 34 | SELECT key, txt_0, value_0 FROM TBL_0 | 2 | Seq Scan on tbl_0 35 | SELECT name, setting, unit, context, vartype, sou | 1 | Function Scan on pg_show_all_settings a + 36 | | | Filter: (name = 'pg_stat_monitor.pgsm_enable_query_plan'::text) 37 | SELECT pg_stat_monitor_reset() | 1 | Result 38 | UPDATE TBL_0 SET value_0 = 1681692777 | 1 | 39 | (6 rows) 40 | 41 | DROP TABLE TBL_0; 42 | SELECT pg_stat_monitor_reset(); 43 | pg_stat_monitor_reset 44 | ----------------------- 45 | 46 | (1 row) 47 | 48 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_enable_query_plan'; 49 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 50 | ----------------------------------------+---------+------+---------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 51 | pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | configuration file | | | | off | off | f 52 | (1 row) 53 | 54 | CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int); 55 | INSERT INTO TBL_0(key, txt_0, value_0) VALUES('000000', '846930886', 1804289383); 56 | SELECT key, txt_0, value_0 FROM TBL_0; 57 | key | txt_0 | value_0 58 | --------+-----------+------------ 59 | 000000 | 846930886 | 1804289383 60 | (1 row) 61 | 62 | SELECT key, txt_0, value_0 FROM TBL_0; 63 | key | txt_0 | value_0 64 | --------+-----------+------------ 65 | 000000 | 846930886 | 1804289383 66 | (1 row) 67 | 68 | UPDATE TBL_0 SET value_0 = 1681692777; 69 | SELECT substr(query, 0,50) AS query, calls, query_plan FROM pg_stat_monitor ORDER BY query,calls; 70 | query | calls | query_plan 71 | ---------------------------------------------------+-------+------------ 72 | CREATE TABLE TBL_0(key text primary key, txt_0 te | 1 | 73 | INSERT INTO TBL_0(key, txt_0, value_0) VALUES('00 | 1 | 74 | SELECT key, txt_0, value_0 FROM TBL_0 | 2 | 75 | SELECT name, setting, unit, context, vartype, sou | 1 | 76 | SELECT pg_stat_monitor_reset() | 1 | 77 | UPDATE TBL_0 SET value_0 = 1681692777 | 1 | 78 | (6 rows) 79 | 80 | DROP EXTENSION pg_stat_monitor; 81 | -------------------------------------------------------------------------------- /t/expected/006_settings_pgsm_overflow_target.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_enable_overflow'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | --------------------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_enable_overflow | off | | postmaster | bool | configuration file | | | | on | off | f 12 | (1 row) 13 | 14 | SELECT pg_stat_monitor_reset(); 15 | pg_stat_monitor_reset 16 | ----------------------- 17 | 18 | (1 row) 19 | 20 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_enable_overflow'; 21 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 22 | --------------------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 23 | pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | configuration file | | | | on | on | f 24 | (1 row) 25 | 26 | DROP EXTENSION pg_stat_monitor; 27 | -------------------------------------------------------------------------------- /t/expected/009_settings_pgsm_histogram_max.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_max'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | ------------------------------------+---------+------+------------+---------+---------+---------+---------+----------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f 12 | (1 row) 13 | 14 | SELECT pg_stat_monitor_reset(); 15 | pg_stat_monitor_reset 16 | ----------------------- 17 | 18 | (1 row) 19 | 20 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_max'; 21 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 22 | ------------------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 23 | pg_stat_monitor.pgsm_histogram_max | 50 | ms | postmaster | real | configuration file | 10 | 5e+07 | | 100000 | 50 | f 24 | (1 row) 25 | 26 | SELECT pg_stat_monitor_reset(); 27 | pg_stat_monitor_reset 28 | ----------------------- 29 | 30 | (1 row) 31 | 32 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_max'; 33 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 34 | ------------------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 35 | pg_stat_monitor.pgsm_histogram_max | 1000 | ms | postmaster | real | configuration file | 10 | 5e+07 | | 100000 | 1000 | f 36 | (1 row) 37 | 38 | DROP EXTENSION pg_stat_monitor; 39 | -------------------------------------------------------------------------------- /t/expected/010_settings_pgsm_histogram_min.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_min'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | ------------------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | configuration file | 0 | 5e+07 | | 1 | 1 | f 12 | (1 row) 13 | 14 | SELECT pg_stat_monitor_reset(); 15 | pg_stat_monitor_reset 16 | ----------------------- 17 | 18 | (1 row) 19 | 20 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_min'; 21 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 22 | ------------------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 23 | pg_stat_monitor.pgsm_histogram_min | 20 | ms | postmaster | real | configuration file | 0 | 5e+07 | | 1 | 20 | f 24 | (1 row) 25 | 26 | SELECT pg_stat_monitor_reset(); 27 | pg_stat_monitor_reset 28 | ----------------------- 29 | 30 | (1 row) 31 | 32 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_histogram_min'; 33 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 34 | ------------------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 35 | pg_stat_monitor.pgsm_histogram_min | 100 | ms | postmaster | real | configuration file | 0 | 5e+07 | | 1 | 100 | f 36 | (1 row) 37 | 38 | DROP EXTENSION pg_stat_monitor; 39 | -------------------------------------------------------------------------------- /t/expected/015_settings_pgsm_query_max_len.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | ------------------------------------+---------+------+------------+---------+--------------------+---------+------------+----------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_query_max_len | 10240 | | postmaster | integer | configuration file | 1024 | 2147483647 | | 2048 | 10240 | f 12 | (1 row) 13 | 14 | SELECT pg_stat_monitor_reset(); 15 | pg_stat_monitor_reset 16 | ----------------------- 17 | 18 | (1 row) 19 | 20 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len'; 21 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 22 | ------------------------------------+---------+------+------------+---------+--------------------+---------+------------+----------+----------+-----------+----------------- 23 | pg_stat_monitor.pgsm_query_max_len | 1024 | | postmaster | integer | configuration file | 1024 | 2147483647 | | 2048 | 1024 | f 24 | (1 row) 25 | 26 | SELECT pg_stat_monitor_reset(); 27 | pg_stat_monitor_reset 28 | ----------------------- 29 | 30 | (1 row) 31 | 32 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len'; 33 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 34 | ------------------------------------+---------+------+------------+---------+---------+---------+------------+----------+----------+-----------+----------------- 35 | pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f 36 | (1 row) 37 | 38 | SELECT pg_stat_monitor_reset(); 39 | pg_stat_monitor_reset 40 | ----------------------- 41 | 42 | (1 row) 43 | 44 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len'; 45 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 46 | ------------------------------------+---------+------+------------+---------+---------+---------+------------+----------+----------+-----------+----------------- 47 | pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f 48 | (1 row) 49 | 50 | SELECT pg_stat_monitor_reset(); 51 | pg_stat_monitor_reset 52 | ----------------------- 53 | 54 | (1 row) 55 | 56 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_max_len'; 57 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 58 | ------------------------------------+---------+------+------------+---------+---------+---------+------------+----------+----------+-----------+----------------- 59 | pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f 60 | (1 row) 61 | 62 | DROP EXTENSION pg_stat_monitor; 63 | -------------------------------------------------------------------------------- /t/expected/016_settings_pgsm_max.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_max'; 9 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 10 | --------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 11 | pg_stat_monitor.pgsm_max | 2048 | MB | postmaster | integer | configuration file | 10 | 10240 | | 256 | 2048 | f 12 | (1 row) 13 | 14 | SELECT pg_stat_monitor_reset(); 15 | pg_stat_monitor_reset 16 | ----------------------- 17 | 18 | (1 row) 19 | 20 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_max'; 21 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 22 | --------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 23 | pg_stat_monitor.pgsm_max | 500 | MB | postmaster | integer | configuration file | 10 | 10240 | | 256 | 500 | f 24 | (1 row) 25 | 26 | SELECT pg_stat_monitor_reset(); 27 | pg_stat_monitor_reset 28 | ----------------------- 29 | 30 | (1 row) 31 | 32 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_max'; 33 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 34 | --------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 35 | pg_stat_monitor.pgsm_max | 100 | MB | postmaster | integer | configuration file | 10 | 10240 | | 256 | 100 | f 36 | (1 row) 37 | 38 | SELECT pg_stat_monitor_reset(); 39 | pg_stat_monitor_reset 40 | ----------------------- 41 | 42 | (1 row) 43 | 44 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_max'; 45 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 46 | --------------------------+---------+------+------------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- 47 | pg_stat_monitor.pgsm_max | 10 | MB | postmaster | integer | configuration file | 10 | 10240 | | 256 | 10 | f 48 | (1 row) 49 | 50 | SELECT pg_stat_monitor_reset(); 51 | pg_stat_monitor_reset 52 | ----------------------- 53 | 54 | (1 row) 55 | 56 | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_max'; 57 | name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart 58 | --------------------------+---------+------+------------+---------+---------+---------+---------+----------+----------+-----------+----------------- 59 | pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f 60 | (1 row) 61 | 62 | DROP EXTENSION pg_stat_monitor; 63 | -------------------------------------------------------------------------------- /t/expected/031_query_stat.out: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION pg_stat_monitor; 2 | SELECT pg_stat_monitor_reset(); 3 | pg_stat_monitor_reset 4 | ----------------------- 5 | 6 | (1 row) 7 | 8 | SELECT 1 AS num; 9 | num 10 | ----- 11 | 1 12 | (1 row) 13 | 14 | SELECT query, comments FROM pg_stat_monitor ORDER BY query COLLATE "C"; 15 | query | comments 16 | --------------------------------+---------- 17 | SELECT 1 AS num | 18 | SELECT pg_stat_monitor_reset() | 19 | (2 rows) 20 | 21 | DROP EXTENSION pg_stat_monitor; 22 | -------------------------------------------------------------------------------- /typedefs.list: -------------------------------------------------------------------------------- 1 | AGG_KEY 2 | Blocks 3 | CallTime 4 | Calls 5 | Counters 6 | ErrorInfo 7 | HistogramTimingType 8 | JitInfo 9 | JumbleState 10 | LocationLen 11 | PGSMTrackLevel 12 | PlanInfo 13 | QueryInfo 14 | SysInfo 15 | WalUsage 16 | Wal_Usage 17 | pgsmEntry 18 | pgsmHashKey 19 | pgsmLocalState 20 | pgsmSharedState 21 | pgsmStoreKind 22 | pgsmVersion --------------------------------------------------------------------------------