Docker環境でのNew Relic Infrastructure Agent導入
はじめに
コンテナ化された環境でのインフラ監視は、従来の物理・仮想サーバー監視とは異なる考慮事項があります。New Relic Infrastructure Agentは、Dockerコンテナとして提供されており、ホストOSとコンテナの両方を効率的に監視できます。
本記事では、Docker Composeを使用した導入から、マルチコンテナ環境での監視設定まで、実践的な導入手順を詳しく解説します。また、コンテナ特有の監視課題とその解決方法についても併せて説明します。
コンテナ監視の基本概念
Infrastructure Agentコンテナの特徴
New Relic Infrastructure Agentコンテナは、ホストOSのシステム情報を収集するため、特権モードでの実行とホストファイルシステムへのアクセスが必要です。これにより、ホストOSのメトリクスとコンテナ固有のメトリクスの両方を統合的に監視できます。
監視対象の範囲
Dockerコンテナとして動作するInfrastructure Agentは、以下の情報を収集します。
ホストレベル情報
- CPU、メモリ、ディスク、ネットワークの使用状況
- ホストOSのプロセス情報
- ファイルシステムの状態
コンテナレベル情報
- 各コンテナのリソース消費量
- コンテナのライフサイクル状態
- Docker daemonのメトリクス
Docker Composeを使用した導入
基本的なDocker Compose設定
シンプルなDocker Compose設定でInfrastructure Agentを導入する例です。
# docker-compose.yml
version: '3.8'
services:
newrelic-infra:
image: newrelic/infrastructure:latest
container_name: newrelic-infra
restart: unless-stopped
# 特権モードでの実行(ホストメトリクス収集に必要)
privileged: true
# ホストネットワークの使用
network_mode: host
# ホストPIDネームスペースの使用
pid: host
# ボリュームマウント設定
volumes:
- "/:/host:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
- "/proc:/host/proc:ro"
- "/sys:/host/sys:ro"
- "/etc:/host/etc:ro"
# 環境変数設定
environment:
- NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
- NRIA_DISPLAY_NAME=${HOSTNAME}
- NRIA_VERBOSE=1
# CPUとメモリの制限設定
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.1'
memory: 128M
環境変数ファイルの設定
セキュリティを考慮して、ライセンスキーは環境変数ファイルで管理します。
# .env ファイル
NEW_RELIC_LICENSE_KEY=your_license_key_here
HOSTNAME=docker-host-01
# カスタム属性(オプション)
NRIA_CUSTOM_ATTRIBUTES='{"environment":"production","team":"backend","location":"tokyo"}'
詳細設定でのDocker Compose
より詳細な監視設定を含むDocker Compose例です。
# docker-compose.advanced.yml
version: '3.8'
services:
newrelic-infra:
image: newrelic/infrastructure:latest
container_name: newrelic-infra
restart: unless-stopped
privileged: true
network_mode: host
pid: host
volumes:
- "/:/host:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
- "/proc:/host/proc:ro"
- "/sys:/host/sys:ro"
- "/etc:/host/etc:ro"
- "./newrelic-infra.yml:/etc/newrelic-infra.yml:ro"
environment:
- NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
- NRIA_DISPLAY_NAME=${HOSTNAME}-docker
- NRIA_VERBOSE=1
- NRIA_CUSTOM_ATTRIBUTES=${NRIA_CUSTOM_ATTRIBUTES}
# プロキシ設定(必要な場合)
- NRIA_PROXY=${PROXY_URL}
# ログ設定
- NRIA_LOG_LEVEL=info
# メトリクス収集間隔の調整
- NRIA_METRICS_PROCESS_SAMPLE_RATE=20
- NRIA_METRICS_STORAGE_SAMPLE_RATE=20
- NRIA_METRICS_NETWORK_SAMPLE_RATE=10
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.1'
memory: 128M
# ヘルスチェック設定
healthcheck:
test: ["CMD", "pgrep", "-f", "newrelic-infra"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
設定ファイルを使用した詳細設定
外部設定ファイルの作成
コンテナ内で使用する設定ファイルを作成します。
# newrelic-infra.yml
license_key: ${NRIA_LICENSE_KEY}
display_name: ${NRIA_DISPLAY_NAME}
verbose: 1
# Docker固有設定
enable_docker: true
docker_api_version: "1.24"
# カスタム属性
custom_attributes:
environment: production
container_runtime: docker
orchestrator: docker-compose
# ログ設定
log_level: info
log_format: json
# プロキシ設定(必要な場合)
# proxy: http://proxy.company.com:8080
# メトリクス収集設定
metrics_process_sample_rate: 20
metrics_storage_sample_rate: 20
metrics_network_sample_rate: 10
# Docker コンテナメトリクスの詳細設定
docker_container_filters:
include:
- "com.docker.compose.project=myapp"
exclude:
- "name=temp-*"
マルチコンテナアプリケーションでの統合監視
アプリケーションスタック全体の監視
Webアプリケーション、データベース、キャッシュサーバーを含む完全なスタックの監視例です。
# docker-compose.stack.yml
version: '3.8'
services:
# New Relic Infrastructure Agent
newrelic-infra:
image: newrelic/infrastructure:latest
container_name: newrelic-infra
restart: unless-stopped
privileged: true
network_mode: host
pid: host
volumes:
- "/:/host:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
- "/proc:/host/proc:ro"
- "/sys:/host/sys:ro"
- "/etc:/host/etc:ro"
environment:
- NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
- NRIA_DISPLAY_NAME=production-stack
# Webアプリケーション
web-app:
image: myapp:latest
container_name: web-app
ports:
- "80:8080"
environment:
- NEW_RELIC_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
- NEW_RELIC_APP_NAME=MyApp-Production
labels:
- "newrelic.monitor=true"
- "newrelic.service=web"
depends_on:
- database
- redis
# データベース
database:
image: postgres:13
container_name: postgres-db
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=myapp
- POSTGRES_PASSWORD=password
labels:
- "newrelic.monitor=true"
- "newrelic.service=database"
volumes:
- postgres_data:/var/lib/postgresql/data
# キャッシュサーバー
redis:
image: redis:6-alpine
container_name: redis-cache
labels:
- "newrelic.monitor=true"
- "newrelic.service=cache"
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
Docker Swarmでの導入
Swarmサービスとしての展開
Docker Swarmクラスターでの展開例です。
# docker-compose.swarm.yml
version: '3.8'
services:
newrelic-infra:
image: newrelic/infrastructure:latest
privileged: true
networks:
- host
volumes:
- "/:/host:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
- "/proc:/host/proc:ro"
- "/sys:/host/sys:ro"
- "/etc:/host/etc:ro"
environment:
- NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
- NRIA_DISPLAY_NAME={{.Node.Hostname}}
deploy:
mode: global # 全ノードにデプロイ
placement:
constraints:
- node.role == manager
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.1'
memory: 128M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
networks:
host:
external: true
name: host
運用と監視
コンテナログの管理
Infrastructure Agentコンテナのログを効率的に管理する設定です。
# ログローテーション設定を含むCompose
services:
newrelic-infra:
image: newrelic/infrastructure:latest
# ... 他の設定 ...
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels: "service=newrelic-infra"
ヘルスチェックと監視
コンテナの健全性を監視するためのスクリプトです。
#!/bin/bash
# check-newrelic-health.sh
# コンテナの状態確認
CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' newrelic-infra 2>/dev/null)
if [ "$CONTAINER_STATUS" = "running" ]; then
echo "✅ New Relic Infrastructure Agent is running"
# メモリ使用量の確認
MEMORY_USAGE=$(docker stats --no-stream --format "{{.MemUsage}}" newrelic-infra)
echo "📊 Memory Usage: $MEMORY_USAGE"
# CPU使用率の確認
CPU_USAGE=$(docker stats --no-stream --format "{{.CPUPerc}}" newrelic-infra)
echo "⚡ CPU Usage: $CPU_USAGE"
else
echo "❌ New Relic Infrastructure Agent is not running"
echo "Attempting to restart..."
docker-compose restart newrelic-infra
fi
トラブルシューティング
一般的な問題と解決方法
コンテナが起動しない場合
# ログの確認
docker logs newrelic-infra
# 設定ファイルの構文チェック
docker run --rm -v $(pwd)/newrelic-infra.yml:/etc/newrelic-infra.yml newrelic/infrastructure:latest -dry-run
# 権限の確認
docker run --rm --privileged -v /:/host:ro newrelic/infrastructure:latest ls -la /host
メトリクスが表示されない場合
# ネットワーク接続の確認
docker run --rm --network=host curlimages/curl:latest curl -I https://infra-api.newrelic.com
# Docker daemonへのアクセス確認
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock newrelic/infrastructure:latest ls -la /var/run/docker.sock
パフォーマンス最適化
リソース使用量を最適化するための設定です。
# リソース効率化設定
services:
newrelic-infra:
image: newrelic/infrastructure:latest
# ... 基本設定 ...
environment:
# 収集間隔の調整(リソース使用量を削減)
- NRIA_METRICS_PROCESS_SAMPLE_RATE=60
- NRIA_METRICS_STORAGE_SAMPLE_RATE=60
- NRIA_METRICS_NETWORK_SAMPLE_RATE=30
# 不要な機能の無効化
- NRIA_ENABLE_WIN_SERVICES=false
- NRIA_ENABLE_WIN_FIREWALL=false
deploy:
resources:
limits:
cpus: '0.3'
memory: 256M
reservations:
cpus: '0.05'
memory: 64M
セキュリティ考慮事項
コンテナセキュリティ
# セキュリティ強化設定
services:
newrelic-infra:
image: newrelic/infrastructure:latest
# ... 基本設定 ...
# 読み取り専用ルートファイルシステム
read_only: true
# 一時ディレクトリの設定
tmpfs:
- /tmp
- /var/tmp
# セキュリティオプション
security_opt:
- no-new-privileges:true
# ユーザー設定(可能な場合)
user: "65534:65534" # nobody:nobody
シークレット管理
Docker Secretsを使用したライセンスキー管理です。
# Docker Secrets使用例
version: '3.8'
services:
newrelic-infra:
image: newrelic/infrastructure:latest
secrets:
- newrelic_license_key
environment:
- NRIA_LICENSE_KEY_FILE=/run/secrets/newrelic_license_key
secrets:
newrelic_license_key:
external: true
まとめ
Docker環境でのNew Relic Infrastructure Agent導入は、適切な権限設定とボリュームマウントにより効率的に実行できます。コンテナ特有の監視要件を理解し、マルチコンテナ環境での統合監視を実現することで、現代的なアプリケーションインフラの可視性を大幅に向上できます。
セキュリティとパフォーマンスのバランスを考慮した設定により、本番環境での安定運用が可能になるでしょう。次回は、Kubernetes環境での導入方法について詳しく解説します。
関連記事: Kubernetes環境での導入関連記事: 設定ファイル完全リファレンス