SNMP Receiver

Telegen’s SNMP receiver collects metrics from network devices, storage systems, and other SNMP-enabled infrastructure.

Overview

The SNMP receiver supports:

  • SNMP v1, v2c, v3 - All protocol versions
  • Polling and Traps - Both collection modes
  • Standard MIBs - IF-MIB, HOST-RESOURCES-MIB, etc.
  • Custom MIBs - Load vendor-specific MIBs
  • Auto-discovery - Find SNMP devices on your network

Architecture

flowchart LR
    subgraph Devices["Network Devices"]
        SW["Switches"]
        RT["Routers"]
        UPS["UPS"]
    end
    
    subgraph Telegen["Telegen Collector"]
        P["SNMP Poller"]
        T["Trap Receiver"]
        M["MIB Resolver"]
        C["Metric Converter"]
    end
    
    SW -->|"SNMP Poll"| P
    RT -->|"SNMP Poll"| P
    UPS -->|"Traps"| T
    P --> M
    T --> M
    M --> C
    C -->|"OTLP"| O["OTel Collector"]

Configuration

Basic SNMP v2c

telegen:
  mode: collector

otlp:
  endpoint: "otel-collector:4317"

collector:
  snmp:
    enabled: true
    poll_interval: 60s
    timeout: 10s
    retries: 3
    
    targets:
      - name: "core-switch-01"
        address: "10.0.1.1:161"
        version: "v2c"
        community: "public"
        modules:
          - if_mib
          - entity_mib
        labels:
          location: "dc1-rack1"
          role: "core"

SNMP v3 (Secure)

collector:
  snmp:
    targets:
      - name: "secure-router"
        address: "10.0.1.10:161"
        version: "v3"
        security:
          user: "monitor"
          security_level: "authPriv"
          auth_protocol: "SHA256"
          auth_password: "${SNMP_AUTH_PASSWORD}"
          priv_protocol: "AES256"
          priv_password: "${SNMP_PRIV_PASSWORD}"
        modules:
          - if_mib
          - bgp4_mib

Security Levels

Level Authentication Privacy
noAuthNoPriv
authNoPriv
authPriv

Auth/Priv Protocols

Auth Protocol Description
MD5 MD5 (legacy, not recommended)
SHA SHA-1
SHA224 SHA-224
SHA256 SHA-256 (recommended)
SHA384 SHA-384
SHA512 SHA-512
Priv Protocol Description
DES DES (legacy, not recommended)
AES AES-128
AES192 AES-192
AES256 AES-256 (recommended)

Standard MIB Modules

if_mib (Interface Statistics)

Collects interface metrics from IF-MIB:

modules:
  - if_mib

Metrics collected:

Metric Description
snmp_if_in_octets Bytes received
snmp_if_out_octets Bytes transmitted
snmp_if_in_unicast_pkts Unicast packets received
snmp_if_out_unicast_pkts Unicast packets transmitted
snmp_if_in_errors Input errors
snmp_if_out_errors Output errors
snmp_if_in_discards Input discards
snmp_if_out_discards Output discards
snmp_if_oper_status Operational status (1=up, 2=down)
snmp_if_speed Interface speed (bps)

entity_mib (Physical Entities)

modules:
  - entity_mib

Metrics collected:

Metric Description
snmp_entity_name Entity name
snmp_entity_class Entity class (chassis, module, port)
snmp_entity_serial Serial number

host_resources (Host Information)

modules:
  - host_resources

Metrics collected:

Metric Description
snmp_hr_system_uptime System uptime
snmp_hr_processor_load CPU utilization
snmp_hr_storage_used Storage used
snmp_hr_storage_size Storage capacity
snmp_hr_memory_size Memory size

Vendor-Specific Modules

Cisco

modules:
  - cisco_process     # CPU/memory statistics
  - cisco_envmon      # Environmental monitoring
  - cisco_flash       # Flash memory

Juniper

modules:
  - juniper_alarm     # System alarms
  - juniper_cos       # Class of Service
  - juniper_firewall  # Firewall statistics

Arista

modules:
  - arista_hw         # Hardware status
  - arista_queue      # Queue statistics

Custom MIB Modules

Define custom modules for specific OIDs:

collector:
  snmp:
    custom_modules:
      - name: "custom_ups"
        walk:
          - "1.3.6.1.4.1.318.1.1"  # APC enterprise OID
        
        metrics:
          - name: "ups_battery_capacity_percent"
            oid: "1.3.6.1.4.1.318.1.1.1.2.2.1.0"
            type: gauge
            help: "UPS battery capacity percentage"
          
          - name: "ups_output_load_percent"
            oid: "1.3.6.1.4.1.318.1.1.1.4.2.3.0"
            type: gauge
            help: "UPS output load percentage"
          
          - name: "ups_runtime_remaining_seconds"
            oid: "1.3.6.1.4.1.318.1.1.1.2.2.3.0"
            type: gauge
            help: "UPS estimated runtime remaining"
          
          - name: "ups_battery_status"
            oid: "1.3.6.1.4.1.318.1.1.1.2.1.1.0"
            type: gauge
            help: "UPS battery status"
            enum_values:
              1: "unknown"
              2: "normal"
              3: "low"
              4: "in_fault"

Apply Custom Module

collector:
  snmp:
    targets:
      - name: "ups-01"
        address: "10.0.2.100:161"
        version: "v2c"
        community: "public"
        modules:
          - custom_ups

SNMP Trap Receiver

Receive asynchronous SNMP traps:

collector:
  snmp:
    trap_receiver:
      enabled: true
      listen_address: ":162"
      
      # v2c trap communities
      community_allowlist:
        - "public"
        - "traps"
      
      # v3 trap authentication
      v3_users:
        - user: "trap-sender"
          auth_protocol: "SHA256"
          auth_password: "${TRAP_AUTH_PASSWORD}"
          priv_protocol: "AES256"
          priv_password: "${TRAP_PRIV_PASSWORD}"

Trap Events

Traps are converted to OpenTelemetry logs:

{
  "timestamp": "2024-01-15T10:30:00Z",
  "severity": "WARNING",
  "body": "Link down on interface Ethernet1/1",
  "attributes": {
    "snmp.trap.oid": "1.3.6.1.6.3.1.1.5.3",
    "snmp.trap.name": "linkDown",
    "snmp.source": "10.0.1.1",
    "snmp.if_index": 1001,
    "snmp.if_descr": "Ethernet1/1",
    "device.name": "core-switch-01"
  }
}

Auto-Discovery

Automatically find SNMP devices:

collector:
  snmp:
    discovery:
      enabled: true
      interval: 1h
      
      # Networks to scan
      networks:
        - "10.0.0.0/16"
        - "192.168.0.0/24"
      
      # Ports to probe
      ports:
        - 161
      
      # Communities to try (v2c)
      communities:
        - "public"
        - "private"
      
      # v3 credentials to try
      v3_credentials:
        - user: "monitor"
          auth_protocol: "SHA256"
          auth_password: "${SNMP_AUTH}"
      
      # Skip specific addresses
      exclude:
        - "10.0.0.1"
        - "10.0.255.255"

Discovery Results

Discovered devices are logged:

{
  "timestamp": "2024-01-15T10:30:00Z",
  "severity": "INFO",
  "body": "SNMP device discovered: 10.0.1.50",
  "attributes": {
    "snmp.discovery.address": "10.0.1.50:161",
    "snmp.discovery.version": "v2c",
    "snmp.discovery.sys_descr": "Cisco IOS Software, C3850...",
    "snmp.discovery.sys_name": "access-switch-05"
  }
}

Metrics Output

Prometheus Format

# Interface traffic rate
rate(snmp_if_in_octets{device="core-switch-01",interface="Ethernet1/1"}[5m]) * 8

# Interface errors
sum(rate(snmp_if_in_errors[5m])) by (device)

# Interface utilization
(rate(snmp_if_in_octets[5m]) + rate(snmp_if_out_octets[5m])) * 8
/ snmp_if_speed * 100

Labels

All metrics include:

Label Description
device Target name
device_address SNMP target address
interface Interface description (for interface metrics)
if_index SNMP interface index
+ custom labels From target configuration

Performance Tuning

Concurrent Polling

collector:
  snmp:
    # Max concurrent SNMP requests
    max_concurrent: 100
    
    # Bulk request settings
    bulk:
      enabled: true
      max_repetitions: 25

Large Environments

For 1000+ devices:

collector:
  snmp:
    poll_interval: 120s  # Reduce frequency
    max_concurrent: 200   # More parallel requests
    timeout: 15s          # Longer timeout
    
    # Use bulk requests
    bulk:
      enabled: true
      max_repetitions: 50

Example: Complete Network Monitoring

telegen:
  mode: collector
  service_name: "network-collector"

otlp:
  endpoint: "otel-collector:4317"

collector:
  snmp:
    enabled: true
    poll_interval: 60s
    timeout: 10s
    retries: 3
    max_concurrent: 100
    
    targets:
      # Core switches
      - name: "core-sw-01"
        address: "10.0.1.1:161"
        version: "v3"
        security:
          user: "monitor"
          security_level: "authPriv"
          auth_protocol: "SHA256"
          auth_password: "${SNMP_AUTH}"
          priv_protocol: "AES256"
          priv_password: "${SNMP_PRIV}"
        modules: [if_mib, entity_mib, cisco_process]
        labels:
          tier: "core"
          location: "dc1"
      
      # Access switches (many)
      - name: "access-sw-*"
        addresses:
          - "10.0.10.0/24"
        version: "v2c"
        community: "public"
        modules: [if_mib]
        labels:
          tier: "access"
      
      # UPS systems
      - name: "ups-*"
        addresses:
          - "10.0.20.1"
          - "10.0.20.2"
        version: "v2c"
        community: "private"
        modules: [custom_ups]
        labels:
          device_type: "ups"
    
    trap_receiver:
      enabled: true
      listen_address: ":162"

Next Steps