Expose Guile GC metrics

As the guix-data-service process seems to be using excessive amounts of
memory, and this will be useful to track it.
This commit is contained in:
Christopher Baines 2022-10-09 11:13:28 +01:00
parent ff77bbea7e
commit 8dd164665a
2 changed files with 38 additions and 2 deletions

View file

@ -24,6 +24,7 @@
#:use-module (fibers)
#:use-module (fibers channels)
#:use-module (fibers conditions)
#:use-module (prometheus)
#:export (call-with-time-logging
with-time-logging
prevent-inlining-for-tests
@ -37,7 +38,9 @@
chunk!
chunk-for-each!
delete-duplicates/sort!))
delete-duplicates/sort!
get-gc-metrics-updater))
(define (call-with-time-logging action thunk)
(simple-format #t "debug: Starting ~A\n" action)
@ -243,3 +246,30 @@
current-element
(cons current-element
result)))))))))
(define (get-gc-metrics-updater registry)
(define metrics
`((gc-time-taken
. ,(make-gauge-metric registry "guile_gc_time_taken"))
(heap-size
. ,(make-gauge-metric registry "guile_heap_size"))
(heap-free-size
. ,(make-gauge-metric registry "guile_heap_free_size"))
(heap-total-allocated
. ,(make-gauge-metric registry "guile_heap_total_allocated"))
(heap-allocated-since-gc
. ,(make-gauge-metric registry "guile_allocated_since_gc"))
(protected-objects
. ,(make-gauge-metric registry "guile_gc_protected_objects"))
(gc-times
. ,(make-gauge-metric registry "guile_gc_times"))))
(lambda ()
(let ((stats (gc-stats)))
(for-each
(match-lambda
((name . metric)
(let ((value (assq-ref stats name)))
(metric-set metric value))))
metrics))))

View file

@ -149,7 +149,11 @@
"-"
"_"))
#:labels '(name))))
pg-stat-indexes-fields)))
pg-stat-indexes-fields))
(gc-metrics-updater
(get-gc-metrics-updater registry)))
(lambda ()
(letpar& ((metric-values
(with-thread-postgresql-connection
@ -234,6 +238,8 @@
(state . ,state)))))
load-new-guix-revision-job-metrics)
(gc-metrics-updater)
(list (build-response
#:code 200
#:headers '((content-type . (text/plain))))