diff --git a/bundles/routeros-monitoring/metadata.py b/bundles/routeros-monitoring/metadata.py index 4e10f83..25d4927 100644 --- a/bundles/routeros-monitoring/metadata.py +++ b/bundles/routeros-monitoring/metadata.py @@ -1,343 +1,443 @@ -# h = repo.libs.hashable.hashable +input_defaults = { + "agents": [ + f"udp://{routeros_node.hostname}:161" + for routeros_node in repo.nodes_in_group("routeros") + ], + "agent_host_tag": "agent_host", + "version": 2, + "community": "public", + "max_repetitions": 5, # supposedly less spiky loads + "tags": { + "operating_system": "routeros", + }, +} -# defaults = { -# 'apt': { -# 'packages': { -# 'snmp': {}, -# 'snmp-mibs-downloader': {}, -# }, -# }, -# } +defaults = { + 'apt': { + 'packages': { + 'snmp': {}, + 'snmp-mibs-downloader': {}, + }, + }, + "telegraf": { + "processors": { + "enum": { + "mikrotik_host_mapping":{ + # - measurements get switch ip has agent_host tag + # - wie define a value mapping ip -> node name + # - agent_host gets translated and written into host tag + "tagpass": { + "operating_system": ["routeros"], + }, + "mapping": [ + { + "tag": "agent_host", + "dest": "host", + "default": "unknown", + "value_mappings": { + routeros_node.hostname: routeros_node.name + for routeros_node in repo.nodes_in_group("routeros") + }, + }, + ], + }, + }, + }, + "inputs": { + "snmp": { + "mikrotik_switches_fast": { + "interval": "2m", + "collection_jitter": "20s", + **input_defaults, + "table": [ + # CPU load (HR-MIB) + { + "name": "mikrotik_cpu", + "oid": "HOST-RESOURCES-MIB::hrProcessorTable", + "field": [ + { + "name": "frw_id", + "oid": "HOST-RESOURCES-MIB::hrProcessorFrwID", + "is_tag": True, + }, + { + "name": "load", + "oid": "HOST-RESOURCES-MIB::hrProcessorLoad", + }, + ], + }, + # Storage (HR-MIB) + { + "name": "mikrotik_storage", + "oid": "HOST-RESOURCES-MIB::hrStorageTable", + "field": [ + { + "name": "index", + "oid": "HOST-RESOURCES-MIB::hrStorageIndex", + "is_tag": True, + }, + { + "name": "type", + "oid": "HOST-RESOURCES-MIB::hrStorageType", + "is_tag": True, + }, + { + "name": "descr", + "oid": "HOST-RESOURCES-MIB::hrStorageDescr", + "is_tag": True, + }, + { + "name": "alloc_unit", + "oid": "HOST-RESOURCES-MIB::hrStorageAllocationUnits", + }, + { + "name": "size", + "oid": "HOST-RESOURCES-MIB::hrStorageSize", + }, + { + "name": "used", + "oid": "HOST-RESOURCES-MIB::hrStorageUsed", + }, + { + "name": "alloc_failures", + "oid": "HOST-RESOURCES-MIB::hrStorageAllocationFailures", + }, + ], + }, + # MikroTik Health (table) + { + "name": "mikrotik_health", + "oid": "MIKROTIK-MIB::mtxrGaugeTable", + "field": [ + { + "name": "sensor", + "oid": "MIKROTIK-MIB::mtxrGaugeName", + "is_tag": True, + }, + { + "name": "value", + "oid": "MIKROTIK-MIB::mtxrGaugeValue", + }, + { + "name": "unit", + "oid": "MIKROTIK-MIB::mtxrGaugeUnit", + "is_tag": True, + }, + ], + }, + ], + }, + "mikrotik_switches_slow": { + "interval": "7m", + "collection_jitter": "2m", + **input_defaults, + "table": [ + # Interface statistics (standard IF-MIB) + { + "name": "mikrotik_interface_generic", + "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", + "oid": "IF-MIB::ifName", + "is_tag": True, + }, + { + "name": "ifAlias", + "oid": "IF-MIB::ifAlias", + "is_tag": True, + }, + + # Bytes (64-bit) + { + "name": "in_octets", + "oid": "IF-MIB::ifHCInOctets", + }, + { + "name": "out_octets", + "oid": "IF-MIB::ifHCOutOctets", + }, + + # Packets (64-bit unicast) + { + "name": "in_ucast_pkts", + "oid": "IF-MIB::ifHCInUcastPkts", + }, + { + "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 + { + "name": "in_discards", + "oid": "IF-MIB::ifInDiscards", + }, + { + "name": "out_discards", + "oid": "IF-MIB::ifOutDiscards", + }, + { + "name": "in_errors", + "oid": "IF-MIB::ifInErrors", + }, + { + "name": "out_errors", + "oid": "IF-MIB::ifOutErrors", + }, + ], + }, + # Interface PoE + { + "name": "mikrotik_poe", + "oid": "MIKROTIK-MIB::mtxrPOETable", + "field": [ + { + "name": "ifName", + "oid": "IF-MIB::ifName", + "is_tag": True, + }, + { + "name": "ifAlias", + "oid": "IF-MIB::ifAlias", + "is_tag": True, + }, + { + "name": "ifindex", + "oid": "MIKROTIK-MIB::mtxrPOEInterfaceIndex", + "is_tag": True, + }, + { + "name": "status", + "oid": "MIKROTIK-MIB::mtxrPOEStatus", + }, + { + "name": "voltage", + "oid": "MIKROTIK-MIB::mtxrPOEVoltage", + }, + { + "name": "current", + "oid": "MIKROTIK-MIB::mtxrPOECurrent", + }, + { + "name": "power", + "oid": "MIKROTIK-MIB::mtxrPOEPower", + }, + ], + }, + ], + }, + "mikrotik_switches_very_slow": { + "interval": "20m", + "collection_jitter": "5m", + **input_defaults, + "table": [ + # Interface statistics (MikroTik-specific mib) + { + "name": "mikrotik_interface_detailed", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTable", + "field": [ + # Join key / label (usually identical to IF-MIB ifName) + { + "name": "ifName", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsName", + "is_tag": True, + }, + + # join IF-MIB for better labels + { + "name": "ifAlias", + "oid": "IF-MIB::ifAlias", + "is_tag": True, + }, + + # ========================= + # Physical layer (L1/L2) + # ========================= + # CRC/FCS errors → very often cabling, connectors, SFPs, signal quality (EMI) + { + "name": "rx_fcs_errors", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxFCSError", + }, + # Alignment errors → typically duplex mismatch or PHY problems + { + "name": "rx_align_errors", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxAlignError", + }, + # Code errors → PHY encoding errors (signal/SFP/PHY) + { + "name": "rx_code_errors", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxCodeError", + }, + # Carrier errors → carrier lost (copper issues, autoneg, PHY instability) + { + "name": "rx_carrier_errors", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxCarrierError", + }, + # Jabber → extremely long invalid frames (faulty NIC/PHY, very severe) + { + "name": "rx_jabber", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxJabber", + }, + + # ================================== + # Length / framing anomalies (diagnostic) + # ================================== + # Frames shorter than minimum (noise, collisions, broken sender) + { + "name": "rx_too_short", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxTooShort", + }, + # Frames longer than allowed (MTU mismatch, framing errors) + { + "name": "rx_too_long", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxTooLong", + }, + # Fragments (often collision-related or duplex mismatch) + { + "name": "rx_fragment", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxFragment", + }, + # Generic length errors + { + "name": "rx_length_errors", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxLengthError", + }, + + # ================== + # Drops (real packet loss) + # ================== + # RX drops (queue/ASIC/policy/overload) → highly alert-worthy + { + "name": "rx_drop", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxDrop", + }, + # TX drops (buffer/queue exhaustion, scheduling, ASIC limits) + { + "name": "tx_drop", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxDrop", + }, + + # ========================================= + # Duplex / collision indicators + # (should be zero on full-duplex links) + # ========================================= + # Total collisions (relevant only for half-duplex or misconfigurations) + { + "name": "tx_collisions", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxCollision", + }, + # Late collisions → almost always duplex mismatch / bad autoneg + { + "name": "tx_late_collisions", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxLateCollision", + }, + # Aggregate collision counter (context) + { + "name": "tx_total_collisions", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxTotalCollision", + }, + # Excessive collisions → persistent duplex problems + { + "name": "tx_excessive_collisions", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxExcessiveCollision", + }, + + # ================== + # Flow control (diagnostic) + # ================== + # Pause frames received (peer throttling you) + { + "name": "rx_pause", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxPause", + }, + # Pause frames sent (you throttling the peer) + { + "name": "tx_pause", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxPause", + }, + # Pause frames actually honored + { + "name": "tx_pause_honored", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxPauseHonored", + }, + + # ========== + # Stability + # ========== + # Link-down events (loose cables, bad SFPs, PoE power drops, reboots) + { + "name": "link_downs", + "oid": "MIKROTIK-MIB::mtxrInterfaceStatsLinkDowns", + }, + ], + }, + ], + }, + }, + }, + }, +} # @metadata_reactor.provides( -# 'telegraf/inputs/snmp', +# 'telegraf/processors/enum', # ) -# def routeros_monitoring_telegraf_inputs(metadata): +# def tag_important_ports(metadata): +# # We want a graph, only for important ports. We deem ports important, if they have untagged vlans configured. # return { # "telegraf": { -# "config": { -# "processors": { -# "enum": [ -# h({ -# "tagpass": { -# "operating_system": ["routeros"], +# "processors": { +# "enum": { +# f"mikrotik_port_mapping_{routeros_node.name}":{ +# "tagpass": { +# "agent_host": [routeros_node.hostname], +# }, +# "mapping": [ +# { +# "tag": "ifName", +# "dest": "is_infra", +# "default": "false", +# "value_mappings": { +# port_name: "true" +# for port_name, port_conf in repo.libs.mikrotik.get_netbox_config_for(routeros_node)['interfaces'].items() +# if port_conf['mode'] == "tagged-all" or port_conf['tagged_vlans'] +# if port_conf['type'] != "lag" +# }, # }, -# "mapping": [ -# h({ -# "tag": "agent_host", -# "dest": "host", -# "default": "unknown", -# "value_mappings": { -# routeros_node.hostname: routeros_node.name -# for routeros_node in repo.nodes_in_group("routeros") -# }, -# }) -# ] -# }) -# ] -# }, -# "inputs": { -# "snmp": { -# h({ -# "agents": [ -# f"udp://{routeros_node.hostname}:161" -# for routeros_node in repo.nodes_in_group("routeros") -# ], -# "version": 2, -# "community": "public", -# "interval": "30s", -# "tags": { -# "operating_system": "routeros", -# }, -# "table": [ -# # MikroTik Health (table) -# { -# "name": "hw", -# "oid": "MIKROTIK-MIB::mtxrGaugeTable", -# "field": [ -# { -# "name": "sensor", -# "oid": "MIKROTIK-MIB::mtxrGaugeName", -# "is_tag": True, -# }, -# { -# "name": "value", -# "oid": "MIKROTIK-MIB::mtxrGaugeValue", -# }, -# { -# "name": "unit", -# "oid": "MIKROTIK-MIB::mtxrGaugeUnit", -# "is_tag": True, -# }, -# ], -# }, -# # Interface statistics (standard IF-MIB) -# { -# "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", -# "oid": "IF-MIB::ifName", -# "is_tag": True, -# }, -# { -# "name": "ifAlias", -# "oid": "IF-MIB::ifAlias", -# "is_tag": True, -# }, - -# # Bytes (64-bit) -# { -# "name": "in_octets", -# "oid": "IF-MIB::ifHCInOctets", -# }, -# { -# "name": "out_octets", -# "oid": "IF-MIB::ifHCOutOctets", -# }, - -# # Packets (64-bit unicast) -# { -# "name": "in_ucast_pkts", -# "oid": "IF-MIB::ifHCInUcastPkts", -# }, -# { -# "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 -# { -# "name": "in_discards", -# "oid": "IF-MIB::ifInDiscards", -# }, -# { -# "name": "out_discards", -# "oid": "IF-MIB::ifOutDiscards", -# }, -# { -# "name": "in_errors", -# "oid": "IF-MIB::ifInErrors", -# }, -# { -# "name": "out_errors", -# "oid": "IF-MIB::ifOutErrors", -# }, -# ], -# }, -# # Interface statistics (MikroTik-specific mib) -# { -# "name": "interface_errors", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTable", -# "field": [ -# # Join key / label (usually identical to IF-MIB ifName) -# { -# "name": "ifName", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsName", -# "is_tag": True, -# }, - -# # join IF-MIB for better labels -# { -# "name": "ifAlias", -# "oid": "IF-MIB::ifAlias", -# "is_tag": True, -# }, - -# # ========================= -# # Physical layer (L1/L2) -# # ========================= -# # CRC/FCS errors → very often cabling, connectors, SFPs, signal quality (EMI) -# { -# "name": "rx_fcs_errors", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxFCSError", -# }, -# # Alignment errors → typically duplex mismatch or PHY problems -# { -# "name": "rx_align_errors", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxAlignError", -# }, -# # Code errors → PHY encoding errors (signal/SFP/PHY) -# { -# "name": "rx_code_errors", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxCodeError", -# }, -# # Carrier errors → carrier lost (copper issues, autoneg, PHY instability) -# { -# "name": "rx_carrier_errors", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxCarrierError", -# }, -# # Jabber → extremely long invalid frames (faulty NIC/PHY, very severe) -# { -# "name": "rx_jabber", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxJabber", -# }, - -# # ================================== -# # Length / framing anomalies (diagnostic) -# # ================================== -# # Frames shorter than minimum (noise, collisions, broken sender) -# { -# "name": "rx_too_short", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxTooShort", -# }, -# # Frames longer than allowed (MTU mismatch, framing errors) -# { -# "name": "rx_too_long", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxTooLong", -# }, -# # Fragments (often collision-related or duplex mismatch) -# { -# "name": "rx_fragment", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxFragment", -# }, -# # Generic length errors -# { -# "name": "rx_length_errors", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxLengthError", -# }, - -# # ================== -# # Drops (real packet loss) -# # ================== -# # RX drops (queue/ASIC/policy/overload) → highly alert-worthy -# { -# "name": "rx_drop", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxDrop", -# }, -# # TX drops (buffer/queue exhaustion, scheduling, ASIC limits) -# { -# "name": "tx_drop", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxDrop", -# }, - -# # ========================================= -# # Duplex / collision indicators -# # (should be zero on full-duplex links) -# # ========================================= -# # Total collisions (relevant only for half-duplex or misconfigurations) -# { -# "name": "tx_collisions", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxCollision", -# }, -# # Late collisions → almost always duplex mismatch / bad autoneg -# { -# "name": "tx_late_collisions", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxLateCollision", -# }, -# # Aggregate collision counter (context) -# { -# "name": "tx_total_collisions", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxTotalCollision", -# }, -# # Excessive collisions → persistent duplex problems -# { -# "name": "tx_excessive_collisions", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxExcessiveCollision", -# }, - -# # ================== -# # Flow control (diagnostic) -# # ================== -# # Pause frames received (peer throttling you) -# { -# "name": "rx_pause", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsRxPause", -# }, -# # Pause frames sent (you throttling the peer) -# { -# "name": "tx_pause", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxPause", -# }, -# # Pause frames actually honored -# { -# "name": "tx_pause_honored", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsTxPauseHonored", -# }, - -# # ========== -# # Stability -# # ========== -# # Link-down events (loose cables, bad SFPs, PoE power drops, reboots) -# { -# "name": "link_downs", -# "oid": "MIKROTIK-MIB::mtxrInterfaceStatsLinkDowns", -# }, -# ], -# }, -# # PoE -# { -# "name": "poe", -# "oid": "MIKROTIK-MIB::mtxrPOETable", -# "field": [ -# { -# "name": "ifName", -# "oid": "IF-MIB::ifName", -# "is_tag": True, -# }, -# { -# "name": "ifAlias", -# "oid": "IF-MIB::ifAlias", -# "is_tag": True, -# }, -# { -# "name": "ifindex", -# "oid": "MIKROTIK-MIB::mtxrPOEInterfaceIndex", -# "is_tag": True, -# }, -# { -# "name": "status", -# "oid": "MIKROTIK-MIB::mtxrPOEStatus", -# }, -# { -# "name": "voltage", -# "oid": "MIKROTIK-MIB::mtxrPOEVoltage", -# }, -# { -# "name": "current", -# "oid": "MIKROTIK-MIB::mtxrPOECurrent", -# }, -# { -# "name": "power", -# "oid": "MIKROTIK-MIB::mtxrPOEPower", -# }, -# ], -# }, -# ], -# }) -# }, +# ], +# } +# for routeros_node in repo.nodes_in_group("switches-mikrotik") # }, # }, # },