Netdata でモニタリングスタックを構築してみた

# はじめに

サーバのモニタリングを行うのに便利な Netdata のご紹介です。

# Netdata とは

[Netdata] はサーバのモニタリングツールです。モニタリングといえば最近は Prometheus を使うことが多いのではないかと思いますが、Netdata は Prometheus とは少し異なるアプローチで設計されています。

| 項目                 | Prometheus                 | Netdata                         |
|----------------------|----------------------------|---------------------------------|
| 設定ファイル         | 必要                       | 不要                            |
| 対象サーバ           | 複数のリモートサーバ       | ローカルサーバのみ              |
| 集計するメトリクス   | エクスポータを使用して集計 | あらゆるメトリクスを自動で集計  |
| メトリクスの保存期間 | 長期間                     | 短期間                          |
| 可視化               | 主に Grafana を利用        | 同梱の Web ダッシュボードを利用 |
| 利用用途             | メトリクスのヒストリ管理   | リアルタイム監視                |

サーバのクラスタ全体のメトリクスを見たければ Prometheus を使い、各サーバのリアルタイムなメトリクスを見たければ Netdata を使うという使い方が想定されています（下記は [Netdata Documentation] より）。

[Netdata Documentation]: https://docs.netdata.cloud/backends/

<div style="text-align:center">
    <img src="https://cloud.githubusercontent.com/assets/2662304/20649711/29f182ba-b4ce-11e6-97c8-ab2c0ab59833.png" />
</div>

ダッシュボードがとても格好いいです。

<div style="text-align:center">
    <img src="https://user-images.githubusercontent.com/1153921/70638670-85dd5080-1bf6-11ea-893e-94400f445574.gif" />
    <img src="https://user-images.githubusercontent.com/2662304/48311876-f9093300-e5ae-11e8-9c74-e3e291741990.gif" />
</div>

Netdata は普段見たいと思うほぼ全てのメトリクスを自動で集計してくれます。

- CPU 使用率
- メモリ使用量
- スワップ
- ディスク I/O
- ネットワーク
- スレッド数
- プロセス数
- 各種 RDB の稼働状況
- Apache/Nginx の稼働状況
- コンテナの稼働状況
- その他 Tomcat/WSGI/Fluentd/Hadoop など多数

# 始め方

Docker イメージが用意されているので簡単に起動ができます。

```shell
$ docker run -d --name=netdata \
  -p 19999:19999 \
  -v /etc/passwd:/host/etc/passwd:ro \
  -v /etc/group:/host/etc/group:ro \
  -v /proc:/host/proc:ro \
  -v /sys:/host/sys:ro \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  --cap-add SYS_PTRACE \
  --security-opt apparmor=unconfined \
  netdata/netdata
```

起動できたら http://localhost:19999 にアクセスすることで上記のようなダッシュボードが見れるようになります。

# Prometheus エクスポータ

Netdata は直近 1 時間のメトリクスしか保存していないので、長期間のメトリクス監視には向いていません。しかし Netdata には Prometheus エクスポータの機能が付いているため、Prometheus と連携すればメトリクスの長期保存も可能になります。しかもあらゆるメトリクスを自動で集計しているので、万能エクスポータとして利用することができます。

下記 URL にアクセスすると Prometheus が読み取れる形式でメトリクスをエクスポートできます。

```shell
http://localhost:19999/api/v1/allmetrics?format=prometheus
```

この URL を Prometheus 側に登録してあげれば Grafana で過去分のメトリクスも可視化できるようになります。

# Shell エクスポータ

メトリクスは環境変数として取り込むこともできます。

```shell
$ eval "$(curl -s http://localhost:19999/api/v1/allmetrics)"
$ set | grep "^NETDATA_SYSTEM_CPU"
NETDATA_SYSTEM_CPU_GUEST=0
NETDATA_SYSTEM_CPU_GUEST_NICE=0
NETDATA_SYSTEM_CPU_IDLE=95
NETDATA_SYSTEM_CPU_IOWAIT=0
NETDATA_SYSTEM_CPU_IRQ=0
NETDATA_SYSTEM_CPU_NICE=0
NETDATA_SYSTEM_CPU_SOFTIRQ=0
NETDATA_SYSTEM_CPU_STEAL=0
NETDATA_SYSTEM_CPU_SYSTEM=1
NETDATA_SYSTEM_CPU_USER=4
NETDATA_SYSTEM_CPU_VISIBLETOTAL=5
```

環境変数でメトリクスが取れると各種 Linux コマンドを叩かなくてもメトリクスが参照できるので、Shell スクリプトがキレイに書けるようになります。

# Confluence への埋め込み

私は使ったことがないですが、Netdata のダッシュボードは Confluence にも埋め込むことができるので紹介しておきます。

html プラグインが利用可能であれば下記のように Confluence にグラフの埋め込みができるようになります。

<div style="text-align:center">
    <img src="https://user-images.githubusercontent.com/2662304/34329700-989f0f2e-e912-11e7-8ac9-c78f82cfbdb0.png" />
</div>

詳細な使い方はこちらを参考にしてください。
https://docs.netdata.cloud/web/gui/confluence/

# その他の API

Netdata は他にも便利な API を備えています。

- メトリクスを CSV/JSON で取得
- Google charts 連携

などは便利そうだと思いました。各 API の使い方は下記を参考にしてください。

- API: https://docs.netdata.cloud/web/api/
- Swagger: https://registry.my-netdata.io/swagger/

# まとめ

Netdata は導入の敷居が低い上に、いろんなツールと連携してモダンなモニタリングができますので、ぜひお試しください。

[Netdata]: https://www.netdata.cloud/
[Prometheus]: https://prometheus.io/
[Grafana]: https://grafana.com/