使用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,希望这个参考能够帮到他们!

附言:非常欢迎指出有任何错误的地方。

bannerAds