ECS アプリケーションのトレース

セットアップ

Amazon ECS エージェントのインストール手順でインストールした後、以下の手順に従いトレースの収集を有効にします。

  1. gcr.io/datadoghq/agent コンテナのタスク定義で次のパラメーターを設定します。portMappings ホスト / コンテナポートを 8126(プロトコルは tcp)に設定します。

    containerDefinitions": [
      {
        "name": "datadog-agent",
        "image": "gcr.io/datadoghq/agent:latest",
        "cpu": 100,
        "memory": 256,
        "essential": true,
        "portMappings": [
          {
            "hostPort": 8126,
            "protocol": "tcp",
            "containerPort": 8126
          }
        ],
        ...
      

    Agent が正しい Datadog ロケーションにデータを送信できるよう、<DATADOG_SITE> の場合に以下の環境変数を設定します。

    "environment": [
        ...
      {
        "name": "DD_SITE",
        "value": "<DATADOG_SITE>"
      },
      ...
      ]
    ...
    

    Agent v7.17 以下の場合、以下の環境変数を追加します。

    "environment": [
          ...
        {
          "name": "DD_APM_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_APM_NON_LOCAL_TRAFFIC",
          "value": "true"
        },
        ...
        ]
    ...
    

    Agent のトレースコレクションで利用可能なすべての環境変数はこちらをご覧ください

  2. アプリケーションコンテナでコンテナが実行されている基底の各インスタンスのプライベート IP アドレスを DD_AGENT_HOST 環境変数に割り当てます。これにより、アプリケーショントレースを Agent に送信できます。

Amazon の EC2 メタデータエンドポイントを使用すると、プライベート IP アドレスを検出できます。各ホストのプライベート IP アドレスを取得するには、次の URL をカールします。

curl http://169.254.169.254/latest/meta-data/local-ipv4

Amazon の ECS コンテナメタデータファイルを使用すると、プライベート IP アドレスを検出できます。各ホストのプライベート IP アドレスを取得するには、次のコマンドを実行します。

cat $ECS_CONTAINER_METADATA_FILE | jq -r .HostPrivateIPv4Address

APM に渡される各アプリケーションコンテナのトレースエージェントのホスト名の環境変数として結果を設定します。

os.environ['DD_AGENT_HOST'] = <EC2_PRIVATE_IP>

起動時間の変数

ECS アプリケーションの変数が起動時に設定される場合は、DD_AGENT_HOST を使ってホスト名を環境変数として設定する必要があります。あるいは、Python、JavaScript、Ruby の場合は対象のホスト名をアプリケーションのソースコード内で設定することも可能です。Java と .NET の場合は、ECS タスクでホスト名を設定できます。たとえば、以下のとおりです。

import requests
from ddtrace import tracer


def get_aws_ip():
  r = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4')
  return r.text

tracer.configure(hostname=get_aws_ip())

他の言語で Agent ホスト名を設定するには、Agent ホスト名の変更方法を参照してください。

const tracer = require('dd-trace').init();
const axios = require('axios');

(async () => {
  const { data: hostname } = await axios.get('http://169.254.169.254/latest/meta-data/local-ipv4');
  tracer.setUrl(`http://${hostname}:8126`);
})();

他の言語で Agent ホスト名を設定するには、Agent ホスト名の変更を参照してください。

require 'ddtrace'
require 'net/http'

Datadog.configure do |c|
  c.agent.host = Net::HTTP.get(URI('http://169.254.169.254/latest/meta-data/local-ipv4'))
end
package main

import (
    "net/http"
    "io/ioutil"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

resp, err := http.Get("http://169.254.169.254/latest/meta-data/local-ipv4")
        bodyBytes, err := ioutil.ReadAll(resp.Body)
        host := string(bodyBytes)
  if err == nil {
        //set the output of the curl command to the DD_Agent_host env
        os.Setenv("DD_AGENT_HOST", host)
        // tell the trace agent the host setting
        tracer.Start(tracer.WithAgentAddr(host))
        defer tracer.Stop()

このスクリプトを ECS タスク定義の entryPoint フィールドにコピーし、アプリケーション jar および引数フラグで値を更新します。

"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); java -javaagent:/app/dd-java-agent.jar <APPLICATION_ARG_FLAGS> -jar <APPLICATION_JAR_FILE/WAR_FILE>"
]

他の言語で Agent ホスト名を設定するには、Agent ホスト名の変更を参照してください。

"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); dotnet ${APP_PATH}"
]
"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); php-fpm -F"  
]

Apache

VirtualHost またはサーバーコンフィギュレーションファイルの Apache および mod_php の場合、PassEnv を使用して、DD_AGENT_HOST およびその他の環境変数 (次の例のように統合サービスタグ付けの変数など) を設定します。

PassEnv DD_AGENT_HOST
PassEnv DD_SERVICE
PassEnv DD_ENV
PassEnv DD_VERSION

PHP fpm

ini パラメーターが clear_env=on に設定されている場合、プールワーカーファイル www.conf で、ホストから読み取られるように環境変数も構成する必要があります。これを使用して、DD_AGENT_HOST およびその他の環境変数 (次の例のように統合サービスタグ付けの変数など) も設定します。

env[DD_AGENT_HOST] = $DD_AGENT_HOST
env[DD_SERVICE] = $DD_SERVICE
env[DD_ENV] = $DD_ENV
env[DD_VERSION] = $DD_VERSION

その他の参考資料