New Relic NPM Entrance Image

New RelicのNPM(NetworkPerformanceMonitoring)ではSNMPを利用しネットワーク機器のパフォーマンス情報を収集します。

実際にネットワーク機器に対してSNMP Pollingを行うドッカーコンテナであるktranslate にはあらかじめい様々なネットワーク機器ベンダーのMIBが情報登録されてるいます。

しかし、全てのベンダーのMIB情報が登録されているわけではありません。

この記事ではお客様がご利用しているネットワーク機器のMIB情報をktranslateで利用する方法をご案内します。

YAMLファイル

ktranslate ではSNMPポーリングを行うためのOIDの情報をyaml ファイルに記載します。

このYamlファイルの構成をご紹介します。

この構成の原文はGithubのWikiをご確認ください。

YAMLファイルの構造

YAMLファイルは3つセクションによって構成されます。

extends

YAMLファイル同士の依存関係を記述します。ネットワーク機器のSNMPオブジェクトは、MIB(Management Information Base)ツリーとしてDNSの名前解決のようなツリー上の依存関係を持ちます。

このMIBツリーの依存関係をYAMLファイル同士の依存関係として継承したい上位のYAMLファイルを定義します。

このセクションにはファイル名のみを記載します。記載されたファイルが見つからない場合はランタイムErrorが発生します。

extends:
  - system-mib.yml
  - if-mib.yml

sysobjectid

このYAMLファイルで定義するシステムオブジェクトのOID(オブジェクトID)を記載します。

MIBツリーにおける、このファイルで定義するレベルのオブジェクトのIDをOID形式で記載します。オブジェクト名形式では記載できません。

OIDにはワイルドカードを指定する事もできます。

sysobjectid: 1.3.6.1.4.1.9.1.111

sysobjectid:
  - 1.3.6.1.4.1.9.1.111
  - 1.3.6.1.4.1.9.1.170
sysobjectid: 1.3.6.1.4.1.25461.*

metrics

先のsysobjectid で指定したオブジェクトから実際に収集するMetrics情報を定義します。

MetricsセクションではMIB名、OID、オブジェクト名を記載し、OIDの構造に合わせてSynbol型とTable型が指定出来ます。

Synbol型はそのOIDから一意の値が返るオブジェクト、

Table型はポート毎のトラフィックのようにモジュール毎に複数の値が返るようなオブジェクトで利用されます。

metrics:
  - MIB: PAN-COMMON-MIB
    symbol:
      OID: 1.3.6.1.4.1.25461.2.1.2.3.1.0
      name: panSessionUtilization
  - MIB: PAN-COMMON-MIB
    symbol:
      OID: 1.3.6.1.4.1.25461.2.1.2.3.2.0
      name: panSessionMax

上記のMetrics記述では、ktranslateはkentik.snmp.panSessionUtilization kentik.snmp.panSessionMaxという2つの値を収集します。

 

  - MIB: PAN-ENTITY-EXT-MIB
    table:
      OID: 1.3.6.1.4.1.25461.1.1.7.1.2.1
      name: panEntityFRUModuleTable
    symbols:
      - OID: 1.3.6.1.4.1.25461.1.1.7.1.2.1.1.1
        name: panEntryFRUModulePowerUsed
      - OID: 1.3.6.1.4.1.25461.1.1.7.1.2.1.1.2
        name: panEntryFRUModuleNumPorts
    metric_tags:
      - MIB: ENTITY-MIB
        column:
          OID: 1.3.6.1.2.1.47.1.1.1.1.2
          name: entPhysicalDescr
        table: entPhysicalTable
        tag: entity_description

上記のYAMLファイルでの場合は次のような構造になっています。

 

    table:
      OID: 1.3.6.1.4.1.25461.1.1.7.1.2.1
      name: panEntityFRUModuleTable

テーブル形式でOID 1.3.6.1.4.1.25461.1.1.7.1.2.1 の情報を取得し、複数あるFRUModuleをリストとして収集します。

 

    symbols:
      - OID: 1.3.6.1.4.1.25461.1.1.7.1.2.1.1.1
        name: panEntryFRUModulePowerUsed
      - OID: 1.3.6.1.4.1.25461.1.1.7.1.2.1.1.2
        name: panEntryFRUModuleNumPorts

そして、そのテーブルに対して

panEntryFRUModulePowerUsedpanEntryFRUModuleNumPorts の値をMetricsとして収集します。

 

    metric_tags:
      - MIB: ENTITY-MIB
        column:
          OID: 1.3.6.1.2.1.47.1.1.1.1.2
          name: entPhysicalDescr
        table: entPhysicalTable
        tag: entity_description

そして収集した値に対してentPhysicalDescr をtag情報として付与します。

Enums 型

UPSやPDUなど測定値はなく、機器のstatusを数値型で返す機器があります。

この際に利用出来るのがEnums型です。

      - OID: 1.3.6.1.4.1.318.1.1.12.2.3.1.1.3
        name: rPDULoadStatusLoadState
        enum:
          phaseLoadNormal: 1
          phaseLoadLow: 2
          phaseLoadNearOverload: 3
          phaseLoadOverload: 4

この定義によって1~4の値を文字列のstatusとマッピングします。

この定義がある場合、実際に収集される値は1~4の整数値ですが、同時にrPDULoadStatusLoadState として文字列型のattributeが作成されます。

これにより、人間による可読性が高いDataを作成することができるようになります。

タグ定義

YAMLでタグを定義することによりEntity名をわかりやすいタグに置き換える事ができます。

      - OID: 1.3.6.1.4.1.9.9.109.1.1.1.1.7
        name: cpmCPUTotal1minRev
        tag: CPU

16進数のエンコード

ネットワーク機器の中には、SNMPの応答値を16進数で返す物があります。16進数のDataをそのまま受け取った場合、通常の数値として大小関係を比較することが出来ないため、明示的に10進数への変換方法を定義する必要があります。

エンコード方法はconversionセクションで定義します。

変換方法の書式は

hextoint:BigEndian|LittleEndian:uint64|uint32|uint16

となります。

hextoint 固定

BigEndian :ABCDEF の大文字で16進数を表現する

LittleEndian: abcdef の小文字で16進数を表現する

uint64:0から18446744073709551615までの符号無し整数

uint32:0から4294967295までの符号無し整数

uint16:0から65535までの符号無し整数

      - column:
          OID: 1.3.6.1.2.1.75.1.2.1.1.1
          name: portIndex
        tag: port_index
        conversion: hextoint:BigEndian:uint16

カスタムプロファイルの利用

このBlogの手順によってYAMLファイルを作成することによって、お客様環境独自でのYAML定義を作成することができます。

独自に作成された、YAMLファイルはktranslateには含まれていません。

このプロファイルを2つめのボリュームとしてktranslateコンテナにマウントしてご利用いただくことでプライベートプロファイルとしてご利用いただくことができるようになります。

公式コンテナイメージへの取り込みリクエスト

お客様環境独自の監視では無く、多くのお客様にメリットがありそうな監視項目やネットワーク機器に付いての定義はGithubからリクエストを行っていいただく事ができます。

この場合はお客様自身でYAMLファイルを作成いただく必要はありません。

YAMLファイルの作成はsnmp-profiles リポジトリで実施するためその元となる

  1. ベンダー名
  2. モデル名
  3. OIDファイル
  4. 認証情報等の個別情報を含まない状態でのsnmpwalkの結果

以上の情報を付与してリクエストを起票してください。

起票方法の詳細は[速報版] Network Performance Monitoringに新たなSNMP Profileを登録するための手順 をご確認ください。

備考

プライベートYAMLファイルの拡張子

ファイル拡張子はyamlでもymlでもご利用可能です。
ただし、どちらか片方に統一してください。

MIBファイルからのYAMLファイルの自動生成

MIBファイルが手元にある場合、以下の手順でYAMLファイルを自動生成することができます。

  1. pysmiをインストールします。(pip install pysmi)
  2. librenmsをインストールします。(git clone https://github.com/librenms/librenms.git)
  3. MIBファイルを、tmp/snmp_inディレクトリに配置します。YAMLファイル出力用のtmp/snmp_outディレクトリも作成します。
  4. pysmi に含まれるmibdumpコマンドを実行します。
  5. mibdump コマンドはMIBファイルからjson ファイルを生成します。
  6. 出来上がったjsonファイルをyamlファイルに変換します。

mibdump コマンドの書式は次の通りです。

mibdump.py --mib-source=file:///path/to/src/librenms/mibs --mib-source=file:///tmp/snmp_in --generate-mib-texts --ignore-errors  --destination-format json --destination-directory=/tmp/snmp_out MY_MIB_NAME

例として、ZSCALER-NSS-MIBというmibファイルを使用し、librenms が /home/me/src/librenms にインストールされている場合は次のようなコマンドになります。

mibdump.py --mib-source=file:///home/me/src/librenms/mibs --mib-source=file:///tmp/snmp_in --generate-mib-texts --ignore-errors  --destination-format json --destination-directory=/tmp/snmp_out ZSCALER-NSS-MIB

ktranslate を利用してjsonファイルをyamlファイルに変換します。

変換コマンドの書式は次の通りです。

docker run --rm -v /tmp/snmp_out:/snmp_out kentik/ktranslate:v2 -snmp /etc/ktranslate/snmp-base.yaml -snmp_json2yaml /snmp_out/MY_MIB_NAME.json

先ほど例にしたZSCALER-NSS-MIB.json を変換する場合は次のようなコマンドになります。

docker run --rm -v /tmp/snmp_out:/snmp_out kentik/ktranslate:v2 -snmp /etc/ktranslate/snmp-base.yaml -snmp_json2yaml /snmp_out/ZSCALER-NSS-MIB.json

このコマンドにより/tmp/snmp_out/ZSCALER-NSS-MIB.yaml が出力されます。

最終調整

自動生成されたYAMLファイルは完璧ではありません、手動により調整と確認を行ってください。必要なチェックは次の通りです、

  1. extends:セクションを追加します。
  2. sysobjectid:セクションが存在し、書式が崩れていない事を確認します、必要に応じて修正してください。

まとめ

MIB ファイルからYAMLファイルを作成し、ktranslateコンテナのセカンドボリュームとしてマウントしていただく事で、お客様環境独自のネットワーク機器の情報を収集するようにktranslateを拡張していただく事ができます。

また、他のお客様でも汎用的に使えるようなモニタリング項目の場合は、snmpwalk などの必要な情報を付けて、プロファイルリクエストを行っていただく事で、公式のktranslate イメージにプロファイルを組み込む事もできます。

まだまだ、日本のネットワークベンダーのプロファイルは少ないのが現状です是非リクエストを作成していただき、New Relic NPMの拡張にご協力ください。