services: Add prometheus-node-exporter-service-type.
authorGábor Boskovits <boskovits@gmail.com>
Mon, 18 Jun 2018 10:43:42 +0000 (12:43 +0200)
committerGábor Boskovits <boskovits@gmail.com>
Mon, 9 Jul 2018 08:39:06 +0000 (10:39 +0200)
* gnu/services/monitoring.scm (prometheus-node-exporter-service-type):
New variable.
(<prometheus-node-exporter-configuration>): New record type.
(prometheus-node-exporter-shepherd-service): New procedure.
* gnu/doc/guix.texi (Monitoring Services): Document it.
* gnu/tests/monitoring.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add test module.

doc/guix.texi
gnu/local.mk
gnu/packages/monitoring.scm
gnu/services/monitoring.scm
gnu/tests/monitoring.scm [new file with mode: 0644]

index a458c7c..3f0eedd 100644 (file)
@@ -48,7 +48,8 @@ Copyright @copyright{} 2017 nee@*
 Copyright @copyright{} 2018 Rutger Helling@*
 Copyright @copyright{} 2018 Oleg Pykhalov@*
 Copyright @copyright{} 2018 Mike Gerwitz@*
-Copyright @copyright{} 2018 Pierre-Antoine Rouby
+Copyright @copyright{} 2018 Pierre-Antoine Rouby@*
+Copyright @copyright{} 2018 Gábor Boskovits@*
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -15649,6 +15650,39 @@ Specify the path of the base URL.  This can be useful if
 @end table
 @end deftp
 
+@subsubheading Prometheus Node Exporter Service
+
+@cindex prometheus-node-exporter
+The Prometheus ``node exporter'' makes hardware and operating system statistics
+provided by the Linux kernel available for the Prometheus monitoring system. 
+This service should be deployed on all physical nodes and virtual machines,
+where monitoring these statistics is desirable. 
+
+@defvr {Scheme variable} prometheus-node-exporter-service-type
+This is the service type for the
+@uref{https://github.com/prometheus/node_exporter/, prometheus-node-exporter}
+service, its value must be a @code{prometheus-node-exporter-configuration}
+record as in this example:
+
+@example
+(service prometheus-node-exporter-service-type
+         (prometheus-node-exporter-configuration
+           (web-listen-address ":9100")))
+@end example
+@end defvar
+
+@deftp {Data Type} prometheus-node-exporter-configuration
+Data type representing the configuration of @command{node_exporter}.
+
+@table @asis
+@item @code{package} (default: @code{go-github-com-prometheus-node-exporter})
+The prometheus-node-exporter package to use.
+
+@item @code{web-listen-address} (default: @code{":9100"})
+Bind the web interface to the specified address.
+
+@end table
+@end deftp
 
 @node Kerberos Services
 @subsubsection Kerberos Services
index dad664c..eb245e3 100644 (file)
@@ -15,7 +15,7 @@
 # Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 # Copyright © 2017, 2018 Clément Lassieur <clement@lassieur.org>
 # Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
-# Copyright © 2017 Gábor Boskovits <boskovits@gmail.com>
+# Copyright © 2017, 2018 Gábor Boskovits <boskovits@gmail.com>
 # Copyright © 2018 Amirouche Boubekki <amirouche@hypermove.net>
 # Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
 #
@@ -530,6 +530,7 @@ GNU_SYSTEM_MODULES =                                \
   %D%/tests/databases.scm                      \
   %D%/tests/desktop.scm                                \
   %D%/tests/dict.scm                           \
+  %D%/tests/monitoring.scm                      \
   %D%/tests/nfs.scm                            \
   %D%/tests/install.scm                                \
   %D%/tests/mail.scm                           \
index db6c22a..fae62d5 100644 (file)
@@ -3,6 +3,7 @@
 ;;; Copyright © 2018 Sou Bunnbu <iyzsong@member.fsf.org>
 ;;; Copyright © 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018 Gábor Boskovits <boskovits@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
index 49a65db..aa3b63a 100644 (file)
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2018 Sou Bunnbu <iyzsong@member.fsf.org>
+;;; Copyright © 2018 Gábor Boskovits <boskovits@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,7 +27,9 @@
   #:use-module (guix records)
   #:use-module (ice-9 match)
   #:export (darkstat-configuration
-            darkstat-service-type))
+            prometheus-node-exporter-configuration
+            darkstat-service-type
+            prometheus-node-exporter-service-type))
 
 \f
 ;;;
@@ -89,3 +92,36 @@ HTTP.")
                              (const %darkstat-accounts))
           (service-extension shepherd-root-service-type
                              (compose list darkstat-shepherd-service))))))
+
+(define-record-type* <prometheus-node-exporter-configuration>
+  prometheus-node-exporter-configuration
+  make-prometheus-node-exporter-configuration
+  prometheus-node-exporter-configuration?
+  (package prometheus-node-exporter-configuration-package
+           (default go-github-com-prometheus-node-exporter))
+  (web-listen-address prometheus-node-exporter-web-listen-address
+                      (default ":9100")))
+
+(define prometheus-node-exporter-shepherd-service
+  (match-lambda
+    (( $ <prometheus-node-exporter-configuration>
+         package web-listen-address)
+     (shepherd-service
+      (documentation "Prometheus node exporter.")
+      (provision '(prometheus-node-exporter))
+      (requirement '(networking))
+      (start #~(make-forkexec-constructor
+                (list #$(file-append package "/bin/node_exporter")
+                      "--web.listen-address" #$web-listen-address)))
+      (stop #~(make-kill-destructor))))))
+
+(define prometheus-node-exporter-service-type
+  (service-type
+   (name 'prometheus-node-exporter)
+   (description
+    "Run @command{node_exporter} to serve hardware and OS metrics to
+prometheus.")
+   (extensions
+    (list (service-extension
+           shepherd-root-service-type
+           (compose list prometheus-node-exporter-shepherd-service))))))
diff --git a/gnu/tests/monitoring.scm b/gnu/tests/monitoring.scm
new file mode 100644 (file)
index 0000000..6789998
--- /dev/null
@@ -0,0 +1,97 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2018 Gábor Boskovits  <boskovits@gmail.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu tests monitoring)
+  #:use-module (gnu services)
+  #:use-module (gnu services monitoring)
+  #:use-module (gnu services networking)
+  #:use-module (gnu system vm)
+  #:use-module (gnu tests)
+  #:use-module (guix gexp)
+  #:export (%test-prometheus-node-exporter))
+
+\f
+;;;
+;;; Prometheus Node Exporter
+;;;
+
+(define* (run-prometheus-node-exporter-server-test name test-os)
+  "Run tests in %PROMETHEUS-NODE-EXPORTER-OS, which has prometheus-node-exporter running."
+  (define os
+    (marionette-operating-system
+     test-os
+     #:imported-modules '((gnu services herd))))
+
+  (define vm
+    (virtual-machine
+     (operating-system os)
+     (port-forwardings '((8080 . 9100)))))
+
+  (define test
+    (with-imported-modules '((gnu build marionette))
+      #~(begin
+          (use-modules (srfi srfi-11)
+                       (srfi srfi-64)
+                       (gnu build marionette)
+                       (web client)
+                       (web response))
+
+          (define marionette
+            (make-marionette (list #$vm)))
+
+          (mkdir #$output)
+          (chdir #$output)
+
+          (test-begin #$name)
+
+          (test-assert "prometheus-node-exporter running"
+            (marionette-eval
+             '(begin
+                (use-modules (gnu services herd))
+                (match (start-service 'prometheus-node-exporter)
+                  (#f #f)
+                  (('service response-parts ...)
+                   (match (assq-ref response-parts 'running)
+                     ((pid) (number? pid))))))
+             marionette))
+
+          (test-equal "http-get"
+            200
+            (begin
+              (wait-for-tcp-port 9100 marionette)
+              (let-values (((response text)
+                            (http-get "http://localhost:8080")))
+                (response-code response))))
+
+          (test-end)
+          (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+  (gexp->derivation (string-append name "-test") test))
+
+(define %prometheus-node-exporter-os
+  (simple-operating-system
+   (dhcp-client-service)
+   (service prometheus-node-exporter-service-type
+            (prometheus-node-exporter-configuration))))
+
+(define %test-prometheus-node-exporter
+  (system-test
+   (name "prometheus-node-exporter")
+   (description "Connect to a running prometheus-node-exporter server.")
+   (value (run-prometheus-node-exporter-server-test
+           name %prometheus-node-exporter-os))))