From a27ac38beced844b6e5868540b8ff66fbfa11ccd Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 1 Apr 2023 07:01:03 +0200 Subject: [PATCH] add bundle:telegraf-monitors-mikrotik --- .../files/telegraf-plugin-snmp-mikrotik | 61 +++++++++++++++++++ bundles/telegraf-monitors-mikrotik/items.py | 9 +++ .../telegraf-monitors-mikrotik/metadata.py | 22 +++++++ nodes/htz-cloud/influxdb.py | 7 +-- 4 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 bundles/telegraf-monitors-mikrotik/files/telegraf-plugin-snmp-mikrotik create mode 100644 bundles/telegraf-monitors-mikrotik/items.py create mode 100644 bundles/telegraf-monitors-mikrotik/metadata.py diff --git a/bundles/telegraf-monitors-mikrotik/files/telegraf-plugin-snmp-mikrotik b/bundles/telegraf-monitors-mikrotik/files/telegraf-plugin-snmp-mikrotik new file mode 100644 index 0000000..322e9db --- /dev/null +++ b/bundles/telegraf-monitors-mikrotik/files/telegraf-plugin-snmp-mikrotik @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +from sys import argv + +from hnmp import SNMP + + +snmp = SNMP(argv[2], community=argv[3]) + +single_value_metrics_int_oids = { + 'cpu-load': '1.3.6.1.2.1.25.3.3.1.2.1', + 'cpu-temperature': '1.3.6.1.4.1.14988.1.1.3.11.0', + 'fan1-speed': '1.3.6.1.4.1.14988.1.1.3.17.0', + 'fan2-speed': '1.3.6.1.4.1.14988.1.1.3.18.0', + 'power-consumption': '1.3.6.1.4.1.14988.1.1.3.12.0', + #'psu1-state': '1.3.6.1.4.1.14988.1.1.3.15.0', + 'temperature': '1.3.6.1.4.1.14988.1.1.3.10.0', +} + +single_value_metrics_int_values = { + key: snmp.get(oid) + for key, oid in single_value_metrics_int_oids.items() +} + +formatted_values = sorted([ + f"{key}={value}i" + for key, value in single_value_metrics_int_values.items() + if value +]) + +print("mikrotik,host={host} {values}".format( + host=argv[1], + values=",".join(formatted_values), +)) + + +table = snmp.table( + "1.3.6.1.4.1.14988.1.1.15.1.1", + columns={ + 2: "interface", + #3: "status", + 4: "voltage", + 5: "current", + 6: "power", + }, + fetch_all_columns=False, +) + +for row in table.rows: + print(row) + interface_name = row['interface'] + values = [] + for column, value in row.items(): + if column == "interface" or not value: + continue + values.append("{}={}i".format(column, value)) + + print("mikrotik,interface={interface},host={host} {values}".format( + host=argv[1], + interface=interface_name, + values=",".join(values), + )) diff --git a/bundles/telegraf-monitors-mikrotik/items.py b/bundles/telegraf-monitors-mikrotik/items.py new file mode 100644 index 0000000..410e563 --- /dev/null +++ b/bundles/telegraf-monitors-mikrotik/items.py @@ -0,0 +1,9 @@ +files['/usr/local/bin/telegraf-plugin-snmp-mikrotik'] = { + 'mode': '0755', +} + +pkg_pip['hnmp'] = { + 'before': { + 'svc_systemd:telegraf', + }, +} diff --git a/bundles/telegraf-monitors-mikrotik/metadata.py b/bundles/telegraf-monitors-mikrotik/metadata.py new file mode 100644 index 0000000..29d5c08 --- /dev/null +++ b/bundles/telegraf-monitors-mikrotik/metadata.py @@ -0,0 +1,22 @@ +@metadata_reactor.provides( + 'telegraf/input_plugins/exec', +) +def collect_nodes(metadata): + execs = {} + + for rnode in repo.nodes_in_group('switches-mikrotik'): + snmp_pw = rnode.metadata.get('routeros/snmp/community', 'public') + + execs[f'snmp_mikrotik_{rnode.name}'] = { + 'commands': [f'/usr/local/bin/telegraf-plugin-snmp-mikrotik {rnode.name} {rnode.hostname} {snmp_pw}'], + 'data_format': 'influx', + 'timeout': '30s', + } + + return { + 'telegraf': { + 'input_plugins': { + 'exec': execs, + }, + }, + } diff --git a/nodes/htz-cloud/influxdb.py b/nodes/htz-cloud/influxdb.py index 1125952..8a8d884 100644 --- a/nodes/htz-cloud/influxdb.py +++ b/nodes/htz-cloud/influxdb.py @@ -3,6 +3,7 @@ nodes['htz-cloud.influxdb'] = { 'bundles': { 'grafana', 'influxdb2', + 'telegraf-monitors-mikrotik', 'zfs', }, 'groups': { @@ -68,12 +69,6 @@ nodes['htz-cloud.influxdb'] = { 'input_plugins': { 'builtin': { 'snmp': [ - { - 'agents': ['udp://172.19.138.4'], - 'agent_host_tag': 'host', - 'table': [{'oid': 'IF-MIB::ifTable'}], - 'interval': '10s', - }, { 'agents': ['udp://172.19.138.3'], 'agent_host_tag': 'host',