From 80f02ea55c24c46b2ca8589e30a231f4f9f2636f Mon Sep 17 00:00:00 2001 From: David Harrigan Date: Mon, 25 Dec 2017 20:57:58 +0000 Subject: [PATCH] Use (Prometheus) node_exporter to expose metrics. This new plugin allows for Prometheus to scrape an OPNsense installation for metrics - including CPU, Memory, devices, interfaces and so on. The data can then be used for remote monitoring/alerting of an OPNsense installation, or indeed graphing using popular graphing technologies such as Grafana. closes #452 -=david=- --- sysutils/node_exporter/Makefile | 7 ++ sysutils/node_exporter/pkg-descr | 4 + .../etc/inc/plugins.inc.d/node_exporter.inc | 52 ++++++++++++ .../NodeExporter/Api/GeneralController.php | 40 ++++++++++ .../NodeExporter/Api/ServiceController.php | 42 ++++++++++ .../NodeExporter/GeneralController.php | 41 ++++++++++ .../OPNsense/NodeExporter/forms/general.xml | 80 +++++++++++++++++++ .../models/OPNsense/NodeExporter/ACL/ACL.xml | 9 +++ .../models/OPNsense/NodeExporter/General.php | 37 +++++++++ .../models/OPNsense/NodeExporter/General.xml | 66 +++++++++++++++ .../OPNsense/NodeExporter/Menu/Menu.xml | 5 ++ .../views/OPNsense/NodeExporter/general.volt | 62 ++++++++++++++ .../conf/actions.d/actions_node_exporter.conf | 23 ++++++ .../templates/OPNsense/NodeExporter/+TARGETS | 1 + .../OPNsense/NodeExporter/node_exporter | 52 ++++++++++++ 15 files changed, 521 insertions(+) create mode 100644 sysutils/node_exporter/Makefile create mode 100644 sysutils/node_exporter/pkg-descr create mode 100644 sysutils/node_exporter/src/etc/inc/plugins.inc.d/node_exporter.inc create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/Api/GeneralController.php create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/Api/ServiceController.php create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/GeneralController.php create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/forms/general.xml create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/ACL/ACL.xml create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/General.php create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/General.xml create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/Menu/Menu.xml create mode 100644 sysutils/node_exporter/src/opnsense/mvc/app/views/OPNsense/NodeExporter/general.volt create mode 100644 sysutils/node_exporter/src/opnsense/service/conf/actions.d/actions_node_exporter.conf create mode 100644 sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/+TARGETS create mode 100644 sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/node_exporter diff --git a/sysutils/node_exporter/Makefile b/sysutils/node_exporter/Makefile new file mode 100644 index 000000000..61514117a --- /dev/null +++ b/sysutils/node_exporter/Makefile @@ -0,0 +1,7 @@ +PLUGIN_NAME= node_exporter +PLUGIN_VERSION= 0.1.0 +PLUGIN_COMMENT= Prometheus Node Exporter +PLUGIN_DEPENDS= node_exporter +PLUGIN_MAINTAINER= dharrigan@gmail.com + +.include "../../Mk/plugins.mk" diff --git a/sysutils/node_exporter/pkg-descr b/sysutils/node_exporter/pkg-descr new file mode 100644 index 000000000..92c19ad60 --- /dev/null +++ b/sysutils/node_exporter/pkg-descr @@ -0,0 +1,4 @@ +Prometheus exporter for hardware and OS metrics exposed by *NIX kernels, +written in Go with pluggable metric collectors. + +WWW: https://github.com/prometheus/node_exporter diff --git a/sysutils/node_exporter/src/etc/inc/plugins.inc.d/node_exporter.inc b/sysutils/node_exporter/src/etc/inc/plugins.inc.d/node_exporter.inc new file mode 100644 index 000000000..99bfa38d9 --- /dev/null +++ b/sysutils/node_exporter/src/etc/inc/plugins.inc.d/node_exporter.inc @@ -0,0 +1,52 @@ +enabled->__toString() == "0") { + return $services; + } + + $services[] = array( + 'description' => gettext('Prometheus Node Exporter'), + 'configd' => array( + 'restart' => array('node_exporter restart'), + 'start' => array('node_exporter start'), + 'stop' => array('node_exporter stop'), + 'status' => array('node_exporter status'), + ), + 'name' => 'node_exporter', + 'pidfile' => '/var/run/node_exporter.pid' + ); + + return $services; +} diff --git a/sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/Api/GeneralController.php b/sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/Api/GeneralController.php new file mode 100644 index 000000000..754cbc577 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/Api/GeneralController.php @@ -0,0 +1,40 @@ +view->pick('OPNsense/NodeExporter/general'); + $this->view->generalForm = $this->getForm("general"); + } +} diff --git a/sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/forms/general.xml b/sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/forms/general.xml new file mode 100644 index 000000000..97e4196c1 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/mvc/app/controllers/OPNsense/NodeExporter/forms/general.xml @@ -0,0 +1,80 @@ +
+ + general.enabled + + checkbox + This will activate the node_exporter plugin. + + + general.listenaddress + + text + Set node_exporter's listen address. By default, node_exporter will listen on 0.0.0.0 (all interfaces). + + + general.listenport + + text + Set node_exporter's listen port. By default, node_exporter will listen on port 9100. + + + general.cpu + + checkbox + Enable the CPU collector. + + + general.exec + + checkbox + Enable the EXEC collector. + + + general.filesystem + + checkbox + Enable the FILESYSTEM collector. + + + general.loadavg + + checkbox + Enable the LOADAVG collector. + + + general.meminfo + + checkbox + Enable the MEMINFO collector. + + + general.netdev + + checkbox + Enable the NETDEV collector. + + + general.time + + checkbox + Enable the TIME collector. + + + general.devstat + + checkbox + Enable the DEVSTAT collector. + + + general.interrupts + + checkbox + Enable the INTERRUPTS collector. + + + general.ntp + + checkbox + Enable the NTP collector. + +
diff --git a/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/ACL/ACL.xml b/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/ACL/ACL.xml new file mode 100644 index 000000000..b04a5d799 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/ACL/ACL.xml @@ -0,0 +1,9 @@ + + + Services: Prometheus Node Exporter + + ui/nodeexporter/* + api/nodeexporter/* + + + diff --git a/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/General.php b/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/General.php new file mode 100644 index 000000000..2873511d5 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/General.php @@ -0,0 +1,37 @@ + + //OPNsense/NodeExporter + + node_exporter - Prometheus exporter for hardware and OS metrics. + + 0.1.0 + + + 0 + Y + + + 0.0.0.0 + Y + /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?)$/ + Please provide a valid IPv4 address. + + + 9100 + Y + 1 + 65535 + Please provide a valid port number between 1 and 65535. Port 9100 is the default. + + + 1 + N + + + 1 + N + + + 1 + N + + + 1 + N + + + 1 + N + + + 1 + N + + + + 0 + N + + + 0 + N + + + 0 + N + + + diff --git a/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/Menu/Menu.xml b/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/Menu/Menu.xml new file mode 100644 index 000000000..497dd8428 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/mvc/app/models/OPNsense/NodeExporter/Menu/Menu.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sysutils/node_exporter/src/opnsense/mvc/app/views/OPNsense/NodeExporter/general.volt b/sysutils/node_exporter/src/opnsense/mvc/app/views/OPNsense/NodeExporter/general.volt new file mode 100644 index 000000000..517c6b3c5 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/mvc/app/views/OPNsense/NodeExporter/general.volt @@ -0,0 +1,62 @@ +{# + +Copyright (C) 2018 David Harrigan +OPNsense® is Copyright © 2015 – 2017 by Deciso B.V. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +#} + + +
+ {{ partial("layout_partials/base_form", ['fields':generalForm,'id':'frm_general_settings']) }} +
+
+ +
+
diff --git a/sysutils/node_exporter/src/opnsense/service/conf/actions.d/actions_node_exporter.conf b/sysutils/node_exporter/src/opnsense/service/conf/actions.d/actions_node_exporter.conf new file mode 100644 index 000000000..76f960cc8 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/service/conf/actions.d/actions_node_exporter.conf @@ -0,0 +1,23 @@ +[start] +command: /usr/local/etc/rc.d/node_exporter start +parameters: +type: script +message: Start Node Exporter Service + +[stop] +command: /usr/local/etc/rc.d/node_exporter stop +parameters: +type: script +message: Stop Node Exporter Service + +[restart] +command: /usr/local/etc/rc.d/node_exporter restart +parameters: +type: script +message: Restart Node Exporter Service + +[status] +command: /usr/local/etc/rc.d/node_exporter status;exit 0 +parameters: +type: script_output +message: Request Node Exporter Status diff --git a/sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/+TARGETS b/sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/+TARGETS new file mode 100644 index 000000000..aac7dcbfc --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/+TARGETS @@ -0,0 +1 @@ +node_exporter:/etc/rc.conf.d/node_exporter diff --git a/sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/node_exporter b/sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/node_exporter new file mode 100644 index 000000000..0e74613f4 --- /dev/null +++ b/sysutils/node_exporter/src/opnsense/service/templates/OPNsense/NodeExporter/node_exporter @@ -0,0 +1,52 @@ +# +# This file is automatically generated. Do not manually edit this file - changes *will* be lost! +# +{% if helpers.exists('OPNsense.NodeExporter.enabled') and OPNsense.NodeExporter.enabled == '1' %} + +{%- set collector = "--collector." -%} + +{%- if OPNsense.NodeExporter.cpu == '1' -%} + {%- set cpu = collector + "cpu " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.exec == '1' -%} + {%- set exec = collector + "exec " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.filesystem == '1' -%} + {%- set filesystem = collector + "filesystem " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.loadavg == '1' -%} + {%- set loadavg = collector + "loadavg " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.meminfo == '1' -%} + {%- set meminfo = collector + "meminfo " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.netdev == '1' -%} + {%- set netdev = collector + "netdev " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.ntp == '1' -%} + {%- set ntp = collector + "ntp " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.time == '1' -%} + {%- set time = collector + "time " -%} +{%- endif -%} + +{%- if OPNsense.NodeExporter.devstat == '1' -%} + {%- set devstat = collector + "devstat " -%} +{%- endif -%} + +node_exporter_args="{{ cpu }}{{ exec }}{{ filesystem }}{{ loadavg }}{{ meminfo }}{{ netdev }}{{ ntp }}{{ time }}{{ devstat }}" +node_exporter_listen_address="{{ OPNsense.NodeExporter.listenaddress }}:{{ OPNsense.NodeExporter.listenport }}" +node_exporter_enable="YES" + +{%- else -%} + +node_exporter_enable="NO" + +{%- endif -%}