PG-173: Added new WAL usage statistics.

pull/72/head
Ibrar Ahmed 2021-02-02 15:50:33 +00:00
parent 12ba1e39d1
commit 8410572ce3
3 changed files with 46 additions and 6 deletions

View File

@ -70,7 +70,10 @@ CREATE FUNCTION pg_stat_monitor(IN showtext boolean,
OUT blk_write_time float8, OUT blk_write_time float8,
OUT resp_calls text, OUT resp_calls text,
OUT cpu_user_time float8, OUT cpu_user_time float8,
OUT cpu_sys_time float8 OUT cpu_sys_time float8,
OUT wal_records int8,
OUT wal_fpi int8,
OUT wal_bytes numeric
) )
RETURNS SETOF record RETURNS SETOF record
AS 'MODULE_PATHNAME', 'pg_stat_monitor' AS 'MODULE_PATHNAME', 'pg_stat_monitor'
@ -145,7 +148,10 @@ CREATE VIEW pg_stat_monitor AS SELECT
blk_write_time, blk_write_time,
(string_to_array(resp_calls, ',')) resp_calls, (string_to_array(resp_calls, ',')) resp_calls,
round(cpu_user_time::numeric, 4) as cpu_user_time, round(cpu_user_time::numeric, 4) as cpu_user_time,
round(cpu_sys_time::numeric, 4) as cpu_sys_time round(cpu_sys_time::numeric, 4) as cpu_sys_time,
wal_records,
wal_fpi,
wal_bytes
FROM pg_stat_monitor(TRUE), pg_database WHERE dbid = oid FROM pg_stat_monitor(TRUE), pg_database WHERE dbid = oid
ORDER BY bucket_start_time; ORDER BY bucket_start_time;

View File

@ -21,7 +21,7 @@
PG_MODULE_MAGIC; PG_MODULE_MAGIC;
#define BUILD_VERSION "0.7.0" #define BUILD_VERSION "0.7.0"
#define PG_STAT_STATEMENTS_COLS 42 /* maximum of above */ #define PG_STAT_STATEMENTS_COLS 45 /* maximum of above */
#define PGSM_TEXT_FILE "/tmp/pg_stat_monitor_query" #define PGSM_TEXT_FILE "/tmp/pg_stat_monitor_query"
#define PGUNSIXBIT(val) (((val) & 0x3F) + '0') #define PGUNSIXBIT(val) (((val) & 0x3F) + '0')
@ -1000,6 +1000,11 @@ static void pgss_store(uint64 queryId,
e->counters.sysinfo.stime = stime; e->counters.sysinfo.stime = stime;
if (sqlcode[0] != 0) if (sqlcode[0] != 0)
memset(&entry->counters.blocks, 0, sizeof(entry->counters.blocks)); memset(&entry->counters.blocks, 0, sizeof(entry->counters.blocks));
#if PG_VERSION_NUM >= 130000
e->counters.walusage.wal_records += walusage->wal_records;
e->counters.walusage.wal_fpi += walusage->wal_fpi;
e->counters.walusage.wal_bytes += walusage->wal_bytes;
#endif
SpinLockRelease(&e->mutex); SpinLockRelease(&e->mutex);
} }
} }
@ -1251,6 +1256,28 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
values[i++] = IntArrayGetTextDatum(tmp.resp_calls, MAX_RESPONSE_BUCKET); values[i++] = IntArrayGetTextDatum(tmp.resp_calls, MAX_RESPONSE_BUCKET);
values[i++] = Float8GetDatumFast(tmp.sysinfo.utime); values[i++] = Float8GetDatumFast(tmp.sysinfo.utime);
values[i++] = Float8GetDatumFast(tmp.sysinfo.stime); values[i++] = Float8GetDatumFast(tmp.sysinfo.stime);
#if PG_VERSION_NUM >= 130000
{
char buf[256];
Datum wal_bytes;
values[i++] = Int64GetDatumFast(tmp.walusage.wal_records);
values[i++] = Int64GetDatumFast(tmp.walusage.wal_fpi);
snprintf(buf, sizeof buf, UINT64_FORMAT, tmp.walusage.wal_bytes);
/* Convert to numeric. */
wal_bytes = DirectFunctionCall3(numeric_in,
CStringGetDatum(buf),
ObjectIdGetDatum(0),
Int32GetDatum(-1));
values[i++] = wal_bytes;
}
#else
nulls[i++] = true;
nulls[i++] = true;
nulls[i++] = true;
#endif
tuplestore_putvalues(tupstore, tupdesc, values, nulls); tuplestore_putvalues(tupstore, tupdesc, values, nulls);
} }
free(query_txt); free(query_txt);
@ -2421,7 +2448,7 @@ static PlannedStmt *pgss_planner_hook(Query *parse, int opt, ParamListInfo param
{ {
if (planner_hook_next) if (planner_hook_next)
result = planner_hook_next(parse, query_string, cursorOptions, boundParams); result = planner_hook_next(parse, query_string, cursorOptions, boundParams);
result = standard_planner(parse, query_string, cursorOptions, boundParams); result = standard_planner(parse, query_string, cursorOptions, boundParams);
} }
#else #else
if (planner_hook_next) if (planner_hook_next)
@ -2587,7 +2614,7 @@ int
read_query_buffer(int bucket_id, uint64 queryid, char *query_txt) read_query_buffer(int bucket_id, uint64 queryid, char *query_txt)
{ {
int fd = 0; int fd = 0;
int buf_len; int buf_len = 0;
char file_name[1024]; char file_name[1024];
unsigned char *buf = NULL; unsigned char *buf = NULL;
int off = 0; int off = 0;
@ -2711,7 +2738,7 @@ get_histogram_timings(PG_FUNCTION_ARGS)
{ {
int64 b_start = (index == 1)? 0 : exp(bucket_size * (index - 1)); int64 b_start = (index == 1)? 0 : exp(bucket_size * (index - 1));
int64 b_end = exp(bucket_size * index); int64 b_end = exp(bucket_size * index);
sprintf(range[index-1], "(%d - %d)}", b_start, b_end); sprintf(range[index-1], "(%ld - %ld)}", b_start, b_end);
} }
return TextArrayGetTextDatum(range, b_count, 1024); return TextArrayGetTextDatum(range, b_count, 1024);
} }

View File

@ -209,6 +209,12 @@ typedef struct SysInfo
float stime; /* system cpu time */ float stime; /* system cpu time */
} SysInfo; } SysInfo;
typedef struct Wal_Usage
{
int64 wal_records; /* # of WAL records generated */
int64 wal_fpi; /* # of WAL full page images generated */
uint64 wal_bytes; /* total amount of WAL bytes generated */
} Wal_Usage;
/* /*
* The actual stats counters kept within pgssEntry. * The actual stats counters kept within pgssEntry.
*/ */
@ -221,6 +227,7 @@ typedef struct Counters
Blocks blocks; Blocks blocks;
SysInfo sysinfo; SysInfo sysinfo;
ErrorInfo error; ErrorInfo error;
Wal_Usage walusage;
int plans; int plans;
int resp_calls[MAX_RESPONSE_BUCKET]; /* execution time's in msec */ int resp_calls[MAX_RESPONSE_BUCKET]; /* execution time's in msec */
} Counters; } Counters;