建议使用此导出器以 Prometheus 可以摄取的格式公开 SNMP 数据。
为了简单开始,建议将if_mib
模块与使用public_v2
auth 模块的交换机、接入点或路由器一起使用,该模块应该是目标设备上的只读访问社区。
请注意,SNMP 中的团体字符串不被视为秘密,因为它们在 SNMP v1 和 v2c 中以未加密的方式发送。为了安全访问,需要 SNMP v3。
虽然 SNMP 使用分层数据结构,而 Prometheus 使用 n 维矩阵,但这两个系统完美映射,无需手动遍历数据。 snmp_exporter
为您映射数据。
Prometheus 能够将 SNMP 索引实例映射到标签。例如, ifEntry
指定ifIndex
的 INDEX 。这成为 Prometheus 中的ifIndex
标签。
如果 SNMP 条目有多个索引值,则每个值都会映射到单独的 Prometheus 标签。
SNMP 采用 OID 树结构,由 MIB 描述。 OID 子树在树中的不同位置具有相同的顺序。 1.3.6.1.2.1.2.2.1.1
( ifIndex
) 下的顺序与1.3.6.1.2.1.2.2.1.2
( ifDescr
)、 1.3.6.1.2.1.31.1.1.1.10
( ifHCOutOctets
) 等中的顺序相同。数字是 OID,括号中的名称是来自 MIB 的名称,在本例中为 IF-MIB。
给定一个接口为 2 的设备,部分snmpwalk
返回如下所示:
1.3.6.1.2.1.2.2.1.1.2 = INTEGER: 2 # ifIndex for '2' is literally just '2'
1.3.6.1.2.1.2.2.1.2.2 = STRING: "eth0" # ifDescr
1.3.6.1.2.1.31.1.1.1.1.2 = STRING: "eth0" # IfName
1.3.6.1.2.1.31.1.1.1.10.2 = INTEGER: 1000 # ifHCOutOctets, 1000 bytes
1.3.6.1.2.1.31.1.1.1.18.2 = STRING: "" # ifAlias
snmp_exporter
将所有这些数据合并为:
ifHCOutOctets{ifAlias="",ifDescr="eth0",ifIndex="2",ifName="eth0"} 1000
snmp_exporter
的单个实例可以为数千个设备运行。
二进制文件可以从 Github 发布页面下载,无需特殊安装。
我们还提供了一个示例 systemd 单元文件。
作为守护进程或从 CLI 启动snmp_exporter
:
./snmp_exporter
访问 http://localhost:9116/snmp?target=192.0.0.8,其中192.0.0.8
是要从中获取指标的 SNMP 设备的 IP 或 FQDN。请注意,这将使用默认传输 ( udp
)、默认端口 ( 161
)、默认身份验证 ( public_v2
) 和默认模块 ( if_mib
)。身份验证和模块必须在snmp.yml
文件中定义。
例如,如果您有一个名为my_secure_v3
的身份验证用于执行ddwrt
,则 URL 将类似于 http://localhost:9116/snmp?auth=my_secure_v3&module=ddwrt&target=192.0.0.8。
要配置不同的传输和/或端口,请使用语法[transport://]host[:port]
。
例如,要在端口1161
上使用tcp
抓取设备,URL 将类似于 http://localhost:9116/snmp?auth=my_secure_v3&module=ddwrt&target=tcp%3A%2F%2F192.0.0.8%3A1161。
请注意,由于:
和/
字符,应该对target
使用 URL 编码。 Prometheus 自动对查询参数进行编码,无需在 Prometheus 配置文件中手动编码。
有关导出器本身操作的指标可在端点 http://localhost:9116/metrics 上获得。
可以在 URL 中提供可选的snmp_context
参数,如下所示: http://localhost:9116/snmp?auth=my_secure_v3&module=ddwrt&target=192.0.0.8&snmp_context=vrf-mgmt URL 中的snmp_context
参数将覆盖context_name
snmp.yml
文件中的参数。
多模块功能允许您指定多个模块,从而能够在一次抓取中从多个模块检索信息。可以使用 snmp-exporter 选项--snmp.module-concurrency
指定并发度(默认值为 1)。
注意:此实现不会对不同模块之间的遍历执行任何重复数据删除。
有两种方法可以指定多个模块。您可以用逗号分隔它们或定义多个 params_module。 URL 看起来像这样:
对于逗号分隔:
http://localhost:9116/snmp?module=if_mib,arista_sw&target=192.0.0.8
对于多个 params_module:
http://localhost:9116/snmp?module=if_mib&module=arista_sw&target=192.0.0.8
默认配置文件名为snmp.yml
,不应手动编辑。如果您需要更改它,请参阅生成配置。
默认的snmp.yml
文件涵盖了使用 SNMP v2 GETBULK 运行的各种常见硬件。
--config.file
参数可以多次使用以加载多个文件。它还支持 glob 文件名匹配,例如snmp*.yml
。
--config.expand-environment-variables
参数允许将环境变量传递到配置文件的某些字段中。支持 auths 部分中的username
、 password
和priv_password
字段。默认为禁用。
重复的module
或auth
条目将被视为无效且无法加载。
URL 参数target
、 auth
和module
可以通过重新标记来控制。
配置示例:
scrape_configs :
- job_name : ' snmp '
static_configs :
- targets :
- 192.168.1.2 # SNMP device.
- switch.local # SNMP device.
- tcp://192.168.1.3:1161 # SNMP device using TCP transport and custom port.
metrics_path : /snmp
params :
auth : [public_v2]
module : [if_mib]
relabel_configs :
- source_labels : [__address__]
target_label : __param_target
- source_labels : [__param_target]
target_label : instance
- target_label : __address__
replacement : 127.0.0.1:9116 # The SNMP exporter's real hostname:port.
# Global exporter-level metrics
- job_name : ' snmp_exporter '
static_configs :
- targets : ['localhost:9116']
您可以通过您选择的环境变量以以下格式传递username
、 password
和priv_password
。如果环境中存在变量,则会动态解析它们,否则配置文件中的字符串将按原样传递。
这需要设置--config.expand-environment-variables
标志。
auths :
example_with_envs :
community : mysecret
security_level : SomethingReadOnly
username : ${ARISTA_USERNAME}
password : ${ARISTA_PASSWORD}
auth_protocol : SHA256
priv_protocol : AES
priv_password : ${ARISTA_PRIV_PASSWORD}
与 blackbox_exporter 类似, snmp_exporter
旨在在一些中央计算机上运行,并且可以被视为“Prometheus 代理”。
SNMP 导出器支持 TLS 和基本身份验证。这可以更好地控制各种 HTTP 端点。
要使用 TLS 和/或基本身份验证,您需要使用--web.config.file
参数传递配置文件。文件的格式在导出工具包存储库中进行了描述。
请注意,TLS 和基本身份验证设置会影响所有 HTTP 端点:用于抓取的 /metrics、用于抓取 SNMP 设备的 /snmp 以及 Web UI。
我们的默认配置应该涵盖大多数用例。如果您需要从 MIB 生成自己的配置,可以使用生成器。
如果您需要自定义遍历哪些对象或使用非公共 MIB,请使用生成器。
为了为较大的 Counter64 值提供准确的计数器,导出器将自动每隔 2^53 换行该值,以避免 64 位浮点舍入。普罗米修斯会为您优雅地处理这个问题,您不会注意到任何负面影响。
如果需要对非 Prometheus 系统禁用此功能,请使用命令行标志--no-snmp.wrap-large-counters
。
开始使用这一切可能是不透明的,但根据我们自己的经验,snmp_exporter 确实是与 SNMP 交互的最佳方式。为了让其他人更容易,请考虑将您的配置反馈给我们。 snmp.yml
配置应附带生成器配置。对于您的仪表板、警报和记录规则,请考虑将它们贡献到 https://github.com/prometheus/snmp_exporter/tree/main/snmp-mixin。