docs/npm/snmp-traps/investigation-playbooks.md
Use these playbooks during SNMP trap incidents when you need a fast, repeatable investigation path. They are written for NOC, NetOps, SecOps, SRE, and incident response teams.
Start from the operator signal, then check the trap rows and receiver metrics together. Trap absence is not proof that nothing happened: a device may be quiet, misconfigured, blocked by the network, rejected by policy, rate limited, deduplicated, or failing to write or export rows.
Use these rules for every playbook:
TRAP_REPORT_TYPE first. It tells you whether the row is a normal trap, a decode error, or a deduplication summary.TRAP_SEVERITY and TRAP_CATEGORY as profile policy. Use them to sort urgency, then confirm the meaning with TRAP_NAME, TRAP_OID, TRAP_VAR_*, TRAP_JSON, device context, and operational evidence.received, decoded, accepted, committed, dedup_suppressed, dropped, and write_failed in snmp.trap.pipeline, then inspect snmp.trap.errors and group trap rows by source fields.TRAP_JSON, full TRAP_ENRICHMENT, organization identifiers, or public IPs that identify your environment into tickets. Use placeholders and RFC 5737 example IPs such as 192.0.2.10, 198.51.100.20, and 203.0.113.5.For field meanings, query examples, metrics, validation checks, and deeper troubleshooting, see:
Situation. One source is flooding the receiver with traps, and the noise is drowning out the events that matter.
snmp.trap.errors rate_limited, rising dedup_suppressed, or rising dropped.TRAP_REPORT_TYPE, TRAP_SOURCE_IP, TRAP_SOURCE_UDP_PEER, TRAP_NAME, TRAP_OID, TRAP_CATEGORY, TRAP_SEVERITY, TRAP_VAR_*, TRAP_JSON, TRAP_ENRICHMENT, snmp.trap.pipeline, snmp.trap.errors, and snmp.trap.dedup_suppressed.TRAP_SOURCE_IP, then by TRAP_NAME or TRAP_OID. Confirm whether dedup_suppressed or rate_limited explains missing repeated rows, then work with the device owner to stop the cause or adjust receiver policy only after confirming the storm is expected.Situation. A high-severity or security trap just fired, and you need to confirm what the device reported before escalating.
emerg, alert, or crit, or a sudden increase in TRAP_CATEGORY=security or TRAP_CATEGORY=auth.TRAP_REPORT_TYPE, TRAP_SOURCE_IP, TRAP_SOURCE_UDP_PEER, TRAP_NAME, TRAP_OID, TRAP_CATEGORY, TRAP_SEVERITY, TRAP_VAR_*, TRAP_JSON, TRAP_ENRICHMENT, receiver pipeline metrics, and receiver error metrics.Situation. A link is reporting up/down transitions and you need to tell a one-time change from a flapping interface.
TRAP_CATEGORY=state_change, repeated state-change traps from one source, or known interface traps such as TRAP_NAME=IF-MIB::linkDown or TRAP_NAME=IF-MIB::linkUp.TRAP_REPORT_TYPE, TRAP_SOURCE_IP, TRAP_SOURCE_UDP_PEER, TRAP_NAME, TRAP_OID, TRAP_CATEGORY, TRAP_SEVERITY, relevant TRAP_VAR_* interface fields, TRAP_JSON, TRAP_ENRICHMENT, and snmp.trap.pipeline.TRAP_VAR_* fields for the interface identifier when present, and open TRAP_JSON only if the indexed varbinds do not identify the affected resource.Situation. A device reported a restart, and you need to know whether it explains other missing or unexpected traps around the same time.
TRAP_NAME=SNMPv2-MIB::coldStart or TRAP_NAME=SNMPv2-MIB::warmStart, or a cluster of restart-like trap OIDs from the same source.TRAP_REPORT_TYPE, TRAP_SOURCE_IP, TRAP_SOURCE_UDP_PEER, TRAP_NAME, TRAP_OID, TRAP_CATEGORY, TRAP_SEVERITY, TRAP_VAR_*, TRAP_JSON, and the same source's rows before and after the restart.Situation. A trap you expected never showed up, and you need to find where in the path it was lost — or whether it was ever sent.
TRAP_REPORT_TYPE, TRAP_SOURCE_IP, TRAP_SOURCE_UDP_PEER, TRAP_NAME, TRAP_OID, decode-error fields, dedup summary fields, snmp.trap.pipeline, snmp.trap.errors, and snmp.trap.dedup_suppressed.received, decoded, accepted, committed. If received is flat, check ipv4.udperrors (RcvbufErrors) for kernel-buffer drops first, then sender and network delivery. If received rises but committed is flat, inspect dropped, dedup_suppressed, write_failed, and the matching error dimensions.Situation. Traps are arriving as raw numeric OIDs with no name or category, and you need to decide whether to extend profile coverage.
TRAP_NAME, TRAP_CATEGORY=unknown, repeated raw TRAP_OID values, or rising unknown_oid.TRAP_OID, TRAP_NAME, TRAP_CATEGORY, and snmp.trap.errors unknown_oid first; for the full field and evidence list, see Troubleshooting.TRAP_OID, the source, a minimized TRAP_JSON summary, and the operational meaning from vendor documentation or device evidence. Add or adjust Trap Profiles only after confirming the OID and expected severity/category policy.Situation. SNMPv3 traps from a device are being rejected, and you need to tell a credential mismatch from an engine-ID problem.
auth_failures, usm_failures, or unknown_engine_id.TRAP_REPORT_TYPE=decode_error, TRAP_DECODE_ERROR_KIND, TRAP_ENGINE_ID, and the auth_failures/usm_failures/unknown_engine_id error dimensions first; for the full decode-error field list and the v3-silent-but-v2c-works cue, see Troubleshooting.TRAP_PACKET_SHA256 values can indicate the same bad packet pattern repeating.TRAP_SOURCE_IP and TRAP_SOURCE_UDP_PEER, then compare the device and listener SNMPv3 configuration without copying secrets into tickets. Treat TRAP_ENGINE_ID as inventory data and share only when necessary.Situation. Repeated traps are showing up as summary rows instead of individual events, and you need to confirm deduplication is behaving as intended.
TRAP_REPORT_TYPE=deduplication_summary or rising dedup_suppressed in snmp.trap.dedup_suppressed or the receiver pipeline.TRAP_SUPPRESSED_COUNT, TRAP_SUPPRESSED_FINGERPRINTS, and TRAP_REPORT_PERIOD_SEC first; for the full evidence list and config checks, see Troubleshooting.TRAP_SUPPRESSED_COUNT and TRAP_SUPPRESSED_FINGERPRINTS to separate one repeated event from many repeated event classes. Inspect the first normal trap row and the summary TRAP_JSON, then confirm the deduplication policy matches operator expectations.Situation. Netdata shows the trap rows, but the downstream SIEM is missing events or fields, and you need to find where the forwarding path diverges.
TRAP_REPORT_TYPE, TRAP_SOURCE_IP, TRAP_SOURCE_UDP_PEER, TRAP_NAME, TRAP_OID, TRAP_CATEGORY, TRAP_SEVERITY, TRAP_VAR_*, TRAP_JSON, TRAP_ENRICHMENT, decode-error fields, dedup summary fields, snmp.trap.pipeline committed, write_failed, and snmp.trap.errors journal_write_failed and otlp_export_failed.Record enough context for another operator to reproduce the investigation without exposing sensitive data:
TRAP_JOB.TRAP_REPORT_TYPE.TRAP_SOURCE_IP and TRAP_SOURCE_UDP_PEER, or RFC 5737 examples in public material.TRAP_NAME and TRAP_OID.TRAP_CATEGORY and TRAP_SEVERITY, with a note that they are profile policy.TRAP_VAR_* names and sanitized values.received, decoded, accepted, committed, dropped, write_failed, dedup_suppressed, and the relevant snmp.trap.errors dimension.TRAP_JSON or TRAP_ENRICHMENT only when indexed fields do not explain the event.