diff options
author | Christopher Baines <mail@cbaines.net> | 2022-10-09 11:13:28 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2022-10-09 11:13:28 +0100 |
commit | 8dd164665a41b7fc4265bad8b43f28b936741bae (patch) | |
tree | 9022b7493fc07a80250ff51386d421e1d761bd36 /guix-data-service | |
parent | ff77bbea7e647a07c5601e51704c04258a73b79f (diff) | |
download | data-service-8dd164665a41b7fc4265bad8b43f28b936741bae.tar data-service-8dd164665a41b7fc4265bad8b43f28b936741bae.tar.gz |
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.
Diffstat (limited to 'guix-data-service')
-rw-r--r-- | guix-data-service/utils.scm | 32 | ||||
-rw-r--r-- | guix-data-service/web/controller.scm | 8 |
2 files changed, 38 insertions, 2 deletions
diff --git a/guix-data-service/utils.scm b/guix-data-service/utils.scm index 6be5cc5..20ac3c0 100644 --- a/guix-data-service/utils.scm +++ b/guix-data-service/utils.scm @@ -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)))) + diff --git a/guix-data-service/web/controller.scm b/guix-data-service/web/controller.scm index a29382a..7aac071 100644 --- a/guix-data-service/web/controller.scm +++ b/guix-data-service/web/controller.scm @@ -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)))) |