Skip to content

SNMP Monitoring

SNMP Monitoring lets you poll network infrastructure devices — routers, switches, printers, UPS units, and anything else that speaks SNMP — directly through the Breeze agent. You define which OIDs to collect via reusable templates, assign those templates to monitored assets, and the platform handles scheduled polling, metric storage, and dashboard aggregation. All SNMP data flows through the same agent WebSocket channel used for other commands, so no additional firewall rules or sidecar processes are required.

The system supports SNMP v1, v2c, and v3 (including SNMPv3 authentication and privacy protocols). Metrics are stored with a configurable retention window (default 7 days) and are automatically pruned by a background worker.


| Version | Authentication | Notes | |---------|---------------|-------| | v1 | Community string | Legacy; limited counter size (32-bit) | | v2c | Community string | Default. Supports 64-bit counters (Counter64) | | v3 | Username + auth/priv protocols | Full encryption support. Requires username; auth and privacy protocols are optional depending on security level |

The agent automatically infers the security level from the credentials you provide:

| Level | Meaning | |-------|---------| | noAuthNoPriv | Username only, no authentication or encryption | | authNoPriv | Authentication (MD5/SHA) but no encryption | | authPriv | Both authentication and encryption (DES/AES) |

| Authentication | Privacy | |---------------|---------| | MD5, SHA, SHA-224, SHA-256, SHA-384, SHA-512 | DES, AES-128, AES-192, AES-256, AES-192C, AES-256C |

Templates are named collections of OIDs that define what to poll on a device. There are two types:

| Type | Description | |------|-------------| | Builtin | Ship with the platform. Cannot be modified or deleted. Cover common device types and major vendors. | | Custom | Created by users. Fully editable. Scoped globally (not per-org). |

Built-in templates now cover a broad range of common network gear so you can monitor most devices without writing your own template. Browse the full list with GET /snmp/templates?source=builtin. The library includes:

  • Generic baselines (Common, Router, Switch, Printer per RFC 1213 and RFC 3805)
  • Cisco IOS switches
  • Ubiquiti UniFi switches, access points, and security gateways
  • Additional multi-vendor templates added with each release

Each OID entry in a template includes:

| Field | Required | Description | |-------|----------|-------------| | oid | Yes | Dotted numeric OID (e.g. 1.3.6.1.2.1.1.3.0) | | name | Yes | Human-readable name (e.g. sysUpTime) | | label | No | Display label for dashboards | | unit | No | Unit of measurement (e.g. bytes, %) | | type | No | Value type hint (e.g. Counter64, Gauge, OctetString) | | description | No | Explanation of what this OID measures |

The Go agent also ships with built-in OID sets for common device types. These are used when the agent receives an snmp_poll command and include:

| Device Type | Example OIDs | |-------------|-------------| | Common (all devices) | sysUpTime, sysName, ifOperStatus, ifInOctets, ifOutOctets | | Router | ipForwarding, ipInReceives, ipOutRequests | | Switch | dot1dBaseBridgeAddress, dot1dBaseNumPorts, dot1dTpFdbTable | | Printer | hrDeviceStatus, prtGeneralPrinterStatus, prtMarkerLifeCount, prtMarkerSuppliesLevel |

The API includes a built-in OID catalog with well-known OIDs for quick reference and validation:

| OID | Name | Type | Description | |-----|------|------|-------------| | 1.3.6.1.2.1.1.1.0 | sysDescr | OctetString | System description | | 1.3.6.1.2.1.1.3.0 | sysUpTime | TimeTicks | Time since last initialization | | 1.3.6.1.2.1.1.5.0 | sysName | OctetString | Device hostname | | 1.3.6.1.2.1.2.2.1.10 | ifInOctets | Counter64 | Inbound octets per interface | | 1.3.6.1.2.1.2.2.1.16 | ifOutOctets | Counter64 | Outbound octets per interface | | 1.3.6.1.2.1.25.3.3.1.2 | hrProcessorLoad | Gauge | Host processor load | | 1.3.6.1.4.1.2021.4.6.0 | memAvailableReal | Gauge | Available physical memory | | 1.3.6.1.4.1.2021.9.1.9 | dskPercent | Gauge | Disk utilization percentage |


Retrieve all templates, optionally filtering by source or searching by name, vendor, or device type:

Terminal window
GET /snmp/templates?source=builtin&search=cisco

Query parameters:

| Parameter | Type | Description | |-----------|------|-------------| | source | builtin or custom | Filter by template origin | | search | string | Search across name, vendor, and device type fields |

Terminal window
POST /snmp/templates
Content-Type: application/json
{
"name": "Ubiquiti EdgeSwitch",
"description": "Standard OIDs for Ubiquiti EdgeSwitch series",
"vendor": "Ubiquiti",
"deviceType": "switch",
"oids": [
{
"oid": "1.3.6.1.2.1.1.3.0",
"name": "sysUpTime",
"type": "TimeTicks",
"description": "System uptime"
},
{
"oid": "1.3.6.1.2.1.2.2.1.10",
"name": "ifInOctets",
"type": "Counter64",
"description": "Inbound octets per interface"
},
{
"oid": "1.3.6.1.2.1.2.2.1.16",
"name": "ifOutOctets",
"type": "Counter64",
"description": "Outbound octets per interface"
}
]
}

The response includes the created template with its generated id and a source of "custom".

Terminal window
PATCH /snmp/templates/:id
Content-Type: application/json
{
"name": "Ubiquiti EdgeSwitch v2",
"oids": [...]
}

All fields are optional in the update payload. Only provided fields are changed.

Terminal window
DELETE /snmp/templates/:id

Returns the deleted template record on success.


SNMP device management has been consolidated into the unified Monitoring Assets API. To configure SNMP polling on a discovered asset, use the /monitoring/assets/:id/snmp endpoints.

  1. Discover the asset using Network Discovery or add it manually through the monitoring assets list.

  2. Configure SNMP credentials by sending a PUT request:

    Terminal window
    PUT /monitoring/assets/:assetId/snmp
    Content-Type: application/json
    {
    "snmpVersion": "v2c",
    "community": "my-community-string",
    "templateId": "uuid-of-template",
    "pollingInterval": 300,
    "port": 161
    }
  3. Verify the configuration by checking the asset’s monitoring status:

    Terminal window
    GET /monitoring/assets/:assetId

| Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| | snmpVersion | v1 or v2c | Yes | — | SNMP protocol version | | community | string | Yes | — | Community string for authentication | | templateId | UUID | No | null | Template defining which OIDs to poll | | pollingInterval | integer | No | 300 | Seconds between polls (min: 30, max: 86400) | | port | integer | No | 161 | SNMP port on the target device |

Use PATCH to update individual fields without replacing the full configuration:

Terminal window
PATCH /monitoring/assets/:assetId/snmp
Content-Type: application/json
{
"pollingInterval": 60,
"isActive": false
}

To disable all monitoring (SNMP and network monitors) on an asset:

Terminal window
DELETE /monitoring/assets/:assetId

This sets isActive: false on all SNMP device rows and network monitors for the asset. No data is deleted.


The SNMP polling system is built on BullMQ with Redis as the message broker. It operates as a three-stage pipeline:

  1. Scheduler — A repeatable BullMQ job runs every 60 seconds, scanning the snmp_devices table for active devices whose pollingInterval has elapsed since their lastPolled timestamp (or that have never been polled).

  2. Poll dispatch — For each due device, the scheduler enqueues a poll-device job. The worker loads the device’s template OIDs, finds an online Breeze agent in the same organization, and sends an snmp_poll command over the agent’s WebSocket connection.

  3. Result processing — When the agent returns SNMP metric results, a process-poll-results job writes each metric row to the snmp_metrics table and updates the device’s lastPolled timestamp and lastStatus.

The worker runs with a concurrency of 10 to allow multiple device polls to be processed in parallel.

A separate snmp-retention worker runs every 6 hours and deletes all metric rows older than the retention period (default: 7 days). This keeps the snmp_metrics table from growing unbounded.


The monitoring assets detail endpoint returns the 20 most recent SNMP metrics for a given asset:

Terminal window
GET /monitoring/assets/:assetId

The response includes a recentMetrics array with:

| Field | Description | |-------|-------------| | oid | The polled OID | | name | Human-readable metric name | | value | The collected value (string-encoded) | | valueType | Data type: number, string, null, or object | | timestamp | ISO 8601 collection timestamp |

The dashboard endpoint provides an aggregated overview of your SNMP monitoring estate:

Terminal window
GET /snmp/dashboard?orgId=uuid

The response contains:

| Section | Description | |---------|-------------| | totals.devices | Total SNMP-monitored devices | | totals.templates | Total templates (builtin + custom) | | totals.thresholds | Total alert thresholds configured | | status | Device counts grouped by last poll status (e.g. online, offline, unknown) | | templateUsage | List of templates with the number of devices using each | | recentPolls | Last 5 polled devices with timestamps and status | | topInterfaces | Top 5 interfaces by traffic volume (last 30 minutes) |

The topInterfaces section ranks network interfaces by total octet throughput (inbound + outbound) over a rolling 30-minute window. It works by aggregating ifInOctets and ifOutOctets metric readings and computing the delta between minimum and maximum values for each interface during the window.

Each entry includes:

| Field | Description | |-------|-------------| | deviceId | The SNMP device UUID | | name | Display name (device name / ifIndex) | | inOctets | Inbound byte delta over the window | | outOctets | Outbound byte delta over the window | | totalOctets | Combined in + out delta |


Search the combined OID catalog (built-in catalog + OIDs from all existing templates):

Terminal window
GET /snmp/oids/browse?query=uptime&limit=10

Results include the source (catalog or template) and the template name if sourced from a template.

Before creating or updating a template, validate OIDs for format correctness and catalog presence:

Terminal window
POST /snmp/oids/validate
Content-Type: application/json
{
"oids": [
{ "oid": "1.3.6.1.2.1.1.3.0", "name": "sysUpTime" },
{ "oid": "not.a.valid.oid" }
]
}

The response includes per-OID validation results:

| Field | Description | |-------|-------------| | valid | true if the OID passes all checks | | errors | Array of error messages (e.g. invalid format, duplicate) | | warnings | Array of warnings (e.g. OID not found in catalog) | | normalizedOid | The OID with leading dots stripped |


| Method | Path | Description | |--------|------|-------------| | GET | /snmp/templates | List templates (?source=builtin\|custom&search=) | | POST | /snmp/templates | Create custom template | | GET | /snmp/templates/:id | Get template by ID | | PATCH | /snmp/templates/:id | Update custom template | | DELETE | /snmp/templates/:id | Delete custom template |

| Method | Path | Description | |--------|------|-------------| | GET | /snmp/oids/browse | Search OID catalog + template OIDs (?query=&limit=) | | POST | /snmp/oids/validate | Validate OID format and catalog presence |

| Method | Path | Description | |--------|------|-------------| | GET | /monitoring/assets | List monitored assets with SNMP status | | GET | /monitoring/assets/:id | Get asset detail with recent metrics | | PUT | /monitoring/assets/:id/snmp | Create or replace SNMP configuration for an asset | | PATCH | /monitoring/assets/:id/snmp | Partially update SNMP configuration | | DELETE | /monitoring/assets/:id | Disable all monitoring on an asset |

| Method | Path | Description | |--------|------|-------------| | GET | /snmp/dashboard | Aggregated SNMP monitoring overview (?orgId=) |

The following legacy endpoints return 410 Gone with a migration message:

| Path | Replacement | |------|-------------| | /snmp/devices (all methods) | /monitoring/assets and /monitoring/assets/:id/snmp | | /snmp/metrics/:deviceId | /monitoring/assets/:id (returns 20 most recent metrics) | | /snmp/metrics/:deviceId/history | Not yet available in new API | | /snmp/metrics/:deviceId/:oid | Not yet available in new API | | /snmp/thresholds (all methods) | Use alert rules on network monitors via /monitors/alerts |


No metrics appearing after enabling SNMP on an asset. The polling scheduler runs every 60 seconds. After enabling SNMP, wait at least one full polling interval (default 300 seconds) plus the 60-second scheduler cycle. Confirm the device has a template assigned with at least one OID — the worker skips devices with no OIDs configured. Also verify that at least one Breeze agent in the same organization is online, since the poll command is dispatched over the agent WebSocket.

Poll status stuck on offline or unknown. This means the SNMP poll command was sent to the agent but no results were returned. Common causes: the target IP is unreachable from the agent’s network, the SNMP port is blocked by a firewall, or the community string / SNMPv3 credentials are incorrect. Test connectivity from the agent host using snmpwalk or snmpget directly.

“No online agent for org” in worker logs. The SNMP worker dispatches poll commands to any online agent in the same organization as the SNMP device. If no agents are connected via WebSocket, polls cannot be dispatched. Ensure at least one agent in the organization is running and connected.

Template OIDs not being polled. Verify the template is assigned to the SNMP device by checking the templateId field. If templateId is null, no OIDs will be loaded and the poll will be skipped. Create or assign a template, then wait for the next poll cycle.

Metrics disappearing after 7 days. This is expected behavior. The SNMP retention worker prunes metrics older than the configured retention period (default: 7 days). The retention job runs every 6 hours. If you need longer retention, this must be configured at the worker level.

Built-in template cannot be modified. Built-in templates are read-only. To customize a built-in template, create a new custom template with the desired OIDs. You can use the OID browser (GET /snmp/oids/browse) to find and copy OIDs from existing templates.

OID validation returns warnings but no errors. A warning that an OID is “not found in catalog/templates” is informational, not a blocker. The OID format is valid (dotted numeric notation), but it is not recognized in the built-in catalog or any existing template. The OID may still work correctly on your target device. Only entries with errors indicate actual problems (invalid format, duplicates).