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)
#:use-module (fibers channels) #:use-module (fibers channels)
#:use-module (fibers conditions) #:use-module (fibers conditions)
#:use-module (prometheus)
#:export (call-with-time-logging #:export (call-with-time-logging
with-time-logging with-time-logging
prevent-inlining-for-tests prevent-inlining-for-tests
@ -37,7 +38,9 @@
chunk! chunk!
chunk-for-each! chunk-for-each!
delete-duplicates/sort!)) delete-duplicates/sort!
get-gc-metrics-updater))
(define (call-with-time-logging action thunk) (define (call-with-time-logging action thunk)
(simple-format #t "debug: Starting ~A\n" action) (simple-format #t "debug: Starting ~A\n" action)
@ -243,3 +246,30 @@
current-element current-element
(cons current-element (cons current-element
result))))))))) 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)))) #:labels '(name))))
pg-stat-indexes-fields))) pg-stat-indexes-fields))
(gc-metrics-updater
(get-gc-metrics-updater registry)))
(lambda () (lambda ()
(letpar& ((metric-values (letpar& ((metric-values
(with-thread-postgresql-connection (with-thread-postgresql-connection
@ -234,6 +238,8 @@
(state . ,state))))) (state . ,state)))))
load-new-guix-revision-job-metrics) load-new-guix-revision-job-metrics)
(gc-metrics-updater)
(list (build-response (list (build-response
#:code 200 #:code 200
#:headers '((content-type . (text/plain)))) #:headers '((content-type . (text/plain))))