services: Add prometheus-node-exporter-service-type.

* 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.
This commit is contained in:
Gábor Boskovits 2018-06-18 12:43:42 +02:00
parent 80b66eb949
commit a33652ee33
No known key found for this signature in database
GPG key ID: 2506A96CCF630B21
5 changed files with 172 additions and 3 deletions

View 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

View 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 \

View 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.
;;;

View 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 @@ (define-module (gnu services monitoring)
#: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))
;;;
@ -89,3 +92,36 @@ (define darkstat-service-type
(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))))))

97
gnu/tests/monitoring.scm Normal file
View file

@ -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))
;;;
;;; 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))))