DatadogNPMでネットワークを可視化する方法

# はじめに
Datadogで新サービス Datadog Network Performance Monitoring(以下DatadogNPM)が出たので、
それを使った所感と導入に必要な諸々な情報を一覧化しておきます。

ただし、この資料の内容はDatadogのドキュメントに記載されていることが大半なので、
詳しくは関連ドキュメントを参照ください。
https://docs.datadoghq.com/ja/network_performance_monitoring/installation
https://docs.datadoghq.com/ja/network_performance_monitoring/network_table/
https://docs.datadoghq.com/ja/network_performance_monitoring/network_map

# DatadogNPMは何ができるの？
簡単に言うとネットワークトラフィックの可視化ツールです。
どのホストからどのホストにどのくらいの容量でデータが送られたかを可視化できます。
このような形で表示されます。
※DB、Redis、APが入ったredash_serverとworkerが入ったredash_workerを雑に立てて検証してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/79ef7920-63c6-bb2d-6537-139136563f55.png)

またグラフィカルに表示することも可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/950802d8-787d-6db7-3278-de49f0a3da6a.png)

詳しくデータの流れを見ることも可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/531001df-c409-be76-b996-7a06ca52a73f.png)


# 何が嬉しいの？
可視化されることによって、障害対応やデータドリブンなオペレーションを可能にします。
例えば、あるホストで期待されるほどの性能ができないとき、実は想定した時と違う挙動をしていることに可視化をすることで気がつけます。
また過去のトラフィックが追えることにより、インフラリソースのキャパシティプランニングにも役立てます。

# DatadogNPMの仕組み
eBPF上でパケットをキャプチャし、それをDatadogAgentで集めて、
Datadogに送ることによってネットワークの可視化を行います。

またtagという単位で、ネットワークトラフィックの集計結果を見ることができ、
tagはユーザが自由につけることが可能です。
※ただし、tagをつけてもDatadogNPMに反映されるまで1日ほどかかりめんどくさかったです

# DatadogNPMの機能
Datadog上では以下の２つの機能があります。

- Network page

DatadogAgentが取得したネットワークトラフィックのスループット/送信量/受信量/RTTを一覧化します。
また再送が起こっているかの有無も確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/79ef7920-63c6-bb2d-6537-139136563f55.png)

- Network Map

Network MapはNetwork pageで表示されたデータを元にトラフィックを図示します。
またtagづけされた情報を元に図示するので、作りたい図によってタグを作り、
DatadogAgentが入っている各ホストでtagの設定をする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/950802d8-787d-6db7-3278-de49f0a3da6a.png)
# 導入方法
現状ではDatadogAgentを入れる必要があります。
また入れるためには以下の条件があります。

- DatadogAgentはv6.14以上
- kernelのバージョンが4.4.0以上のLinux

ここではDatadogAgentをdockerで入れる方法を紹介します。
※ドキュメントに記載されている内容の一部です

```
$ DOCKER_CONTENT_TRUST=1 docker run -e DD_API_KEY="<DATADOG_API_KEY>" \
	-e DD_SYSTEM_PROBE_ENABLED=true \
	-e DD_PROCESS_AGENT_ENABLED=true \
        -v /var/run/docker.sock:/var/run/docker.sock:ro \
        -v /proc/:/host/proc/:ro \
        -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
	-v /sys/kernel/debug:/sys/kernel/debug \
	--security-opt apparmor:unconfined \
	--cap-add=SYS_ADMIN \
	--cap-add=SYS_RESOURCE \
	--cap-add=SYS_PTRACE \
	--cap-add=NET_ADMIN \
	datadog/agent:latest
```

上記のコマンドを叩くだけで、DatadogAgentはホスト上で動きます。
`<DATADOG_API_KEY>`はご自身のアカウントで表示されるAPIキーをご利用ください。
※事前準備として、dockerでDatadogAgentを動かす場合は、dockerエンジンをインストールしてください

これだけで、Datadog Network Performance monitoringが動き始めます。

# DatadogNPMができないこと(2020/01/30現在)

- Network Pageを元に監視の設定ができない

Network Pageに表示される値を元にアラートの設定は現状できない。
例えば、ホスト間の通信で1GBの通信が走らないかを監視したい場合は、
DatadogAgentを各ホストに入れ、Network監視機能を使い、ホストのdeviceを監視することになる。
cf. https://docs.datadoghq.com/ja/integrations/network/#setup

```
system.net.bytes_rcvd
system.net.bytes_sent
```

- Network MapでIPなどを指定できない

Network PageではIPを元にトラフィックを一覧化できるが、
現状はtagがついてあるDatadogAgentが入っているホストでしか図示できない。

# 最後に
DatadogNPMが入ったことにより、
Datadogでよりインフラの統合的な監視ができるようになりました。
ただし、DatadogNPMの機能で監視設定ができなかったり、
DatadogNPMが全ホストで有効になっていないとうまく可視化されない状態だったりと、
痒いところにはまだ手が届いていない印象がありました。