aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/utils.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2021-03-25 21:29:47 +0000
committerChristopher Baines <mail@cbaines.net>2021-03-25 21:29:47 +0000
commit6e7e63f356cb88e3e5fe1a55a0390a1366205c9c (patch)
treea3ef831ecf8d99a34de308608ea0d17d990ee539 /guix-build-coordinator/utils.scm
parentfca86bde6b20c166f2c54a4831248e8fef57ffae (diff)
downloadbuild-coordinator-6e7e63f356cb88e3e5fe1a55a0390a1366205c9c.tar
build-coordinator-6e7e63f356cb88e3e5fe1a55a0390a1366205c9c.tar.gz
Add Guile GC related metrics
I'm seeing mmap(PROT_NONE) failed crashes, and maybe these metrics will help in understanding what's going on.
Diffstat (limited to 'guix-build-coordinator/utils.scm')
-rw-r--r--guix-build-coordinator/utils.scm31
1 files changed, 30 insertions, 1 deletions
diff --git a/guix-build-coordinator/utils.scm b/guix-build-coordinator/utils.scm
index fea9c1c..ee1fea3 100644
--- a/guix-build-coordinator/utils.scm
+++ b/guix-build-coordinator/utils.scm
@@ -23,6 +23,7 @@
#:use-module (gcrypt hash)
#:use-module (gcrypt random)
#:use-module (json)
+ #:use-module (prometheus)
#:use-module (guix pki)
#:use-module (guix utils)
#:use-module (guix config)
@@ -59,7 +60,9 @@
get-load-average
- running-on-the-hurd?))
+ running-on-the-hurd?
+
+ get-gc-metrics-updater))
(eval-when (eval load compile)
(begin
@@ -838,3 +841,29 @@ again."
(unless cached-system
(set! cached-system (utsname:sysname (uname))))
(string=? cached-system "GNU")))
+
+(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))))