add labels

This commit is contained in:
Pierre Verkest 2023-09-01 16:23:20 +02:00
parent c5b0262b32
commit bb66722036
2 changed files with 88 additions and 13 deletions

View file

@ -12,45 +12,79 @@ load_dotenv()
HA_STATES = ["active", "hot_standby", "unavailable", "maintenancemode"] HA_STATES = ["active", "hot_standby", "unavailable", "maintenancemode"]
main_ha_state = Enum( main_ha_state = Enum(
"opnsense_main_ha_state", "OPNSense HA state of the MAIN server", states=HA_STATES "opnsense_main_ha_state",
"OPNSense HA state of the MAIN server",
[
"instance",
"host",
],
states=HA_STATES,
) )
backup_ha_state = Enum( backup_ha_state = Enum(
"opnsense_backup_ha_state", "opnsense_backup_ha_state",
"OPNSense HA state of the BACKUP server", "OPNSense HA state of the BACKUP server",
[
"instance",
"host",
],
states=HA_STATES, states=HA_STATES,
) )
active_server_bytes_received = Gauge( active_server_bytes_received = Gauge(
"opnsense_active_server_bytes_received", "opnsense_active_server_bytes_received",
"Active OPNSense server bytes received on WAN interface", "Active OPNSense server bytes received on WAN interface",
[
"instance",
"host",
],
) )
active_server_bytes_transmitted = Gauge( active_server_bytes_transmitted = Gauge(
"opnsense_active_server_bytes_transmitted", "opnsense_active_server_bytes_transmitted",
"Active OPNSense server bytes transmitted on WAN interface", "Active OPNSense server bytes transmitted on WAN interface",
[
"instance",
"host",
],
) )
def process_requests(main, backup): def process_requests(main, backup, exporter_instance: str = ""):
"""A dummy function that takes some time.""" """A dummy function that takes some time."""
main_state = main.get_interface_vip_status() main_state = main.get_interface_vip_status()
backup_sate = backup.get_interface_vip_status() backup_sate = backup.get_interface_vip_status()
main_ha_state.labels(instance=exporter_instance, host=main.host)
main_ha_state.state(main_state) main_ha_state.state(main_state)
backup_ha_state.labels(instance=exporter_instance, host=backup.host)
backup_ha_state.state(backup_sate) backup_ha_state.state(backup_sate)
bytes_received = None active_opnsense = None
bytes_transmitted = None
if main_state == "active": if main_state == "active":
bytes_received, bytes_transmitted = main.get_wan_trafic() active_opnsense = main
if backup_sate == "active": if backup_sate == "active":
bytes_received, bytes_transmitted = backup.get_wan_trafic() active_opnsense = backup
active_server_bytes_received.set(bytes_received or -1) if active_opnsense:
active_server_bytes_transmitted.set(bytes_transmitted or -1) bytes_received, bytes_transmitted = active_opnsense.get_wan_trafic()
if bytes_received or bytes_received == 0:
active_server_bytes_received.labels(
instance=exporter_instance, host=active_opnsense.host
)
active_server_bytes_received.set(bytes_received)
if bytes_transmitted or bytes_transmitted == 0:
active_server_bytes_transmitted.labels(
instance=exporter_instance, host=active_opnsense.host
)
active_server_bytes_transmitted.set(bytes_transmitted)
def start_server(main: OPNSenseAPI, backup: OPNSenseAPI, check_frequency: int = 1): def start_server(
main: OPNSenseAPI,
backup: OPNSenseAPI,
check_frequency: int = 1,
exporter_instance: str = "",
):
# Start up the server to expose the metrics. # Start up the server to expose the metrics.
start_http_server(8000) start_http_server(8000)
# Generate some requests. # Generate some requests.
while True: while True:
process_requests(main, backup) process_requests(main, backup, exporter_instance=exporter_instance)
time.sleep(check_frequency) time.sleep(check_frequency)
@ -105,7 +139,7 @@ def run():
type=str, type=str,
default=socket.gethostname(), default=socket.gethostname(),
help=( help=(
"Instance name, default value computed with hostname " "Exporter Instance name, default value computed with hostname "
"where the server is running. Use to set the instance label." "where the server is running. Use to set the instance label."
), ),
) )
@ -115,4 +149,5 @@ def run():
OPNSenseAPI(arguments.main, arguments.user, arguments.password), OPNSenseAPI(arguments.main, arguments.user, arguments.password),
OPNSenseAPI(arguments.backup, arguments.user, arguments.password), OPNSenseAPI(arguments.backup, arguments.user, arguments.password),
check_frequency=arguments.frequency, check_frequency=arguments.frequency,
exporter_instance=arguments.prom_instance,
) )

View file

@ -161,5 +161,45 @@ def test_process_no_active():
) )
main_ha_state_mock.assert_called_once_with("maintenancemode") main_ha_state_mock.assert_called_once_with("maintenancemode")
backup_ha_state_mock.assert_called_once_with("unavailable") backup_ha_state_mock.assert_called_once_with("unavailable")
active_server_bytes_received_mock.assert_called_once_with(-1) active_server_bytes_received_mock.assert_not_called()
active_server_bytes_transmitted_mock.assert_called_once_with(-1) active_server_bytes_transmitted_mock.assert_not_called()
@responses.activate
def test_process_with_falsy_value():
responses.add(
responses.GET,
f"https://{MAIN_HOST}/api/diagnostics/interface/get_vip_status/",
body=generate_get_vip_status_paylaod("MASTER", "MASTER", False),
)
responses.add(
responses.GET,
f"https://{BACKUP_HOST}/api/diagnostics/interface/get_vip_status/",
body=generate_get_vip_status_paylaod("BACKUP", "BACKUP", False),
)
responses.add(
responses.GET,
f"https://{BACKUP_HOST}/api/diagnostics/traffic/interface",
body=generate_diagnostics_traffic_interface_paylaod(),
status=404,
)
with mock.patch(
"opnsense_exporter.server.main_ha_state.state"
) as main_ha_state_mock:
with mock.patch(
"opnsense_exporter.server.backup_ha_state.state"
) as backup_ha_state_mock:
with mock.patch(
"opnsense_exporter.server.active_server_bytes_received.set"
) as active_server_bytes_received_mock:
with mock.patch(
"opnsense_exporter.server.active_server_bytes_transmitted.set"
) as active_server_bytes_transmitted_mock:
process_requests(
OPNSenseAPI(MAIN_HOST, LOGIN, PASSWORD),
OPNSenseAPI(BACKUP_HOST, LOGIN, PASSWORD),
)
main_ha_state_mock.assert_called_once_with("active")
backup_ha_state_mock.assert_called_once_with("hot_standby")
active_server_bytes_received_mock.assert_not_called()
active_server_bytes_transmitted_mock.assert_not_called()