diff --git a/Makefile b/Makefile index 51fb11d5..f0937e91 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,8 @@ PGFILEDESC = "pg_stat_monitor - execution statistics of SQL statements" LDFLAGS_SL += $(filter -lm, $(LIBS)) +PG_CPPFLAGS += -std=c99 -g -ggdb + TAP_TESTS = 1 REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_monitor/pg_stat_monitor.conf --inputdir=regression REGRESS = basic version guc pgsm_query_id functions counters relations database error_insert application_name application_name_unique top_query cmd_type error rows tags user diff --git a/guc.c b/guc.c index c98d3ce3..50740f4c 100644 --- a/guc.c +++ b/guc.c @@ -36,6 +36,8 @@ bool pgsm_track_utility; bool pgsm_enable_pgsm_query_id; int pgsm_track; static int pgsm_overflow_target; /* Not used since 2.0 */ +/*custum */ +bool pgsm_extract_bind_variables; /* Check hooks to ensure histogram_min < histogram_max */ static bool check_histogram_min(double *newval, void **extra, GucSource source); @@ -213,6 +215,19 @@ init_guc(void) NULL, /* assign_hook */ NULL /* show_hook */ ); + + /* custum */ + DefineCustomBoolVariable("pg_stat_monitor.pgsm_extract_bind_variables", /* name */ + "Selects whether extracting bind variables from queries.", /* short_desc */ + NULL, /* long_desc */ + &pgsm_extract_bind_variables, /* value address */ + false, /* boot value */ + PGC_USERSET, /* context */ + 0, /* flags */ + NULL, /* check_hook */ + NULL, /* assign_hook */ + NULL /* show_hook */ + ); DefineCustomBoolVariable("pg_stat_monitor.pgsm_enable_overflow", /* name */ "Enable/Disable pg_stat_monitor to grow beyond shared memory into swap space.", /* short_desc */ @@ -226,6 +241,53 @@ init_guc(void) NULL /* show_hook */ ); +<<<<<<< HEAD +#if PG_VERSION_NUM >= 130000 + conf[i] = (GucVariable) + { + .guc_name = "pg_stat_monitor.pgsm_track_planning", + .guc_desc = "Selects whether planning statistics are tracked.", + .guc_default = 0, + .guc_min = 0, + .guc_max = 0, + .guc_restart = false, + .guc_unit = 0, + .guc_value = &PGSM_TRACK_PLANNING + }; + DefineBoolGUC(&conf[i++]); + + conf[i] = (GucVariable) + { + .guc_name = "pg_stat_monitor.pgsm_extract_bind_variables", + .guc_desc = "Selects whether extracting bind variables from queries.", + .guc_default = 0, + .guc_min = 0, + .guc_max = 0, + .guc_restart = false, + .guc_unit = 0, + .guc_value = &PGSM_EXTRACT_VARIABLES + }; + DefineBoolGUC(&conf[i++]); +#endif +} + +static void +DefineIntGUCWithCheck(GucVariable * conf, GucIntCheckHook check) +{ + conf->type = PGC_INT; + DefineCustomIntVariable(conf->guc_name, + conf->guc_desc, + NULL, + conf->guc_value, + conf->guc_default, + conf->guc_min, + conf->guc_max, + conf->guc_restart ? PGC_POSTMASTER : PGC_USERSET, + conf->guc_unit, + check, + NULL, + NULL); +} DefineCustomBoolVariable("pg_stat_monitor.pgsm_enable_query_plan", /* name */ "Enable/Disable query plan monitoring.", /* short_desc */ NULL, /* long_desc */ diff --git a/pg_stat_monitor--1.0--2.0.sql b/pg_stat_monitor--1.0--2.0.sql index de114ba6..6dc2525b 100644 --- a/pg_stat_monitor--1.0--2.0.sql +++ b/pg_stat_monitor--1.0--2.0.sql @@ -25,6 +25,7 @@ CREATE FUNCTION pg_stat_monitor_internal( OUT top_queryid int8, OUT top_query text, OUT application_name text, + OUT bind_variables text, OUT relations text, -- 11 OUT cmd_type int, @@ -128,6 +129,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, @@ -185,6 +187,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, @@ -251,6 +254,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, @@ -317,6 +321,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, diff --git a/pg_stat_monitor--2.0.sql b/pg_stat_monitor--2.0.sql index 6182fa41..88202fde 100644 --- a/pg_stat_monitor--2.0.sql +++ b/pg_stat_monitor--2.0.sql @@ -97,7 +97,7 @@ CREATE FUNCTION pg_stat_monitor_internal( OUT top_queryid int8, OUT top_query text, OUT application_name text, - + OUT bind_variables text, OUT relations text, -- 11 OUT cmd_type int, OUT elevel int, @@ -184,6 +184,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, @@ -241,6 +242,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, @@ -307,6 +309,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, @@ -373,6 +376,7 @@ CREATE VIEW pg_stat_monitor AS SELECT query_plan, top_query, application_name, + bind_variables, string_to_array(relations, ',') AS relations, cmd_type, get_cmd_type(cmd_type) AS cmd_type_text, diff --git a/pg_stat_monitor.c b/pg_stat_monitor.c index 19f9b45e..cc8d2678 100644 --- a/pg_stat_monitor.c +++ b/pg_stat_monitor.c @@ -40,7 +40,7 @@ PG_MODULE_MAGIC; /* Number of output arguments (columns) for various API versions */ #define PG_STAT_MONITOR_COLS_V1_0 52 -#define PG_STAT_MONITOR_COLS_V2_0 64 +#define PG_STAT_MONITOR_COLS_V2_0 65 #define PG_STAT_MONITOR_COLS PG_STAT_MONITOR_COLS_V2_0 /* maximum of above */ #define PGSM_TEXT_FILE PGSTAT_STAT_PERMANENT_DIRECTORY "pg_stat_monitor_query" @@ -256,7 +256,8 @@ static uint64 get_query_id(JumbleState *jstate, Query *query); #endif static char *generate_normalized_query(JumbleState *jstate, const char *query, - int query_loc, int *query_len_p, int encoding); + int query_loc, int *query_len_p, int encoding, + char* bind_variables, int *bind_var_len_p); static void fill_in_constant_lengths(JumbleState *jstate, const char *query, int query_loc); static int comp_location(const void *a, const void *b); @@ -407,6 +408,10 @@ pgsm_post_parse_analyze_internal(ParseState *pstate, Query *query, JumbleState * int norm_query_len; int location; int query_len; + /* custum bind_variables */ + char bind_variables[VAR_LEN] = ""; + int bind_var_len = 0; + /* Safety check... */ if (!IsSystemInitialized()) @@ -477,8 +482,9 @@ pgsm_post_parse_analyze_internal(ParseState *pstate, Query *query, JumbleState * query_text, /* query */ location, /* query location */ &norm_query_len, - GetDatabaseEncoding()); - + GetDatabaseEncoding(), + &bind_variables[0], + &bind_var_len); Assert(norm_query); } @@ -496,6 +502,10 @@ pgsm_post_parse_analyze_internal(ParseState *pstate, Query *query, JumbleState * */ entry->pgsm_query_id = get_pgsm_query_id_hash(norm_query ? norm_query : query_text, norm_query_len); entry->counters.info.cmd_type = query->commandType; + + if(bind_var_len > 0){ + _snprintf(entry->counters.info.bind_variables, bind_variables, bind_var_len + 1, VAR_LEN); + } /* * Add the query text and entry to the local list. @@ -1776,6 +1786,10 @@ pgsm_store(pgsmEntry * entry) pgsm = pgsm_get_ss(); + /* + * We should lock the hash table here what if the bucket is removed; e.g. + * reset is called - HAMID + */ prev_bucket_id = pg_atomic_read_u64(&pgsm->current_wbucket); bucketid = get_next_wbucket(pgsm); @@ -1852,6 +1866,7 @@ pgsm_store(pgsmEntry * entry) * Get the memory address from DSA pointer and copy the query text in * local variable */ + query_buff = dsa_get_address(query_dsa_area, dsa_query_pointer); memcpy(query_buff, query, query_len); @@ -1878,11 +1893,6 @@ pgsm_store(pgsmEntry * entry) if (shared_hash_entry == NULL) { - LWLockRelease(pgsm->lock); - - if (DsaPointerIsValid(dsa_query_pointer)) - dsa_free(query_dsa_area, dsa_query_pointer); - /* * Out of memory; report only if the state has changed now. * Otherwise we risk filling up the log file with these message. @@ -1891,16 +1901,18 @@ pgsm_store(pgsmEntry * entry) { pgsm->pgsm_oom = true; - PGSM_DISABLE_ERROR_CAPUTRE(); - { - ereport(WARNING, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("[pg_stat_monitor] pgsm_store: Hash table is out of memory and can no longer store queries!"), - errdetail("You may reset the view or when the buckets are deallocated, pg_stat_monitor will resume saving " \ - "queries. Alternatively, try increasing the value of pg_stat_monitor.pgsm_max."))); - } PGSM_END_DISABLE_ERROR_CAPTURE(); + ereport(WARNING, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("[pg_stat_monitor] pgsm_store: Hash table is out of memory and can no longer store queries!"), + errdetail("You may reset the view or when the buckets are deallocated, pg_stat_monitor will resume saving " \ + "queries. Alternatively, try increasing the value of pg_stat_monitor.pgsm_max."))); } + LWLockRelease(pgsm->lock); + + if (DsaPointerIsValid(dsa_query_pointer)) + dsa_free(query_dsa_area, dsa_query_pointer); + return; } else @@ -1923,6 +1935,9 @@ pgsm_store(pgsmEntry * entry) snprintf(shared_hash_entry->username, sizeof(shared_hash_entry->username), "%s", entry->username); } + if(strlen(entry->counters.info.bind_variables) > 0) + strncpy(shared_hash_entry->counters.info.bind_variables, entry->counters.info.bind_variables, VAR_LEN); + pgsm_update_entry(shared_hash_entry, /* entry */ query, /* query */ comments, /* comments */ @@ -2232,6 +2247,18 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo, values[i++] = CStringGetTextDatum(tmp.info.application_name); else nulls[i++] = true; + + /* bind_variables at column number 48 */ + if (strlen(tmp.info.bind_variables) > 0) + values[i++] = CStringGetTextDatum(tmp.info.bind_variables); + else + nulls[i++] = true; + + /* bind_variables at column number 48 */ + if (strlen(tmp.info.bind_variables) > 0) + values[i++] = CStringGetTextDatum(tmp.info.bind_variables); + else + nulls[i++] = true; /* relations at column number 10 */ if (tmp.info.num_relations > 0) @@ -3303,15 +3330,18 @@ CleanQuerytext(const char *query, int *location, int *len) */ static char * generate_normalized_query(JumbleState *jstate, const char *query, - int query_loc, int *query_len_p, int encoding) + int query_loc, int *query_len_p, int encoding, + char* bind_variables, int *bind_var_len_p) { char *norm_query; int query_len = *query_len_p; + int bind_var_len; int i, norm_query_buflen, /* Space allowed for norm_query */ len_to_wrt, /* Length (in bytes) to write */ quer_loc = 0, /* Source query byte location */ n_quer_loc = 0, /* Normalized query byte location */ + n_var_loc = 0, /* bind_variables byte location */ last_off = 0, /* Offset from start for previous tok */ last_tok_len = 0; /* Length (in bytes) of that tok */ @@ -3362,6 +3392,14 @@ generate_normalized_query(JumbleState *jstate, const char *query, quer_loc = off + tok_len; last_off = off; last_tok_len = tok_len; + if (pgsm_extract_bind_variables){ + if (n_var_loc+tok_len + 1 < VAR_LEN-1){ + memcpy(bind_variables + n_var_loc, query + quer_loc - tok_len, tok_len); + n_var_loc += tok_len; + memcpy(bind_variables + n_var_loc , "|", 1); + n_var_loc ++; + } + } } /* @@ -3378,6 +3416,11 @@ generate_normalized_query(JumbleState *jstate, const char *query, norm_query[n_quer_loc] = '\0'; *query_len_p = n_quer_loc; + if (pgsm_extract_bind_variables){ + bind_var_len = n_var_loc-1; + bind_variables[bind_var_len] = '\0'; + *bind_var_len_p = bind_var_len; + } return norm_query; } diff --git a/pg_stat_monitor.h b/pg_stat_monitor.h index 339f6474..c89c73db 100644 --- a/pg_stat_monitor.h +++ b/pg_stat_monitor.h @@ -88,8 +88,10 @@ #define CMD_LEN 20 #define APPLICATIONNAME_LEN NAMEDATALEN #define COMMENTS_LEN 256 +#define VAR_LEN 512 #define PGSM_OVER_FLOW_MAX 10 #define PLAN_TEXT_LEN 1024 +#define VAR_LEN COMMENTS_LEN /* the assumption of query max nested level */ #define DEFAULT_MAX_NESTED_LEVEL 10 @@ -104,9 +106,9 @@ #define TOTAL_RELS_LENGTH (REL_LST * REL_LEN) #if PG_VERSION_NUM >= 130000 -#define MAX_SETTINGS 15 +#define MAX_SETTINGS 16 #else -#define MAX_SETTINGS 14 +#define MAX_SETTINGS 15 #endif /* Update this if need a enum GUC with more options. */ @@ -249,9 +251,11 @@ typedef struct QueryInfo int64 type; /* type of query, options are query, info, * warning, error, fatal */ char application_name[APPLICATIONNAME_LEN]; + char bind_variables[VAR_LEN]; char comments[COMMENTS_LEN]; char relations[REL_LST][REL_LEN]; /* List of relation involved * in the query */ + char bind_variables[VAR_LEN]; int num_relations; /* Number of relation in the query */ CmdType cmd_type; /* query command type * SELECT/UPDATE/DELETE/INSERT */ @@ -514,6 +518,7 @@ extern bool pgsm_enable_overflow; extern bool pgsm_normalized_query; extern bool pgsm_track_utility; extern bool pgsm_enable_pgsm_query_id; +extern bool pgsm_extract_bind_variables; extern int pgsm_track; #define DECLARE_HOOK(hook, ...) \ diff --git a/regression/expected/guc.out b/regression/expected/guc.out index dd84374f..45748af7 100644 --- a/regression/expected/guc.out +++ b/regression/expected/guc.out @@ -16,25 +16,26 @@ WHERE name LIKE 'pg_stat_monitor.%' ORDER BY name COLLATE "C"; - name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart --------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- - pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f - pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f - pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f - pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f - pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f - pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f - pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f - pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f - pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f - pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f - pg_stat_monitor.pgsm_track_planning | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f -(17 rows) + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- + pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f + pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f + pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f + pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f + pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f + pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f + pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f + pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f + pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f + pg_stat_monitor.pgsm_track_planning | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f +(18 rows) DROP EXTENSION pg_stat_monitor; diff --git a/regression/expected/guc_1.out b/regression/expected/guc_1.out index 6c73f2ed..96f617cf 100644 --- a/regression/expected/guc_1.out +++ b/regression/expected/guc_1.out @@ -16,24 +16,25 @@ WHERE name LIKE 'pg_stat_monitor.%' ORDER BY name COLLATE "C"; - name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart --------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- - pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f - pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f - pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f - pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f - pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f - pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f - pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f - pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f - pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f - pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f - pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f -(16 rows) + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- + pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f + pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f + pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f + pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f + pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f + pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f + pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f + pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f + pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f + pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f +(17 rows) DROP EXTENSION pg_stat_monitor; diff --git a/regression/expected/guc_2.out b/regression/expected/guc_2.out index 06d08649..931a5451 100644 --- a/regression/expected/guc_2.out +++ b/regression/expected/guc_2.out @@ -16,24 +16,25 @@ WHERE name LIKE 'pg_stat_monitor.%' ORDER BY name COLLATE "C"; - name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart --------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- - pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f - pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f - pg_stat_monitor.pgsm_histogram_max | 100000 | | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f - pg_stat_monitor.pgsm_histogram_min | 1 | | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f - pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f - pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f - pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f - pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f - pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f - pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f - pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f -(16 rows) + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- + pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f + pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f + pg_stat_monitor.pgsm_histogram_max | 100000 | | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f + pg_stat_monitor.pgsm_histogram_min | 1 | | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f + pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f + pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f + pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f + pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f + pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f + pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f +(17 rows) DROP EXTENSION pg_stat_monitor; diff --git a/t/018_column_names.pl b/t/018_column_names.pl index 6abe1860..b2c93ef6 100644 --- a/t/018_column_names.pl +++ b/t/018_column_names.pl @@ -22,7 +22,7 @@ close $conf; # Dictionary for expected PGSM columns names on different PG server versions -my %pg_versions_pgsm_columns = ( 16 => "application_name,blk_read_time," . +my %pg_versions_pgsm_columns = ( 16 => "application_name,bind_variables,blk_read_time," . "blk_write_time,bucket,bucket_done,bucket_start_time,calls," . "client_ip,cmd_type,cmd_type_text,comments,cpu_sys_time,cpu_user_time," . "datname,dbid,elevel,jit_emission_count,jit_emission_time,jit_functions," . @@ -37,7 +37,7 @@ "temp_blk_read_time,temp_blk_write_time,temp_blks_read,temp_blks_written," . "top_query,top_queryid,toplevel,total_exec_time,total_plan_time," . "userid,username,wal_bytes,wal_fpi,wal_records", -15 => "application_name,blk_read_time," . +15 => "application_name,bind_variables,blk_read_time," . "blk_write_time,bucket,bucket_done,bucket_start_time,calls," . "client_ip,cmd_type,cmd_type_text,comments,cpu_sys_time,cpu_user_time," . "datname,dbid,elevel,jit_emission_count,jit_emission_time,jit_functions," . @@ -52,7 +52,7 @@ "temp_blk_read_time,temp_blk_write_time,temp_blks_read,temp_blks_written," . "top_query,top_queryid,toplevel,total_exec_time,total_plan_time," . "userid,username,wal_bytes,wal_fpi,wal_records", - 14 => "application_name,blk_read_time," . + 14 => "application_name,bind_variables,blk_read_time," . "blk_write_time,bucket,bucket_done,bucket_start_time,calls," . "client_ip,cmd_type,cmd_type_text,comments,cpu_sys_time,cpu_user_time," . "datname,dbid,elevel,local_blks_dirtied,local_blks_hit,local_blks_read," . @@ -63,7 +63,7 @@ "shared_blks_written,sqlcode,stddev_exec_time,stddev_plan_time," . "temp_blks_read,temp_blks_written,top_query,top_queryid,toplevel," . "total_exec_time,total_plan_time,userid,username,wal_bytes,wal_fpi,wal_records", - 13 => "application_name,blk_read_time," . + 13 => "application_name,bind_variables,blk_read_time," . "blk_write_time,bucket,bucket_done,bucket_start_time,calls," . "client_ip,cmd_type,cmd_type_text,comments,cpu_sys_time,cpu_user_time," . "datname,dbid,elevel,local_blks_dirtied,local_blks_hit,local_blks_read," . @@ -74,7 +74,7 @@ "shared_blks_written,sqlcode,stddev_exec_time,stddev_plan_time," . "temp_blks_read,temp_blks_written,top_query,top_queryid,toplevel," . "total_exec_time,total_plan_time,userid,username,wal_bytes,wal_fpi,wal_records", - 12 => "application_name,blk_read_time,blk_write_time,bucket,bucket_done," . + 12 => "application_name,bind_variables,blk_read_time,blk_write_time,bucket,bucket_done," . "bucket_start_time,calls,client_ip,cmd_type,cmd_type_text,comments," . "cpu_sys_time,cpu_user_time,datname,dbid,elevel,local_blks_dirtied," . "local_blks_hit,local_blks_read,local_blks_written,max_time,mean_time," . diff --git a/t/030_settings_pgms_extract_bind_variables.pl b/t/030_settings_pgms_extract_bind_variables.pl new file mode 100644 index 00000000..a0e3bf94 --- /dev/null +++ b/t/030_settings_pgms_extract_bind_variables.pl @@ -0,0 +1,114 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use File::Compare; +use File::Copy; +use String::Util qw(trim); +use Test::More; +use lib 't'; +use pgsm; + +# Get file name and CREATE out file name and dirs WHERE requried +PGSM::setup_files_dir(basename($0)); + +# CREATE new PostgreSQL node and do initdb +my $node = PGSM->pgsm_init_pg(); +my $pgdata = $node->data_dir; + +# UPDATE postgresql.conf to include/load pg_stat_monitor library +open my $conf, '>>', "$pgdata/postgresql.conf"; +print $conf "shared_preload_libraries = 'pg_stat_monitor'\n"; +print $conf "pg_stat_monitor.pgsm_normalized_query = 'no'\n"; +print $conf "pg_stat_monitor.pgsm_extract_bind_variables = 'no'\n"; +close $conf; + +# Start server +my $rt_value = $node->start; +ok($rt_value == 1, "Start Server"); + +# CREATE EXTENSION and change out file permissions +my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); +ok($cmdret == 0, "CREATE PGSM EXTENSION"); +PGSM::append_to_file($stdout); + +# Run required commands/queries and dump output to out file. +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +ok($cmdret == 0, "Reset PGSM EXTENSION"); +PGSM::append_to_file($stdout); + +($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 in ('pg_stat_monitor.pgsm_normalized_query', 'pg_stat_monitor.pgsm_extract_bind_variables');", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +ok($cmdret == 0, "Print PGSM EXTENSION Settings"); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', "INSERT INTO TBL_0(key, txt_0, value_0) VALUES('000000', '846930886', 1804289383);", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT key, txt_0, value_0 FROM TBL_0;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT key, txt_0, value_0 FROM TBL_0;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'UPDATE TBL_0 SET value_0 = 1681692777;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT datname, substr(query,0,100) AS query, calls, bind_variables FROM pg_stat_monitor ORDER BY datname, query, calls DESC Limit 20;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +ok($cmdret == 0, "SELECT XXX FROM pg_stat_monitor"); +PGSM::append_to_file($stdout); + +$node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_normalized_query = 'yes'\n"); +$node->append_conf('postgresql.conf', "pg_stat_monitor.pgsm_extract_bind_variables = 'yes'\n"); +$node->restart(); + +# Run required commands/queries and dump output to out file. +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'DROP TABLE TBL_0;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +ok($cmdret == 0, "Reset PGSM EXTENSION"); +PGSM::append_to_file($stdout); + +($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 in ('pg_stat_monitor.pgsm_normalized_query', 'pg_stat_monitor.pgsm_extract_bind_variables');", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +ok($cmdret == 0, "Print PGSM EXTENSION Settings"); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int);', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', "INSERT INTO TBL_0(key, txt_0, value_0) VALUES('000000', '846930886', 1804289383);", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT key, txt_0, value_0 FROM TBL_0;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT key, txt_0, value_0 FROM TBL_0;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'UPDATE TBL_0 SET value_0 = 1681692777;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +PGSM::append_to_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT datname, substr(query,0,100) AS query, calls, bind_variables FROM pg_stat_monitor ORDER BY datname, query, calls DESC Limit 20;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); +ok($cmdret == 0, "SELECT XXX FROM pg_stat_monitor"); +PGSM::append_to_file($stdout); + +# DROP EXTENSION +$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); +ok($cmdret == 0, "DROP PGSM EXTENSION"); +PGSM::append_to_file($stdout); + +# Stop the server +$node->stop; + +# compare the expected and out file +my $compare = PGSM->compare_results(); + +# Test/check if expected and result/out file match. If Yes, test passes. +is($compare,0,"Compare Files: $PGSM::expected_filename_with_path and $PGSM::out_filename_with_path files."); + +# Done testing for this testcase file. +done_testing(); diff --git a/t/expected/001_settings_default.out b/t/expected/001_settings_default.out index 5a99aeed..3e2f757b 100644 --- a/t/expected/001_settings_default.out +++ b/t/expected/001_settings_default.out @@ -6,26 +6,27 @@ SELECT pg_stat_monitor_reset(); (1 row) 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%'; - name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart --------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- - pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f - pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f - pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f - pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f - pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f - pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f - pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f - pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f - pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f - pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f - pg_stat_monitor.pgsm_track_planning | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f -(17 rows) + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- + pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f + pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f + pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f + pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f + pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f + pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f + pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f + pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f + pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f + pg_stat_monitor.pgsm_track_planning | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f +(18 rows) SELECT datname, substr(query,0,100) AS query, calls FROM pg_stat_monitor ORDER BY datname, query, calls DESC Limit 20; datname | query | calls @@ -35,26 +36,27 @@ SELECT datname, substr(query,0,100) AS query, calls FROM pg_stat_monitor ORDER B (2 rows) 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%'; - name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart --------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- - pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f - pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f - pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f - pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f - pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f - pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f - pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f - pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f - pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f - pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f - pg_stat_monitor.pgsm_track_planning | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f -(17 rows) + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- + pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f + pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f + pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f + pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f + pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f + pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f + pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f + pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f + pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f + pg_stat_monitor.pgsm_track_planning | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f +(18 rows) SELECT pg_stat_monitor_reset(); pg_stat_monitor_reset diff --git a/t/expected/001_settings_default.out.12 b/t/expected/001_settings_default.out.12 index 4933ae9e..6db8066a 100644 --- a/t/expected/001_settings_default.out.12 +++ b/t/expected/001_settings_default.out.12 @@ -6,25 +6,26 @@ SELECT pg_stat_monitor_reset(); (1 row) 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%'; - name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart --------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- - pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f - pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f - pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f - pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f - pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f - pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f - pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f - pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f - pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f - pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f - pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f -(16 rows) + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- + pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f + pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f + pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f + pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f + pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f + pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f + pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f + pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f + pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f + pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f +(17 rows) SELECT datname, substr(query,0,100) AS query, calls FROM pg_stat_monitor ORDER BY datname, query, calls DESC Limit 20; datname | query | calls @@ -34,25 +35,26 @@ SELECT datname, substr(query,0,100) AS query, calls FROM pg_stat_monitor ORDER B (2 rows) 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%'; - name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart --------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- - pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f - pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f - pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f - pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f - pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f - pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f - pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f - pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f - pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f - pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f - pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f - pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f - pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f -(16 rows) + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+------------+---------+---------+---------+------------+----------------+----------+-----------+----------------- + pg_stat_monitor.pgsm_bucket_time | 60 | s | postmaster | integer | default | 1 | 2147483647 | | 60 | 60 | f + pg_stat_monitor.pgsm_enable_overflow | on | | postmaster | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_pgsm_query_id | on | | user | bool | default | | | | on | on | f + pg_stat_monitor.pgsm_enable_query_plan | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_extract_comments | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_histogram_buckets | 20 | | postmaster | integer | default | 2 | 50 | | 20 | 20 | f + pg_stat_monitor.pgsm_histogram_max | 100000 | ms | postmaster | real | default | 10 | 5e+07 | | 100000 | 100000 | f + pg_stat_monitor.pgsm_histogram_min | 1 | ms | postmaster | real | default | 0 | 5e+07 | | 1 | 1 | f + pg_stat_monitor.pgsm_max | 256 | MB | postmaster | integer | default | 10 | 10240 | | 256 | 256 | f + pg_stat_monitor.pgsm_max_buckets | 10 | | postmaster | integer | default | 1 | 20000 | | 10 | 10 | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | default | | | | off | off | f + pg_stat_monitor.pgsm_overflow_target | 1 | | postmaster | integer | default | 0 | 1 | | 1 | 1 | f + pg_stat_monitor.pgsm_query_max_len | 2048 | | postmaster | integer | default | 1024 | 2147483647 | | 2048 | 2048 | f + pg_stat_monitor.pgsm_query_shared_buffer | 20 | MB | postmaster | integer | default | 1 | 10000 | | 20 | 20 | f + pg_stat_monitor.pgsm_track | top | | user | enum | default | | | {none,top,all} | top | top | f + pg_stat_monitor.pgsm_track_utility | on | | user | bool | default | | | | on | on | f +(17 rows) SELECT pg_stat_monitor_reset(); pg_stat_monitor_reset diff --git a/t/expected/030_settings_pgms_extract_bind_variables.out b/t/expected/030_settings_pgms_extract_bind_variables.out new file mode 100644 index 00000000..c6699fe9 --- /dev/null +++ b/t/expected/030_settings_pgms_extract_bind_variables.out @@ -0,0 +1,81 @@ +CREATE EXTENSION pg_stat_monitor; +SELECT pg_stat_monitor_reset(); + pg_stat_monitor_reset +----------------------- + +(1 row) + +SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name in ('pg_stat_monitor.pgsm_normalized_query', 'pg_stat_monitor.pgsm_extract_bind_variables'); + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+---------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- + pg_stat_monitor.pgsm_extract_bind_variables | off | | user | bool | configuration file | | | | off | off | f + pg_stat_monitor.pgsm_normalized_query | off | | user | bool | configuration file | | | | off | off | f +(2 rows) + +CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int); +INSERT INTO TBL_0(key, txt_0, value_0) VALUES('000000', '846930886', 1804289383); +SELECT key, txt_0, value_0 FROM TBL_0; + key | txt_0 | value_0 +--------+-----------+------------ + 000000 | 846930886 | 1804289383 +(1 row) + +SELECT key, txt_0, value_0 FROM TBL_0; + key | txt_0 | value_0 +--------+-----------+------------ + 000000 | 846930886 | 1804289383 +(1 row) + +UPDATE TBL_0 SET value_0 = 1681692777; +SELECT datname, substr(query,0,100) AS query, calls, bind_variables FROM pg_stat_monitor ORDER BY datname, query, calls DESC Limit 20; + datname | query | calls | bind_variables +----------+-----------------------------------------------------------------------------------------------------+-------+---------------- + postgres | CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int) | 1 | + postgres | INSERT INTO TBL_0(key, txt_0, value_0) VALUES('000000', '846930886', 1804289383) | 1 | + postgres | SELECT key, txt_0, value_0 FROM TBL_0 | 2 | + postgres | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_v | 1 | + postgres | SELECT pg_stat_monitor_reset() | 1 | + postgres | UPDATE TBL_0 SET value_0 = 1681692777 | 1 | +(6 rows) + +DROP TABLE TBL_0; +SELECT pg_stat_monitor_reset(); + pg_stat_monitor_reset +----------------------- + +(1 row) + +SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name in ('pg_stat_monitor.pgsm_normalized_query', 'pg_stat_monitor.pgsm_extract_bind_variables'); + name | setting | unit | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | pending_restart +---------------------------------------------+---------+------+---------+---------+--------------------+---------+---------+----------+----------+-----------+----------------- + pg_stat_monitor.pgsm_extract_bind_variables | on | | user | bool | configuration file | | | | off | on | f + pg_stat_monitor.pgsm_normalized_query | on | | user | bool | configuration file | | | | off | on | f +(2 rows) + +CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int); +INSERT INTO TBL_0(key, txt_0, value_0) VALUES('000000', '846930886', 1804289383); +SELECT key, txt_0, value_0 FROM TBL_0; + key | txt_0 | value_0 +--------+-----------+------------ + 000000 | 846930886 | 1804289383 +(1 row) + +SELECT key, txt_0, value_0 FROM TBL_0; + key | txt_0 | value_0 +--------+-----------+------------ + 000000 | 846930886 | 1804289383 +(1 row) + +UPDATE TBL_0 SET value_0 = 1681692777; +SELECT datname, substr(query,0,100) AS query, calls, bind_variables FROM pg_stat_monitor ORDER BY datname, query, calls DESC Limit 20; + datname | query | calls | bind_variables +----------+-----------------------------------------------------------------------------------------------------+-------+--------------------------------------------------------------------------------------- + postgres | CREATE TABLE TBL_0(key text primary key, txt_0 text, value_0 int) | 1 | + postgres | INSERT INTO TBL_0(key, txt_0, value_0) VALUES($1, $2, $3) | 1 | '000000','846930886',1804289383 + postgres | SELECT key, txt_0, value_0 FROM TBL_0 | 2 | + postgres | SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_v | 1 | 'pg_stat_monitor.pgsm_normalized_query','pg_stat_monitor.pgsm_extract_bind_variables' + postgres | SELECT pg_stat_monitor_reset() | 1 | + postgres | UPDATE TBL_0 SET value_0 = $1 | 1 | 1681692777 +(6 rows) + +DROP EXTENSION pg_stat_monitor;