Add error handling and logging to monitoring supervisor

Improved startup reliability and debugging for SNMP pollers:
- Added try/rescue blocks around monitor and poller startup
- Added logging for successful startup and errors
- Added error logging to PollerWorker's perform_poll
- Added debug logging for successful sensor/interface polls

This will help identify issues when pollers fail to start or
encounter errors during polling, which was causing silent failures
where sensors weren't being collected.
This commit is contained in:
Graham McIntire 2026-01-04 13:24:33 -06:00
parent bd91e2a7c3
commit 91759ac16c
No known key found for this signature in database
2 changed files with 36 additions and 4 deletions

View file

@ -9,6 +9,8 @@ defmodule Towerops.Monitoring.Supervisor do
alias Towerops.Snmp.PollerSupervisor
alias Towerops.Snmp.PollerWorker
require Logger
def start_link(init_arg) do
Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
end
@ -33,8 +35,22 @@ defmodule Towerops.Monitoring.Supervisor do
Task.start(fn ->
# Wait briefly for the supervisor tree to be fully initialized
Process.sleep(100)
start_all_monitors()
start_all_snmp_pollers()
try do
start_all_monitors()
Logger.info("Started all equipment monitors")
rescue
error ->
Logger.error("Failed to start monitors: #{inspect(error)}")
end
try do
start_all_snmp_pollers()
Logger.info("Started all SNMP pollers")
rescue
error ->
Logger.error("Failed to start SNMP pollers: #{inspect(error)}")
end
end)
end

View file

@ -86,10 +86,26 @@ defmodule Towerops.Snmp.PollerWorker do
now = DateTime.truncate(DateTime.utc_now(), :second)
# Poll all sensors
_ = poll_sensors(device.sensors, client_opts, now)
try do
poll_sensors(device.sensors, client_opts, now)
Logger.debug("Polled #{length(device.sensors)} sensors for #{equipment.name}")
rescue
error ->
Logger.error(
"Error polling sensors for #{equipment.name}: #{inspect(error)}\n#{Exception.format_stacktrace()}"
)
end
# Poll all interfaces
_ = poll_interfaces(device.interfaces, client_opts, now)
try do
poll_interfaces(device.interfaces, client_opts, now)
Logger.debug("Polled #{length(device.interfaces)} interfaces for #{equipment.name}")
rescue
error ->
Logger.error(
"Error polling interfaces for #{equipment.name}: #{inspect(error)}\n#{Exception.format_stacktrace()}"
)
end
# Schedule next poll
schedule_next_poll(get_poll_interval(equipment))