Skip to content

Latest commit

 

History

History
387 lines (304 loc) · 11.3 KB

File metadata and controls

387 lines (304 loc) · 11.3 KB

Network & IoT Integrations

Version

This document covers network device and IoT messaging integrations.

Overview

flowchart TB
    subgraph "TelemetryFlow Agent"
        IM[Integration Manager]
    end

    subgraph "Network Management"
        DNAC[Cisco DNA Center]
        MERAKI[Cisco Meraki]
    end

    subgraph "Network Protocols"
        SNMP[SNMP v1/v2c/v3]
    end

    subgraph "IoT Messaging"
        MQTT[MQTT Broker]
    end

    IM --> DNAC & MERAKI
    IM --> SNMP
    IM --> MQTT

    DNAC --> |Devices, Health| IM
    MERAKI --> |Organizations, Devices| IM
    SNMP --> |OIDs, MIBs| IM
    MQTT --> |Topics| IM
Loading

Cisco (DNA Center / Meraki)

Architecture

sequenceDiagram
    participant Agent as TFO Agent
    participant DNAC as DNA Center
    participant Meraki as Meraki Dashboard

    alt DNA Center
        Agent->>DNAC: POST /dna/system/api/v1/auth/token
        DNAC-->>Agent: Auth Token

        Agent->>DNAC: GET /dna/intent/api/v1/network-device
        DNAC-->>Agent: Device List

        Agent->>DNAC: GET /dna/intent/api/v1/network-health
        DNAC-->>Agent: Health Scores
    else Meraki
        Agent->>Meraki: GET /organizations (X-Cisco-Meraki-API-Key)
        Meraki-->>Agent: Organizations

        Agent->>Meraki: GET /organizations/{id}/devices/statuses
        Meraki-->>Agent: Device Statuses
    end
Loading

Configuration

integrations:
  cisco:
    enabled: true
    api_type: dnac # or meraki

    # DNA Center configuration
    dnac:
      endpoint: "https://dnac.example.com"
      username: "${CISCO_DNAC_USERNAME}"
      password: "${CISCO_DNAC_PASSWORD}"

    # Meraki configuration
    meraki:
      api_key: "${CISCO_MERAKI_API_KEY}"
      # org_id: "${CISCO_MERAKI_ORG_ID}"

    tls_skip_verify: false
    scrape_interval: 60s
    timeout: 30s

    collect_devices: true
    collect_networks: true
    collect_clients: true
    collect_health: true
    collect_events: false

Metrics

DNA Center

Metric Type Description
cisco_dnac_device_up gauge Device reachability (1=up)
cisco_dnac_device_uptime_seconds gauge Device uptime
cisco_dnac_network_health_score gauge Network health (0-100)
cisco_dnac_client_health_score gauge Client health (0-100)
cisco_dnac_application_health_score gauge App health (0-100)

Meraki

Metric Type Description
cisco_meraki_device_online gauge Device online status
cisco_meraki_device_using_cellular gauge Cellular failover active
cisco_meraki_organization_devices_total gauge Total devices

SNMP

Architecture

sequenceDiagram
    participant Agent as TFO Agent
    participant Device as Network Device

    alt SNMPv2c
        Agent->>Device: GET (community string)
        Device-->>Agent: OID Values
    else SNMPv3
        Agent->>Device: GET (user/auth/priv)
        Device-->>Agent: OID Values
    end

    loop For each OID
        Agent->>Device: SNMP GET/WALK
        Device-->>Agent: Value
    end
Loading

Configuration

integrations:
  snmp:
    enabled: true
    version: v2c # v1, v2c, v3
    community: "${SNMP_COMMUNITY:-public}"
    port: 161
    timeout: 10s
    retries: 3
    scrape_interval: 60s
    max_repetitions: 10

    # SNMPv3 settings
    security_level: noAuthNoPriv # noAuthNoPriv, authNoPriv, authPriv
    username: "${SNMP_USERNAME}"
    auth_protocol: SHA # MD5, SHA
    auth_password: "${SNMP_AUTH_PASSWORD}"
    priv_protocol: AES # DES, AES
    priv_password: "${SNMP_PRIV_PASSWORD}"

    targets:
      - address: "switch1.example.com"
        port: 161
        name: "Core Switch 1"
        community: "private"
        labels:
          location: datacenter1

      - address: "router1.example.com"
        name: "Edge Router 1"

    # walk_oids / get_oids are optional. When omitted, the agent applies the
    # industry-standard defaults below (system scalars + full IF-MIB tables).
    walk_oids:
      - "1.3.6.1.2.1.2.2" # IF-MIB::ifTable
      - "1.3.6.1.2.1.31.1.1.1" # IF-MIB::ifXTable (64-bit HC counters, ifName)

    get_oids:
      - oid: "1.3.6.1.2.1.1.3.0"
        name: "sysUpTime"
        type: counter
      - oid: "1.3.6.1.2.1.1.5.0"
        name: "sysName"
        type: string

Default OIDs

When no get_oids / walk_oids are configured, the agent polls a standard baseline. Scalars are collected via SNMP GET; per-interface metrics are collected by WALKing the IF-MIB tables, so a fresh target yields useful interface data with no manual OID mapping.

Scalar GET defaults (SNMPv2-MIB / UCD-SNMP-MIB):

OID Name Type Unit
1.3.6.1.2.1.1.1.0 sysDescr string
1.3.6.1.2.1.1.3.0 sysUpTime counter ticks
1.3.6.1.2.1.1.5.0 sysName string
1.3.6.1.4.1.2021.11.9.0 ssCpuUser gauge percent
1.3.6.1.4.1.2021.11.11.0 ssCpuIdle gauge percent
1.3.6.1.4.1.2021.4.5.0 memTotalReal gauge kB
1.3.6.1.4.1.2021.4.6.0 memAvailReal gauge kB

Interface WALK defaults (IF-MIB — RFC 1213 + RFC 2233):

Table root Provides
1.3.6.1.2.1.2.2 ifTable — ifSpeed, ifOperStatus, ifIn/OutOctets, errors, discards
1.3.6.1.2.1.31.1.1.1 ifXTable — ifName, ifHCIn/OutOctets (64-bit), ifHighSpeed

64-bit counters: ifXTable HC counters are collected because 32-bit ifInOctets/ifOutOctets wrap in seconds on ≥1 Gbps links and cannot be used for accurate rate calculation. This matches standard NMS practice (LibreNMS, Observium, Prometheus snmp_exporter).

Each walked row carries an index tag (the interface index) so per-interface series stay distinct — feeding the platform's Interface Utilization view (in/out, capacity, errors, discards, oper status) directly.

Metrics

Metric Type Source (IF-MIB) Description
snmp_target_up gauge probe Target reachability (0/1)
snmp_sysuptime counter sysUpTime System uptime ticks
snmp_walk_1_3_6_1_2_1_31_1_1_1_6 counter ifHCInOctets Interface bytes in (64-bit)
snmp_walk_1_3_6_1_2_1_31_1_1_1_10 counter ifHCOutOctets Interface bytes out (64-bit)
snmp_walk_1_3_6_1_2_1_2_2_1_14 counter ifInErrors Interface inbound errors
snmp_walk_1_3_6_1_2_1_2_2_1_13 counter ifInDiscards Interface inbound discards
snmp_walk_1_3_6_1_2_1_2_2_1_8 gauge ifOperStatus Interface operational status
snmp_sscpuuser gauge ssCpuUser CPU user percentage

Walk metric names default to snmp_walk_<oid>; assign a friendly name in a get_oids/MIB mapping to rename them.

Operational Notes

  • Concurrent polling: targets are polled in parallel (bounded pool) so one slow or timing-out device does not delay the rest of the scrape.
  • Health check: Health() issues a real SNMP GET for sysUpTime.0 per target — a device counts as reachable only if it actually answers SNMP (a UDP socket opening is not treated as reachability).
  • SNMPv3: privacy (encryption) is enabled whenever security_level: authPriv is set; auth-only and no-auth levels are honored independently.
  • Cancellation: in-flight GET/WALK I/O is bounded by timeout and unwound on context cancellation (agent shutdown) so no poll leaks a connection.

MQTT

Architecture

sequenceDiagram
    participant Agent as TFO Agent
    participant Broker as MQTT Broker
    participant Sub as Subscribers

    Agent->>Broker: CONNECT (ClientID, Credentials)
    Broker-->>Agent: CONNACK

    Note over Agent,Broker: Last Will configured

    loop Publishing
        Agent->>Broker: PUBLISH (metrics/logs/traces)
        Broker-->>Agent: PUBACK (QoS 1/2)
        Broker->>Sub: Forward Message
    end

    Agent->>Broker: DISCONNECT
Loading

Configuration

integrations:
  mqtt:
    enabled: true
    broker: "tcp://mqtt.example.com:1883"
    # broker: "ssl://mqtt.example.com:8883"
    # broker: "ws://mqtt.example.com:8083/mqtt"
    client_id: "${HOSTNAME}-tfo-agent"
    username: "${MQTT_USERNAME}"
    password: "${MQTT_PASSWORD}"

    metrics_topic: "telemetryflow/metrics"
    logs_topic: "telemetryflow/logs"
    traces_topic: "telemetryflow/traces"
    topic_prefix: ""

    qos: 1 # 0, 1, or 2
    retained: false
    clean_session: true

    connect_timeout: 30s
    keep_alive: 60s
    ping_timeout: 10s
    auto_reconnect: true
    max_reconnect_interval: 5m

    tls_enabled: false
    tls_ca_file: ""
    tls_cert_file: ""
    tls_key_file: ""
    tls_skip_verify: false

    encoding: json # json, protobuf
    batch_size: 100
    flush_interval: 10s

    will:
      enabled: true
      topic: "telemetryflow/status/${HOSTNAME}"
      payload: '{"status": "offline"}'
      qos: 1
      retained: true

Topic Structure

telemetryflow/
├── metrics              # Metric data
├── logs                 # Log entries
├── traces               # Trace spans
└── status/
    └── {hostname}       # Agent status (LWT)

Message Format (JSON)

Metrics:

{
  "timestamp": "2024-12-29T10:30:00Z",
  "name": "cpu_usage",
  "value": 45.5,
  "type": "gauge",
  "tags": {
    "host": "server1"
  }
}

Logs:

{
  "timestamp": "2024-12-29T10:30:00Z",
  "level": "info",
  "message": "Service started",
  "source": "app.main",
  "trace_id": "abc123"
}

QoS Levels

QoS Name Guarantee
0 At most once Fire and forget
1 At least once Acknowledged delivery
2 Exactly once Two-phase commit

Comparison

Feature Cisco DNAC Cisco Meraki SNMP MQTT
Protocol REST API REST API UDP TCP
Auth Token API Key Community/USM User/Pass
Direction Pull Pull Pull Push
Metrics
Logs
Traces
Real-time

Copyright (c) 2024-2026 Telemetri Data Indonesia. All rights reserved.