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


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

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

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

やること

Raspberry Pi 4B(4GB)上で動いているサーバーの状態(CPU・メモリ・プロセス)を監視する。

環境

nginx-proxyを使って各サーバーへのリクエストを振り分けている。

New Relic について

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

アカウント作成・ライセンスキー取得

New Relicのサイトにアクセスして、右上にある「無料サインアップ」を押してアカウントを作る。アカウントが作成できたら、右上のアカウントのドロップダウンからAccount settingsを選択し、左のサイドバーからAPI keysをクリックする。
Create keyを押して、Key typeIngest - LicenseNameを任意の名前にしてキーを作成する。

Dockerコンテナを立てる

x86-64であれば公式にDockerイメージが提供されているので、それを公式のドキュメントに従ってコンテナを起動すればいいだけなのだが、arm64なので自前でビルドする必要がある。

Dockerイメージのビルド

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

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のGitHubリポジトリをCloneする。

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

Dockerイメージをビルドする方法はこのページを参考にした。まずダウンロードしたバイナリを指定のフォルダにコピーする。linux_amd64にarm64バイナリを入れるというのもアレだが、そこはスルーで。

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と同じ手順でコンテナを立てる。手順はこのページに従えばいい。

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

cd ~/newrelic-infra-setup
echo "license_key: {YOUR_LICENSE_KEY}" > newrelic-infra.yml
touch newrelic-infra.dockerfile
vim newrelic-infra.dockerfile  # どのエディタでも大丈夫
newrelic-infra.dockerfile
FROM newrelic/infrastructure:latest
ADD newrelic-infra.yml /etc/newrelic-infra.yml
touch docker-compose.yaml
vim docker-compose.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
docker-compose build
docker-compose up -d

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

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

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

不具合

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

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

参考文献

New Relic Pricing(日本語)
New Relic license key
Docker container for infrastructure monitoring
Docker instrumentation for infrastructure monitoring
newrelic/infrastructure-agent
newrelic/infrastructure-agent - Containerized Agent
newrelic/infrastructure-agent - ARM64 (aarch64) support #107
Dockerコンテナの監視を行うサービス
「デジタル・ニューノーマル構想」を掲げるNew Relicが製品や価格体系を刷新