From 47ad1050117778c85c515a7006ff16b58915e4f8 Mon Sep 17 00:00:00 2001 From: Ibrar Ahmed Date: Sun, 6 Dec 2020 16:38:48 +0000 Subject: [PATCH] PG-150: Logging CMD Type like SELECT, UPDATE, INSERT, DELETE. --- docs/USER_GUIDE.md | 35 ++++++++++++++++------------------- hash_query.c | 2 -- pg_stat_monitor--1.0.sql | 8 ++++++-- pg_stat_monitor.c | 18 ++++++++---------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index 688ba99..53b51c9 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -341,23 +341,20 @@ SELECT relations::oid[]::regclass[], query FROM pg_stat_monitor; **`cmd_type`**: List the command type of the query. ```sql -SELECT substr(query,0, 50) AS query, cmd_type FROM pg_stat_monitor WHERE elevel = 0; -                       query                       |    cmd_type     ----------------------------------------------------+----------------- - BEGIN                                             | {INSERT} - vacuum pgbench_branches                           | {} - UPDATE pgbench_branches SET bbalance = bbalance + | {UPDATE,SELECT} - select substr(query,$1, $2) as query, cmd_type fr | {SELECT} - select count(*) from pgbench_branches             | {SELECT} - select substr(query,$1, $2) as query, cmd_type fr | {} - UPDATE pgbench_accounts SET abalance = abalance + | {UPDATE,SELECT} - update test SET a = $1                            | {UPDATE} - END                                               | {INSERT} - INSERT INTO pgbench_history (tid, bid, aid, delta | {INSERT} - vacuum pgbench_tellers                            | {} - SELECT a from test for update                     | {UPDATE,SELECT} - SELECT abalance FROM pgbench_accounts WHERE aid = | {SELECT} - UPDATE pgbench_tellers SET tbalance = tbalance +  | {UPDATE,SELECT} - truncate pgbench_history                          | {} -(15 rows) +postgres=# SELECT bucket, substr(query,0, 50) AS query, cmd_type FROM pg_stat_monitor WHERE elevel = 0; + bucket | query | cmd_type +--------+---------------------------------------------------+---------- + 1 | vacuum analyze pgbench_history | + 1 | alter table pgbench_tellers add primary key (tid) | + 1 | insert into pgbench_tellers(tid,bid,tbalance) val | INSERT + 1 | select * from tt for update | UPDATE + 1 | update tt set a = $1 | UPDATE + 1 | delete from tt | DELETE + 1 | insert into pgbench_branches(bid,bbalance) values | INSERT + 1 | begin | + 1 | drop table if exists pgbench_accounts, pgbench_br | + 1 | copy pgbench_accounts from stdin | INSERT + 1 | create table pgbench_history(tid int,bid int,aid | + 1 | SELECT bucket, substr(query,$1, $2) AS query, cmd | SELECT +(12 rows) ``` diff --git a/hash_query.c b/hash_query.c index a34447b..32164c0 100644 --- a/hash_query.c +++ b/hash_query.c @@ -176,14 +176,12 @@ hash_query_entry_dealloc(int bucket) HASH_SEQ_STATUS hash_seq; pgssQueryEntry *entry; - printf ("--%d--", hash_get_num_entries(pgss_hash)); hash_seq_init(&hash_seq, pgss_query_hash); while ((entry = hash_seq_search(&hash_seq)) != NULL) { if (entry->key.bucket_id == bucket) entry = hash_search(pgss_query_hash, &entry->key, HASH_REMOVE, NULL); } - printf ("--%d", hash_get_num_entries(pgss_hash)); } /* diff --git a/pg_stat_monitor--1.0.sql b/pg_stat_monitor--1.0.sql index 173420c..9f83262 100644 --- a/pg_stat_monitor--1.0.sql +++ b/pg_stat_monitor--1.0.sql @@ -99,8 +99,12 @@ CREATE VIEW pg_stat_monitor AS SELECT queryid, query, application_name, - (string_to_array(relations, ',')) relations, - (string_to_array(cmd_type, ',')) cmd_type, + (string_to_array(relations, ',')) AS relations, + CASE + WHEN query like 'BEGIN' THEN '' + WHEN query like 'END' THEN '' + ELSE (string_to_array(cmd_type, ','))[1] + END AS cmd_type, elevel, sqlcode, message, diff --git a/pg_stat_monitor.c b/pg_stat_monitor.c index 231d221..6ae36c6 100644 --- a/pg_stat_monitor.c +++ b/pg_stat_monitor.c @@ -465,14 +465,14 @@ pgss_ExecutorCheckPerms(List *rt, bool abort) pgss->relations[i++] = rte->relid; } if (rte->requiredPerms & ACL_INSERT) snprintf(pgss->cmdTag[0],CMD_LEN,"%s", "INSERT"); - if (rte->requiredPerms & ACL_UPDATE) snprintf(pgss->cmdTag[1],CMD_LEN,"%s", "UPDATE"); - if (rte->requiredPerms & ACL_DELETE) snprintf(pgss->cmdTag[2],CMD_LEN,"%s", "DELETE"); - if (rte->requiredPerms & ACL_SELECT) snprintf(pgss->cmdTag[3],CMD_LEN,"%s", "SELECT"); - if (rte->requiredPerms & ACL_TRUNCATE) snprintf(pgss->cmdTag[4],CMD_LEN,"%s", "TRUNCATE"); - if (rte->requiredPerms & ACL_REFERENCES) snprintf(pgss->cmdTag[5],CMD_LEN,"%s", "REFERENCES"); - if (rte->requiredPerms & ACL_TRIGGER) snprintf(pgss->cmdTag[6],CMD_LEN,"%s", "TRIGGER"); - if (rte->requiredPerms & ACL_EXECUTE) snprintf(pgss->cmdTag[7],CMD_LEN,"%s", "EXECUTE"); - if (rte->requiredPerms & ACL_CREATE) snprintf(pgss->cmdTag[8],CMD_LEN,"%s", "CREATE"); + else if (rte->requiredPerms & ACL_UPDATE) snprintf(pgss->cmdTag[1],CMD_LEN,"%s", "UPDATE"); + else if (rte->requiredPerms & ACL_DELETE) snprintf(pgss->cmdTag[2],CMD_LEN,"%s", "DELETE"); + else if (rte->requiredPerms & ACL_SELECT) snprintf(pgss->cmdTag[3],CMD_LEN,"%s", "SELECT"); + else if (rte->requiredPerms & ACL_TRUNCATE) snprintf(pgss->cmdTag[4],CMD_LEN,"%s", "TRUNCATE"); + else if (rte->requiredPerms & ACL_REFERENCES) snprintf(pgss->cmdTag[5],CMD_LEN,"%s", "REFERENCES"); + else if (rte->requiredPerms & ACL_TRIGGER) snprintf(pgss->cmdTag[6],CMD_LEN,"%s", "TRIGGER"); + else if (rte->requiredPerms & ACL_EXECUTE) snprintf(pgss->cmdTag[7],CMD_LEN,"%s", "EXECUTE"); + else if (rte->requiredPerms & ACL_CREATE) snprintf(pgss->cmdTag[8],CMD_LEN,"%s", "CREATE"); } LWLockRelease(pgss->lock); @@ -1255,7 +1255,6 @@ get_next_wbucket(pgssSharedState *pgss) hash_query_entry_dealloc(bucket_id); sprintf(file_name, "%s.%d", PGSM_TEXT_FILE, (int)bucket_id); unlink(file_name); - printf("\nRemove file %s\n", file_name); /* reset the query buffer */ memset(buf, 0, sizeof (uint64)); @@ -2530,7 +2529,6 @@ dump_queries_buffer(int bucket_id, unsigned char *buf, int buf_len) char file_name[1024]; sprintf(file_name, "%s.%d", PGSM_TEXT_FILE, bucket_id); - printf("\nWriting to %s\n", file_name); fd = OpenTransientFile(file_name, O_RDWR | O_CREAT | O_APPEND | PG_BINARY); if (fd < 0) ereport(LOG,