DataKit SNMP 设备指标采集配置最佳实践

文章介绍如何通过 DataKit SNMP 采集器,将网络、安全、存储等设备的 OID 数据转换为观测云指标,实现设备数据标准化采集,并用于趋势分析、仪表板展示与异常告警,帮助用户统一掌握设备运行状态,提升监控与故障发现效率。

最佳实践
banner.png

背景与目标

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 先从最小配置开始,确认能采到后再逐步扩展。
获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台