aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2022-10-09 11:13:28 +0100
committerChristopher Baines <mail@cbaines.net>2022-10-09 11:13:28 +0100
commit8dd164665a41b7fc4265bad8b43f28b936741bae (patch)
tree9022b7493fc07a80250ff51386d421e1d761bd36 /guix-data-service
parentff77bbea7e647a07c5601e51704c04258a73b79f (diff)
downloaddata-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.scm32
-rw-r--r--guix-data-service/web/controller.scm8
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))))