Skip to content

Commit fd4335e

Browse files
author
Anze
committed
Discard values when counter overflow is detected
1 parent b53adfc commit fd4335e

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

snmpcollector.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,17 @@ def _convert_counters_to_values(results, now, counter_ident_prefix):
5656
_save_current_counter_value(new_value, now, counter_ident)
5757
if old_value is None:
5858
new_results.append(SNMPVariable(oid=v.oid, oid_index=v.oid_index, value=None, snmp_type='COUNTER_PER_S'))
59-
else:
60-
dt = now - t
61-
dv = (new_value - old_value) / dt
62-
new_results.append(SNMPVariable(oid=v.oid, oid_index=v.oid_index, value=dv, snmp_type='COUNTER_PER_S'))
59+
continue
60+
61+
# it seems like the counter overflow happened, discard result:
62+
if new_value < old_value:
63+
new_results.append(SNMPVariable(oid=v.oid, oid_index=v.oid_index, value=None, snmp_type='COUNTER_PER_S'))
64+
log.warning(f"Counter overflow detected for oid {v.oid}, oid index {v.oid_index}, discarding value - if this happens often, consider using OIDS with 64bit counters (if available) or decreasing polling interval.")
65+
continue
66+
67+
dt = now - t
68+
dv = (new_value - old_value) / dt
69+
new_results.append(SNMPVariable(oid=v.oid, oid_index=v.oid_index, value=dv, snmp_type='COUNTER_PER_S'))
6370
return new_results
6471

6572

test_snmpcollector.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,7 @@ def test_convert_counters_counter():
119119

120120
results_0 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.16', oid_index='1', value='1000', snmp_type='COUNTER')]
121121
expected_0 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.16', oid_index='1', value=None, snmp_type='COUNTER_PER_S')]
122-
actual = _convert_counters_to_values(results_0, now, "ASDF/1234")
123-
assert actual == expected_0
122+
assert _convert_counters_to_values(results_0, now, "ASDF/1234") == expected_0
124123

125124
results_1 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.16', oid_index='1', value='2000.0', snmp_type='COUNTER')]
126125
expected_1 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.16', oid_index='1', value='1000.0', snmp_type='COUNTER_PER_S')]
@@ -129,3 +128,23 @@ def test_convert_counters_counter():
129128
results_2 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.16', oid_index='1', value='2300.0', snmp_type='COUNTER')]
130129
expected_2 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.16', oid_index='1', value='100.0', snmp_type='COUNTER_PER_S')]
131130
assert _convert_counters_to_values(results_2, now + 1.0 + 3.0, "ASDF/1234") == expected_2
131+
132+
def test_convert_counters_overflow():
133+
""" First expression should be empty, next ones should work """
134+
now = 1234567890.123456
135+
136+
results_0 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value='123000.0', snmp_type='COUNTER')]
137+
expected_0 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value=None, snmp_type='COUNTER_PER_S')]
138+
assert _convert_counters_to_values(results_0, now, "ASDF/1234") == expected_0
139+
140+
results_1 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value='234000.0', snmp_type='COUNTER')]
141+
expected_1 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value='111000.0', snmp_type='COUNTER_PER_S')]
142+
assert _convert_counters_to_values(results_1, now + 1.0, "ASDF/1234") == expected_1
143+
144+
results_2 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value='1000.0', snmp_type='COUNTER')]
145+
expected_2 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value=None, snmp_type='COUNTER_PER_S')]
146+
assert _convert_counters_to_values(results_2, now + 1.0 + 3.0, "ASDF/1234") == expected_2
147+
148+
results_3 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value='2000.0', snmp_type='COUNTER')]
149+
expected_3 = [SNMPVariable(oid='.1.3.6.1.2.1.2.2.1.17', oid_index='1', value='500.0', snmp_type='COUNTER_PER_S')]
150+
assert _convert_counters_to_values(results_3, now + 1.0 + 3.0 + 2.0, "ASDF/1234") == expected_3

0 commit comments

Comments
 (0)