自宅のルータ(Yamahaルータ)のモニタリングをNew Relicで行えるようにしてみた

2023.11.09

初めに

しばらく前に自宅のサーバ周りのモニタリングを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時点では存在したようなパラメータが落ちていたり、extendssysobjectidもなかったので書き足します。

# 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もまだまだ使いこなせてないところはありますのでもっといい感じに使っていけるように頑張ります。