aboutsummaryrefslogtreecommitdiff
path: root/nar-herder/server.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2022-04-17 20:40:53 +0100
committerChristopher Baines <mail@cbaines.net>2022-04-17 20:40:53 +0100
commit35c69f37d8fc75c247831cc4a287c5b747b51d84 (patch)
tree1d36d7dc6afc3f413af4b16fb491cff185a91a8b /nar-herder/server.scm
parent3f732ba58b1720410aeaff0b87e3dd0e54a6fa5d (diff)
downloadnar-herder-35c69f37d8fc75c247831cc4a287c5b747b51d84.tar
nar-herder-35c69f37d8fc75c247831cc4a287c5b747b51d84.tar.gz
Add support for exposing some basic metrics
In a format understood by Prometheus.
Diffstat (limited to 'nar-herder/server.scm')
-rw-r--r--nar-herder/server.scm74
1 files changed, 73 insertions, 1 deletions
diff --git a/nar-herder/server.scm b/nar-herder/server.scm
index 97335c0..c977956 100644
--- a/nar-herder/server.scm
+++ b/nar-herder/server.scm
@@ -22,6 +22,7 @@
#:use-module (web response)
#:use-module (web request)
#:use-module (logging logger)
+ #:use-module (prometheus)
#:use-module (json)
#:use-module (nar-herder database)
#:use-module (nar-herder storage)
@@ -45,13 +46,53 @@
(("") '())
(() '()))))
+(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))))
+
(define* (make-request-handler database storage-root
- #:key ttl negative-ttl logger)
+ #:key ttl negative-ttl logger
+ metrics-registry)
(define (narinfo? str)
(and
(= (string-length str) 40)
(string-suffix? ".narinfo" str)))
+ (define gc-metrics-updater
+ (get-gc-metrics-updater metrics-registry))
+
+ (define requests-total-metric
+ (make-counter-metric metrics-registry
+ "server_requests_total"))
+
+ (define (increment-request-metric category response-code)
+ (metric-increment
+ requests-total-metric
+ #:label-values `((category . ,category)
+ (response_code . ,response-code))))
+
(lambda (request body)
(log-msg logger
'DEBUG
@@ -67,6 +108,12 @@
(database-select-narinfo-contents-by-hash
database
(string-take narinfo 32))))
+
+ (increment-request-metric "narinfo"
+ (if narinfo-contents
+ "200"
+ "404"))
+
(if narinfo-contents
(values `((content-type . (text/plain))
,@(if ttl
@@ -84,6 +131,12 @@
(database-select-narinfo-contents-by-hash
database
(string-take narinfo 32))))
+
+ (increment-request-metric "narinfo/info"
+ (if narinfo-contents
+ "200"
+ "404"))
+
(if narinfo-contents
(render-json
`((stored . ,(store-item-in-local-storage?
@@ -97,6 +150,9 @@
(or (and=> (uri-query (request-uri request))
parse-query-string)
'())))
+
+ (increment-request-metric "recent-changes" "200")
+
(render-json
`((recent_changes . ,(list->vector
(database-select-recent-changes
@@ -105,11 +161,27 @@
(assoc-ref query-parameters "since")
"1970-01-01 00:00:01"))))))))
(('GET "latest-database-dump")
+
+ (increment-request-metric "latest-database-dump" "200")
+
(values (build-response
#:code 200
#:headers '((X-Accel-Redirect . "/internal/database/nar_herder_dump.db")))
#f))
+ (('GET "metrics")
+ (gc-metrics-updater)
+ (increment-request-metric "metrics" "200")
+
+ (values (build-response
+ #:code 200
+ #:headers '((content-type . (text/plain))
+ (vary . (accept))))
+ (lambda (port)
+ (write-metrics metrics-registry
+ port))))
(_
+ (increment-request-metric "unhandled" "404")
+
(values (build-response #:code 404)
"404")))))