PrometheusでNW機器のSNMP監視

# はじめに
既存のmetric収集ツールからどうやればいい感じに移行できるのかを考えてみようと思って
いろいろ適当に触ってみた結果をまとめてみました。

# SNMP_Exporterの設定
NW機器のメーカーや用途によって、収集したいmetricが異なりますので、
SNMP_Exporterの設定として、各種機器ごとの設定を作ります。

```
Juniper:
   ...
   ...
Cisco:
   ...
   ...
Arista:
   ...
   ...
allied-telesis:
   ...
   ...
```

などなど。
ここは実際に何を収集するのかで変わってきますので詳しいことは省略。

# Prometheusの設定
ジョブとしてSNMP_Exporterを登録します。
加除が簡単なようにサービスディスカバリを利用します。
ここではfile_sd_configsを用いて

```
scrape_configs:
  - job_name: 'snmp'
    file_sd_configs:
      - files:
        - 'files/*_*.yml'
    metrics_path: /snmp
    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
      - source_labels: [__meta_filepath]
        target_label: __param_module
        regex: '.*_(.*)\.yml'
        action: replace
```
こんな感じでしょうか。
          replacement: 127.0.0.1:9116
この部分は、SNMP_Exporterを動かしているアドレスを記載しましょう。
あとは機器リストを
files以下に作るのですが
file_sd_configsに記載した通り
XXX_YYY.yml のような命名規則にします。
さらに、YYYの部分には、SNMP_Exporterで定義した名前を利用します(上記設定例ですとJuniper,Cisco,Arista,allied-telesisのどれか)。
こうすると、そのファイルのものはYYYという種類であるとしてSNMP_Exporterから情報を拾ってくれます。
XXXの部分には場所とか、何等かグルーピングしておくと便利そうな単位にすると良いと思います。
必要なければ

```
file_sd_configs:
  - files/*.yml
```
などに変更し、 YYY.ymlという種類名だけにしても良いでしょう。
肝心の中身ですが、
target_groups
に入るデータを記載します。

```
- targets:
   - hostA
   - hostB
   - XXX.YYY.ZZZ.XYZ
```
のような。
サービスディスカバリを利用すると、Prometheus側でファイルが変更されると再読み込みをかけてくれますので楽ちん。
NW機器であれば、サーバーほどぽんぽん増えたり減ったりしない気がしているので、手動でも良いのではないかと思います。
ぽんぽん増えたり減ったりするとしても、適当なスクリプトを定期実行させて、ymlを生成させてあげれば良いと思います。

このほか
たとえば

```
        - source_labels: [__meta_filepath]
          target_label: type
          regex: '.*_(.*)\.yml'
          action: replace
```
と追加すると、収集データにtypeというラベルが付くので、type毎の統計をとったり

```
        - source_labels: [__meta_filepath]
          target_label: type2
          regex: '(.*)_.*\.yml'
          action: replace
```
と追加すると、収集データにtype2というラベルが付くので、ファイル名のXXX毎の統計をとったり
できます。

SNMP_exporterの種類も、ファイル名ではなく、ラベルから決定することもできます。

```
        - source_labels: [__meta_filepath]
          target_label: __param_module
          regex: '.*_(.*)\.yml'
          action: replace
```
この部分を

```
        - source_labels: [type]
          target_label: __param_module
          action: replace
```
に変更して
ymlファイルにtypeというラベルを記載することでそれで変更させられます。

```
- labels:
    type: Juniper
  targets:
    - HostA
    - HostB
- labels:
    type: Cisco
  targets:
    - HostC
    - HostD
```
こんな具合に。
この辺りは機器リストをどう作るのが管理しやすいのか次第だと思います。
場所情報も含めて全部動的に読み込むファイルに記載してしまうのも手ではあります。

参考に載せたURLにも記載がありますが、
ファイルサービスディスカバリはCustom service discovery として用意されてる感じもあり、
実際は動的に読み込む機器リストをさらに何らかのスクリプトで生成するというのが想定されている利用方法かなと思います。
MySQLのテーブルからデータを抜き出してfile_sd_configsとして利用できるものを生成する方法が例として示されていました。

特定セグメント全体にpingを打って、応答があったものを機器として登録させたり、
`dig -t axfr NW機器専用domain` みたいなことをしてそれを成形してファイルに落としたり、
いろいろ方法は考えられますよね。

# 注意点
relabel_configs
でいい感じにラベルを付け替えていくのですが、ここでは、配列は使えません。
SNMP_Exporterに渡すmodule は複数指定できる (module=default&module=typeAのように)のですが、
relabel_configsでは複数指定ができないということです。
全機器で必ず収集するものがある、という場合は

```
    metrics_path: /snmp
    params:
      module:
        -
        - default
    relabel_configs:
     ...
```
などとやって、1つ目を空に、2つ目に共通となるものを入れると、
relabel_configによって変更されるのは1つめの空の部分なので、moduleを2つ指定するみたいなことはできます。


# 参考
[Prometheus Config](https://prometheus.io/docs/operating/configuration/)
[Advanced Service Discovery](https://prometheus.io/blog/2015/06/01/advanced-service-discovery/)