Add Prometheus metrics for indexes specifically
This commit is contained in:
parent
2fa9f151f6
commit
5267bde603
2 changed files with 78 additions and 10 deletions
|
|
@ -19,7 +19,8 @@
|
||||||
#:use-module (ice-9 match)
|
#:use-module (ice-9 match)
|
||||||
#:use-module (squee)
|
#:use-module (squee)
|
||||||
#:export (fetch-high-level-table-size-metrics
|
#:export (fetch-high-level-table-size-metrics
|
||||||
fetch-pg-stat-user-tables-metrics))
|
fetch-pg-stat-user-tables-metrics
|
||||||
|
fetch-pg-stat-user-indexes-metrics))
|
||||||
|
|
||||||
(define (fetch-high-level-table-size-metrics conn)
|
(define (fetch-high-level-table-size-metrics conn)
|
||||||
;; Adapted from https://wiki.postgresql.org/wiki/Disk_Usage
|
;; Adapted from https://wiki.postgresql.org/wiki/Disk_Usage
|
||||||
|
|
@ -41,7 +42,6 @@ SELECT table_name,
|
||||||
COALESCE(pg_tablespace.spcname,'default') AS tablespace,
|
COALESCE(pg_tablespace.spcname,'default') AS tablespace,
|
||||||
row_estimate,
|
row_estimate,
|
||||||
table_bytes,
|
table_bytes,
|
||||||
index_bytes,
|
|
||||||
toast_bytes
|
toast_bytes
|
||||||
FROM (
|
FROM (
|
||||||
SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes
|
SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes
|
||||||
|
|
@ -75,12 +75,11 @@ FROM (
|
||||||
LEFT JOIN pg_tablespace ON tablespace_id = pg_tablespace.oid")
|
LEFT JOIN pg_tablespace ON tablespace_id = pg_tablespace.oid")
|
||||||
|
|
||||||
(map (match-lambda
|
(map (match-lambda
|
||||||
((name tablespace row-estimate table-bytes index-bytes toast-bytes)
|
((name tablespace row-estimate table-bytes toast-bytes)
|
||||||
(list name
|
(list name
|
||||||
tablespace
|
tablespace
|
||||||
(or (string->number row-estimate) 0)
|
(or (string->number row-estimate) 0)
|
||||||
(or (string->number table-bytes) 0)
|
(or (string->number table-bytes) 0)
|
||||||
(or (string->number index-bytes) 0)
|
|
||||||
(or (string->number toast-bytes) 0))))
|
(or (string->number toast-bytes) 0))))
|
||||||
(exec-query conn query)))
|
(exec-query conn query)))
|
||||||
|
|
||||||
|
|
@ -126,3 +125,33 @@ SELECT relname, seq_scan, seq_tup_read,
|
||||||
(analyze-count . ,analyze-count)
|
(analyze-count . ,analyze-count)
|
||||||
(autoanalyze-count . ,autoanalyze-count))))
|
(autoanalyze-count . ,autoanalyze-count))))
|
||||||
(exec-query conn query)))
|
(exec-query conn query)))
|
||||||
|
|
||||||
|
(define (fetch-pg-stat-user-indexes-metrics conn)
|
||||||
|
(define query
|
||||||
|
"
|
||||||
|
SELECT pg_indexes.indexname,
|
||||||
|
pg_indexes.tablename,
|
||||||
|
COALESCE(pg_indexes.tablespace,'default') AS tablespace,
|
||||||
|
pg_stat_user_indexes.idx_scan,
|
||||||
|
pg_stat_user_indexes.idx_tup_read,
|
||||||
|
pg_stat_user_indexes.idx_tup_fetch,
|
||||||
|
pg_relation_size(indexrelid) AS size_in_bytes
|
||||||
|
FROM pg_stat_user_indexes
|
||||||
|
LEFT JOIN pg_indexes
|
||||||
|
ON pg_stat_user_indexes.indexrelname = pg_indexes.indexname
|
||||||
|
AND pg_stat_user_indexes.schemaname = pg_indexes.schemaname
|
||||||
|
WHERE pg_stat_user_indexes.schemaname = 'guix_data_service'")
|
||||||
|
|
||||||
|
(map
|
||||||
|
(match-lambda
|
||||||
|
((indexname tablename tablespace
|
||||||
|
idx_scan idx_tup_read idx_tup_fetch
|
||||||
|
size_in_bytes)
|
||||||
|
`((name . ,indexname)
|
||||||
|
(table-name . ,tablename)
|
||||||
|
(tablespace . ,tablespace)
|
||||||
|
(idx-scan . ,idx_scan)
|
||||||
|
(idx-tup-read . ,idx_tup_read)
|
||||||
|
(idx-tup-fetch . ,idx_tup_fetch)
|
||||||
|
(bytes . ,size_in_bytes))))
|
||||||
|
(exec-query conn query)))
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,24 @@
|
||||||
"-"
|
"-"
|
||||||
"_"))
|
"_"))
|
||||||
#:labels '(name))))
|
#:labels '(name))))
|
||||||
pg-stat-fields)))
|
pg-stat-fields))
|
||||||
|
|
||||||
|
(pg-stat-indexes-fields '(idx-scan idx-tup-read
|
||||||
|
idx-tup-fetch bytes))
|
||||||
|
|
||||||
|
(pg-stat-indexes-metrics (map (lambda (field)
|
||||||
|
(cons
|
||||||
|
field
|
||||||
|
(make-gauge-metric
|
||||||
|
registry
|
||||||
|
(string-append
|
||||||
|
"pg_stat_indexes_"
|
||||||
|
(string-replace-substring
|
||||||
|
(symbol->string field)
|
||||||
|
"-"
|
||||||
|
"_"))
|
||||||
|
#:labels '(name))))
|
||||||
|
pg-stat-indexes-fields)))
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(letpar& ((metric-values
|
(letpar& ((metric-values
|
||||||
(with-thread-postgresql-connection
|
(with-thread-postgresql-connection
|
||||||
|
|
@ -141,13 +158,16 @@
|
||||||
(pg-stat-user-tables-metrics
|
(pg-stat-user-tables-metrics
|
||||||
(with-thread-postgresql-connection
|
(with-thread-postgresql-connection
|
||||||
fetch-pg-stat-user-tables-metrics))
|
fetch-pg-stat-user-tables-metrics))
|
||||||
|
(pg-stat-user-indexes-metrics
|
||||||
|
(with-thread-postgresql-connection
|
||||||
|
fetch-pg-stat-user-indexes-metrics))
|
||||||
(load-new-guix-revision-job-metrics
|
(load-new-guix-revision-job-metrics
|
||||||
(with-thread-postgresql-connection
|
(with-thread-postgresql-connection
|
||||||
select-load-new-guix-revision-job-metrics)))
|
select-load-new-guix-revision-job-metrics)))
|
||||||
|
|
||||||
(for-each (match-lambda
|
(for-each (match-lambda
|
||||||
((name tablespace row-estimate
|
((name tablespace row-estimate
|
||||||
table-bytes index-bytes toast-bytes)
|
table-bytes toast-bytes)
|
||||||
|
|
||||||
(metric-set table-row-estimate-metric
|
(metric-set table-row-estimate-metric
|
||||||
row-estimate
|
row-estimate
|
||||||
|
|
@ -156,10 +176,6 @@
|
||||||
table-bytes
|
table-bytes
|
||||||
#:label-values `((name . ,name)
|
#:label-values `((name . ,name)
|
||||||
(tablespace . ,tablespace)))
|
(tablespace . ,tablespace)))
|
||||||
(metric-set table-index-bytes-metric
|
|
||||||
index-bytes
|
|
||||||
#:label-values `((name . ,name)
|
|
||||||
(tablespace . ,tablespace)))
|
|
||||||
(metric-set table-toast-bytes-metric
|
(metric-set table-toast-bytes-metric
|
||||||
toast-bytes
|
toast-bytes
|
||||||
#:label-values `((name . ,name)
|
#:label-values `((name . ,name)
|
||||||
|
|
@ -183,6 +199,29 @@
|
||||||
field-values)))
|
field-values)))
|
||||||
pg-stat-user-tables-metrics)
|
pg-stat-user-tables-metrics)
|
||||||
|
|
||||||
|
(map (lambda (field-values)
|
||||||
|
(let ((name (assq-ref field-values 'name))
|
||||||
|
(table-name (assq-ref field-values 'table-name))
|
||||||
|
(tablespace (assq-ref field-values 'tablespace)))
|
||||||
|
(for-each
|
||||||
|
(match-lambda
|
||||||
|
(('name . _) #f)
|
||||||
|
(('table-name . _) #f)
|
||||||
|
(('tablespace . _) #f)
|
||||||
|
((field . value)
|
||||||
|
(let ((metric (or (assq-ref pg-stat-indexes-metrics field)
|
||||||
|
(error field))))
|
||||||
|
(metric-set metric
|
||||||
|
value
|
||||||
|
#:label-values
|
||||||
|
`((name . ,name)
|
||||||
|
(table . ,table-name)
|
||||||
|
,@(if (eq? field 'bytes)
|
||||||
|
`((tablespace . ,tablespace))
|
||||||
|
'()))))))
|
||||||
|
field-values)))
|
||||||
|
pg-stat-user-indexes-metrics)
|
||||||
|
|
||||||
(for-each (match-lambda
|
(for-each (match-lambda
|
||||||
((repository-label completed count)
|
((repository-label completed count)
|
||||||
(metric-set
|
(metric-set
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue