blob: aa29076083205b5db629c9d1ddf93eebeb3a0f8d (
about) (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
;; This Guile module provides a Prometheus exporter for the GNU Shepherd.
;;
;; Build command:
;; guix build -L . -e '(@ (prometheus-shepherd-exporter) prometheus-shepherd-exporter)'
(define-module (prometheus-shepherd-exporter)
#:use-module (gnu packages guile-xyz)
#:use-module (guix gexp)
#:use-module (guix modules)
#:export (prometheus-shepherd-exporter))
(define prometheus-shepherd-exporter
(program-file
"prometheus-shepherd-exporter"
(with-extensions (list guile-prometheus)
(with-imported-modules (source-module-closure '((gnu services herd)
(prometheus)))
#~(begin
(use-modules (gnu services herd)
(prometheus)
(srfi srfi-1)
(web request)
(web response)
(web server)
(web uri))
(define my-registry
(make-metrics-registry #:namespace "shepherd"))
(define request-counter
(make-counter-metric my-registry "requests_count"))
(define service-status-gauge
(make-gauge-metric my-registry "service_status"))
(define %exclude-services
(append '(host-name
kernel-module-loader
kres-cache-gc
sysctl
term-console
user-homes)
'(lvm-thin)))
(define (request-handler request body)
(metric-increment request-counter)
(for-each (lambda (service)
(metric-set service-status-gauge
(cond
((member
(live-service-canonical-name service)
%exclude-services)
2)
((live-service-running service)
1)
(else
0))
#:label-values
`((service . ,(live-service-canonical-name service)))))
(current-services))
(if (equal? (split-and-decode-uri-path (uri-path (request-uri request)))
'("metrics"))
(values '((content-type . (text/plain)))
(lambda (port)
(write-metrics my-registry port)))
(values '((content-type . (text/plain)))
(lambda (port)
(display "Incrementing metric\n" port)))))
(run-server request-handler 'http
'(#:port 9180)))))))
|