SNMP Profile Format
Overview
An SNMP profile defines how a specific class of devices is monitored through SNMP.
SNMP profiles are reusable and declarative — you never need to modify the collector source code to support new devices.
It tells the Netdata SNMP collector:
- which OIDs to query
- how to interpret the returned values
- how to transform them into metrics, dimensions, tags, and metadata
Profiles make it possible to describe entire device families (switches, routers, UPSes, firewalls, printers, etc.) declaratively — so you don’t need to hard-code logic in Go or manually define metrics for each device.
Each profile is a single YAML file that can be reused, extended, and combined.
How Profiles Work
When Netdata connects to an SNMP device, the collector:
- Reads the device’s sysObjectID and sysDescr.
- Evaluates all available profiles.
- Applies all profiles whose selectors match (multiple profiles can apply simultaneously).
- Uses the combined configuration to:
- Collect scalar metrics (single values like uptime or temperature).
- Collect table metrics (multi-row values like per-interface traffic).
- Build virtual metrics (derived totals, fallbacks, or aggregates).
- Gather metadata and tags for labeling and grouping.
Profile Lifecycle
┌──────────────────────┐
│ SNMP Device │ → provides sysObjectID/sysDescr
└──────────┬───────────┘
↓
┌──────────────────────┐
│ selector │ → matches device profile
├──────────────────────┤
│ extends │ → inherits base profiles
├──────────────────────┤
│ metadata │ → device info (vendor, model, etc.)
├──────────── ──────────┤
│ metrics │ → OIDs to collect
├──────────────────────┤
│ metric_tags │ → dynamic tags for all metrics
├──────────────────────┤
│ static_tags │ → fixed tags for all metrics
├──────────────────────┤
│ virtual_metrics │ → calculated or aggregated metrics
└──────────┬───────────┘
↓
┌──────────────────────┐
│ Netdata charts & UI │ → visualized in dashboard
└──────────────────────┘
Example: Complete SNMP Profile
# example-device.yaml
# selects which devices this profile applies to.
selector:
- sysobjectid:
include: ["1.3.6.1.4.1.9.*"] # Cisco devices
sysdescr:
include: ["IOS"]
# imports common base metrics
extends:
- _system-base.yaml
- _std-if-mib.yaml
# defines device-level labels (virtual node)
metadata:
device:
fields:
vendor:
value: "Cisco"
model:
symbol:
OID: 1.3.6.1.2.1.47.1.1.1.1.2.1
name: entPhysicalModelName
# specifies which OIDs to collect
metrics:
- MIB: IF-MIB
table:
OID: 1.3.6.1.2.1.2.2
name: ifTable
symbols:
- OID: 1.3.6.1.2.1.2.2.1.10
name: ifInOctets
chart_meta:
description: Interface inbound traffic
family: 'Network/Interface/Traffic/In'
unit: "bit/s"
scale_factor: 8
metric_tags:
- tag: interface
symbol:
OID: 1.3.6.1.2.1.31.1.1.1.1
name: ifName
# add dynamic tags to all metrics
metric_tags:
- tag: fs_sys_version
symbol:
OID: 1.3.6.1.4.1.9.2.1.73.0
name: fsSysVersion
# add fixed tags to all metrics
static_tags:
- tag: region
value: "us-east-1"
- tag: environment
value: "production"
# computes combined metrics
virtual_metrics:
- name: ifTotalTraffic
sources:
- { metric: _ifHCInOctets, table: ifXTable, as: in }
- { metric: _ifHCOutOctets, table: ifXTable, as: out }
chart_meta:
description: Total traffic across all interfaces
family: 'Network/Total/Traffic'
unit: "bit/s"
Profile Structure
Each SNMP profile is a YAML file that defines how Netdata collects, interprets, and labels SNMP metrics from a device.
Profiles are modular — you can extend others, define metadata, and specify what to collect.
selector: <device matching pattern>
extends: <base profiles to include>
metadata: <device information>
metrics: <what to collect>
metric_tags: <global tags>
static_tags: <static tags>
virtual_metrics: <calculated metrics>
| Section | Purpose |
|---|---|
| selector | Defines which devices the profile applies to. |
| extends | Inherits and merges other base profiles. |
| metadata | Collects device-level information (host labels). |
| metrics | Defines which OIDs to collect and how to chart them. |
| metric_tags | Defines global dynamic tags collected once per device and attached to all metrics. |
| static_tags | Defines fixed tags applied to all metrics. |
| virtual_metrics | Defines calculated or aggregated metrics based on others. |
1. selector
You use the selector to:
- Target specific device families (e.g., Cisco, Juniper, HP)
- Match devices supporting specific MIBs
- Exclude unwanted devices
During discovery, Netdata evaluates all profiles; any profile whose selector matches a device is **applied **.
selector:
- sysobjectid:
include: ["1.3.6.1.4.1.9.*"] # regex: Cisco enterprise OID subtree
exclude: ["1.3.6.1.4.1.9.9.666"] # optional excludes
sysdescr:
include: ["IOS"] # substring (case-insensitive)
exclude: ["emulator", "lab"] # optional excludes
How it works:
- Each selector rule is a set of conditions (
sysobjectid,sysdescr, etc.). - For a rule to match, all its conditions must pass.
- A profile is applied if at least one rule in the
selectorlist matches the device. - If both
sysobjectidandsysdescrare defined within the same rule, both must succeed.
Supported conditions:
| Key | What It Checks | Match Criteria (Pass) | Fails When... |
|---|---|---|---|
sysobjectid.include | Device sysObjectID | Matches at least one pattern in the list. | No items match. |
sysobjectid.exclude | Device sysObjectID | Matches none of the listed patterns. | Any item matches. |
sysdescr.include | Device sysDescr (case-insensitive) | Contains at least one substring in the list. | No listed substrings are found. |
sysdescr.exclude | Device sysDescr (case-insensitive) | Contains none of the listed substrings. | Any listed substring is found. |
2. extends
Use extends to inherit metrics, tags, and metadata from another profile instead of duplicating common metrics — perfect for vendor-specific variations of a base MIB.
Most real profiles extend a few shared building blocks and then add device-specific definitions.
extends:
- _system-base.yaml # System basics (uptime, contact, location)
- _std-if-mib.yaml # Network interfaces (IF-MIB)
- _std-ip-mib.yaml # IP statistics
The final profile is the merged result of all inherited profiles plus the content in the current file.
How inheritance works:
- Order matters — profiles are loaded in the order listed.
- Metrics are merged — all metrics from all referenced profiles are included.
- Later overrides earlier — if the same field is defined multiple times, the last one wins.
Common base profiles
| Profile | Provides | Typical Use |
|---|---|---|
_system-base.yaml | Basic system info (uptime, name, contact) | All devices |
_std-if-mib.yaml | Interface statistics (IF-MIB) | Network devices |
_std-ip-mib.yaml | IP-level statistics (IP-MIB) | Routers, switches |
_std-tcp-mib.yaml | TCP statistics | Servers, firewalls |
_std-udp-mib.yaml | UDP statistics | Servers, firewalls |
_std-ups-mib.yaml | Power and UPS metrics | UPS devices |
3. metadata
The metadata section defines device-level information (not metric tags).
It is collected once per device and populates the device’s host labels in Netdata (the “virtual node” labels shown on the device page).
It always follows the structure metadata → device → fields, where each field defines a single label.
Each field can be:
- Static —
value:is a fixed string. - Dynamic — the value is read from one or more SNMP OIDs using either:
symbol— a single OID to read from.symbols— an ordered list of OIDs to try, first non-empty wins.
metadata:
device:
fields:
vendor:
value: "Cisco" # static label
model:
symbols: # dynamic label with fallback
- OID: 1.3.6.1.4.1.9.3.6.3.0
name: ciscoModelA
- OID: 1.3.6.1.2.1.47.1.1.1.1.13.1
name: entPhysicalModelName
How it works:
vendoris set statically to"Cisco".modelis collected dynamically. The collector tries the listed OIDs in order and uses the first one that returns a non-empty value.- These values appear as device (virtual node) host labels in the Netdata UI.
- They are not per-metric tags and are applied to the device itself, not individual charts.
See Tag Transformation for supported transformations and syntax examples.
4. metrics
The metrics section defines what data to collect from the device — which OIDs to query, how to interpret them, and how to display them as charts in Netdata.
Metrics can be:
- Scalars — single values that apply to the entire device (for example, uptime).
- Tables — repeating rows of related values (for example, interfaces, disks, sensors).
A metric is either scalar (single value) or table-based (multiple rows). Never mix both in the same metric entry.
The collector automatically uses SNMP GET for scalars and SNMP BULKWALK for tables.
metrics:
- MIB: HOST-RESOURCES-MIB
symbol:
OID: 1.3.6.1.2.1.1.3.0
name: systemUptime
scale_factor: 0.01 # Value is in hundredths of a second
chart_meta:
description: Time since the system was last rebooted or powered on
family: 'System/Uptime'
unit: "s"
- MIB: IF-MIB
table:
OID: 1.3.6.1.2.1.31.1.1
name: ifXTable
symbols:
- OID: 1.3.6.1.2.1.31.1.1.1.6
name: ifHCInOctets
chart_meta:
description: Traffic
family: 'Network/Interface/Traffic/In'
unit: "bit/s"
scale_factor: 8 # Octets → bits
metric_tags:
- tag: interface
symbol:
OID: 1.3.6.1.2.1.31.1.1.1.1
name: ifName
How it works:
- Each entry defines a metric or table of metrics to collect via SNMP.
- Scalars use a single
symbol, while tables define atableand one or moresymbols. - Metrics can include transformations (
extract_value,scale_factor, etc.) and chart metadata. - Table metrics can include tags (
metric_tags) to identify rows by interface, disk, or other attributes.
See also
- Collecting Metrics — explains SNMP OIDs, scalars, and tables.
- Scalar Metrics — detailed syntax for single-value metrics.
- Table Metrics— how tables and row indexes work.
- Adding Tags to Metrics — tag types and how to label table rows.
- Tag Transformations — extract, match, or map tag values.
- Value Transformations — manipulate or scale collected values.
- Virtual Metrics — build new metrics from existing ones.
Underscore-prefixed metrics
Metric names that start with an underscore (e.g., _ifHCInOctets) are private: they’re collected but not propagated to the SNMP collector output. Use them as internal building blocks (typically as inputs for virtual_metrics) so the final metric set remains clean. After virtual metrics are computed, the collector drops underscored metrics from the exported set.
# IF-MIB::ifXTable
metrics:
- MIB: IF-MIB
table:
OID: 1.3.6.1.2.1.31.1.1
name: ifXTable
symbols:
- { OID: 1.3.6.1.2.1.31.1.1.1.6, name: _ifHCInOctets, scale_factor: 8 }
- { OID: 1.3.6.1.2.1.31.1.1.1.10, name: _ifHCOutOctets, scale_factor: 8 }
virtual_metrics:
- name: ifTraffic
per_row: true
group_by: ["interface"]
sources:
- { metric: _ifHCInOctets, table: ifXTable, as: in }
- { metric: _ifHCOutOctets, table: ifXTable, as: out }
Multiple symbol fallbacks
You can express “try this OID, otherwise try that OID” by declaring multiple metrics with the same symbol.name, each pointing to a different OID. At runtime the collector GETs all declared scalar OIDs, marks missing ones, and emits the metric from whichever OID returns data. Missing OIDs are skipped cleanly.
metrics:
- MIB: HOST-RESOURCES-MIB
symbol:
OID: 1.3.6.1.2.1.25.1.1.0
name: systemUptime
scale_factor: 0.01
chart_meta:
description: Time since the system was last rebooted or powered on.
family: 'System/Uptime'
unit: "s"
- MIB: HOST-RESOURCES-MIB
symbol:
OID: 1.3.6.1.2.1.1.3.0
name: systemUptime
scale_factor: 0.01
chart_meta:
description: Time since the system was last rebooted or powered on.
family: 'System/Uptime'
unit: "s"
5. metric_tags
The metric_tags section defines global dynamic tags — values collected once from the device and applied to every metric in the profile.
They are evaluated during collection, just like other SNMP symbols, and remain the same for all metrics within that device.
Typical uses:
- Attach device-wide metadata such as serial number, firmware version, or model.
- Enable grouping and filtering by hardware, OS, or vendor attributes.
- Complement per-metric tags (for example, per-interface or per-sensor tags in tables).
metric_tags:
- tag: fs_sys_serial
symbol:
OID: 1.3.6.1.4.1.12356.106.1.1.1.0
name: fsSysSerial
- tag: fs_sys_version
symbol:
OID: 1.3.6.1.4.1.12356.106.4.1.1.0
name: fsSysVersion
How it works:
- Each tag is collected once per device, not per metric or per table row.
- The resulting tag values are attached to all metrics collected by the profile.
- Tags can be transformed (for example, reformatted or mapped) using the same rules as per-metric tags.
See Tag Transformation for supported transformations and syntax examples.
Underscore-prefixed tags
Tag names that start with an underscore (e.g., _if_type) are emitted as labels but are ignored for chart-ID composition by the SNMP collector that consumes these metrics. Use underscore tags to keep chart IDs short when another tag already guarantees uniqueness (for example, interface). (You still get the underscore-tag value as a chart label.)
metrics:
- MIB: IF-MIB
table:
OID: 1.3.6.1.2.1.31.1.1
name: ifXTable
symbols:
- OID: 1.3.6.1.2.1.31.1.1.1.6
name: ifHCInOctets
chart_meta:
description: Traffic
family: 'Network/Interface/Traffic/In'
unit: "bit/s"
scale_factor: 8
metric_tags:
- tag: interface
symbol: { OID: 1.3.6.1.2.1.31.1.1.1.1, name: ifName }
- tag: _if_type
table: ifTable
symbol: { OID: 1.3.6.1.2.1.2.2.1.3, name: ifType }
mapping:
1: "other"
6: "ethernet"
24: "loopback"
131: "tunnel"
161: "lag"
Tag fallback (first non-empty wins)
If you declare the same tag name multiple times, tags are evaluated in order and the first non-empty value is kept. This lets you fall back from a preferred column to an alternative. (Internally, the tag adder only sets a tag if it isn’t already set or is empty.)
metrics:
- MIB: IF-MIB
table:
OID: 1.3.6.1.2.1.31.1.1
name: ifXTable
symbols:
- OID: 1.3.6.1.2.1.31.1.1.1.6
name: ifHCInOctets
chart_meta:
description: Traffic
family: 'Network/Interface/Traffic/In'
unit: "bit/s"
scale_factor: 8 # Octets → bits
metric_tags:
- tag: interface
symbol: { OID: 1.3.6.1.2.1.31.1.1.1.1, name: ifName } # preferred
- tag: interface
table: ifTable
symbol: { OID: 1.3.6.1.2.1.2.2.1.2, name: ifDescr } # fallback
6. static_tags
The static_tags section defines fixed key–value pairs that are attached to every metric collected by the profile.
They don’t depend on SNMP data and remain constant for all devices using the profile.
Typical uses:
- Add environment or deployment identifiers (for example,
environment,region, orservice). - Simplify filtering, grouping, and alerting across metrics from multiple devices.
- Provide consistent context (for example, datacenter or team ownership).
static_tags:
- tag: environment
value: production
- tag: region
value: us-east-1
- tag: service
value: network
How it works:
- Each tag is added to all metrics collected by the profile.
- Static tags are merged with any dynamic tags defined in
metric_tags. - Device-specific or dynamic tags always take precedence if they overlap.
7. virtual_metrics
The virtual_metrics section defines calculated metrics built from other metrics already collected by the profile.
They don’t query SNMP directly — instead, they reuse existing metric values to produce totals, sums, or fallbacks.
See Virtual Metrics for the complete reference, configuration options, and advanced examples.
Typical uses:
- Combine related counters (for example,
in+outtraffic or errors). - Create fallbacks (prefer 64-bit counters, fall back to 32-bit if missing).
- Aggregate or group metrics per tag (for example, total per interface or per type).
- name: ifTotalTraffic
sources:
- { metric: ifHCInOctets, table: ifXTable, as: in }
- { metric: ifHCOutOctets, table: ifXTable, as: out }
chart_meta:
description: Total traffic across all interfaces
family: 'Network/Total/Traffic'
unit: "bit/s"
How it works:
- Defines a new virtual metric named
ifTotalTraffic. - Uses existing metrics (
ifHCInOctets,ifHCOutOctets) as sources. - The
asfield names the resulting dimensions (in,out). - The resulting chart behaves like a regular metric — visible in dashboards, alertable, and included in exports.
Collecting Metrics
This section explains how SNMP data is structured and how it maps to metrics in a Netdata profile.
Understanding SNMP Data
SNMP data is organized as a hierarchical tree of numeric identifiers called OIDs (Object Identifiers).
Each OID uniquely identifies a value on a device — similar to a file path in a filesystem.
1.3.6.1.2.1.1.3.0
│ │ │ │ │ │ │ └── Instance (0 = scalar)
│ │ │ │ │ │ └──── Object (3 = sysUpTime)
│ │ │ │ │ └────── Branch: system (MIB-2)
│ │ │ └────────── MIB-2 root
└─ SNMP global prefix
-
MIBs (Management Information Bases) are named collections of related OIDs.
Examples:
IF-MIB(interfaces),IP-MIB(IP statistics),HOST-RESOURCES-MIB(system info). -
Each OID maps to a typed value, such as
Counter64,Gauge32,Integer, orTimeTicks. -
Some OIDs represent single values (scalars), while others represent tables of related values (rows).