diff options
| author | Oleg Pykhalov <go.wigust@gmail.com> | 2022-11-07 02:16:39 +0300 |
|---|---|---|
| committer | Oleg Pykhalov <go.wigust@gmail.com> | 2022-11-07 11:49:40 +0300 |
| commit | 4ad0486598a6ff4d6f8fcc680942618c5efc5a87 (patch) | |
| tree | 78bb7f61c6dafa70af78b3176459f03647345d5a | |
| download | prometheus-shepherd-exporter-4ad0486598a6ff4d6f8fcc680942618c5efc5a87.tar.gz | |
Initial commit.
| -rw-r--r-- | channels.scm | 6 | ||||
| -rw-r--r-- | prometheus-shepherd-exporter.scm | 71 |
2 files changed, 77 insertions, 0 deletions
diff --git a/channels.scm b/channels.scm new file mode 100644 index 0000000..fe47342 --- /dev/null +++ b/channels.scm @@ -0,0 +1,6 @@ +(list (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (branch "master") + (commit + "1f734a6f0a7db5b0e12091a0c869c5c4810ac80e"))) diff --git a/prometheus-shepherd-exporter.scm b/prometheus-shepherd-exporter.scm new file mode 100644 index 0000000..aa29076 --- /dev/null +++ b/prometheus-shepherd-exporter.scm @@ -0,0 +1,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))))))) |
