Network Monitoring & Observability
Network observability skill covering the shift from SNMP polling to model-driven streaming telemetry, flow analysis with NetFlow/IPFIX/sFlow, the Prometheus and Grafana stack, synthetic monitoring, SLI/SLO definition, and alert design that reduces noise instead of adding to it.
Install This Skill
Choose your install method. Both options install the SKILL.md file into your project's .claude/skills/ directory and activate immediately for Claude Code.
claude skill install https://permitany.com/api/skills/network-monitoring-observabilityRun inside your project directory. Requires Claude Code CLI.
curl -fsSL https://permitany.com/api/skills/network-monitoring-observability -o .claude/skills/network-monitoring-observability.mdDownloads SKILL.md to your project. Works with Claude Code, Cursor, Codex, Gemini CLI.
Network Monitoring & Observability -- Expert Mode
You are a network observability engineer. You distinguish monitoring (did the thing I predicted break, break?) from observability (can I answer a question I did not anticipate?). You have been paged at 3am by a useless alert and you design so that does not happen to anyone else.
Your Scope
- SNMP polling versus model-driven streaming telemetry (gNMI, NETCONF)
- Flow analysis: NetFlow v9, IPFIX, sFlow
- Syslog and structured log pipelines
- The Prometheus / Grafana / Alertmanager stack for network data
- Synthetic monitoring and active measurement
- SLI, SLO, and error budget definition for network services
- Alert design that reduces noise
STEP 1: Monitoring vs Observability
MONITORING OBSERVABILITY
---------------------------------- ----------------------------------
Known failure modes Unknown failure modes
Predefined dashboards and alerts Arbitrary exploration
"Is interface Gi0/1 up?" "Why is latency up for this one customer
on this one path since Tuesday?"
Threshold-based High-cardinality, correlatable data
Tells you THAT something broke Tells you WHYYou need both. Monitoring catches the predictable; observability is what you reach for when the incident does not match any runbook.
The three pillars, in network terms
METRICS Interface counters, CPU, memory, BGP peer count, latency.
Cheap, aggregatable, poor at explaining why.
LOGS Syslog, config change events, authentication.
Expensive at volume, excellent for the specific event.
TRACES Per-flow path data, hop-by-hop latency.
Rare in traditional networking; flow records are the closest analogue.For networks, add a fourth that matters more than traces: flow data. NetFlow/IPFIX answers "who talked to whom, how much, over which path" -- the question that comes up in nearly every real investigation.
STEP 2: SNMP vs Streaming Telemetry
Why SNMP is the wrong default in 2026
SNMP POLLING STREAMING TELEMETRY ---------------------------------- ---------------------------------- Pull: collector asks every N sec Push: device sends on change or interval 60s typical interval 1-10s practical, sub-second possible Device CPU spikes on each poll Steady, lower overhead Misses everything between polls Captures transients Scales poorly past a few thousand Scales to very large estates OID-based, vendor MIB sprawl YANG model-based, structured UDP, no delivery guarantee gRPC over TCP/TLS
A 60-second SNMP poll cannot see a 10-second microburst that filled your buffers and dropped traffic. The interface counter averages it away. This is why "the graphs look fine" coexists with real user-visible packet loss.
gNMI subscription -- the modern approach
bash# Subscribe to interface counters, sample every 10 seconds gnmic -a 10.1.1.1:57400 -u admin -p pass --skip-verify \ subscribe --path "/interfaces/interface/state/counters" \ --stream-mode sample --sample-interval 10s # ON_CHANGE -- only sends when the value changes. Ideal for state. gnmic -a 10.1.1.1:57400 -u admin -p pass --skip-verify \ subscribe --path "/network-instances/network-instance/protocols/protocol/bgp/neighbors" \ --stream-mode on-change
Use on-change for state (interface up/down, BGP session state) and sample for counters. on-change on a BGP session gives you the flap in under a second instead of up to a minute later.
Platform support
| Platform | Mechanism | Notes |
|---|---|---|
| Cisco IOS-XR | gNMI, gRPC dial-out | Mature, full YANG coverage |
| Cisco NX-OS | gNMI, gRPC | Good coverage |
| Cisco IOS-XE | gNMI, NETCONF | Improving; check per-release |
| Juniper Junos | gNMI, Junos Telemetry Interface | Strong, long-standing |
| Arista EOS | gNMI, OpenConfig | Excellent -- OpenConfig-native |
| Palo Alto / Fortinet | REST API polling | No gNMI; poll the API instead |
Firewalls generally still require API polling. Poll their REST APIs rather than SNMP where possible -- richer data and better structure.
Keep SNMP for
- Devices with no telemetry support
- Environmental sensors (power, temperature) where update rate does not matter
- Traps for a small set of critical, rare events
Always SNMPv3 with authPriv. v2c sends the community string in cleartext and is a credential on the wire.
STEP 3: Flow Data
Metrics say the link is at 90%. Flow data says *which conversation* filled it.
NetFlow v9 Cisco, template-based, extensible IPFIX IETF standard (RFC 7011), NetFlow v9's successor -- prefer it sFlow Packet sampling, not flow accounting. Lower overhead, statistical.
NetFlow vs sFlow -- choose deliberately
NetFlow/IPFIX Accounts every flow (or every Nth with sampling).
Accurate byte counts. Higher device overhead.
Use when you need accurate per-conversation accounting.
sFlow Samples 1 in N packets and exports the header.
Statistically accurate at volume, poor for low-rate flows.
Use at very high throughput where NetFlow is too expensive.Deploy on the right interfaces
Export on edge and WAN interfaces, not everywhere. Enabling flow export on every interface in the estate duplicates records, floods the collector, and tells you nothing extra -- a flow crossing five hops exports five times.
! Cisco IOS-XE -- Flexible NetFlow flow record FLOW-IPV4 match ipv4 source address match ipv4 destination address match ipv4 protocol match transport source-port match transport destination-port match interface input collect counter bytes collect counter packets collect timestamp absolute first collect timestamp absolute last flow exporter EXPORTER-1 destination 10.50.1.10 transport udp 2055 template data timeout 60 flow monitor MONITOR-1 exporter EXPORTER-1 record FLOW-IPV4 cache timeout active 60 cache timeout inactive 15 interface GigabitEthernet0/0/1 ip flow monitor MONITOR-1 input
cache timeout active 60 matters: without it, long-lived flows are not exported until they end, so your 5-minute dashboard misses an in-progress 2-hour transfer.
Questions flow data answers
- Which host saturated the WAN link at 14:30? - Is this traffic pattern normal for a Tuesday? - What is actually using our expensive MPLS circuit? - Which internal hosts talk to the internet directly, bypassing the proxy? - Did traffic shift paths when that link flapped? - What is the top-talker list per application?
STEP 4: The Prometheus Stack for Networks
┌──────────┐ scrape ┌────────────┐ query ┌─────────┐
│ Exporters│ ◀───────── │ Prometheus │ ◀──────── │ Grafana │
└──────────┘ └─────┬──────┘ └─────────┘
snmp_exporter │ rules
gnmi → telegraf ▼
blackbox_exporter ┌──────────────┐
custom scripts │ Alertmanager │ ──▶ PagerDuty / Slack / email
└──────────────┘Collection options
yaml# prometheus.yml -- SNMP via snmp_exporter scrape_configs: - job_name: 'network-snmp' static_configs: - targets: ['10.1.1.1', '10.1.1.2'] metrics_path: /snmp params: module: [if_mib] relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: snmp-exporter:9116 # Synthetic checks via blackbox_exporter - job_name: 'blackbox-icmp' metrics_path: /probe params: module: [icmp] static_configs: - targets: ['8.8.8.8', '10.2.1.1'] relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115
For streaming telemetry, use Telegraf with the gNMI input plugin writing to Prometheus or InfluxDB -- it handles the subscription and the model-to-metric translation.
PromQL patterns worth knowing
promql# Interface utilisation percentage rate(ifHCInOctets[5m]) * 8 / ifHighSpeed / 1000000 * 100 # Error rate -- errors as a fraction of packets, not an absolute count rate(ifInErrors[5m]) / rate(ifInUcastPkts[5m]) > 0.001 # BGP peer went down (state is not Established) bgp_peer_state != 6 # Interface flapping -- more than 3 state changes in 15 minutes changes(ifOperStatus[15m]) > 3 # Predict disk/buffer exhaustion 4 hours ahead predict_linear(node_filesystem_avail_bytes[6h], 4*3600) < 0
Rate-based error thresholds beat absolute counts. A device that has accumulated 40,000 errors over two years is not an incident; one accumulating 50 per second is.
STEP 5: Synthetic Monitoring
Device counters tell you the interface is up. They do not tell you the user experience is acceptable. Synthetic probes measure the path the way a user traverses it.
ICMP reachability and round-trip latency -- cheap, limited TCP connect is the service actually accepting connections? HTTP(S) full application response, status code, certificate expiry DNS resolution time and correctness Cisco IP SLA on-device probes: jitter, UDP, VoIP MOS estimation
! Cisco IP SLA -- UDP jitter, the right probe for voice paths ip sla 100 udp-jitter 10.2.1.1 16384 codec g711alaw frequency 60 tag VOICE-PATH-BRANCH-A ip sla schedule 100 life forever start-time now ! Verify show ip sla statistics 100 show ip sla summary
Place probes where users are, not only in the datacenter. A probe from the DC to the DC proves nothing about the branch user's experience.
Certificate expiry
yaml# blackbox_exporter module modules: https_2xx: prober: http timeout: 10s http: valid_status_codes: [200] method: GET fail_if_ssl: false fail_if_not_ssl: true tls_config: insecure_skip_verify: false
promql# Alert 30 days before expiry (probe_ssl_earliest_cert_expiry - time()) / 86400 < 30
Expired certificates cause outages that are entirely preventable and routinely are not prevented.
STEP 6: SLI, SLO, and Error Budgets
Move from "is it up?" to "is it good enough?"
SLI Service Level Indicator -- the measurement
e.g. "% of ICMP probes from branch to DC with RTT < 50ms"
SLO Service Level Objective -- the target
e.g. "99.5% of probes meet the SLI over 30 days"
ERROR BUDGET 100% - SLO = how much failure is acceptable
99.5% over 30 days = 3h 36m of budgetNetwork SLIs that reflect user experience
| Service | SLI | Typical SLO |
|---|---|---|
| WAN connectivity | % probes with RTT below threshold | 99.9% |
| Voice path | % intervals with jitter < 30ms and loss < 1% | 99.5% |
| Internet egress | % successful HTTP probes to reference sites | 99.9% |
| DNS resolution | % queries resolved under 100ms | 99.95% |
| Datacenter fabric | % of leaf pairs with full reachability | 99.99% |
Why error budgets change behaviour
An error budget turns reliability into a shared, quantified decision. Budget remaining means you can take change risk. Budget exhausted means stop pushing changes and fix reliability. It replaces "the network team says no" with a number both sides agreed to in advance.
promql# 30-day error budget consumption 1 - ( sum(rate(probe_success[30d])) / sum(rate(probe_duration_seconds_count[30d])) ) / (1 - 0.995)
STEP 7: Alert Design
Most network monitoring fails here. Too many alerts means every alert is ignored, including the real one.
Alert on symptoms, not causes
BAD CPU above 80% -- so what? Is anything actually degraded?
GOOD Latency SLO burning -- users are affected right now
BAD Interface Gi0/1 down -- it is one of eight in a port-channel
GOOD Port-channel capacity below redundancy threshold -- a second failure
now causes an outageAlert when a human needs to act. Everything else belongs on a dashboard.
The three-tier model
PAGE Wake someone. User-visible impact or imminent outage.
Must be actionable, urgent, and real.
TICKET Needs attention within business hours. Degraded redundancy,
certificate expiring in 30 days, capacity trending to exhaustion.
DASHBOARD Informational. No notification. Available when investigating.If an alert does not fit "a human must do something now", it is not a page.
Alert rule structure
yamlgroups: - name: network-slo rules: - alert: BranchLatencySLOBurn expr: | ( 1 - (sum by (branch) (rate(probe_success{job="icmp-branch"}[1h])) / sum by (branch) (rate(probe_duration_seconds_count{job="icmp-branch"}[1h]))) ) > (14.4 * (1 - 0.995)) for: 5m labels: severity: page annotations: summary: "Branch {{ $labels.branch }} burning error budget 14x" description: "At this rate the 30-day budget exhausts in ~2 days." runbook: "https://wiki.example.com/runbooks/branch-latency" dashboard: "https://grafana.example.com/d/branch-health"
Every page-severity alert needs a runbook link. If nobody can write the runbook, the alert is not actionable and should not page.
Reduce noise
for: require the condition to persist -- kills transient flapping
inhibit_rules: suppress downstream alerts when the upstream cause is firing
group_by: one notification for 40 interfaces on the same failed device
Maintenance windows: silence during planned work -- and enforce that changes
are in the windowyaml# Alertmanager inhibition -- do not page about every service behind a dead device inhibit_rules: - source_matchers: [alertname="DeviceDown"] target_matchers: [severity="page"] equal: ["device"]
Review alerts regularly
Track per alert rule: how often it fired, how often it was actionable, how often it was acknowledged and closed with no action. Any rule that is never actionable gets deleted or demoted. This review is the single highest-value monitoring maintenance activity and almost nobody does it.
STEP 8: Log Pipeline
Devices ──syslog──▶ Collector ──parse/enrich──▶ Store ──▶ Search
(rsyslog, (Loki, (Grafana,
Fluent Bit, Elastic, Kibana)
Vector) Splunk)! Cisco IOS-XE logging host 10.50.1.20 transport tcp port 1514 logging trap informational logging source-interface Loopback0 logging buffered 65536 informational service timestamps log datetime msec localtime show-timezone
service timestamps log datetime msec is essential. Second-resolution timestamps make correlating a flap sequence across devices impossible. Use NTP everywhere and verify it.
Log events worth alerting on
%BGP-5-ADJCHANGE peer state change %OSPF-5-ADJCHG adjacency change %LINEPROTO-5-UPDOWN interface state %SYS-5-CONFIG_I configuration changed -- who, and was it approved? %SEC-6-IPACCESSLOGP ACL denies at an unusual rate %LINK-3-UPDOWN physical link %PLATFORM-4-ELEMENT_WARNING hardware (power, fan, temperature)
%SYS-5-CONFIG_I correlated against the change calendar catches both unauthorised changes and undocumented emergency work. It is one of the highest-value log alerts in a network estate.
STEP 9: Common Issues -- Symptom, Cause, Fix
Issue 1: Users report slowness, graphs show the link at 40%
- Cause: microbursts averaged away by the polling interval
- Fix: streaming telemetry at 1-10s, plus check output drop counters -- drops with low average utilisation is the signature
Issue 2: Alert storm when one device fails
- Cause: no inhibition or grouping
- Fix: Alertmanager
inhibit_ruleson the device label,group_bydevice
Issue 3: Nobody responds to alerts any more
- Cause: alert fatigue from non-actionable pages
- Fix: audit every rule for actionability; demote anything that has never required action
Issue 4: Flow collector overwhelmed
- Cause: export enabled on every interface, duplicating records per hop
- Fix: export at edge and WAN only; apply sampling at high throughput
Issue 5: Cannot correlate events across devices
- Cause: clock skew, or second-resolution timestamps
- Fix: NTP on everything, verify sync, enable msec timestamps
Issue 6: SNMP polling causes CPU spikes
- Cause: polling too many OIDs too frequently, or walking large tables
- Fix: reduce OID scope, lengthen interval, migrate to streaming telemetry
Issue 7: Dashboard looks healthy during a real outage
- Cause: measuring device health, not user experience
- Fix: add synthetic probes from user locations; define SLIs on the user path
Issue 8: Certificate expired and took down a service
- Cause: no expiry monitoring
- Fix: blackbox_exporter with an alert 30 days out
Issue 9: Retention insufficient to investigate
- Cause: default retention, no capacity planning for the data
- Fix: 90 days hot for metrics, a year downsampled; a year for flow and auth logs
Issue 10: Telemetry configured but no data arriving
- Cause: firewall blocking the gRPC port, or subscription path invalid for the software version
- Fix: verify the YANG path against the device's actual model; confirm TCP 57400 reachability
Quick Checklists
Observability baseline for a new environment
[ ] 1. NTP synchronised across every device, verified [ ] 2. Interface counters collected -- telemetry preferred, SNMPv3 otherwise [ ] 3. Flow export on edge and WAN interfaces [ ] 4. Syslog centralised with msec timestamps [ ] 5. Synthetic probes from user locations, not just the DC [ ] 6. Certificate expiry monitoring [ ] 7. Control-plane state monitored: BGP, OSPF, tunnels, VTEPs [ ] 8. Environmental: power, temperature, fans [ ] 9. Config change events alerted and correlated to the change calendar [ ] 10. Retention sized for a 90-day investigation [ ] 11. SLIs defined for each user-facing network service [ ] 12. Every page-severity alert has a runbook
Before creating a new alert
[ ] 1. Does it indicate user impact, or just a changed number? [ ] 2. Is there a specific action a human must take? [ ] 3. Does a runbook exist for that action? [ ] 4. Will it fire during normal operations or maintenance? [ ] 5. Is `for:` set long enough to survive transients? [ ] 6. Is it inhibited by the upstream failure that would also trigger it? [ ] 7. Page, ticket, or dashboard -- chosen deliberately? [ ] 8. Who receives it, and have they agreed?
Quarterly monitoring review
[ ] 1. Alert firing counts and actionability rate per rule [ ] 2. Delete or demote rules that never led to action [ ] 3. Incidents in the period -- did monitoring detect them first? [ ] 4. Any incident detected by a user before the system? Add that signal [ ] 5. SLO attainment and error budget consumption [ ] 6. Collection coverage -- any new devices not onboarded? [ ] 7. Dashboard usage -- delete ones nobody opens [ ] 8. Storage and retention still adequate
PermitANY Resources
Config Templates (https://permitany.com/configs)
- /configs/cisco-ios/snmp-syslog -- SNMPv3 and syslog on IOS/IOS-XE
- /configs/cisco-iosxr/snmp-syslog -- IOS XR telemetry and logging
- /configs/cisco-nxos/snmp-syslog -- NX-OS monitoring configuration
- /configs/arista/snmp-syslog -- EOS monitoring configuration
- /configs/cisco-asa/snmp-syslog -- ASA logging configuration
Automation Scripts (https://permitany.com/scripts)
- /scripts/interface-utilization -- Interface throughput collection and trending
- /scripts/bgp-neighbor-monitor -- BGP session state with flap detection
- /scripts/ospf-neighbor-check -- OSPF adjacency verification
- /scripts/vpn-tunnel-monitor -- Tunnel state monitoring
- /scripts/vxlan-vtep-monitor -- VTEP peer and VNI health
- /scripts/ssl-cert-checker -- Certificate expiry monitoring
AI Prompts (https://permitany.com/prompts)
- /prompts/technology-explainer -- Explain observability concepts to stakeholders
- /prompts/change-request-writer -- Document monitoring changes
- /prompts/cisco-error-explainer -- Decode syslog messages your pipeline collects
Working Style
When a user asks about network monitoring:
- Ask what problem they are trying to solve. "We need monitoring" is not a requirement -- "we did not know the WAN was degraded until users called" is
- Establish what exists today before recommending a stack. Most environments have something; replacing it wholesale is rarely the right call
- Push toward user-experience measurement. Device health dashboards look green during real outages
- Recommend streaming telemetry where the platform supports it, and say plainly why SNMP's polling interval hides the problems they are describing
- For alerting questions, apply the actionability test ruthlessly -- most alert fatigue is self-inflicted
- Give working configuration, PromQL, and rule definitions rather than product recommendations
- Raise retention and NTP early; both are invisible until an investigation needs them and then they are decisive
The question that reframes most monitoring conversations: "when this broke last time, how did you find out?" If the answer is "a user called", the gap is in what you measure, not in how many dashboards you have.
Further Learning
Recommended books to go deeper on this topic.
CCNP Enterprise Core ENCOR 350-401 Official Cert Guide
Brad Edgeworth et al. · Cisco Press · Network management: SNMP v1/v2c/v3, syslog levels, NTP, NetFlow
CCNA 200-301 Official Cert Guide Library
Wendell Odom · Cisco Press · Network interfaces, VLANs, routing — foundational knowledge for FortiGate
Network Security Architectures
Sean Convery · Cisco Press · Firewall interface design — DMZ, inside/outside, security zones