初めに
しばらく前に自宅のサーバ周りのモニタリングをNew Relicに集約するようにしましたが、ふとした時にルーター周りがまだ個別に確認が必要な状態な事に気づきました。
ただ各種サーバと違ってエージェントを設置できるわけではないので何か方法はないものかと思ったところ、SNMPというプロトコルを利用することで実現できそうでしたのでこちらを利用してNew Relic上にデータを上げて閲覧できるようにしてみました。
なお本記事の作業は理解が薄い状態で実施している関係でとりあえず動くという設定も含まれています。その関係で不適切な設定が混じっている可能性もありますのでご注意ください。
環境
- AlmaLinux 9
- 正確にはこのホスト上のDocker
- Yamaha RTX 830
- Rev 15.02.28
ルータ側の設定
SNMPにはいくつかのバージョンがあるようですが基本的には後続の方がセキュリティや機能面で優れているようなのでSNMPv3で設定します。
以下のドキュメントを元に設定しています。
snmp local address {{ルータのIFのIP}}
snmp trap enable snmp all
snmp sysname home-router-master
snmpv3 context name home-router
snmpv3 usm user 1 new-relic-watcher group 1 sha {{パスワード}} aes128-cfb {{パスワード}}
snmpv3 trap host {{AlmaLinuxのホスト名}} user 1
snmpv3 host {{AlmaLinuxのホスト名}} user 1
snmpv3 vacm view 1 include 1.3.6.1
snmpv3 vacm access 1 read 1 write none
ログ(SYSLOG)に関しては別のプロトコルとなるようなのでこちらも設定しておきます。
syslog host {{AlmaLinuxのホスト名}}
コレクタ側のベース設定取得
SNMPマネージャーとして利用可能なコンテナがあるようなのでそちらで対応します。
New Relicのウィザードを通して必要な値を入力することで必要なファイルやコマンドまで生成してくれるようです。
ただそのままだと今回の環境に合致しないためか動かないような部分があったので最終的には手で修正はしています。
「Add Data」から「SNMP」を選択します。
Dockerで起動させたいので「Docker」を選択します。
設定値は後の設定コマンドの出力に使われますがパラメータについては後々変更できるので適当に埋めてます。
設定や切れてしまっていますが実行に必要なコマンドが出力されるので、これを元に起動準備をします。
コレクターの設定
先ほど記載の設定をもとにAlmaLinux上で実行する収集コンテナの設定を作成します。
必要なdocker run
コマンドが提示されていましたが個人的にはdocker-compose.yml
にまとめておくのが好きなので元のコマンドを参考に記述して設置しておきます。
ほぼほぼ引数の違いなのでエイリアス/アンカーでもう少しスマートに書けそうな気もしますし、いっそのこと1コンテナにならないかとも思っていますがひとまずはこれで動かします。
Syslog側も同様にウィザードで生成されるコマンドを参考にしています。
docker-compose.yml
version: "3.9"
services:
SnmpManager:
image: kentik/ktranslate:v2
container_name: snmp-manager
restart: unless-stopped
ports:
- "162:1620/udp"
volumes:
- ./snmp-base.yaml:/snmp-base.yaml
# 後述します
- ./profiles:/etc/ktranslate/profiles
environment:
NEW_RELIC_API_KEY: xxxxx
command:
- -snmp=/snmp-base.yaml
- -nr_account_id=xxxxx
- -metrics=jchf
- -tee_logs=true
- -service_name=router-snmp
- -snmp_discovery_on_start=true
- -snmp_discovery_min=60
- nr1.snmp
SyslogManager:
image: kentik/ktranslate:v2
container_name: syslog-manager
restart: unless-stopped
ports:
- "514:5143/udp"
volumes:
- ./snmp-base.yaml:/snmp-base.yaml
environment:
NEW_RELIC_API_KEY: xxxxx
command:
- -snmp=/snmp-base.yaml
- -nr_account_id=xxxxxx
- -metrics=jchf
- -tee_logs=true
- -service_name=router-syslog
- -snmp_discovery_min=60
- nr1.syslog
先ほどのコンテナのコンテンツ用の設定ファイル(?)も同様に設置して起動します。
起動後の処理で色々加筆されるようなので最終形は異なりますがこれで動くはずです(記憶の限り復元)。
snmp-base.yml
devices: {}
trap:
listen: 0.0.0.0:1620
community: ""
version: v3
transport: ""
v3_config:
user_name: new-relic-watcher
authentication_protocol: SHA
authentication_passphrase: xxxxx
privacy_protocol: AES
privacy_passphrase: xxxxx
context_name: home-router
trap_only: false
discovery:
cidrs:
- {{ルーターのIP}}/32
ignore_list: []
ports:
- 161
default_communities: []
use_snmp_v1: false
default_v3:
user_name: new-relic-watcher
authentication_protocol: SHA
authentication_passphrase: xxxxx
privacy_protocol: AES
privacy_passphrase: xxxxx
context_name: home-router
add_devices: true
add_mibs: true
threads: 4
replace_devices: true
check_all_ips: true
kentik: null
global:
poll_time_sec: 300
mib_profile_dir: /etc/ktranslate/profiles
mibs_enabled:
- IF-MIB
timeout_ms: 3000
retries: 0
設定変更に関して必要なパラメータは以下を参照しています。
実行します。
docker compose up -d
仮確認
CPU利用率諸々等表示されないですがひとまずデータは上がっていることが確認できました。
表示されなかった項目
SNMPのモニタリング情報はMIBという規格で取得されるようです。
これには標準で提供されるようなパラメータと各社が拡張したパラメータがあるようですが、以下の資料(同社別製品のSWですが)をみる限り標準ではCPU使用率やメモリの使用率が含まれていないようです。
今回の収集を行っているコンテナには以下に設置されているような幾つかのベンダーのプロファイルは含まれているようですが、Yamaha製品は含まれていないため独自でプロファイルを作成し拡張する必要があります。
独自プロファイルの作成
Yamaha製品のプライベートMIBのファイルは以下から取得が可能です。
ただ今回のコレクタに読み込ませるにはそのままではダメで特定の形式に変換をする必要があるので以下のNew Relicのブログを参考にプロファイルを作成します。
とりあえずCPU・メモリ利用率あたりとついでの作業で取れそうなものを設定してみます。
作業はMacOS上で行ってます。
#NOTE: 別途先ほどのyamaha-private-mib.zipをダウンロードして解凍済み
# ~/git/ディレクトリ上で作業しています。
pip install pysmi
git clone git@github.com:librenms/librenms.git
git clone git@github.com:kentik/snmp-profiles.git
mkdir snmp-profiles/profiles/kentik_snmp/yamaha/
cd yamaha-private-mib
#末尾が.txtだとうまく動かなかったので.txtを全て除去しておく
rename "s/.txt//g" ./*
mibdump.py --mib-source ../librenms/mibs --mib-source ./ --destination-format json --destination-directory ../snmp-profiles/profiles/kentik_snmp/yamaha/ yamaha-rt-hardware.mib
# $ ls ~/git/snmp-profiles/profiles/kentik_snmp/yamaha
# YAMAHA-RT-HARDWARE.json YAMAHA-RT.json YAMAHA-SMI.json
docker run --rm -v ~/git/snmp-profiles/profiles/kentik_snmp/yamaha/:/snmp_out kentik/ktranslate:v2 -snmp /etc/ktranslate/snmp-base.yaml -snmp_json2yaml /snmp_out/YAMAHA-RT-HARDWARE.json
変換が終わって生成されたyamlを見てみるjson時点では存在したようなパラメータが落ちていたり、extends
やsysobjectid
もなかったので書き足します。
# Autogenerated by ktranslate on Wed Nov 8 17:34:01 UTC 2023 from YAMAHA-RT-HARDWARE.json
# 他のものをを見る限り大体この2つ固定だった。共通MIBっぽい感じがする
extends:
- system-mib.yml
- if-mib.yml
# 雰囲気ハードウェアのoidな気がするのでとりあえずそれで
sysobjectid:
- 1.3.6.1.4.1.1182.1.53
metrics:
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.1
name: yrhCpuType
walk_full_table: false
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.17
name: yrhEnableSystemAlarmTrap
walk_full_table: false
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.3
name: yrhFlashROMSize
walk_full_table: false
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.2
name: yrhMemorySize
walk_full_table: false
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.19
name: yrhMemorySizeMB
walk_full_table: false
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.16
name: yrhSystemAlarm
walk_full_table: false
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.4
name: yrhMemoryUtil
walk_full_table: false
- MIB: YAMAHA-RT-HARDWARE
symbol:
OID: 1.3.6.1.4.1.1182.2.1.6
name: yrhCpuUtil1min
walk_full_table: false
no_use_bulkwalkall: false
matches: {}
matches_list: []
sysmap: {}
今回は一旦CPU/メモリ利用率が取れれば良かったので変換せず直接書いて生成で良かった気もしますが一旦はよしとしましょう。
再確認
先ほどのsnmp-profiles/profiles/
をAlmaLinux上のdocker-compose.yml
と同階層に設置して起動しなおします。
順序が前後していますが先に記載したdocker-compose.yml
にはすでにprofilesをマウントするように設定が書いてあります。
起動してしばらくするとNew Relic側のCurrently Collected Metrics
で先ほど追加したパラメータが増えていることがわかります。
Summary上の直近の使用率の表示はクエリがkentik.snmp.MemoryUtilization
を参照しているため引き続きNo Valueですが、kentik.snmp.yrhMemoryUtil
を参照するようにクエリを実行してみるとメモリ使用率が取れることが確認できます。
終わりに
まだ諸々調整するような部分はありますが無事に必要なパラメータを収集してNew Relic上で閲覧できるところまで設定することができました。
実のところ始める前は「よくわからないけどウィザードもあるしサクッと設定して動くでしょ」と思っていましたが、あちこちでハマって結局それなりに時間は掛かってしまいました。
engine id
の不一致によるエラー- マネージャー側必須ではないみたいでyml側未設定で解決(根本解決はしていない)
- snmpv3使うだけの予定がデフォルトの設定だとsnmpv2cが飛び続ける
- ウィザードに沿って作成すると含まれる
default_communities
が原因
- ウィザードに沿って作成すると含まれる
- CPU/メモリがNo Valueのままでそもそも何のパラメータが取得されてるかすらわからなかった
- MIBをふわっと理解してなんとか解決
ただこれでちょっとSNMPわかって設定できそうな部分も増えましたしいい学びにはなったかと思います。
New Relicもまだまだ使いこなせてないところはありますのでもっといい感じに使っていけるように頑張ります。