A problem during bucket management was allowing some queries to be duplicated, old entries would sit around without having their statistics updated. The problem would arise during the following chain of events: 1. A query goes through pgss_post_parse_analyze, in this stage (PGSS_PARSE) we only save the query into the query buffer and create an entry in the query hash table. 2. The query then goes through pgss_ExecutorStart (PGSS_EXEC), in this stage we create an entry for query statistic counters with default values, all time stats equal zero, etc. 3. The query then goes through pgss_ExecutorEnd (PGSS_FINISH), in this stage we update the query statistis, no. calls, total time taken, min_time, etc. The problem is that between steps 2 and 3, the current bucket ID timer may have been expired. For example, during steps 1 and 2 the query may have been stored in bucket ID 1, but when the query is finished (pgss_ExecutorEnd) the current bucket ID may have been updated to 2. This is leaving an entry for the query in bucket ID 1 with state ACTIVE, with time statistics not updated yet. This is also creating an entry for the query in the bucket ID 2, with all statistics (time and others) being updated for this entry. To solve this problem, during transition to a new bucket id, we scan all pending queries in the previous bucket id and move them to the new bucket id. This way finished queries will always be associated with the bucket id that was active at the time they've finished. |
||
---|---|---|
.github/workflows | ||
docs | ||
percona-packaging | ||
regression | ||
.gitignore | ||
CONTRIBUTING.md | ||
LICENSE | ||
META.json | ||
Makefile | ||
README.md | ||
code-of-conduct.md | ||
guc.c | ||
hash_query.c | ||
pg_stat_monitor--1.0.sql | ||
pg_stat_monitor.c | ||
pg_stat_monitor.conf | ||
pg_stat_monitor.control | ||
pg_stat_monitor.h |
README.md
What is pg_stat_monitor?
pg_stat_monitor is a Query Performance Monitoring tool for Percona Distribution for PostgreSQL and PostgreSQL. pg_stat_monitor is based on PostgreSQL's contrib module pg_stat_statements
. 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.
pg_stat_monitor is developed on the basis of pg_stat_statements as is a more advanced replacement. It provides all the features of pg_stat_statements plus its own feature set.
How does pg_stat_monitor work?
pg_stat_monitor
accumulates the information in the form of buckets. All the aggregated information is bucket based. The size of a bucket and the number of buckets should be configured using GUC (Grand Unified Configuration). When a bucket time elapses, pg_stat_monitor
resets all the statistics and switches to the next bucket. After the last bucket elapses, pg_stat_monitor
goes back to the first bucket. All the data on the first bucket is cleared out with new writes; therefore, to not lose the data, users must read the buckets before that.
Documentation
- Supported PostgreSQL Versions
- Installation
- Setup
- User Guide
- Release Notes
- License
- Submitting Bug Reports
- Copyright Notice
Supported PostgreSQL Versions
pg_stat_monitor
should work on the latest version of both Percona Distribution for PostgreSQL and PostgreSQL and is currently tested against thes following versions:
Distribution | Version | Supported |
---|---|---|
PostgreSQL | < 11 | ❌ |
PostgreSQL | 11 | ✔️ |
PostgreSQL | 12 | ✔️ |
PostgreSQL | 13 | ✔️ |
Percona Distribution for PostgreSQL | < 11 | ❌ |
Percona Distribution for PostgreSQL | 11 | ✔️ |
Percona Distribution for PostgreSQL | 12 | ✔️ |
Percona Distribution for PostgreSQL | 13 | ✔️ |
Installation
You can install pg_stat_monitor
from Percona repositories and from source code.
Installing from Percona repositories
pg_stat_monitor
is supplied as part of Percona Distribution for PostgreSQL. The RPM/DEB packages are available from Percona's repositories. To install pg_stat_monitor
, follow the installation instructions.
Installing from PGXN
You can install pg_stat_monitor
from PGXN (PostgreSQL Extensions Network) using the PGXN client.
Use the following command:
pgxn install pg_stat_monitor
Installing from source code
You can download the source code of the latest release of pg_stat_monitor
from the releases page on GitHub or using git:
git clone git://github.com/Percona/pg_stat_monitor.git
Compile and install the extension
cd pg_stat_monitor
make USE_PGXS=1
make USE_PGXS=1 install
Setup
pg_stat_monitor
cannot be enabled in your running postgresql
instance, it needs to be loaded at the start time. This requires adding the pg_stat_monitor
extension to the shared_preload_libraries
parameter and restarting the postgresql
instance.
You can set the pg_stat_monitor
extension in the postgresql.conf
file.
# - Shared Library Preloading -
shared_preload_libraries = 'pg_stat_monitor' # (change requires restart)
#local_preload_libraries = ''
#session_preload_libraries = ''
Or you can set it from psql
terminal using the ALTER SYSTEM
command.
ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_monitor';
ALTER SYSTEM
sudo systemctl restart postgresql-13
Create the extension using the CREATE EXTENSION
command.
CREATE EXTENSION pg_stat_monitor;
CREATE EXTENSION
-- Select some of the query information, like client_ip, username and application_name etc.
postgres=# SELECT application_name, userid AS user_name, datname AS database_name, substr(query,0, 50) AS query, calls, client_ip
FROM pg_stat_monitor;
application_name | user_name | database_name | query | calls | client_ip
------------------+-----------+---------------+---------------------------------------------------+-------+-----------
psql | vagrant | postgres | SELECT application_name, userid::regrole AS user_ | 1 | 127.0.0.1
psql | vagrant | postgres | SELECT application_name, userid AS user_name, dat | 3 | 127.0.0.1
psql | vagrant | postgres | SELECT application_name, userid AS user_name, dat | 1 | 127.0.0.1
psql | vagrant | postgres | SELECT application_name, userid AS user_name, dat | 8 | 127.0.0.1
psql | vagrant | postgres | SELECT bucket, substr(query,$1, $2) AS query, cmd | 1 | 127.0.0.1
(5 rows)
-- Select queries along with elevel, message and sqlcode which have some errors.
SELECT decode_error_level(elevel) AS elevel, sqlcode, query, message FROM pg_stat_monitor WHERE elevel != 0;
elevel. | sqlcode | query | message
--------------------+---------+-------------------------------------------------------------------------------------------+------------------------------------------------
ERROR | 132 | select count(*) from pgbench_branches | permission denied for table pgbench_branches
ERROR | 130 | select 1/0; | division by zero
ERROR | 132 | SELECT decode_elevel(elevel), sqlcode, message from pg_stat_monitor where elevel != 0; | function decode_elevel(integer) does not exist
ERROR | 132 | drop table if exists pgbench_accounts, pgbench_branches, pgbench_history, pgbench_tellers | must be owner of table pgbench_accounts
(4 rows)
To learn more about pg_stat_monitor
configuration and usage, see the User Guide.
Submitting Feature Requests or Bug Reports
If you would like to request a feature of if you found a bug in pg_stat_monitor
, please submit the report to the Jira issue tracker.
Start by searching the open tickets for a similar report. If you find that someone else has already reported your issue, then you can upvote that report to increase its visibility.
If there is no existing report, submit your report following these steps:
-
Sign in to Jira issue tracker. You will need to create an account if you do not have one.
-
In the Summary, Description, Steps To Reproduce, Affects Version fields describe the problem you have detected.
-
As a general rule of thumb, try to create bug reports that are:
-
Reproducible: describe the steps to reproduce the problem.
-
Unique: check if there already exists a JIRA ticket to describe the problem.
-
Scoped to a Single Bug: only report one bug in one JIRA ticket.
Copyright Notice
Portions Copyright © 2018-2021, Percona LLC and/or its affiliates
Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
Portions Copyright (c) 1994, The Regents of the University of California