カスタムmibファイルのSMNP Integration用のpythonファイルへの変換し、yamlへ設定する

DatadogのSMNP integrationは、カスタムなmibを扱うことができます。しかしながら、ドキュメントサイトに十分な記述がされていないために、依存関係の多いカスタムmibを、SMNP integrationが必要としているpythonファイルに変換するには、SMNPの高度な理解と多くの経験値とが求められる状況になっているようです。

私自身もドキュメントのままでは、juniper用のmibを変換することができませんでした。試行錯誤の結果、なんとかエラーを出さないpythonファイルを手に入れるまでたどり着いたので、その行程をまとめておきたいと思います。

これ以外に、もっと適切な方法が有る場合は、下のコメント欄で教え頂けると助かります。(僕は、pysmnp-mib周りはそれほど得意ではないです。未だに試行錯誤中です。説明が不純分なところがあれば、そこも教えてください。)

## 作業環境
- OS: ubuntu 16.04
- Python: 2.7.12 (system python)
- サンプル事例としてjuniperのmibを使うことにします

## 作業手順

`snmp`, `snmp-mibs-downloader`, `python-pysnmp-common` インストールします。

|package| 概要 |
|:----|:----|
| snmp | SNMP (Simple Network Management Protocol) applications |
| snmp-mibs-downloader | Install and manage Management Information Base (MIB) files |
| python-pysnmp4 | Python SNMP library for agents and managers (Python 2 module) |  

multiverseカテゴリーのリポジトリーをOSに取り込めるように追加します。その後、`apt-get`コマンドを実行し、パッケージをインストールします。。multiverseの説明は、次の[ascii.jpのドキュメント](http://ascii.jp/elem/000/000/441/441502/index-3.html)を参照してください。

```
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse"
$ sudo apt-get install snmp snmp-mibs-downloader python-pysnmp4
```

`snmp-mibs-downloader`をインストールすることで、基本となる IETF MIB filesは、`/usr/share/mibs/`へ保存され、変換時の依存関係を保管してくれるようになります。

尚、以降 `/usr/share/mibs/`を、更新する際には、次のコマンドを使うことができます。

```
$ sudo download-mibs
```

次に、変換に必要なJuniper関連のmibファイルを、[juniper.net](https://www.juniper.net/techpubs/en_US/release-independent/junos/mibs/mibs.html)より取得します。

取得した圧縮ファイルをを展開し、そのディレクトリーで`build-pysnmp-mib`コマンドを使ってmibファイルを個別に変換していきます。

```
$ sudo build-pysnmp-mib -o henkango_no_file.py henkan_shitai_file.mib
```

*Datadogのドキュメントでは、`/opt/datadog-agent/bin/build-pysnmp-mibs`というコマンドを使って変換するように記されています。しかし今回は、それを使わず、OSにインストールされた`build-pysnmp-mib`コマンドを使いますので、間違えないようにしてください。*

`/opt/datadog-agent/bin/build-pysnmp-mibs`は、ディレクトリー内いのmibファイルを一括で変換するために、ドキュメントで意図している方法で変換を進めることができませんでした。色々検索した結果、`python-pysnmp4`でインストールした`build-pysnmp-mib`を使って個別にmibファイルを変換し、pythonファイルを作ることができました。

## 変換後のpythonファイルの取扱

下記に示す一覧が、juniperを監視されているお客様の実績に基づいて選んだpythonファイルです。
サンプルなので、mibの依存関係に基づいて必要なファイルを追加していってください。

まず、でき上がったpythonファイルを`/opt/datadog-agent/juniper-pymibs` へ集めます。

```
sample です。

./JUNIPER-IF-MIB.py 
./IF-MIB.py 
./SNMPv2-SMI.py 
./HCNUM-TC.py 
./SNMPv2-TC.py 
./JUNIPER-SMI.py 
./JUNIPER-MIB.py
...
```

その後、`snmp.yaml`に、追加mib用のpythonファイルを保存する場所の`mibs_folder`オプションを指定した後、dd-agentを再起動します。

```
init_config:
    mibs_folder: /opt/datadog-agent/juniper-pymibs

instances:
  - ip_address: 100.100.100.100
    port: xxx
    community_string: xxxxxxxxxxxxxxxxxxxxxxxx
    snmp_version: 2 # Only required for snmp v1, will default to 2
    timeout: 1 # second, by default
    retries: 5
    enforce_mib_constraints: true  # if set to false we will not check the values
    tags:
      - prod: datacenter-main

    metrics:
      - MIB: JUNIPER-IF-MIB


    ...必要な内容を記述していく。   
```

## まとめ
SMNP integrationは、色々なシーンで使えそうなintegrationです。しかし、高度な知識を要求さ、なかなかハードルが高いintegrationの一つでもあるのかなと感じています。そのようなintegrationでも、network上に設置された機器を監視するには必要不可欠なモノでもあります。

Datadogのドキュメントを読んで変換で躓いてた人は、上に示した方法にならって、個別にmibファイルをpythonファイルへの変換試してみてください。きっと、変換のハードルは越えられると思います。