DynatraceのExtensions 2.0でカスタムSNMPを試してみた

# はじめに

Dynatraceの機能を拡張し、より多くの機器の監視を可能とするExtensions 2.0 がリリースされました。
本記事では、Extensions 2.0で対応可能なSNMPについて実際の設定についてまとめました。

15日間の無料トライアルを利用することができるので、自分の環境でも簡単に試してみることができます。
[Dynatraceフリートライアル](https://www.dynatrace.com/ja/trial/)

## 参考URL
Dynatraceの公式サイトに必要な情報がまとまっています。

[Extensions 2.0 | Dynatrace Documentation](https://www.dynatrace.com/support/help/extend-dynatrace/extensions20/)

# 前提条件

SNMPのリクエストはActiveGateから行われるため、監視対象のデバイスはActiveGateからアクセスできる必要があります。

# 設定手順

## API Token の発行

Extension 2.0はAPI経由で設定する必要があるため、API Tokenの発行を行う。

Dynatrace GUI上のSettings > Integration > Dynatrace APIを選んでいく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/e8eb69e7-2e73-8a6b-0409-a745fb95e10c.png)

Generate tokenをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/64944269-0a38-a5c4-8fc0-14f7314c61b7.png)

任意の名前を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/e80321a0-4f79-cf68-0d1e-974f3a68efc5.png)

API v2で以下を有効にする。

* Read extensions
* Write extensions
* Read extension environment configurations
* Write extension environment configurations
* Read extension monitoring configurations
* Write extension monitoring configurations

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/8a4c7e70-13d0-4415-d10b-2b06e105a8ac.png)

`Generate`ボタンをクリックするとAPIが生成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/b5dd21ef-ed1e-b9e2-0847-198a83381f0b.png)

## Extensionの作成

### Schemeファイルのダウンロード

以下のコマンドを実行することでschemaファイルのダウンロードをすることが可能。

```bash
curl -X GET "https://${ENV_ID}.live.dynatrace.com/api/v2/extensions/schemas/1.215/extension.schema.json" \
-H "accept: application/json; charset=utf-8" \
-H "Authorization: Api-Token ${API_TOKEN}" | jq . > extension.schema.json
```

```bash
curl -X GET "https://${ENV_ID}.live.dynatrace.com/api/v2/extensions/schemas/1.215/snmp.schema.json" \
-H "accept: application/json; charset=utf-8" \
-H "Authorization: Api-Token ${API_TOKEN}" | jq . > snmp.schema.json
```

`${ENV_ID}`は自分に割り当てられているテナントのID、`${API_TOKEN}`は先ほど生成したAPI_TOKENにそれぞれ置き換えます。

### Extensionの作成

schemaファイルの定義や公式サイトのドキュメントに従ってyaml形式で設定をしていく。

```yaml:extension.yaml
name: custom:katsu.snmp.extension
version: 1.0.0
minDynatraceVersion: "1.215"
author:
  name: "sukatsu"

snmp:
  - group: Linux-Server
    interval: 5m
    dimensions:
      - id: snmp.generic.device.name
        value: oid:1.3.6.1.2.1.1.5.0
      - id: snmp.generic.device.address
        value: this:device.address
      - id: snmp.generic.device.port
        value: this:device.port

    subgroups:
      - subgroup: SNMP health
        table: false
        metrics:
          - id: snmp.generic.snmp.in.pkts
            value: oid:1.3.6.1.2.1.11.1.0
            type: count
            metadata:
              displayName: The total number of messages delivered from the transport service
              unit: Count 
          - id: snmp.generic.silentdrops
            value: oid:1.3.6.1.2.1.11.31.0
            type: count
            metadata:
              displayName: The number of silently dropped PDUs due to the large reply size
              unit: Count
      - subgroup: NIC status
        table: true
        dimensions:
          - id: snmp.generic.if.descr
            value: oid:1.3.6.1.2.1.2.2.1.2
          - id: snmp.generic.if.type
            value: oid:1.3.6.1.2.1.2.2.1.3
        metrics:
          - id: snmp.generic.if.lastchange
            value: oid:1.3.6.1.2.1.2.2.1.9
            type: gauge
            metadata:
              displayName: The value of sysUpTime when the interface entered its current state
              unit: Count
          - id: snmp.generic.if.in.errors
            value: oid:1.3.6.1.2.1.2.2.1.14
            type: count
            metadata:
              displayName: The number of inbound packets/transmission units with errors
              unit: Count
```

extensionを作成したらzipファイルに圧縮する。

## extensionへの署名

[Sign extension | Dynatrace Documentation](https://www.dynatrace.com/support/help/extend-dynatrace/extensions20/sign-extension/)

### 自己ルート証明書の作成

opensslが入っているサーバー等で以下のコマンドを実行し、ルート証明書を作成する。

```bash
openssl genrsa -out ca_one.key 2048
openssl req -days 10000 -new -x509 -key ca_one.key -out ca_one.crt
openssl rsa -in ca_one.key -pubout -out ca_one.pub.key
```

DynatraceではPFX, P12, PEM形式のみ対応しているので、以下のコマンドで変換を行う。

```bash
openssl pkcs12 -export -in ca_one.crt -nokeys -out ca_one.p12
```

### Dynatraceへのアップロード

Dynatrace GUI上のSettings > Web and mobile monitoring > Credential vault を選んでいく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/52da6347-e588-31aa-58da-3ae9187d2dfb.png)

`Add new credential`をクリックし、証明書のアップロードを行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/43f80bc3-76bd-85e8-5f25-d291c8e528e1.png)

ActiveGate側にも同じルート証明書をアップロードする。

* Linux: `<CONFIG>/remotepluginmodule/agent/conf/certificates/` (default: `/var/lib/dynatrace/remotepluginmodule/agent/conf/certificates/`)
* Windows: `%PROGRAMDATA%\dynatrace\remotepluginmodule\agent\conf\certificates`

### 開発者用の証明書の発行とextensionsへの署名

先ほど作成したルート証明書を用いて、extensionに署名するための証明書を作成する。

```bash
openssl genrsa -out developer.key 2048
openssl rsa -in developer.key -pubout -out developer.pub.key
openssl req -new -key developer.key -out developer.csr
openssl x509 -req -days 10000 -in developer.csr -CA ca_one.crt -CAkey ca_one.key -CAcreateserial -out developer.crt
```

以下のコマンドを実行し、extensionへ署名する。

```bash
openssl cms -sign -signer developer.crt -inkey developer.key -binary -in extension.zip -outform PEM -out extension.zip.sig
```

※extensionの内容を変更した場合には、改めて署名をする必要がある。

`extension.zip`と`extension.zip.sig`を１つのzipファイルにまとめる。

```
snmp-custom-extension.zip
│   extension.zip
│   extension.zip.sig
```

## extensionsのアップロード

以下のコマンドを実行して、extensionsのアップロードと使用するバージョンの指定をします。

```bash
curl -X POST "https://${ENV_ID}.live.dynatrace.com/api/v2/extensions" \
-H "accept: application/json; charset=utf-8" \
-H "Authorization: Api-Token ${API_TOKEN}" \
-H "Content-Type: multipart/form-data" \
-F "file=@snmp_extension.zip;type=application/zip"
```

```bash
curl -X PUT "https://${ENV_ID}.live.dynatrace.com/api/v2/extensions/<extension_name>/environmentConfiguration" \
-H "accept: application/json; charset=utf-8" \
-H "Authorization: Api-Token ${API_TOKEN}" \
-H "Content-Type: application/json; charset=utf-8" \
-d "{\"version\":\"1.0.0\"}"
```

`<extension_name>`はextension.yamlで設定した名前を指定する。

## Monitoring Configurationの作成とアップロード

### Monitoring 設定の作成

監視対象デバイスの情報を記載したjsonファイルを作成する。

```json:snmp_monitoring.json
[
  {
    "scope": "ag_group",
    "value": {
      "version": "1.0.0",
      "description": "SNMP monitoring configuration",
      "enabled": true,
      "snmp": {
        "devices": [
          {
            "ip": "<Device IP Address>",
            "port": 161,
            "timeoutSecs": 5,
            "retries": 0,
            "maxRepetitions": 50,
            "authentication": {
              "type": "SNMPv2c",
              "community": "public"
            }
          }
        ]
      }
    }
  }
]
```

`<Device IP Address>`には監視対象のデバイスのアドレスを指定する。
`scope` にはActiveGateのグループ名を指定する。

### Monitoring 設定のアップロード

以下のコマンドを実行して設定をアップロードする。

```bash
curl -X POST "https://${ENV_ID}.live.dynatrace.com/api/v2/extensions/<extension_name>/monitoringConfigurations" \
-H "accept: application/json; charset=utf-8" \
-H "Authorization: Api-Token ${API_TOKEN}" \
-H "Content-Type: application/json; charset=utf-8" \
--data @snmp_monitoring.json -i
```

以下のようなレスポンスが返ってくれば正常にアップロードできています。

```json
[{"objectId":"xxxxx","code":200}]
```

# Metricの確認

Dynatrace GUIのMetricsの画面で設定したextensionsの情報を確認可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/c5066928-3e45-eef4-93b4-d60940eec7d3.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/ead4766a-d02f-5e93-3d35-de7b649bb154.png)

`Details` の矢印メニューから`Create chart`をクリックすることでカスタムチャートの設定とダッシュボードへのピン付けが可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/c2befa9b-3407-a244-a4f1-4055a733d131.png)

# まとめ

本記事ではDynatraceで新しく導入されたExtensions 2.0 のカスタムSNMPについて設定方法をまとめました。
SNMPはネットワーク機器を中心に今でも使われており、様々なデータを収集できるのでDynatraceで一元管理ができるとより便利に使うことができると思います。