NetdataをNetdata Parentsで統一的にモニタリングする

# Netdataとは
Netdataとは分散型のリアルタイムパフォーマンスモニタリングツールです。サーバーの稼働状況などをリアルタイムに把握することを目的としています。他ツールに比べて導入が容易で扱いやすいですが、監視ツールではないのでログ取りには向いていません。詳しくは先駆者様や公式ドキュメントも参照してください。

https://dev.classmethod.jp/articles/netdata/

https://github.com/netdata/netdata

https://www.netdata.cloud


## Netdata Parentsとは
Netdataは本来、分散型としてすべてのシステムで独立して動くソフトウェアで、ユーザー側のブラウザ上のキャッシュファイルに複数のサーバーを見ているという旨の情報を保存し、管理します。Netdata Parentsとはそれらのソフトウェアを「親」と「子」に分けて管理し、親ノードはメトリクスデータを受信、保存、処理する中央ノードとして構成することができます。今回はこの機能を用いてネットワーク内の監視対象を簡単かつ統一的にモニタリングできるようにします。

https://learn.netdata.cloud/docs/streaming/

# Netdataの導入
今回は親と子で異なる導入方法を用います。
- 親サーバー：ESXi上のVM Ubuntu22.04×1
    - docker copmoseでのインストール
- 子サーバー：物理サーバー Ubuntu22.04×3
    - ansibleを用いた一括インストール(docker非使用)

親サーバーがdocker composeなのは、他のマシンでも環境の再現が比較的しやすいからです。

### 親へのインストール
こちらはdocker composeを用いてインストールします。また、httpsにも対応したいので今回は[https-portal](https://github.com/SteveLTN/https-portal)でLet's Encryptの証明書を利用します。
元のdocker-compose.ymlは[公式ドキュメント](https://learn.netdata.cloud/docs/installing/docker#with-host-editable-configuration)を参照しています。httpsにする必要がない場合や、その下にある公式ドキュメントに添ったCaddyを用いたLet's Encryptの利用を行う場合はそちらを利用してください。

```yaml:docker-compose.yml
version: '3'
services:
  netdata:
    image: netdata/netdata
    container_name: netdata
    hostname: my_netdata #任意の名前
    pid: host
    network_mode: host
    restart: unless-stopped
    cap_add:
      - SYS_PTRACE
      - SYS_ADMIN
    security_opt:
      - apparmor:unconfined
    volumes:
      - ./netdataconfig/netdata:/etc/netdata:rw #公式ドキュメントだと:roになってるけどこれじゃ動かない
      - netdatalib:/var/lib/netdata
      - netdatacache:/var/cache/netdata
      - /etc/passwd:/host/etc/passwd:ro
      - /etc/group:/host/etc/group:ro
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /etc/os-release:/host/etc/os-release:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    network_mode: host
    restart: always
    environment:
      DOMAINS: 'netdata.hoge.com -> http://127.0.0.1:19999'
      STAGE: 'production'
      # FORCE_RENEW: 'true'
    volumes:
      - ./data/https-portal:/var/lib/https-portal

volumes:
  netdatalib:
  netdatacache:
```
これを任意の場所において`docker compose up -d`として導入完了。
ドメイン名もしくはIPアドレスでブラウザから見るとnetdataの画面が見れるはずです。
![スクリーンショット 2023-08-16 11.06.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986547/fa131abc-29c6-5e04-83ba-5c54b6eeae3a.png)


### streamingの下準備
子へのインストールに取り掛かる前に、先ほど設定した親ノードにAPIキーを登録します。やり方は以下に従って行います。

https://learn.netdata.cloud/docs/streaming/understanding-how-streaming-works#enable-streaming-on-the-parent-node

まずは、親ノードでuuidgenを実行してapiキーを決定します
```shell
sudo apt install uuid-runtime #もしなければ
uuidgen
~~ここにapiキーが表示される~~
```
次にnetdataのディレクトリに移動してスクリプトを起動します
```shell
cd ~/netdata/netdataconfig/netdata #環境により異なります 
sudo ./edit-config stream.conf
```
そうするとnanoが起動するので[API_KEY]で始まるセクションまでスクロールし、先ほど出てきたuuidを入力します。
```diff_conf
- [API_KEY]
+ [11111111-2222-3333-4444-555555555555] #さっきのapiキー
    # Default settings for this API key

    # This GUID is to be used as an API key from remote agents connecting
    # to this machine. Failure to match such a key, denies access.
    # YOU MUST SET THIS FIELD ON ALL API KEYS.
    type = api

    # You can disable the API key, by setting this to: no
    # The default (for unknown API keys) is: no
-   enabled = no
+   enabled = yes

    # A list of simple patterns matching the IPs of the servers that
    # will be pushing metrics using this API key.
    # The metrics are received via the API port, so the same IPs
    # should also be matched at netdata.conf [web].allow connections from
    allow from = *

    # The default history in entries, for all hosts using this API key.
    # You can also set it per host below.
    # For the default db mode (dbengine), this is ignored.
    #default history = 3600

    # The default memory mode to be used for all hosts using this API key.
    # You can also set it per host below.
    # If you don't set it here, the memory mode of netdata.conf will be used.
    # Valid modes:
    #    save     save on exit, load on start
    #    map      like swap (continuously syncing to disks - you need SSD)
    #    ram      keep it in RAM, don't touch the disk
    #    none     no database at all (use this on headless proxies)
    #    dbengine like a traditional database
-   #default memory mode = dbengine
+   default memory mode = dbengine
```
これで下準備完了。保存して`docker compose restart`でnetdataのdockerを立ち上げ直しておきます。

### 子へのインストール
こちらはAnsibleというツールを用いて複数台に同時にnetdataを導入します。Ansibleについての詳細な説明は省きますが、冪等性を担保しながら複数のマシンに同じ設定などを反映させることができます。netdataにおいても、公式でansibleを用いた導入手順が解説されているほか、公式のansibleのgithubがあるのでこれに手を加えていきます。

https://learn.netdata.cloud/docs/installing/install-with-a-cicd-provisioning-system/ansible

https://github.com/netdata/ansible

やることはstreamingの設定を加える設定なので、以下に筆者が変更を加えたansibleを用意しました。


https://github.com/tsukky67/ansible-netdata-streaming

別途ansibleを実行するためのサーバーを用意するのも面倒なので今回は親のサーバーで実行します。ネットワークが疎通するならなんでもいいです。 

事前準備として親のサーバーからこのサーバーにSSHできるようになっている必要があります。その為、公開鍵を事前に登録しておいてください。
また、パスワード認証で行いたいという場合は以下を`ansible.cfg`に追記してください。
```diff_yaml
[defaults]
inventory      = ./hosts
gathering = smart
ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
+ask_pass = True
display_skipped_hosts = False
fact_caching = yaml
fact_caching_timeout = 86400
fact_caching_connection = /tmp/facts_cache
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
+ [privilege_escalation]
+ become_ask_pass = True
```
hostsファイルに適応したいサーバーを書いた上で以下を実行しました。

```shell
sudo apt install ansible-playbook #ansibleの実行環境をインストール
ansible-playbook netdata-agent.yml #netdataの各サーバーへのインストール
#もしパスワード認証をオンにしていた場合は以下も入力する
#SSH password:
#BECOME password[defaults to SSH password]:
ansible-playbook streaming.yml #netdataのparentsへのデータを送信する設定
#もしパスワード認証をオンにしていた場合は以下も入力する
#SSH password:
#BECOME password[defaults to SSH password]:
Input parent ip: xx.xx.xx.xx
Input parent API key: xx-xxx-xxxx
```
これで最初に作った親ノードのページを確認しに行くと各サーバーがNodesの中に表示されるようになっているはずです。![スクリーンショット 2023-08-16 11.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986547/9ac58335-d35f-478e-0f41-fc8615fe8251.png)

# まとめ
今回はNetdata Parentsでモニタリング環境を構築しました。親のサーバーをさらにNetdata cloudと接続したり、プロキシとして利用する他ミラーリングなども可能なので色々な活用方法を検討してみてください。