New Relic のSNMP機能でモニタリングしているデバイスの設定一覧を管理しよう！

## はじめに
### New Relic を活用したネットワーク機器のモニタリング
　New Relicではネットワーク運用監視向けにNetwork Performance Monitoring(NPM)を提供しています。さまざまな機能を提供しており、SNMP、Syslog、Network Flowといったプロトコルに対応しています。
　今回はNPMのSNMP機能でポーリングしているデバイスの一覧がどこで管理されているのか、そしてデバイスの設定を外部ファイルで管理する方法について紹介します。ファイルを分けることで監視台数が多い等の理由で手動でのディスカバリーが必要な環境においてデバイスの一覧情報をファイルの置き換えることで更新できたり、モニタリング設定のバージョン管理ができるようになるといったメリットがあります。

:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::
:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

　今回紹介する New Relic NPM は、無料アカウントでも利用できます。是非永久無償ライセンスを[こちら](https://newrelic.com/jp/sign-up-japan)から試してみてください。

https://newrelic.com/jp/sign-up-japan

## デバイスの設定一覧はどこにあるのか
　New Relic の NPM は、kentik 社の ktranslate を使用してデバイスの情報を収集しています。どの機器からSNMPで情報を収集するのかという設定は、ktranslateの設定であるため New Relic の UI 上から設定を確認することはできません。
### snmp-base.ymlに書き込まれている
　ktranslate のSNMPの設定は、 snmp-base.yml で管理されていて、ポーリングしているデバイスの一覧もこのファイルに存在します。
正確には、ktranslateの起動に指定している **`-snmp`** のフラグで指定しているファイルです。

```console:ktranslateをDockerで起動する
docker run -d --name ktranslate-$CONTAINER_SERVICE \
--restart unless-stopped \
--pull=always -p 162:1620/udp \
-v `pwd`/snmp-base.yaml:/snmp-base.yaml \
-e NEW_RELIC_API_KEY=$YOUR_NR_LICENSE_KEY \
kentik/ktranslate:v2 \
  -snmp /snmp-base.yaml \
  -nr_account_id=$YOUR_NR_ACCOUNT_ID \
  -metrics=jchf \
  -tee_logs=true \
  -service_name=$CONTAINER_SERVICE \
  -snmp_discovery_on_start=true \
  -snmp_discovery_min=180 \
  nr1.snmp
```

### snmp-base.yml の構成要素
snmp-base.yml のファイルは大きく４つのセクションに分かれています。
<dl>
  <dt>devices</dt>
  <dd>
    SNMPでポーリングしているデバイスの情報、設定が記載されています。<br>
    <strong>device_name</strong> が New Relic の UI に表示されているデバイスのエンティティ名です。
  </dd>
  <dt>trap</dt>
  <dd>SNMPTrapを有効化する場合に必要な設定が記載されています。</dd>
  <dt>discovery</dt>
  <dd>SNMPでポーリングするデバイスを探索する際に必要な設定が記載されています。</dd>
  <dt>global</dt>
  <dd>SNMPでポーリングする際のタイムアウトやリトライ回数のデフォルト設定が記載されています。</dd>
</dl>

各セクションに含まれるの設定値の詳細については、[New Relic の公式ドキュメント](https://docs.newrelic.com/jp/docs/network-performance-monitoring/advanced/advanced-config/#snmp-base-yml-template)もしくは[GithubのWiki](https://github.com/kentik/ktranslate/wiki/Sample-SNMP-config)で確認できます。

https://docs.newrelic.com/jp/docs/network-performance-monitoring/advanced/advanced-config/#snmp-base-yml-template


https://github.com/kentik/ktranslate/wiki/Sample-SNMP-config

## デバイスの設定を別ファイルで管理する方法
　デバイスの設定を外部の設定ファイルで管理することが可能です。
### 実践
　実際に外部設定ファイルを作成してみます。
 
#### 1\. snmp-base.yamlの設定
　　外部設定ファイルを使用するために devices セクションに "@ファイル名" の形式でファイル名を記載する。
```yaml:snmp-base.yaml
devices: "@network-devices.yaml"
trap:
    listen: 0.0.0.0:1620
    community: ""
    version: ""
    transport: ""
    v3_config: null
    trap_only: false
    drop_undefined: false
discovery:
    cidrs:
        - 192.168.100.1
        - 192.168.100.3
    ignore_list: []
    debug: false
    ports:
        - 161
    default_communities:
        - public
    use_snmp_v1: false
    default_v3: null
    add_devices: true
    add_mibs: true
    threads: 4
    replace_devices: false
    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
```
#### 2\. 外部設定ファイルを作成する
　下記のコマンドを使用して空の設定ファイルを作成します。
```console:空の設定ファイルを作成
touch network-devices.yaml
```
ここまでの手順で準備は完了です。この時点で作業ディレクトリには下記の様に**network-devices.yaml**と**snmp-base.yaml**が配置されている状態です。
```console:作業ディレクトリのイメージ
% ls -1
network-devices.yaml
snmp-base.yaml
```
あとはktranslateのコンテナを起動するだけです。またこの際に注意が必要なのは、ktranslateを起動する際のマウント引数に外部設定ファイルを設定する必要があるということです。下記のように指定することでデバイスの設定が外部設定ファイル **network-devices.yaml** に出力されます。
```console:ktranslateをDockerで起動する
docker run -d --name ktranslate-$CONTAINER_SERVICE \
--restart unless-stopped \
--pull=always -p 162:1620/udp \
-v `pwd`/snmp-base.yaml:/snmp-base.yaml \
-v `pwd`/network-devices.yaml:/network-devices.yaml \
-e NEW_RELIC_API_KEY=$YOUR_NR_LICENSE_KEY \
kentik/ktranslate:v2 \
  -snmp /snmp-base.yaml \
  -nr_account_id=$YOUR_NR_ACCOUNT_ID \
  -metrics=jchf \
  -tee_logs=true \
  -service_name=$CONTAINER_SERVICE \
  -snmp_discovery_on_start=true \
  -snmp_discovery_min=180 \
  nr1.snmp
```

ktranslateのコンテナを起動するとディスカバリーの処理が実行されて指定したIPアドレスの範囲にあるデバイスの情報を取得します。そのデバイスの情報が下記の**network-devices.yaml**に出力されます。
```yaml:network-devices.yaml
192.168.100.1__192.168.100.1:
    device_name: 192.168.100.1
    device_ip: 192.168.100.1
    snmp_comm: public
    use_snmp_v1: false
    debug: false
    port: 161
    oid: .1.3.6.1.4.1.1182.1.41
    description: RTX810 Rev.11.01.34 (Tue Nov 26 18:39:12 2019)
    last_checked: 2024-03-18T11:41:28.162192884Z
    mib_profile: yamaha-rt.yaml
    provider: kentik-router
    user_tags: {}
    discovered_mibs:
        - IF-MIB
        - YAMAHA-RT-HARDWARE
    match_attributes: {}
    monitor_admin_shut: false
    no_use_bulkwalkall: false
    purge_after_num: 0
192.168.100.3__192.168.100.3:
    device_name: 192.168.100.3
    device_ip: 192.168.100.3
    snmp_comm: public
    use_snmp_v1: false
    debug: false
    port: 161
    oid: .1.3.6.1.4.1.211.1.127.118.39
    description: '''SR-S318TL2'' ''2.1 V14.00'' ''Fri Jan 31 20:52:37 JST 2014'''
    last_checked: 2024-03-18T11:41:29.17629276Z
    mib_profile: sr-s.yml
    provider: kentik-switch
    user_tags: {}
    discovered_mibs:
        - FUJITSU-SRS
        - IF-MIB
    match_attributes: {}
    monitor_admin_shut: false
    no_use_bulkwalkall: false
    purge_after_num: 0
```

## まとめ
　今回はNPMのSNMP機能でポーリングしているデバイスの一覧を外部ファイルで管理する方法について紹介しました。このアプローチを採用する利点は、複数のネットワーク機器にわたる監視作業の効率化です。具体的には、外部ファイルを用いることで、機器の一覧更新や設定のバージョン管理を簡単に実行できるようになります。

　外部ファイルによる管理方法は、監視対象のネットワーク機器が増えた場合でも柔軟に対応できるため、スケーラビリティの面でもメリットがあります。New Relic NPMと外部ファイルを組み合わせることで、ネットワーク機器の効率的なモニタリングと運用の最適化・自動化を実現しましょう。

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::