summaryrefslogtreecommitdiff
path: root/prometheus-shepherd-exporter.scm
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)))))))