SNMPを用いたNetwork Performance Monitoringのローカル検証環境構築手順

所要時間:約 13分
NR with NPM

作業の流れ

作業の流れは以下の通りとなります。

  • [前提] New Relicのアカウントを取得する
    (取得先URLはこちらになります。)
  • [前提] 動作検証を行う環境にdockerを導入する
  • 監視対象サーバのセットアップ (10分程度)
  • NPM管理サーバの導入 (10分程度)

構築する環境のイメージは以下の通りです。

environment to be achieved

補足: 以下の作業は、Linux, Mac環境下で動作確認を行っています。Windows環境の方は適宜、読み替える、あるいは、Linux環境をご用意の上で確認されることをお勧めします。

以下より、作業を進めて行きます。

監視対象サーバのセットアップ

本来であれば、ネットワーク機器を対象とすべきですが、ローカル環境のみで確認をできることを優先するため、サーバを監視対象として環境を構築していきます。

dockerネットワークの作成

【注意】実監視環境では、こちらの作業は不要です。ローカルでの検証のために実施する作業となります。

監視対象サーバと管理サーバを同一dockerネットワークに配置するために、事前にdockerネットワークを作成します。
# docker network create <任意のdockerネットワーク名>

docker network create nrnpm_dnetwork

監視対象サーバのdockerイメージ取得とコンテナ化

【注意】実監視環境では、こちらの作業は不要です。ローカルでの検証のために実施する作業となります。

今回は、ubuntuイメージを利用していますが、慣れているイメージをご利用ください。
# docker run -it -d --network <作成したdockerネットワーク名> --name <管理し易いコンテナ名> ubuntu:latest

docker run -it -d --network nrnpm_dnetwork --name managed-node ubuntu:latest

後でSNMPでクエリをかけるために、dockerネットワーク内のIPアドレスをdocker inspectコマンドで確認しておきましょう。
例えば、以下の様にすることで、割り振られているIPアドレスを確認することができます。
# docker inspect <コンテナ名>

確認コマンド例 (Linux, Mac環境)
docker inspect managed-node | grep IPAddress
(出力例)
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.18.0.2",

監視対象サーバインスタンス内での作業

docker execコマンドでインスタンス内にアクセスし、以下の作業を実施します。

docker exec -it managed-node /bin/bash
 # apt-get update
 # apt-get install snmpd snmp vim
 # vi /etc/snmp/snmpd.conf
[変更前]
agentaddress   127.0.0.1,[::1]

[変更後]
agentaddress   127.0.01,<先ほど確認したIPv4アドレスを記載する>

 # /etc/init.d/snmpd start
 # snmpwalk -v2c -c public localhost または、 # snmpwalk -v2c -c public <指定したIPv4アドレス>を実行し、レスポンスが返ってくれば設定が正しく行えています。

出力例
 

sample output by running snmpwalk

SNMPの参照できる領域を拡張します。(注意: 実際の運用の際は、適切な設定を行ってください。)
 # vi /etc/snmp/snmpd.conf

[変更前]
#  system + hrSystem groups only
view   systemonly  included   .1.3.6.1.2.1.1
view   systemonly  included   .1.3.6.1.2.1.25.1

[変更後]
#  system + hrSystem groups only
view   systemonly  included   .1.3.6.1

変更後、snmpdを再起動し、snmpwalkの返り値が増えていることを確認します。
補足: 動作を確認している際に、kill -9にてプロセスを止めなければならないケースがありました。再起動してもsnmpwalkの返す値に変更がない場合には、kill -9を実行して、snmpdを再起動して下さい。

NPM管理サーバの導入

New Relic Oneポータルにアクセスし、ログインします。
ログイン後、"+Add more data"ボタンより"Network performance monitoring"セクションの"SNMP"ボタンをクリックして下さい。

Add more data button on NR1 platform
NPM buttons to start the instrument

設定画面が表示されましたら、account情報が適切なものをプルダウンメニューから選択します。

次に、監視対象サーバのSNMP設定をUI上で指定します。
SNMP versionの設定を行う際は、一般的に利用されているv2cを選ぶのが良いかと思います。
補足: 実運用の際は、Community stringsは、"public"以外のものをご活用下さい。

SNMP settings for managed node

設定後、"Validate and continue"ボタンを押し、設定画面下部のコマンドを生成させて下さい。
補足: このブログでは、ローカル環境で触ってみることを目的としていますので、"Launch device discovery"で生成されたコマンドを、そのまま使っておりません。実際の運用環境では、生成されたコマンドの手順に従って導入を進めて下さい。

一旦、ローカル環境に戻り、任意のパスで空の"snmp-base.yaml"ファイルを作成します。
(注意: NPMの設定画面は閉じずに、そのまま開いた状態にしておいて下さい。後の作業でも続けて利用します。)
作成後、"Launch device discovery"で生成されたコマンド内の"YAML"で挟まれた箇所を、"snmp-base.yaml"ファイル内に記載して下さい。

cat > snmp-base.yaml <<- YAML
 <この複数行の中身を、snmp-base.yamlに転記してください。>
YAML
docker run...

(v2cのサンプルsnmp-base.yaml)

sample snmp-base-yaml in v2c

"snmp-base.yaml"ファイルの内容を記載後、生成されたコマンドのdocker部分以降を実行します。
実行の際に、dockerネットワーク部分の設定を、先ほど作成したdockerネットワークを利用する様に変更して下さい。

docker run -ti --name ktranslate-discovery --rm --network nrnpm_dnetwork \
--user `id -u`:`id -g` \
-v `pwd`/snmp-base.yaml:/snmp-base.yaml \
kentik/ktranslate:v2 \
    -snmp /snmp-base.yaml \
    -log_level info \
    -snmp_discovery=true  

上記の実行により、NPMの監視対象ノードの検出プロセスが走り、その結果を先ほど作成したsnmp-base.yamlに反映されます。

上記の作業が完了しましたら、再度、NPMの設定画面に戻り、"Poll target devices"にて生成されたコマンドを実行します。コマンドを実行する際に、ローカル検証だとわかるコンテナ名の設定を行うことと、先ほど生成したdockerネットワークを利用する様にして下さい。

docker run -d --name ktranslate-snmp-localeval --restart unless-stopped --network nrnpm_dnetwork \
-v `pwd`/snmp-base.yaml:/snmp-base.yaml \
-e NEW_RELIC_API_KEY=<表示されるKeyの値を、そのまま利用する>  \
kentik/ktranslate:v2 \
  -snmp /snmp-base.yaml \
  -nr_account_id=<割り振られたアカウントID> \
  -log_level=info \
  -metrics=jchf \
  -tee_logs=true \
  -service_name=snmp \
  nr1.snmp

上記の作業を実施すると、ローカル環境でNPMのコンテナが起動し、監視対象サーバにSNMPポーリングを実施し、その結果をNew Relic Oneプラットフォームに送り始めます。

ここまで来ましたら、NPMの設定画面は閉じて下さい。

導入作業、お疲れ様でした!!
それでは、収集されたSNMPデータがどの様にNew Relic Oneポータル上で参照できるかを見てみましょう。

Data explorerのMetricsとして

収集されたSNMPデータは、MetricsとしてData Explorer上で参照することができます。Metrics名は、"kentik."で始まる名前になっています。

NPM kentik metrics

補足:

  • SNMPを介して、さまざまなデータを取得すると、kentik.snmp.<OID名>という形式で、データが集められます。例えば、kentik.snmp.ifInErrorsや、kentik.snmp.ifHCInOctetsとなります。
  • NPMは、監視対象がサーバであると判定しているため、IF-MIBなどのデータを取得しません。もしサーバの詳細がどうしても必要という場合には、Infrastructure agentのご利用をご検討下さい。

Query builderにて
SELECT * FROM Metric WHERE metricName like 'kentik.%'
とNRQLを入力頂くことで、どのようなデータを収集しているかを確認することができます。より詳細については、こちらのページをご参照ください。
これらのデータから、SNMPデータが取得できなかった際に、アラートを発砲するといった設定ができるようになります。
例えば、
SELECT latest(kentik.ktranslate.chf.kkc.snmp_fail) FROM Metric FACET device_name
というNRQLを用いることで、1ではない値になった場合、SNMPクエリに応答できなくなっているサーバを特定することができます。

LogsによるSNMPポーリング状況確認

Data explorerにてSNMPで得られたデータ内容を参照することができますが、そのSNMPポーリングを行われているかは、Logsにて確認することが可能です。message内にKtranslate/snmpという文字列を含んでいますので、機器の検出後に定期的にポーリングを行えているかをLogsを介して確認することができます。

Logsの例: (こちらはAWS環境下での出力例となります。)

NPM output in Logs UI