From 8dd164665a41b7fc4265bad8b43f28b936741bae Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Sun, 9 Oct 2022 11:13:28 +0100 Subject: [PATCH] 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. --- guix-data-service/utils.scm | 32 +++++++++++++++++++++++++++- 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))))