前提
- Datadog経由で物理機器、例えばNW機器をSNMPを使ってメトリクス収集させたい
- datadog agentにはSNMP Intergrationがデフォで備わっているので簡単に実現可能
- しかし大体の機器は独自なOID実装をしていて、当然そういったメトリクスも取得したい
- 各社が公式に提供しているMIBファイルを取り込んで、独自OIDを使ったSNMP GETを実現させたい!
- datadog agentはテキストなMIBファイルのインポートはサポートしておらずpythonで書かれたpysnmpの形式でないとインポートできない
注意
- datadog agentそのものインストールやセットアップについて言及しない
- 公式的なはっきりとした手順がないので、以下が唯一無二の方法!っていうわけではない。まぁやり方はいくつか考えられると思う。
手順
- 自分の端末でpysnmpをインストール
$ pip3 install pysnmp pysnmp-mibs
- MIBファイルをダウンロード
- 今回は以下を対象にして成功
- 展開してpysnmp形式に変換
$ unzip yamaha-private-mib.zip
$ mibdump.py ./*
-
これで
~/.pysnmpにpythonとして変換されたMIBファイルが生成される -
変換したMIBファイルを各OSの所定パスに配置
- Windows:
C:¥programdata¥datadog¥conf.d¥snmp.d¥mibs/ - Linux:
/etc/datadog-agent/conf.d/snmp.d/mibs/
- Windows:
-
以下のようにコンフィグファイルを設定
python形式であることを明示指定配置したMIBを読み込むようにパスを明示指定- instancesセクション配下で対象とする機器の接続先とコミュニティ名、必要に応じてMIB情報を指定する
- この時バージョン問題かどうかわからないが、
metricsを指定した場合、標準MIBでサポートされる範囲のSNMP GETができないケースに見舞われた - あえて標準MIBだけでmetrics指定を持たない指定と、拡張MIBを前提としたmetrics指定のみの2つを書くことでどちらも取得できた
- 環境起因かバージョンなのか、はっきりとしたことがわからないが、一応そういった事象が発生した旨とその対象について述べておく、誰かの役に立てば良いが。
- この時バージョン問題かどうかわからないが、
- ref.https://docs.datadoghq.com/ja/agent/guide/agent-configuration-files/?tabs=agentv6v7
init_config:
loader: python
mibs_folder: /etc/datadog-agent/conf.d/snmp.d/mibs
instances:
- ip_address: 192.168.0.254
community_string: private
- ip_address: 192.168.0.254
community_string: private
metrics:
- MIB: YAMAHA-SW-HARDWARE
symbol: yshMemoryUtil
- MIB: YAMAHA-SW-HARDWARE
symbol: yshCpuUtil5min
- MIB: YAMAHA-SW-HARDWARE
symbol: yshInboxTemperature
- あとはDatadog側で確認すれば、これらの値が取得できていることが確認できるはず
トラブル
mibdump.pyにはぶっちゃけ問題がある。
ref. https://github.com/etingof/pysmi/blob/master/scripts/mibdump.py
mibBorrowerというある種のキャッシュ機構のような機能があり、既に世に知れたMIBファイルであればわざわざ生成処理をしなくても対象MIBと同じものが既にアップストリームで保持されているならそれを信用して使う、というものっぽい。ちなみによく調べていないのでもしかしたら全然違うかもしれない。
この機能が悪さしている。
実装コードを見てもらえればわかるが、↑の処理では http://mibs.snmplabs.com/pysnmpにアクセスする。
このFQDNは既に使われていない。正確にはどこかに買われて、不適当な状態で残置されている。
そのせいか、mibBorrowerの処理の最中にわけわからんhtmlを変換後のMIBだと勘違いしてダウンロードしてくる。
当然、MIBなんかじゃない。見ればわかるが、クソみたいなhtmlだ。MIBとして読み込めない。
これを回避する方法はいくつか考えられるが、サクッとこの機能を無効化するのが良いと思う。
バージョンなどによって行位置は異なると思うので、皆さんそれぞれでよく確認して欲しいが、私のv0.3.4環境だとこんな感じ。
234 # borrowers = [PyFileBorrower(x[1], genTexts=mibBorrowers[x[0]][1])
235 # for x in enumerate(getReadersFromUrls(*[m[0] for m in mibBorrowers], **dict(lowcaseMatching=False)))]
...
355 # mibCompiler.addBorrowers(*borrowers)
ptyhonなのでコメントアウトして保存して再実行すればmibBorrowerの機能を使わず毎回生成して正しくpythonなMIBへと変換してくれるはず。