DataKit SNMP 设备指标采集配置最佳实践
文章介绍如何通过 DataKit SNMP 采集器,将网络、安全、存储等设备的 OID 数据转换为观测云指标,实现设备数据标准化采集,并用于趋势分析、仪表板展示与异常告警,帮助用户统一掌握设备运行状态,提升监控与故障发现效率。
背景与目标
SNMP 常用于采集网络设备、安全设备、存储设备、硬件设备等指标。
通过 DataKit SNMP 采集器,可以将设备 OID 数据转换为观测云中的指标数据。
本文目标是说明如何基于 SNMP 协议、MIB/OID、DataKit Profile 完成设备指标采集,并总结常见配置注意事项。
SNMP 基础概念
SNMP Agent:运行在被采集设备上的服务,负责暴露设备指标。
SNMP Manager:主动发起采集的一方,在这里就是 DataKit。
OID:指标对象编号,例如 1.3.6.1.2.1.1.3.0。
MIB:OID 的说明文档,用来解释 OID 的含义、类型、单位。
标量 OID:通常以 .0 结尾,表示单个值。
表格 OID:同一列下面有多个索引值,例如接口表、磁盘表。
SNMP v1 / v2c / v3 区别
| 版本 | 特点 | 安全性 | 使用建议 |
|---|---|---|---|
| SNMP v1 | 早期版本,功能简单 | 较弱 | 不推荐生产使用 |
| SNMP v2c | 支持批量采集,性能较好,使用 community | 较弱 | 内网场景可用 |
| SNMP v3 | 支持用户名、认证、加密 | 较高 | 生产环境推荐 |
重点说明:
- v1/v2c 主要依赖 community,类似明文口令。
- v3 支持认证和加密,更适合生产环境。
- 如果设备支持,建议优先使用 SNMP v3。
DataKit SNMP 采集链路
设备 SNMP Agent
-> DataKit SNMP 采集器
-> SNMP Profile 解析 OID
-> 转换为指标和标签
-> 上报到观测云
DataKit 负责定时请求设备 SNMP OID。
Profile 负责定义采集哪些 OID,以及如何转换成指标。
上报到观测云后,可在指标管理、指标分析、仪表板、监控器中使用。
DataKit SNMP 采集方式概览
Zabbix Profile 和 Prometheus Profile使用优先级放在最后。
优先使用DK的内置Profile(内置Profile不支持可以自定义编写内置Profile,基本能满足)
- 使用内置 Profile:设备已被 DataKit 支持时,可通过 sysObjectID 自动匹配。
- 使用自定义 Profile:设备是厂商私有 MIB,或内置 Profile 不满足需求时使用。
- 使用 Zabbix Profile:已有 Zabbix 模板时,可作为迁移来源。
- 使用 Prometheus Profile:已有
snmp_exporter配置时,可参考其 OID 和模块。 - 直接配置 OID:少量指标场景下,也可以直接在采集器中定义 metrics。
建议:
- 优先确认设备是否已有内置 Profile。
- 没有内置 Profile 时,先用
snmpwalk验证 OID,再编写自定义 Profile。 - 不建议直接照搬 Zabbix 或 Prometheus 配置,需要根据 DataKit 格式转换。
DataKit 内置 SNMP Profile 配置结构
extends:
- _base.yaml
sysobjectid:
- 1.3.6.1.4.1.x.x.x
metrics:
- MIB: XXX-MIB
symbol:
name: device.cpu.usage
OID: 1.3.6.1.4.1.x.x.x.0
核心字段说明:
extends:继承基础 Profile,推荐自定义时先使用_base.yaml。sysobjectid:用于自动匹配设备类型。metrics:定义需要采集的指标。symbol:定义单个标量指标。table+symbols:定义表格类指标。metric_tags:为指标增加标签,例如接口名、磁盘索引等。extract_value:从字符串中提取数值。
注意:
- 自定义 Profile 文件名不要以下划线开头。
- 初期不要继承太复杂的通用 Profile,避免排查困难。
各种数据结构采集配置
标量指标采集配置
标量指标一般是单个值,OID 通常以 .0 结尾。
- MIB: SF-MIB
symbol:
name: sf.system.memory.usage
OID: 1.3.6.1.4.1.35047.1.13.5.0
说明:
- 适用于 CPU 使用率、内存使用率、设备状态、连接数等单值指标。
- 如果
snmpwalk返回的 OID 是.0结尾,Profile 中也建议写完整.0。 - 常见错误是漏写
.0,导致采集不到指标。
表格指标采集配置
表格指标适用于磁盘、网卡、风扇、电源等多实例数据。
- MIB: SF-MIB
table:
name: sfDiskTable
OID: 1.3.6.1.4.1.35047.1.5.1
symbols:
- name: sf.disk.used
OID: 1.3.6.1.4.1.35047.1.5.1.4
metric_tags:
- index: 1
tag: disk_index
说明:
table.OID是表的根 OID。symbols.OID是表中的列 OID。- 表格列 OID 不要写具体行索引。
metric_tags.index可以把行索引作为标签。
字符串数值处理
有些设备返回的是字符串,但里面实际是数值。
STRING: "4879MB"
STRING: "52.30"
STRING: "9.16Kbps"
这种情况可以使用 extract_value 提取数值。
- name: sf.disk.available
OID: 1.3.6.1.4.1.35047.1.5.1.5
extract_value: '^([0-9]+[.]?[0-9]*)MB$'
说明:
extract_value只提取括号中的内容。"4879MB"会被提取为4879。"9.16Kbps"可以用类似正则提取为9.16。
extract_value: '^([0-9]+[.]?[0-9]*)Kbps$'
注意:
- 纯字符串状态值不建议直接作为指标值。
- 例如
Normal、yes、STANDALONE更适合作为 tag。
sysObjectID 匹配注意事项
sysObjectID 用于让 DataKit 自动识别设备类型并匹配对应 Profile。
可通过命令查看:
snmpwalk -v2c -c public 192.168.1.2 1.3.6.1.2.1.1.2.0
有时候返回的可读性较高的 MIB 名称:

如果让snmpwalk获取结果直接显示数字OID,可以加-On

注意事项:
sysObjectID不一定总能准确代表设备厂商。- 有些设备可能返回通用
sysObjectID,导致匹配到 generic profile。 - 如果匹配到了错误 Profile,就可能出现 OID 有返回,但观测云没有目标指标的情况。
- 自定义 Profile 时,建议先确认
sysObjectID是否唯一、准确。
观测云接入 SNMP 设备示例
以深信服 零信任安全代理网关 为例
DK >= 1.91.0
设备开启 SNMP 协议
开启V3协议
IP:10.8.18.45
用户名:guance
认证:SHA
密码:guance123456
加密:AES
密码:guance1234567

snmpwalk 测试
mib 文件参考同级目录下 MIB_helper.xls
正常返回,具体含义参考 mib 文件。

开启 snmp 采集器
cd /usr/local/datakit/conf.d/samples/snmp
# 复制snmp配置文件
cp snmp.conf.sample snmp.conf
# 按下方配置修改snmp配置文件
vim snmp.conf
# 重启datakit
datakit service -R
snmp.conf 内容基本如下
[[inputs.snmp]]
specific_devices = ["192.168.1.2"]
snmp_version = 3
v3_user = "guance"
v3_auth_protocol = "SHA"
v3_auth_key = "guance123456"
v3_priv_protocol = "AES"
v3_priv_key = "guance1234567"
## Field key or tag key mapping. Do NOT edit.
[inputs.snmp.key_mapping]
CNTLR_NAME = "unit_name"
DISK_NAME = "unit_name"
ENT_CLASS = "unit_class"
ENT_NAME = "unit_name"
FAN_DESCR = "unit_desc"
IF_OPERS_TATUS = "unit_status"
IFADMINSTATUS = "unit_status"
IFALIAS = "unit_alias"
IFDESCR = "unit_desc"
IFNAME = "unit_name"
IFOPERSTATUS = "unit_status"
IFTYPE = "unit_type"
PSU_DESCR = "unit_desc"
SENSOR_LOCALE = "unit_locale"
SNMPINDEX = "snmp_index"
SNMPVALUE = "snmp_value"
TYPE = "unit_type"
SENSOR_INFO = "unit_desc"
## We can add more mapping below
# dev_fan_speed = "fanSpeed"
# dev_disk_size = "diskTotal
## Reserved oid-key mappings. Do NOT edit.
[inputs.snmp.oid_keys]
"1.3.6.1.2.1.1.3.0" = "netUptime"
"1.3.6.1.2.1.25.1.1.0" = "uptime"
"1.3.6.1.2.1.2.2.1.13" = "ifInDiscards"
"1.3.6.1.2.1.2.2.1.14" = "ifInErrors"
"1.3.6.1.2.1.31.1.1.1.6" = "ifHCInOctets"
"1.3.6.1.2.1.2.2.1.19" = "ifOutDiscards"
"1.3.6.1.2.1.2.2.1.20" = "ifOutErrors"
"1.3.6.1.2.1.31.1.1.1.10" = "ifHCOutOctets"
"1.3.6.1.2.1.31.1.1.1.15" = "ifHighSpeed"
"1.3.6.1.2.1.2.2.1.8" = "ifNetStatus"
## We can add more oid-key mapping below
# [inputs.snmp.tags]
# tag1 = "val1"
# tag2 = "val2"
[inputs.snmp.traps]
enable = true
bind_host = "0.0.0.0"
port = 9162
stop_timeout = 3 # stop timeout in seconds.
根据 mib 文件编写内置 profile
修改好 snmp 采集器配置后,重启 DataKit 服务,会在 snmp 采集器配置文件目录看到 profiles 目录,里面都是内置 profile(前提是 snmp 采集器能正常访问到 snmp 协议设备),如非特殊设备,一般可能默认直接支持(观测云采集器 DataKit 默认集成了大量的 snmp 设备的接入),如果内置 Profile 不支持,可以自行额外编写内置 Profile。 根据 mib 文件编写内置 profile(mib 文件参考 MIB_helper.xls)
将增加的配置文件放到 snmp 采集器的 profiles 目录下。
下方编写的内置 profile 表达的含义是除了根据 mib 中的特殊 OID 获取指标之外,还扩展了 generic-router 的通用指标。
注意:上报到观测云的指标,指标名称中的点默认会转换成下划线。
# Sangfor router profile using the generic Net-SNMP Linux sysObjectID.
extends:
- generic-router.yaml
# Sangfor SDP / SF-MIB profile
# 建议文件名:sangfor_sdp.yaml
# 注意:文件名不要以下划线开头,否则会被当成 base profile
sysobjectid:
- 1.3.6.1.4.1.8072.3.2.10
metric_tags:
- OID: 1.3.6.1.4.1.35047.1.1.0
symbol: sfDeviceDescr
tag: sf_device_descr
- OID: 1.3.6.1.4.1.35047.2.15.1.0
symbol: sdpServiceState
tag: sdp_service_state
- OID: 1.3.6.1.4.1.35047.2.15.7.0
symbol: sdpClusterRole
tag: sdp_cluster_role
metrics:
# CPU / system
- MIB: SF-MIB
symbol:
name: sf.sys.cpu.cost_rate
OID: 1.3.6.1.4.1.35047.1.3.1.0
- MIB: SF-MIB
symbol:
name: sf.cpu.load_1min
OID: 1.3.6.1.4.1.35047.1.3.2.0
extract_value: '^([0-9]+[.]?[0-9]*)$'
- MIB: SF-MIB
symbol:
name: sf.cpu.load_5min
OID: 1.3.6.1.4.1.35047.1.3.3.0
extract_value: '^([0-9]+[.]?[0-9]*)$'
- MIB: SF-MIB
symbol:
name: sf.cpu.load_15min
OID: 1.3.6.1.4.1.35047.1.3.4.0
extract_value: '^([0-9]+[.]?[0-9]*)$'
- MIB: SF-MIB
symbol:
name: sf.cpu.iowait
OID: 1.3.6.1.4.1.35047.1.3.6.0
extract_value: '^([0-9]+[.]?[0-9]*)$'
- MIB: SF-MIB
symbol:
name: sf.device.status
OID: 1.3.6.1.4.1.35047.1.12.0
- MIB: SF-MIB
symbol:
name: sf.system.memory.usage
OID: 1.3.6.1.4.1.35047.1.13.5.0
# SDP
- MIB: SF-MIB
symbol:
name: sf.sdp.all_user
OID: 1.3.6.1.4.1.35047.2.15.2.0
- MIB: SF-MIB
symbol:
name: sf.sdp.authorization_current
OID: 1.3.6.1.4.1.35047.2.15.3.0
extract_value: '^([0-9]+)/[0-9]+$'
- MIB: SF-MIB
symbol:
name: sf.sdp.authorization_total
OID: 1.3.6.1.4.1.35047.2.15.3.0
extract_value: '^[0-9]+/([0-9]+)$'
- MIB: SF-MIB
symbol:
name: sf.sdp.all_connection
OID: 1.3.6.1.4.1.35047.2.15.4.0
- MIB: SF-MIB
symbol:
name: sf.sdp.new_connection
OID: 1.3.6.1.4.1.35047.2.15.5.0
- MIB: SF-MIB
symbol:
name: sf.sdp.cluster_enable
OID: 1.3.6.1.4.1.35047.2.15.6.0
# Disk table
- MIB: SF-MIB
table:
name: sfDiskTable
OID: 1.3.6.1.4.1.35047.1.5.1
symbols:
- name: sf.disk.used
OID: 1.3.6.1.4.1.35047.1.5.1.4
extract_value: '^([0-9]+[.]?[0-9]*)MB$'
- name: sf.disk.available
OID: 1.3.6.1.4.1.35047.1.5.1.5
extract_value: '^([0-9]+[.]?[0-9]*)MB$'
- name: sf.disk.used_percent
OID: 1.3.6.1.4.1.35047.1.5.1.6
extract_value: '^([0-9]+[.]?[0-9]*)$'
metric_tags:
- index: 1
tag: disk_index
# Interface table
- MIB: SF-MIB
table:
name: sfIfTable
OID: 1.3.6.1.4.1.35047.1.34.1
symbols:
- name: sf.if.in_rate
OID: 1.3.6.1.4.1.35047.1.34.1.4
extract_value: '^([0-9]+[.]?[0-9]*)Kbps$'
- name: sf.if.out_rate
OID: 1.3.6.1.4.1.35047.1.34.1.5
extract_value: '^([0-9]+[.]?[0-9]*)Kbps$'
- name: sf.if.in_packets
OID: 1.3.6.1.4.1.35047.1.34.1.6
metric_type: monotonic_count
- name: sf.if.out_packets
OID: 1.3.6.1.4.1.35047.1.34.1.7
metric_type: monotonic_count
- name: sf.if.in_errors
OID: 1.3.6.1.4.1.35047.1.34.1.8
metric_type: monotonic_count
- name: sf.if.in_drops
OID: 1.3.6.1.4.1.35047.1.34.1.9
metric_type: monotonic_count
- name: sf.if.out_errors
OID: 1.3.6.1.4.1.35047.1.34.1.10
metric_type: monotonic_count
- name: sf.if.out_drops
OID: 1.3.6.1.4.1.35047.1.34.1.11
metric_type: monotonic_count
- name: sf.if.link_status
constant_value_one: true
metric_tags:
- index: 1
tag: if_index
- symbol:
name: sfIfName
OID: 1.3.6.1.4.1.35047.1.34.1.2
tag: if_name
- symbol:
name: sfIfLinkStat
OID: 1.3.6.1.4.1.35047.1.34.1.3
tag: if_link_status
mapping:
yes: up
no: down
观测云 SNMP 指标采集上报情况
默认上报的指标集是 snmp_metric

观测云指标上报展示(snmp_metric 是默认指标集):


SNMP 对象展示:

总结
- 先用
snmpwalk验证 OID,内置 Profile 不支持再自行编写 Profile。 - 标量 OID 通常带
.0。 - 表格 OID 写列 OID,不写具体行索引。
- 字符串数值用
extract_value转换。 - 状态字符串优先作为 tag。
- 自定义 Profile 先从最小配置开始,确认能采到后再逐步扩展。


