使用SNMP导出器的生成器
2017年普罗米修斯降临日历的第二天。
这是一篇关于SNMP Exporter的文章。
SNMP Exporter是什么?
这是一种使用Prometheus来监控通过SNMP获得的信息的导出器。
当希望将现有的SNMP管理器迁移到Prometheus时,可以使用它。
它的功能很简单,只是在收到请求时,利用SNMP收集信息并进行显示。
SNMP Exporter的配置设置
SNMP Exporter的设置是指通过使用SNMP收集什么数据(以及如何收集)的一个方面。
在SNMP Exporter中,可以通过模块的单位来设置要收集的数据。
配置文件中并行列出了许多模块。
我将从if_mib模块中提取出一些例子来进行说明。
在使用walk命令时,您需要指定要进行snmpwalk的OID。
另外,在metrics部分,您需要记录每个OID的名称、值的类型,以及如果存在索引则包括索引的信息。
此外,还有其他的一些设置部分,比如称为auth的部分,用于设置SNMP v2c的Community信息或者SNMP v3的用户名和密码等等。
if_mib:
walk:
- 1.3.6.1.2.1.1.3
- 1.3.6.1.2.1.2
- 1.3.6.1.2.1.31.1.1
metrics:
- name: sysUpTime
oid: 1.3.6.1.2.1.1.3
type: gauge
help: The time (in hundredths of a second) since the network management portion
of the system was last re-initialized. - 1.3.6.1.2.1.1.3
- name: ifNumber
oid: 1.3.6.1.2.1.2.1
type: gauge
help: The number of network interfaces (regardless of their current state) present
on this system. - 1.3.6.1.2.1.2.1
- name: ifIndex
oid: 1.3.6.1.2.1.2.2.1.1
type: gauge
help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
indexes:
- labelname: ifIndex
type: gauge
- name: ifDescr
oid: 1.3.6.1.2.1.2.2.1.2
type: DisplayString
help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
indexes:
- labelname: ifIndex
type: gauge
- name: ifType
oid: 1.3.6.1.2.1.2.2.1.3
type: gauge
help: The type of interface - 1.3.6.1.2.1.2.2.1.3
indexes:
- labelname: ifIndex
type: gauge
- name: ifMtu
oid: 1.3.6.1.2.1.2.2.1.4
type: gauge
help: The size of the largest packet which can be sent/received on the interface,
specified in octets - 1.3.6.1.2.1.2.2.1.4
indexes:
- labelname: ifIndex
type: gauge
- name: ifSpeed
oid: 1.3.6.1.2.1.2.2.1.5
type: gauge
help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
indexes:
- labelname: ifIndex
type: gauge
- name: ifPhysAddress
oid: 1.3.6.1.2.1.2.2.1.6
type: PhysAddress48
help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
indexes:
- labelname: ifIndex
type: gauge
- name: ifAdminStatus
oid: 1.3.6.1.2.1.2.2.1.7
type: gauge
help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
indexes:
- labelname: ifIndex
type: gauge
- name: ifOperStatus
oid: 1.3.6.1.2.1.2.2.1.8
type: gauge
help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
indexes:
- labelname: ifIndex
type: gauge
# 以下略
這是從官方樣本中提取出的一部分。
它是為了獲取介面信息而設計的。
配置本身是由SNMP Exporter附帶的生成器創建的。
然而,目前的二进制发行版本没有附带生成器。你需要从源代码进行构建。
生成器依赖于Net-SNMP,并且目前采用动态链接方式创建二进制文件的方式,因此处于这种状态。
这个问题已经被提出,并可能会在将来被包含进来。
使用发电机
发电机的构建
只需要一個選擇:
如前所述,為了使用generator,需要進行編譯。
首先取得Net-SNMP的庫和相關的include檔案,
例如使用以下指令進行安裝:yum install net-snmp-devel,apt install libsnmp-base libsnmp-devel等等。
接著安裝golang,
並使用以下指令獲取snmp_exporter的原始碼:
go get github.com/prometheus/snmp_exporter
然後進入目錄:cd $GOPATH/src/github.com/prometheus/snmp_exporter/generator
進行編譯:go build
這樣就會生成generator的可執行文件。
只需要参考generator.yml的内容进行编写。
生成器只是上述提到的SNMP设置示例中的一种。
modules:
if_mib:
walk: [sysUpTime, interfaces, ifXTable]
只有三行而已。
由于易于理解和管理,我建议基本上使用generator来生成配置文件。
在生成器的配置文件中,没有OID信息,但这些信息都是从MIB文件中获取的。
所以,您需要单独获取要配置的设备的SNMP-MIB文件。
在生成器的README文件的底部,有关主要MIB文件的获取和安装方法已经写明了,您可以参考一下。
发电机的设置(官方页面摘录和解释)
所有的生成器设定都记录在generator.yml文件中。
设定是以模块为单位进行的。
module:
<module1>:
module1の設定
<module2>:
module2の設定
<module3>:
module3の設定
以下が提供されます。
每个模块都是为您提供的。
<modulename>:
walk:
snmpwalkするもの
version: 2 # snmp v1,2,3 を設定するもの
max_repetitions: 25 #SNMP BULK Requestするときの最大値
retries: 3 # リトライ回数
timeout: 10s # タイムアウト時間
auth:
認証情報
lookups:
Indexを他のものに置き換えるための情報
overrides:
metric情報を書き換えるための情報
由(module名)组成。
在(module名)中,可以使用您喜欢的名称。这是在Prometheus的配置中设置的模块名称。它还会在收集时记录下来。
在SNMP Exporter的配置中,没有提到指标(metrics)的内容,但这些指标会自动从walk:中生成。
(因此,如果在walk:中写入大量内容,会设置很多指标)
如果数量太多,一些设备可能会因超时而无法返回结果,请注意。
在将上述if_mib配置应用于某个设备时,有时可能需要等待60秒才能得到返回。
查找
查找是用来将索引转换为易于理解的方式。
lookups:
- old_index: ifIndex
new_index: ifName
- old_index: someIndex
new_index: someDescr
按照以下方式,将原始索引和新索引排列在一起。
请注意,替换后的索引必须是唯一的。示例中包含了将ifIndex替换为mib_ifDescr或mib_ifName的设置,但是ifDescr等并不能保证是唯一的,使用这些可能导致无法获取到信息,请注意。如果需要此类信息,建议使用Prometheus的强大查询功能来合成。
ifInOctets * on(ifIndex) group_left(ifName) ifName
“とか” 可以用一种中文方式转述:「之类的」
ifInOctets * on(ifIndex) group_left(ifName) ifName * on(ifIndex) group_left(ifDescr) ifDescr
如此查询,可以将ifName和ifDescr进行关联。
但是,如果做得过多,查询回应会变慢,所以要适度进行。
在我的周围环境中
rate(ifHCInOctets[5m]) * 8
rate(ifHCInOctets[5m]) * 8 * on(instance,ifIndex) group_left(ifName) ifName * on(instance,ifIndex) group_left(ifDescr) ifDescr
在两次测试中,我们发现,之前返回时间约为1500毫秒的结果,加上ifName和ifDescr后,时间变长,大约在2900毫秒左右。
让我们在16日的查询训练场学习记住有关查询的内容。
我认为,一旦变成这样,最好还是利用普罗米修斯的规则在收集时进行添加。
超越
overrides是用来修改和保存通过SNMP获取的信息的工具。
例如,当使用SNMP获取值时,可能会返回字符串如“OK”、“NG”、“UNKNOWN”,这些无法作为指标来处理。为了将它们作为指标处理,可以将其替换为数字,例如将OK替换为1、NG替换为2、UNKNOWN替换为3等等。
在使用过程中,可以使用正则表达式。
overrides:
<MetricName>:
regex_extracts:
<SubName>:
- regex: 'OK'
value: '1'
- regex: 'NG'
value: '2'
- regex: 'UNKNOWN'
value: '3'
- regex: '(.*)'
value: '0'
就像这样,它们可以各自被分配。这样一来,就可以进行监控了。
即原始名称,即新名称。
在这种情况下,数据将被命名为(即原始名称与自己取的名称的连接)。
同时,原来的数据将不再出现在SNMP Exporter上。
创建snmp.yml文件
当 generator.yml 文件完成后,只需在 generator.yml 所在的目录中执行 /path/to/generator generate,将会创建 snmp.yml 文件。接下来,我们从 snmp_exporter 指定该文件并进行操作测试。
我已经实际创建并尝试使用了generator.yml。
这是从进行验证等工作中创建的generator.yml文件中提取的摘录。
yamaha:
auth:
community: public
walk:
- sysName
- yrhCpuUtil1min
- yrhInboxTemperature
- yrhMemoryUtil
- yrhFanModuleStatus
- yrhFanModuleIndex
if_name:
auth:
community: public
walk:
- sysUpTime
- ifAdminStatus
- ifOperStatus
- ifInErrors
- ifOutErrors
- ifInDiscards
- ifOutDiscards
- ifOutQLen
- ifDescr
- ifName
- ifAlias
- ifHCInOctets
- ifHCOutOctets
- ifHCInUcastPkts
- ifHCInBroadcastPkts
- ifHCInMulticastPkts
- ifHCOutUcastPkts
- ifHCOutBroadcastPkts
- ifHCOutMulticastPkts
lookups:
- old_index: ifIndex
new_index: ifName
paloalto:
auth:
community: public
walk:
- entPhysicalDescr
- entPhySensorValue
- entPhySensorOperStatus
- hrProcessorLoad
- hrDeviceDescr
- hrStorageDescr
- hrStorageUsed
- hrStorageSize
- panSessionActive
- panSessionActiveICMP
- panSessionActiveTcp
- panSessionActiveUdp
- panSessionUtilization
- panSysHAPeerState
- panSysHAState
- sysName
overrides:
panSysHAPeerState:
regex_extracts:
Status:
- regex: '.*active.*'
value: '1'
- regex: '.*passive.*'
value: '2'
- regex: '.*'
value: '0'
panSysHAState:
regex_extracts:
Status:
- regex: '.*active.*'
value: '1'
- regex: '.*passive.*'
value: '2'
- regex: '.*'
value: '0'
结束了
SNMP Exporter的使用说明只是基本的介绍。
如果有人想从使用其他基于SNMP的指标收集工具迁移到Prometheus,希望这个参考能够帮到他们!
附言:非常欢迎指出有任何错误的地方。