PG-150: Logging CMD Type like SELECT, UPDATE, INSERT, DELETE.

pull/66/head
Ibrar Ahmed 2020-12-06 16:38:48 +00:00
parent 379fcdefd5
commit 47ad105011
4 changed files with 30 additions and 33 deletions

View File

@ -341,23 +341,20 @@ SELECT relations::oid[]::regclass[], query FROM pg_stat_monitor;
**`cmd_type`**: List the command type of the query. **`cmd_type`**: List the command type of the query.
```sql ```sql
SELECT substr(query,0, 50) AS query, cmd_type FROM pg_stat_monitor WHERE elevel = 0; postgres=# SELECT bucket, substr(query,0, 50) AS query, cmd_type FROM pg_stat_monitor WHERE elevel = 0;
                       query                       |    cmd_type     bucket | query | cmd_type
---------------------------------------------------+----------------- --------+---------------------------------------------------+----------
 BEGIN                                             | {INSERT} 1 | vacuum analyze pgbench_history |
 vacuum pgbench_branches                           | {} 1 | alter table pgbench_tellers add primary key (tid) |
 UPDATE pgbench_branches SET bbalance = bbalance + | {UPDATE,SELECT} 1 | insert into pgbench_tellers(tid,bid,tbalance) val | INSERT
 select substr(query,$1, $2) as query, cmd_type fr | {SELECT} 1 | select * from tt for update | UPDATE
 select count(*) from pgbench_branches             | {SELECT} 1 | update tt set a = $1 | UPDATE
 select substr(query,$1, $2) as query, cmd_type fr | {} 1 | delete from tt | DELETE
 UPDATE pgbench_accounts SET abalance = abalance + | {UPDATE,SELECT} 1 | insert into pgbench_branches(bid,bbalance) values | INSERT
 update test SET a = $1                            | {UPDATE} 1 | begin |
 END                                               | {INSERT} 1 | drop table if exists pgbench_accounts, pgbench_br |
 INSERT INTO pgbench_history (tid, bid, aid, delta | {INSERT} 1 | copy pgbench_accounts from stdin | INSERT
 vacuum pgbench_tellers                            | {} 1 | create table pgbench_history(tid int,bid int,aid |
 SELECT a from test for update                     | {UPDATE,SELECT} 1 | SELECT bucket, substr(query,$1, $2) AS query, cmd | SELECT
 SELECT abalance FROM pgbench_accounts WHERE aid = | {SELECT} (12 rows)
 UPDATE pgbench_tellers SET tbalance = tbalance +  | {UPDATE,SELECT}
 truncate pgbench_history                          | {}
(15 rows)
``` ```

View File

@ -176,14 +176,12 @@ hash_query_entry_dealloc(int bucket)
HASH_SEQ_STATUS hash_seq; HASH_SEQ_STATUS hash_seq;
pgssQueryEntry *entry; pgssQueryEntry *entry;
printf ("--%d--", hash_get_num_entries(pgss_hash));
hash_seq_init(&hash_seq, pgss_query_hash); hash_seq_init(&hash_seq, pgss_query_hash);
while ((entry = hash_seq_search(&hash_seq)) != NULL) while ((entry = hash_seq_search(&hash_seq)) != NULL)
{ {
if (entry->key.bucket_id == bucket) if (entry->key.bucket_id == bucket)
entry = hash_search(pgss_query_hash, &entry->key, HASH_REMOVE, NULL); entry = hash_search(pgss_query_hash, &entry->key, HASH_REMOVE, NULL);
} }
printf ("--%d", hash_get_num_entries(pgss_hash));
} }
/* /*

View File

@ -99,8 +99,12 @@ CREATE VIEW pg_stat_monitor AS SELECT
queryid, queryid,
query, query,
application_name, application_name,
(string_to_array(relations, ',')) relations, (string_to_array(relations, ',')) AS relations,
(string_to_array(cmd_type, ',')) cmd_type, CASE
WHEN query like 'BEGIN' THEN ''
WHEN query like 'END' THEN ''
ELSE (string_to_array(cmd_type, ','))[1]
END AS cmd_type,
elevel, elevel,
sqlcode, sqlcode,
message, message,

View File

@ -465,14 +465,14 @@ pgss_ExecutorCheckPerms(List *rt, bool abort)
pgss->relations[i++] = rte->relid; pgss->relations[i++] = rte->relid;
} }
if (rte->requiredPerms & ACL_INSERT) snprintf(pgss->cmdTag[0],CMD_LEN,"%s", "INSERT"); 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"); else 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"); else 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"); else 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"); else 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"); else 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"); else 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"); else 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_CREATE) snprintf(pgss->cmdTag[8],CMD_LEN,"%s", "CREATE");
} }
LWLockRelease(pgss->lock); LWLockRelease(pgss->lock);
@ -1255,7 +1255,6 @@ get_next_wbucket(pgssSharedState *pgss)
hash_query_entry_dealloc(bucket_id); hash_query_entry_dealloc(bucket_id);
sprintf(file_name, "%s.%d", PGSM_TEXT_FILE, (int)bucket_id); sprintf(file_name, "%s.%d", PGSM_TEXT_FILE, (int)bucket_id);
unlink(file_name); unlink(file_name);
printf("\nRemove file %s\n", file_name);
/* reset the query buffer */ /* reset the query buffer */
memset(buf, 0, sizeof (uint64)); 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]; char file_name[1024];
sprintf(file_name, "%s.%d", PGSM_TEXT_FILE, bucket_id); 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); fd = OpenTransientFile(file_name, O_RDWR | O_CREAT | O_APPEND | PG_BINARY);
if (fd < 0) if (fd < 0)
ereport(LOG, ereport(LOG,