標準Agentと違う「Datadog IoT Agent」って何？

## はじめに
本記事を [Datadog アドベントカレンダー2023](https://qiita.com/advent-calendar/2023/datadog) の12月4日に投稿します。

Datadogはサーバーを監視・モニタリングするさまざまなオブザーバビリティ機能を利用できます。AWSやAzureなどのクラウドサービスとDatadogを連携（インテグレーション）するだけでもモニタリングを開始できますが、仮想サーバーOSに Datadog Agent をインストールすると高度な監視・モニタリングができます。そして IoTデバイスに組み込みされたアプリケーション向けの Datadog IoT Agent が存在することをご存じでしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/0f69c4bc-e318-1e27-aedb-86fdaee9eb33.png)


## Datadog IoT Agent とは
Datadog の Iot Agent は、IoTデバイス及び組み込みアプリ用のAgentです。
サイネージやセキュリティ・デバイスなどを監視することを目的としているとのこと。

### できること
機能は、CPU・メモリのリソース、ディスク、ネットワーク、Systemd、NTPの監視。
独自の監視メトリクスは DogStatsD サーバーを経由して監視できる。
Journaldなどのログ収集もできる。

### できないこと
サーバー向け標準Agentにパッケージされている機能が少ない。

### リソース比較
|   | IoT Agent | Standard Agent |
|:-:|:-:|:-:|
| 平均利用CPU | 0.5% | 0.08% |
| メモリ | 36MB | 130MB |
| ネットワーク帯域 | アップ237bps, ダウン79bps | アップ800bps, ダウン140bps |
| 占有ディスク | 63MB | 830MB~880MB |

## ゴールの姿
Datadog IoT Agentを使って、ダッシュボードでIoTデバイスとなるラズパイを監視・モニタリングする。中央の赤色グラフがラズパイの温度センサーの値。今年の11月はとても暖かかったので毎日20℃以上ありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/9b0077ae-4ab0-8656-8b3d-b9022c0dd05b.png)


## インストール
Raspberry Pi 3B ラズパイに Datadog IoT Agent をインストールしてみる。
いつものようにDatadogコンソールのインテグレーションメニューから対象OSを探すと・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/e10efd2f-4714-7158-97c4-0a4060423a16.png)

### RaspberryPi OS は見つからない？
Datadog ポータルのインテグレーション メニューからは RaspberryPi OS が見つかりません。下記のWEBサイトに IoT Agent のインストール手順が記載されていました。

[https://docs.datadoghq.com/ja/agent/iot/](https://docs.datadoghq.com/ja/agent/iot/)

説明によると下記のコマンドで Datadog IoT Agent を自動インストールできます。標準Agentのコマンドと異なるのは「DD_AGENT_FLAVOR」オプションの部分に"datadog-iot-agent"を指定することです。
```
pi@raspberrypi:~ $ DD_API_KEY=<YOUR_DD_API_KEY> DD_SITE="datadoghq.com" \
DD_AGENT_FLAVOR=datadog-iot-agent \
bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script_agent7.sh)"
```
### インストールを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/78e761fe-cbd3-179d-2727-704909b4a73a.png)

インストール後、サービスのステータスが Running になって、サービス名の横に「Datadog IoT Agent」が表示されることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/14980d7a-4bd3-0ed2-2c5c-133748f83309.png)

## IoT デバイスをモニタリング
なんちゃってIoTですが寒くなってきた室内環境をラズパイで計測してみます。GPIOには温度センサー「DS18B20」を繋ぎました。ラズパイ上のセンサーの読み取りなどは[既出のブログ](https://funnygeekjp.com/geek/20200112iot.html "FunnyGeek by かの")で紹介しています。前回はIoT Agentがなかったので標準Agentで試していましたが、今回はIoTに特化したAgentです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/3d56540c-227d-ce74-69ef-f75dc12c1771.png)

### デフォルトのダッシュボード
IoT Agentが起動するとDatadogダッシュボードでモニタリングがスタートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/d91672e2-2809-abe0-dcb8-5b3afb50cfa5.png)

### 初期設定
独自メトリックをモニタリングするために大切な設定ファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/a01d0894-363b-15b6-fced-b22366968167.png)

## （参考）ラズパイの温度データをモニタリングする方法
この章では温度データを「iotdata.json」というファイルに書き込みます。あとでこの温度データをDatadogダッシュボードに監視メトリックスとして送信します。

### 1-Wire デジタル温度センサー(DS18B20)

1-Wireデバイスをラズパイのブート・コンフィグに追加して使います。
設定ファイル： /boot/config.txt
追加する設定値： dtoverlay=w1-gpio,pullup=on 
```
$ sudo nano /boot/config.txt
```
一旦、再起動してデバイスを認識します。
```
$ sudo reboot
```

Linuxコマンドで温度データを読み取ります。「t=29812」を1000で割って29.8℃としています。
```
$ cat /sys/bus/w1/devices/28-031652ddc4ff/w1_slave
 
dd 01 4b 46 7f ff 0c 10 06 : crc=06 YES
dd 01 4b 46 7f ff 0c 10 06 t=29812
```



### 温度データをDatadogダッシュボードに送信する python コード
ラズパイで読み取った温度センサーの値は、Datadog IoT Agent に含まれている DogStatsD というメトリクス集計サービスを経由して、独自メトリックスとしてダッシュボードに記録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/d9bd3839-d978-74da-4171-70c82ad9d337.png)


```/home/pi/cron_temperature_datadog.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datadog import initialize, statsd
import subprocess

# DogStatsD インスタンスを作成
options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}
initialize(**options)

# 温度センサー（CPU）
CPU = float(subprocess.getoutput("cat /sys/class/thermal/thermal_zone0/temp"))/1000
# 温度センサー（室温）
TEMP = "cat /sys/bus/w1/devices/28-031652ddc4ff/w1_slave"
TEMP = subprocess.getoutput( TEMP )
TEMP = float(TEMP[-5:])/1000
# DogStatsDに値を渡してDatadogポータルへ反映する
statsd.gauge('kano_CPU_temp', CPU, tags=["environment:dev"])
statsd.gauge('kano_Room_temp', TEMP, tags=["environment:dev"])

# END
```

### pythonコードを毎分起動する
温度センサーの値を毎分、jsonファイルに出力するように crontab -e で設定しました

```
$ crontab -e

# ファイルの最下段に下記を追加
*/1 * * * * python /home/pi/cron_temperature_datadog.py
```

### Datadog Iot Agent の DogStatsD を有効化する

```/etc/datadog-agent/datadog.yaml
## @param use_dogstatsd - boolean - optional - default: true
## Set this option to false to disable the Agent DogStatsD server.

use_dogstatsd: true           # コメントを解除した

## @param dogstatsd_port - integer - optional - default: 8125
## Override the Agent DogStatsD port.
## Note: Make sure your client is sending to the same UDP port.
#
dogstatsd_port: 8125          # コメントを解除した

```


### ダッシュボードに独自メトリックスが届く検査
メニュー[Metrics] > [Explorer]
メトリックス名にわかりやすく「kano_room_temp」という名前を設定しておいたので「kano」で検索すると温度データが記録開始されたことを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/dbae64b8-9826-e90f-7451-60ce7e66110f.png)

### グラフ種類は「ライン」と「棒グラフ」のどちらを使っていますか
グラフ種類「Lines（下図の折れ線グラフ）」を使うとメトリックスが欠損しているときでもデータとデータを繋いでしまうのでメトリックスが欠損していることに気づき難いと思います。データ欠損も可視化するにはグラフ種類「Bars（下図の棒グラフ）」の方がわかりやすいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/ecfad801-1dd1-9bb7-fbe3-c279e199eb22.png)

### 予測モニタリング
これから本格的な冬なのでいつから寒くなるのか予想してもらいました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/5b228945-87a3-49e1-eb84-0d4a67f58b34.png)

### もちろん監視アラートも届きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/315cf3f9-e346-3f21-c639-234c2b5ddb71.png)

## 以上、まとめ

- Datadog IoT Agent をインストールして使い方を検証しました
- ラズパイ（RaspberryPi OS）で監視・モニタリングできました
- 今回は室温データをモニタリングできました（カスタムメトリックス）
つまり、IoTデバイスとしてのデータ自体も Datadog でモニタリングできます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/7b2d3b7e-a72b-2f52-9d13-e7cbec3ef220.png)

いつか、たくさんのIoTデバイスをひとまとめにしてオブザーバビリティしてみたいです。