From 815b15412f7e42a8981087fdd3a1fda00c33b956 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Fri, 31 Dec 2021 00:44:15 +0100 Subject: prometheus/node: add textfile collector sensors (WIP) --- .../prometheus/exporter/node/defaults/main.yml | 36 +++++++++++++++ .../prometheus/exporter/node/handlers/main.yml | 5 +++ .../node/tasks/textfile_collector_sensors.yml | 32 ++++++++++++++ .../textfile-collector-scripts/sensors.j2 | 51 ++++++++++++++++++++++ .../textfile-collector-scripts/sensors.service.j2 | 33 ++++++++++++++ .../textfile-collector-scripts/sensors.timer.j2 | 9 ++++ 6 files changed, 166 insertions(+) create mode 100644 roles/monitoring/prometheus/exporter/node/tasks/textfile_collector_sensors.yml create mode 100644 roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.j2 create mode 100644 roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.service.j2 create mode 100644 roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.timer.j2 (limited to 'roles/monitoring') diff --git a/roles/monitoring/prometheus/exporter/node/defaults/main.yml b/roles/monitoring/prometheus/exporter/node/defaults/main.yml index 0bcea14f..9e8bcf8b 100644 --- a/roles/monitoring/prometheus/exporter/node/defaults/main.yml +++ b/roles/monitoring/prometheus/exporter/node/defaults/main.yml @@ -16,3 +16,39 @@ prometheus_exporter_node_textfile_collector_scripts: - deleted-libraries # - smartmon # - chrony +# - sensors + +# prometheus_exporter_node_textfile_collector__sensors: +# i2c: +# - number: 1 +# devices: +# - name: blub +# address: 0x5c +# type: am2315 +# - address: 0x18 +# type: ds2482 +# - name: "10000900.i2c" +# devices: +# - address: 0x70 +# type: pca9548 +# channels: +# - number: 0 +# devices: +# - name: foo +# address: 0x76 +# type: bme280 +# - number: 1 +# devices: +# - name: bar +# address: 0x77 +# type: bmp280 +# w1: +# - name: temp1 +# address: 28-987654321098 +# - name: temp2 +# address: 28-012345678901 +# gpio: +# - name: everything-is-fine-and-dandy +# number: 0 +# - name: something-went-horribly-wrong +# number: 1 diff --git a/roles/monitoring/prometheus/exporter/node/handlers/main.yml b/roles/monitoring/prometheus/exporter/node/handlers/main.yml index 56056ea6..8f5cb37c 100644 --- a/roles/monitoring/prometheus/exporter/node/handlers/main.yml +++ b/roles/monitoring/prometheus/exporter/node/handlers/main.yml @@ -8,3 +8,8 @@ service: name: nginx state: reloaded + +- name: remove sensors state file + file: + path: /run/prometheus-node-exporter_sensors/state + state: absent diff --git a/roles/monitoring/prometheus/exporter/node/tasks/textfile_collector_sensors.yml b/roles/monitoring/prometheus/exporter/node/tasks/textfile_collector_sensors.yml new file mode 100644 index 00000000..966c6d7f --- /dev/null +++ b/roles/monitoring/prometheus/exporter/node/tasks/textfile_collector_sensors.yml @@ -0,0 +1,32 @@ +--- +- name: install lua and libs needed by sensors script + apt: + name: + - lua5.1 + - lua-cjson + - lua-posix + state: present + +- name: create lua 5.1 module path in /usr/local + file: + path: /usr/local/share/lua/5.1 + state: directory + +- name: install sensors module + copy: + src: "{{ global_files_dir }}/common/openwrt/sensors.module_lua" + dest: /usr/local/share/lua/5.1/sensors.lua + +- name: create configure directory + file: + path: /etc/prometheus/exporter/node + state: directory + +- name: generate senors config + copy: + content: "{{ prometheus_exporter_node_textfile_collector__sensors | to_nice_json }}\n" + dest: /etc/prometheus/exporter/node/sensors.json + notify: remove sensors state file + +- name: install the sensors textfile collector script + include_tasks: textfile_collector_generic.yml diff --git a/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.j2 b/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.j2 new file mode 100644 index 00000000..822aa3b5 --- /dev/null +++ b/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.j2 @@ -0,0 +1,51 @@ +#!/usr/bin/lua5.1 + +local sensors = require "sensors" +local units = { + temperature = "celsius", + humidity = "percent", + pressure = "pascals", + gpio = "status", +} + +local function metric(name, mtype, labels, value) + print("# TYPE " .. name .. " " .. mtype) + + local label_string = "" + if labels then + for label,value in pairs(labels) do + label_string = label_string .. label .. '="' .. value .. '",' + end + label_string = "{" .. string.sub(label_string, 1, -2) .. "}" + end + print(string.format("%s%s %s", name, label_string, value)) +end + +local function scrape(config, num_sensors) + local readings, err = sensors.read(config) + if not readings then return end + + metric("sensors_count_total", "gauge", nil, num_sensors) + for name, values in pairs(readings) do + labels = { name = name, kind = values._kind_ } + for t, v in pairs(values) do + local unit = units[t] + if unit ~= nil then + metric("sensors_" .. t .. "_" .. unit, "gauge", labels, v) + end + end + end +end + +function main() + local config, _ = sensors.read_config('/etc/prometheus/exporter/node/sensors.json') + + -- TODO: only do this if sensor state file does not exist - else read num_sensors from state file + local num_sensors, err = sensors.setup(config) + if num_sensors == nil then error(err) end + -- TODO: write num_sensors to state file + + scrape(config, num_sensors, units) +end + +main() diff --git a/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.service.j2 b/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.service.j2 new file mode 100644 index 00000000..7a438317 --- /dev/null +++ b/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.service.j2 @@ -0,0 +1,33 @@ +[Unit] +Description=Promethues node exporter textfile collector sensors + +[Service] +Type=oneshot +Environment=TMPDIR=/var/lib/prometheus-node-exporter/textfile-collector +Environment=LC_NUMERIC=C +ExecStart=bash -c "/usr/local/share/prometheus-node-exporter/sensors | sponge /var/lib/prometheus-node-exporter/textfile-collector/sensors.prom" +TimeoutStartSec=30s + +# systemd hardening-options +AmbientCapabilities= +CapabilityBoundingSet= +LockPersonality=true +MemoryDenyWriteExecute=true +NoNewPrivileges=true +PrivateTmp=true +ProtectControlGroups=true +ProtectHome=true +ProtectKernelModules=true +ProtectKernelTunables=true +ProtectSystem=strict +ReadWritePaths=/var/lib/prometheus-node-exporter/textfile-collector +RuntimeDirectory=prometheus-node-exporter_sensors +RuntimeDirectoryPreserve=yes +RemoveIPC=true +RestrictNamespaces=true +RestrictRealtime=true +RestrictAddressFamilies=AF_UNIX +SystemCallArchitectures=native + +[Install] +WantedBy=multi-user.target diff --git a/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.timer.j2 b/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.timer.j2 new file mode 100644 index 00000000..164b4681 --- /dev/null +++ b/roles/monitoring/prometheus/exporter/node/templates/textfile-collector-scripts/sensors.timer.j2 @@ -0,0 +1,9 @@ +[Unit] +Description=Promethues node exporter textfile collector sensors + +[Timer] +OnBootSec=50s +OnUnitActiveSec=5min + +[Install] +WantedBy=timers.target -- cgit v1.2.3