From 75657d2423ea0276e03fa0f69032ea0b13e12cc2 Mon Sep 17 00:00:00 2001 From: CroneKorkN Date: Sat, 13 Dec 2025 16:29:20 +0100 Subject: [PATCH] more routeros grafana --- bundles/grafana/items.py | 3 +- bundles/routeros-monitoring/metadata.py | 39 ++++++++++++-- data/grafana/flux.mako | 7 ++- data/grafana/rows/proc_cpu_ram.py | 4 +- data/grafana/rows/proc_io.py | 4 +- data/grafana/rows/routeros_discards.py | 18 +++---- data/grafana/rows/routeros_errors.py | 18 +++---- data/grafana/rows/routeros_packets.py | 54 +++++++++++++++++++ data/grafana/rows/routeros_poe.py | 68 ++++++++++++++++++++++++ data/grafana/rows/routeros_throughput.py | 46 ++++++++++++++++ groups/os/routeros.py | 3 ++ 11 files changed, 232 insertions(+), 32 deletions(-) create mode 100644 data/grafana/rows/routeros_packets.py create mode 100644 data/grafana/rows/routeros_poe.py create mode 100644 data/grafana/rows/routeros_throughput.py diff --git a/bundles/grafana/items.py b/bundles/grafana/items.py index 3a1e6e5..9c636eb 100644 --- a/bundles/grafana/items.py +++ b/bundles/grafana/items.py @@ -158,13 +158,14 @@ for dashboard_id, monitored_node in enumerate(monitored_nodes, start=1): host=monitored_node.name, negative=query_config.get('negative', False), boolean_to_int=query_config.get('boolean_to_int', False), - minimum=query_config.get('minimum', None), + over=query_config.get('over', None), filters={ 'host': monitored_node.name, **query_config['filters'], }, exists=query_config.get('exists', []), function=query_config.get('function', None), + multiply=query_config.get('multiply', None), ).strip() }) diff --git a/bundles/routeros-monitoring/metadata.py b/bundles/routeros-monitoring/metadata.py index aa814be..975ee5a 100644 --- a/bundles/routeros-monitoring/metadata.py +++ b/bundles/routeros-monitoring/metadata.py @@ -44,6 +44,19 @@ def routeros_monitoring_telegraf_inputs(metadata): "name": "interface", "oid": "IF-MIB::ifTable", "field": [ + # 6: ethernetCsmacd (physischer Ethernet-Port) + # 24: softwareLoopback + # 53: propVirtual (oft VLANs bei MikroTik) + # 131: tunnel + # 135: l2vlan + # 161: ieee8023adLag (Bonding/LACP) + # 209: bridge + { + "name": "ifType", + "oid": "IF-MIB::ifType", + "is_tag": True, + }, + # Labels (optional but recommended) { "name": "ifName", @@ -75,6 +88,22 @@ def routeros_monitoring_telegraf_inputs(metadata): "name": "out_ucast_pkts", "oid": "IF-MIB::ifHCOutUcastPkts", }, + { + "name": "in_mcast_pkts", + "oid": "IF-MIB::ifHCInMulticastPkts", + }, + { + "name": "in_bcast_pkts", + "oid": "IF-MIB::ifHCInBroadcastPkts", + }, + { + "name": "out_mcast_pkts", + "oid": "IF-MIB::ifHCOutMulticastPkts", + }, + { + "name": "out_bcast_pkts", + "oid": "IF-MIB::ifHCOutBroadcastPkts", + }, # Drops / Errors { @@ -111,24 +140,24 @@ def routeros_monitoring_telegraf_inputs(metadata): "is_tag": True, }, { - "name": "poe_ifindex", + "name": "ifindex", "oid": "MIKROTIK-MIB::mtxrPOEInterfaceIndex", "is_tag": True, }, { - "name": "poe_status", + "name": "status", "oid": "MIKROTIK-MIB::mtxrPOEStatus", }, { - "name": "poe_voltage", + "name": "voltage", "oid": "MIKROTIK-MIB::mtxrPOEVoltage", }, { - "name": "poe_current", + "name": "current", "oid": "MIKROTIK-MIB::mtxrPOECurrent", }, { - "name": "poe_power", + "name": "power", "oid": "MIKROTIK-MIB::mtxrPOEPower", }, ], diff --git a/data/grafana/flux.mako b/data/grafana/flux.mako index 83ec9e2..0adf9b2 100644 --- a/data/grafana/flux.mako +++ b/data/grafana/flux.mako @@ -8,8 +8,8 @@ from(bucket: "${bucket}") |> filter(fn: (r) => exists r["${exist}"]) // WTF % endfor |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) // aggregate early for best performance -% if minimum: - |> filter(fn: (r) => r._value > ${minimum}) +% if over is not None: + |> filter(fn: (r) => r._value > ${over}) % endif % if function == 'derivative': |> derivative(nonNegative: true) @@ -19,5 +19,8 @@ from(bucket: "${bucket}") % endif % if negative: |> map(fn: (r) => ({r with _value: r._value * - 1.0})) +% endif +% if multiply is not None: + |> map(fn: (r) => ({r with _value: r._value * ${multiply}})) % endif |> yield(name: "mean") diff --git a/data/grafana/rows/proc_cpu_ram.py b/data/grafana/rows/proc_cpu_ram.py index abf660f..2c2876b 100644 --- a/data/grafana/rows/proc_cpu_ram.py +++ b/data/grafana/rows/proc_cpu_ram.py @@ -9,7 +9,7 @@ 'cpu_usage', ], }, - 'minimum': 0.2, + 'over': 0.2, }, }, 'unit': 'percent', @@ -32,7 +32,7 @@ 'memory_rss', ], }, - 'minimum': 10*(10**6), + 'over': 10*(10**6), }, }, 'unit': 'bytes', diff --git a/data/grafana/rows/proc_io.py b/data/grafana/rows/proc_io.py index 227d84f..7c3208f 100644 --- a/data/grafana/rows/proc_io.py +++ b/data/grafana/rows/proc_io.py @@ -10,7 +10,7 @@ ], }, 'function': 'derivative', - 'minimum': 1024, + 'over': 1024, }, }, 'unit': 'bytes', @@ -34,7 +34,7 @@ ], }, 'function': 'derivative', - 'minimum': 1, + 'over': 1, }, }, 'unit': 'bytes', diff --git a/data/grafana/rows/routeros_discards.py b/data/grafana/rows/routeros_discards.py index 899e7df..7974da4 100644 --- a/data/grafana/rows/routeros_discards.py +++ b/data/grafana/rows/routeros_discards.py @@ -1,15 +1,14 @@ { - 'discards_in': { - 'stacked': False, + 'in': { + 'stacked': True, 'queries': { - 'discards_in': { + 'in': { 'filters': { '_measurement': 'interface', '_field': ['in_discards'], 'operating_system': 'routeros', }, - 'function': 'max', - 'derivative': True, + 'function': 'derivative', }, }, 'min': 0, @@ -20,17 +19,16 @@ 'displayMode': 'hidden', }, }, - 'discards_out': { - 'stacked': False, + 'out': { + 'stacked': True, 'queries': { - 'discards_out': { + 'out': { 'filters': { '_measurement': 'interface', '_field': ['out_discards'], 'operating_system': 'routeros', }, - 'function': 'max', - 'derivative': True, + 'function': 'derivative', }, }, 'min': 0, diff --git a/data/grafana/rows/routeros_errors.py b/data/grafana/rows/routeros_errors.py index 3838cf2..e7a3f3c 100644 --- a/data/grafana/rows/routeros_errors.py +++ b/data/grafana/rows/routeros_errors.py @@ -1,15 +1,14 @@ { - 'errors_in': { - 'stacked': False, + 'in': { + 'stacked': True, 'queries': { - 'errors_in': { + 'in': { 'filters': { '_measurement': 'interface', '_field': ['in_errors'], 'operating_system': 'routeros', }, - 'function': 'max', - 'derivative': True, + 'function': 'derivative', }, }, 'min': 0, @@ -20,17 +19,16 @@ 'displayMode': 'hidden', }, }, - 'errors_out': { - 'stacked': False, + 'out': { + 'stacked': True, 'queries': { - 'errors_out': { + 'out': { 'filters': { '_measurement': 'interface', '_field': ['out_errors'], 'operating_system': 'routeros', }, - 'function': 'max', - 'derivative': True, + 'function': 'derivative', }, }, 'min': 0, diff --git a/data/grafana/rows/routeros_packets.py b/data/grafana/rows/routeros_packets.py new file mode 100644 index 0000000..f1e75ae --- /dev/null +++ b/data/grafana/rows/routeros_packets.py @@ -0,0 +1,54 @@ +{ + 'in': { + 'stacked': True, + 'queries': { + 'in': { + 'filters': { + '_measurement': 'interface', + '_field': [ + 'in_ucast_pkts', + 'in_mcast_pkts', + 'in_bcast_pkts', + ], + 'ifType': [6], + 'operating_system': 'routeros', + }, + 'function': 'derivative', + 'over': 0, + }, + }, + 'min': 0, + 'unit': 'pps', + 'tooltip': 'multi', + 'display_name': '${__field.labels.ifName} - ${__field.labels.ifAlias}', + 'legend': { + 'displayMode': 'hidden', + }, + }, + 'out': { + 'stacked': True, + 'queries': { + 'out': { + 'filters': { + '_measurement': 'interface', + '_field': [ + 'in_ucast_pkts', + 'in_mcast_pkts', + 'in_bcast_pkts', + ], + 'ifType': [6], + 'operating_system': 'routeros', + }, + 'function': 'derivative', + 'over': 0, + }, + }, + 'min': 0, + 'unit': 'pps', + 'tooltip': 'multi', + 'display_name': '${__field.labels.ifName} - ${__field.labels.ifAlias}', + 'legend': { + 'displayMode': 'hidden', + }, + }, +} diff --git a/data/grafana/rows/routeros_poe.py b/data/grafana/rows/routeros_poe.py new file mode 100644 index 0000000..0954141 --- /dev/null +++ b/data/grafana/rows/routeros_poe.py @@ -0,0 +1,68 @@ +{ + 'power': { + 'stacked': True, + 'queries': { + 'power': { + 'filters': { + '_measurement': 'poe', + '_field': ['power'], + 'operating_system': 'routeros', + }, + 'function': 'mean', + 'multiply': 0.1, + 'over': 0, + }, + }, + 'min': 0, + 'unit': 'watt', + 'tooltip': 'multi', + 'display_name': '${__field.labels.ifName} - ${__field.labels.ifAlias}', + 'legend': { + 'displayMode': 'hidden', + }, + }, + 'current': { + 'stacked': True, + 'queries': { + 'voltage': { + 'filters': { + '_measurement': 'poe', + '_field': ['current'], + 'operating_system': 'routeros', + }, + 'function': 'mean', + 'multiply': 0.1, + 'over': 0, + }, + }, + 'min': 0, + 'unit': 'ampere', + 'tooltip': 'multi', + 'display_name': '${__field.labels.ifName} - ${__field.labels.ifAlias}', + 'legend': { + 'displayMode': 'hidden', + }, + }, + 'voltage': { + 'stacked': False, + 'queries': { + 'voltage': { + 'filters': { + '_measurement': 'poe', + '_field': ['voltage'], + 'operating_system': 'routeros', + }, + 'function': 'mean', + 'multiply': 0.1, + 'over': 0, + }, + }, + 'min': 0, + 'unit': 'volt', + 'tooltip': 'multi', + 'display_name': '${__field.labels.ifName} - ${__field.labels.ifAlias}', + 'legend': { + 'displayMode': 'hidden', + }, + }, +} diff --git a/data/grafana/rows/routeros_throughput.py b/data/grafana/rows/routeros_throughput.py new file mode 100644 index 0000000..4f12f3d --- /dev/null +++ b/data/grafana/rows/routeros_throughput.py @@ -0,0 +1,46 @@ +{ + 'in': { + 'stacked': True, + 'queries': { + 'in': { + 'filters': { + '_measurement': 'interface', + '_field': ['in_octets'], + 'ifType': [6], + 'operating_system': 'routeros', + }, + 'function': 'derivative', + 'over': 0, + }, + }, + 'min': 0, + 'unit': 'bps', + 'tooltip': 'multi', + 'display_name': '${__field.labels.ifName} - ${__field.labels.ifAlias}', + 'legend': { + 'displayMode': 'hidden', + }, + }, + 'out': { + 'stacked': True, + 'queries': { + 'out': { + 'filters': { + '_measurement': 'interface', + '_field': ['out_octets'], + 'ifType': [6], + 'operating_system': 'routeros', + }, + 'function': 'derivative', + 'over': 0, + }, + }, + 'min': 0, + 'unit': 'bps', + 'tooltip': 'multi', + 'display_name': '${__field.labels.ifName} - ${__field.labels.ifAlias}', + 'legend': { + 'displayMode': 'hidden', + }, + }, +} diff --git a/groups/os/routeros.py b/groups/os/routeros.py index 58ab849..7dbb19e 100644 --- a/groups/os/routeros.py +++ b/groups/os/routeros.py @@ -12,6 +12,9 @@ 'grafana_rows': { 'routeros_discards', 'routeros_errors', + 'routeros_throughput', + 'routeros_poe', + 'routeros_packets', }, 'routeros': { 'gateway': '10.0.0.1',