ヘルプ APM Goエージェントを使用したAPMインサイト eBPFを使用したDockerでのGoアプリケーションの監視
Site24x7 APMインサイトは、extended Berkley Packet Filter(eBPF)テクノロジーを用いて、Dockerコンテナ内で実行されるGoアプリケーションの自動監視を可能にします。このアプローチにより、ソースコードを変更することなくアプリケーションのパフォーマンスを監視可能です。
このガイドでは、Dockerで実行されているGoアプリケーションを監視するために必要な完全なセットアップ、構成、およびトラブルシューティングの手順について説明します。
以下の図は、共有ボリュームとホストプロセス識別子(PID)名前空間を備えたサイドカーコンテナパターンを使用したDockerセットアップ内での監視の仕組みの概要を示しています。
Goアプリケーションはアプリケーションコンテナ(図ではGoアプリケーションと表記)内で実行され、別のヘルパーコンテナ(APMインサイトエージェントコンテナ)がすべての監視作業を処理します。このAPMインサイトエージェントコンテナ内では、APMインサイトGoエージェントがGoプロセスを検出します。Instrumentor(コードを変更せずにパフォーマンスデータを収集するために、アプリに監視フックを追加する小さなコンポーネント)は、軽量のeBPFプローブをアタッチしてアプリケーションの動作を監視し、S247DataExporterが収集したデータをSite24x7バックエンドに送信します。
両方のコンテナはアプリバイナリボリューム(アプリの実行ファイルを格納する共有フォルダ)を共有します。これにより、エージェントはアプリケーションのバイナリを変更することなく、読み取りのみが可能になります。また、エージェントはホストの/procフォルダと/sysフォルダ(ホストリソースとして表示)にアクセスし、装置上で何が実行されているかを把握します。これらはすべてバックグラウンドで実行され、アプリケーションに変更を加えることなくパフォーマンスに関する分析情報を提供します。

始める前に、次の要件が満たされていることを確認します。
以下の手順にて、Dockerで実行されているGoアプリケーションの自動監視をすばやく構成します。
Site24x7 APMコンテナは、監視を実行するためにGoバイナリにアクセスする必要があります。アプリケーションバイナリが共有ボリューム経由でアクセスできることを確認します。
既存のdocker-compose.ymlを変更して、共有ボリュームを通じてGoアプリケーションバイナリを公開します。
services: your-app:
image: your-go-application:latest
container_name: your-app-container # Your application configuration
ports:
- "8080:8080" # Your application ports
# Create shared volume for binary access
volumes:
- app_binary:/app:ro # Mount application directory as read-only # Define shared volume (will be used by APM container)
volumes:
app_binary:
driver: local
次に、Site24x7 APMインサイトサービスをdocker-compose.ymlに追加します。
services:
# Your existing application service
your-app:
image: your-go-application:latest
container_name: your-app-container
ports:
- "8080:8080"
volumes:
- app_binary:/app:ro # Site24x7 APM Insight service
site24x7-apm:
image: site24x7/apminsight-go-agent:latest
container_name: site24x7-apm-agent
# Required: Privileged mode for eBPF operations
privileged: true
# Required: Host PID namespace for process discovery
pid: host
# Required environment variables
environment:
# REQUIRED: Your Site24x7 license key
- S247_LICENSE_KEY=
# REQUIRED: Go applications to monitor
# Format: "AppName=ProcessName:Port1,Port2;AnotherApp=ProcessName:Port;"
# Replace with your application details
- GO_APPS=MyGoApp=your-app-binary:8080
# Volume mounts
volumes:
# Required: Host /proc access for eBPF (read-only)
- /proc:/host/proc:ro
# Required: Shared volume with your application (read-only)
- app_binary:/app_runtime:ro
# Restart policy
restart: unless-stopped
# Shared resources
volumes:
app_binary:
driver: local
docker-compose.ymlと同じディレクトリにENVファイルを作成します。
# Site24x7 License Key (REQUIRED)
S247_LICENSE_KEY=your_actual_license_key_here # Go Applications to Monitor (REQUIRED)
# Format: "AppName=ProcessName:Port1,Port2,Port3;AnotherApp=ProcessName:Port;"
#
# Examples:
# Single app with one port:
# GO_APPS=WebAPI=mywebapi:8080
#
# Single app with multiple ports:
# GO_APPS=WebAPI=mywebapi:8080,8443,9090
#
# Multiple apps:
# GO_APPS=WebAPI=mywebapi:8080;AdminAPI=adminapi:9000;WorkerService=worker:8081
#
GO_APPS=MyGoApp=your-process-name:8080
GO_APPS形式は、Goアプリケーションを自動検出および監視用にマッピングするために使用されます。この形式には以下のフィールドが含まれます。
次のガイドラインは、監視設定のセキュリティ関連の側面について説明しています。
複数のGoアプリケーションを監視したり、SwarmやStackモードなどのより複雑なDocker環境にAPMエージェントをデプロイする必要がある場合は、以下の高度な設定を使用します。
環境に複数のGoコンテナが含まれている場合は、それらすべてを監視するようにAPMエージェントを設定可能です。
services: # Application 1
user-service:
image: your-registry/user-service:latest
container_name: user-service
ports:
- "8081:8081"
volumes:
- user_app:/app:ro # Application 2
order-service:
image: your-registry/order-service:latest
container_name: order-service
ports:
- "8082:8082"
volumes:
- order_app:/app:ro # Site24x7 APM (monitors both)
site24x7-apm:
image: site24x7/apminsight-go-agent:latest
container_name: site24x7-apm-agent
privileged: true
pid: host
environment:
- S247_LICENSE_KEY=${S247_LICENSE_KEY}
# Monitor both applications
- GO_APPS=UserService=user-service:8081;OrderService=order-service:8082
volumes:
- /proc:/host/proc:ro
# Mount both application volumes
- user_app:/app_runtime/user:ro
- order_app:/app_runtime/order:ro volumes:
user_app:
driver: local
order_app:
driver: local
Swarmモード(装置のクラスターのため、クラスター全体を監視するために各装置でAPMエージェントを実行する必要がある)でデプロイする場合は、すべてのノードでAPMエージェントが実行されるように設定し、すべてのノードが監視されるようにします。
version: '3.8' services:
your-app:
image: your-go-application:latest
deploy:
replicas: 3
placement:
constraints:
- node.role == worker
volumes:
- app_binary:/app:ro site24x7-apm:
image: site24x7/apminsight-go-agent:latest
# Required capabilities
privileged: true
deploy:
mode: global # Run on every node to monitor all applications
placement:
constraints:
- node.platform.os == linux
environment:
- S247_LICENSE_KEY=${S247_LICENSE_KEY}
- GO_APPS=${GO_APPS}
volumes:
- /proc:/host/proc:ro
- app_binary:/app_runtime:ro volumes:
app_binary:
driver: local
関連記事