diff --git a/lib/towerops/snmp/poller_worker.ex b/lib/towerops/snmp/poller_worker.ex index ed200279..c5e7c910 100644 --- a/lib/towerops/snmp/poller_worker.ex +++ b/lib/towerops/snmp/poller_worker.ex @@ -245,15 +245,32 @@ defmodule Towerops.Snmp.PollerWorker do defp decode_snmp_value(value) when is_number(value), do: value defp decode_snmp_value(value) when is_binary(value) do - # Try to decode as Counter64 (8 bytes, big-endian unsigned integer) + # Try to decode based on byte size case byte_size(value) do 8 -> + # Standard Counter64 (8 bytes, big-endian unsigned integer) <> = value counter + 16 -> + # Some SNMP implementations return 16-byte values + # Try reading last 8 bytes as Counter64 + <<_prefix::binary-size(8), counter::unsigned-big-integer-size(64)>> = value + counter + + size when size > 8 -> + # Large binary, try reading last 8 bytes + offset = size - 8 + <<_prefix::binary-size(offset), counter::unsigned-big-integer-size(64)>> = value + Logger.debug("Decoded #{size}-byte SNMP value as Counter64 from last 8 bytes: #{counter}") + counter + _ -> - # Unknown binary format, return nil - Logger.debug("Unknown SNMP binary value format, size: #{byte_size(value)}") + # Unknown binary format or too small + Logger.warning( + "Unknown SNMP binary value format, size: #{byte_size(value)}, bytes: #{inspect(value)}" + ) + nil end end