ヘルプ APM Goエージェントを使用したAPMインサイト eBPFを使用したDockerでのGoアプリケーションの監視

eBPFを使用したDockerでのGoアプリケーションの監視

Site24x7 APMインサイトは、extended Berkley Packet Filter(eBPF)テクノロジーを用いて、Dockerコンテナ内で実行されるGoアプリケーションの自動監視を可能にします。このアプローチにより、ソースコードを変更することなくアプリケーションのパフォーマンスを監視可能です。

このガイドでは、Dockerで実行されているGoアプリケーションを監視するために必要な完全なセットアップ、構成、およびトラブルシューティングの手順について説明します。

Dockerにおける監視ワークフロー

以下の図は、共有ボリュームとホストプロセス識別子(PID)名前空間を備えたサイドカーコンテナパターンを使用したDockerセットアップ内での監視の仕組みの概要を示しています。

Goアプリケーションはアプリケーションコンテナ(図ではGoアプリケーションと表記)内で実行され、別のヘルパーコンテナ(APMインサイトエージェントコンテナ)がすべての監視作業を処理します。このAPMインサイトエージェントコンテナ内では、APMインサイトGoエージェントがGoプロセスを検出します。Instrumentor(コードを変更せずにパフォーマンスデータを収集するために、アプリに監視フックを追加する小さなコンポーネント)は、軽量のeBPFプローブをアタッチしてアプリケーションの動作を監視し、S247DataExporterが収集したデータをSite24x7バックエンドに送信します。

両方のコンテナはアプリバイナリボリューム(アプリの実行ファイルを格納する共有フォルダ)を共有します。これにより、エージェントはアプリケーションのバイナリを変更することなく、読み取りのみが可能になります。また、エージェントはホストの/procフォルダと/sysフォルダ(ホストリソースとして表示)にアクセスし、装置上で何が実行されているかを把握します。これらはすべてバックグラウンドで実行され、アプリケーションに変更を加えることなくパフォーマンスに関する分析情報を提供します。

前提条件

始める前に、次の要件が満たされていることを確認します。

  • Dockerエンジンが20.10以降であること
  • Docker Composeがv2以降であること
  • Linuxカーネルが5.8以上であること(eBPFサポートに必要)
  • 有効なSite24x7 APMライセンスキー
  • Go1.18以降を実行するGoアプリケーションコンテナ(推奨)

DockerでGoアプリケーションの監視を設定する

以下の手順にて、Dockerで実行されているGoアプリケーションの自動監視をすばやく構成します。

Step1:アプリケーションコンテナを準備する

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

Step2:Site24x7 APMインサイトコンテナを追加する

次に、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

Step3:環境変数を設定する

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アプリケーションを自動検出および監視用にマッピングするために使用されます。この形式には以下のフィールドが含まれます。

  • ProcessName:コンテナ内に表示されるGoバイナリ/プロセスの正確な名前
  • Port(s):アプリケーションがリッスンするポート(アプリケーションの識別に使用されます)
  • AppName:アプリケーションのフレンドリ名(Site24x7ダッシュボードに表示されます)

セキュリティに関する考慮事項

次のガイドラインは、監視設定のセキュリティ関連の側面について説明しています。

  • Privileged mode:eBPF操作にはこのモードが必要です。コンテナは、eBPFプローブを安全にアタッチおよび管理するために、昇格された権限を必要とします。
  • Host PID namespace:これにより、コンテナ全体のプロセス検出が可能になります。APMエージェントはすべてのホストプロセスを表示可能ですが、設定で指定されたプロセスのみを監視します。
  • Read-only volumes:アプリケーションバイナリボリュームは、変更を防止し、安全なアクセスを確保するために、読み取り専用(:ro)オプションでマウントされます。

高度な設定

複数のGoアプリケーションを監視したり、SwarmやStackモードなどのより複雑なDocker環境にAPMエージェントをデプロイする必要がある場合は、以下の高度な設定を使用します。

複数のGoアプリケーションの監視

環境に複数の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

Docker Swarm/Stackへのデプロイ

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

関連記事