【ARM64】New RelicでDockerサーバー監視 on Docker on RasPi4

最近Raspberry Pi 4B（4GB）上のDockerでサービスを次から次へと立ち上げていて、サーバー監視してみたくなってきたのでやり方をメモ。

- Dockerに対応したサーバー監視ツール
- ARMアーキテクチャに対応
- サーバー監視そのものもDocker上で行いたい

という欲張りな人には役立つはず。

## やること
Raspberry Pi 4B（4GB）上で動いているサーバーの状態（CPU・メモリ・プロセス）を監視する。

## 環境
- Raspberry Pi 4B（4GB）
- [Raspberry Pi OS 64bit beta](https://www.raspberrypi.org/forums/viewtopic.php?p=1668160)
- Docker 19.03.12
- Docker Compose 1.26.2

[nginx-proxy](https://github.com/nginx-proxy/nginx-proxy)を使って各サーバーへのリクエストを振り分けている。

## New Relic について
サーバー監視ツールはいくつもありますが、その中でDockerに対応しているツールとなると限られてくる。サービスの選定は[こちらの記事](https://thinkit.co.jp/article/9318)を参考にして、SaaS型で手軽に無料で使えそうなNew Relicを選んだ。
サーバー監視ツールは価格が高く、個人開発でちょろっと公開しているだけのサービスに導入するのは敷居が高い気がしていたが、New Relic Oneでは毎月100GBのデータ取り込みまでは無料ライセンスで使える。個人で使う分であれば十分すぎる容量だ。
New Relicにはアプリのパフォーマンス監視（APM）やPingによる死活監視など複数のサービスがあるが、今回使うのはCPUやメモリの使用量を見られるInfrastructure。

## アカウント作成・ライセンスキー取得
[New Relicのサイト](https://newrelic.com/jp)にアクセスして、右上にある「無料サインアップ」を押してアカウントを作る。アカウントが作成できたら、右上のアカウントのドロップダウンから` Account settings`を選択し、左のサイドバーから`API keys`をクリックする。
`Create key`を押して、`Key type`を`Ingest - License`、`Name`を任意の名前にしてキーを作成する。

## Dockerコンテナを立てる
x86-64であれば公式にDockerイメージが提供されているので、それを[公式のドキュメント](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent/linux-installation/docker-container-infrastructure-monitoring)に従ってコンテナを起動すればいいだけなのだが、arm64なので自前でビルドする必要がある。

### Dockerイメージのビルド
とはいえ、イメージの中に突っ込まれる`newrelic-infra`、`newrelic-infra-ctl`、`newrelic-infra-service`の3つのバイナリを差し替えればいいだけ。
バイナリは公式に提供されているので、以下のリンクよりダウンロード（2021年1月現在では1.9.7が最新）。
[https://download.newrelic.com/infrastructure_agent/binaries/linux/](https://download.newrelic.com/infrastructure_agent/binaries/linux/)

```sh
mkdir ~/newrelic-infra-setup
cd ~/newrelic-infra-setup
wget https://download.newrelic.com/infrastructure_agent/binaries/linux/arm64/newrelic-infra_linux_1.9.7_arm64.tar.gz
tar -zxvf newrelic-infra_linux_1.9.7_arm64.tar.gz
```

次に[newrelic/infrastructure-agent](https://github.com/newrelic/infrastructure-agent)のGitHubリポジトリをCloneする。

```sh
git clone https://github.com/newrelic/infrastructure-agent.git
```

Dockerイメージをビルドする方法は[このページ](https://github.com/newrelic/infrastructure-agent/blob/master/build/container/README.md)を参考にした。まずダウンロードしたバイナリを指定のフォルダにコピーする。`linux_amd64`にarm64バイナリを入れるというのもアレだが、そこはスルーで。

```sh
mkdir -p infrastructure-agent/target/bin/linux_amd64
cp newrelic-infra/usr/bin/* infrastructure-agent/target/bin/linux_amd64/
cd infrastructure-agent/build/container
export IMAGE_VERSION=1.0  # 適当に。指定しなければ0.0になる
make build/base
```

### Dockerコンテナを立てる
これでDockerイメージが生成されたので、後はx86-64と同じ手順でコンテナを立てる。手順は[このページ](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent/linux-installation/docker-container-infrastructure-monitoring)に従えばいい。

最初に取得したライセンスキーを`newrelic-infra.yml`に入れます。

```sh
cd ~/newrelic-infra-setup
echo "license_key: {YOUR_LICENSE_KEY}" > newrelic-infra.yml
touch newrelic-infra.dockerfile
vim newrelic-infra.dockerfile  # どのエディタでも大丈夫
```

```dockerfile:newrelic-infra.dockerfile
FROM newrelic/infrastructure:latest
ADD newrelic-infra.yml /etc/newrelic-infra.yml
```

```sh
touch docker-compose.yaml
vim docker-compose.yaml  # どのエディタでも大丈夫
```

```yaml:docker-compose.yaml
version: '3'

services:
  agent:
    container_name: newrelic-infra
    build:
      context: .
      dockerfile: newrelic-infra.dockerfile
    cap_add:
      - SYS_PTRACE
    network_mode: host
    pid: host
    privileged: true
    volumes:
      - "/:/host:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
    restart: unless-stopped
```

```sh
docker-compose build
docker-compose up -d
```

これでもうサーバー監視がもう始まっているので、New RelicのWebサイト上の上部バーから`Infrastructure`を選んでみると、CPU使用率や空きメモリの割合等がグラフで表示されている。

![Screenshot_2021-01-12 Infrastructure New Relic One.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451958/f7c19399-0165-fd81-db2d-9de6c48d1166.png)


また、上部バーから`Entity explorer`を開いてみると、他にも色々なグラフや表があるので、好きなものをダッシュボードに追加すると良い。

![Screenshot_2021-01-12 Docker New Relic One.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451958/3518ecc9-079f-55b4-687c-816468a98373.png)

`newrelic-infra`が一番CPU使ってますね、草。

### 不具合

- Infrastructure > Hosts > Docker Containers でコンテナごとの情報が取得されていない
- `docker-compose logs`するとエラーを吐いている（`"integration exited with error state"`）

Docker対応ということでNewRelicを選んだのに使えないのは本末転倒なのでなんとか直したい。


## 参考文献
[New Relic Pricing（日本語）](https://newrelic.com/jp/pricing)
[New Relic license key](https://docs.newrelic.com/docs/accounts/accounts-billing/account-setup/new-relic-license-key)
[Docker container for infrastructure monitoring](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent/linux-installation/docker-container-infrastructure-monitoring)
[Docker instrumentation for infrastructure monitoring](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent/linux-installation/docker-instrumentation-infrastructure-monitoring)
[newrelic/infrastructure-agent](https://github.com/newrelic/infrastructure-agent)
[newrelic/infrastructure-agent - Containerized Agent](https://github.com/newrelic/infrastructure-agent/blob/master/build/container/README.md)
[newrelic/infrastructure-agent - ARM64 (aarch64) support #107](https://github.com/newrelic/infrastructure-agent/issues/107)
[Dockerコンテナの監視を行うサービス](https://thinkit.co.jp/article/9318)
[「デジタル・ニューノーマル構想」を掲げるNew Relicが製品や価格体系を刷新](https://ascii.jp/elem/000/004/024/4024253/)