ECS Fargate上で動いているJavaアプリケーションにDatadogを導入する

ECS Fargate上で動いているJavaアプリケーションにDatadogを導入する手順をまとめます。

本記事の環境
- Java 11
- Gradle 7.0.2
- Spring Boot 2.5.1
- Jib 3.3.1

大まかな流れ

  1. Gradleプロジェクトでアプリケーションを作る
  2. ECS Fargate環境を用意する
  3. ECS FargateにデプロイできるようにGitHub Actionsワークフローを用意する
  4. ECS Faragte上で動いているJavaアプリケーションにDatadogを導入する

本記事では4についてまとめます。JibのGradleプラグインを利用してDockerイメージを生成しています。

手順

1. Javaクライアントのインストール

Javaクライアントをインストールして、任意の場所に配置(この記事では .datadog/)します。

$ wget -O dd-java-agent.jar 'https://dtdg.co/latest-java-tracer'
もしくは
$ curl -L -o dd-java-agent.jar https://dtdg.co/latest-java-tracer

Java アプリケーションのトレースに「classpath に dd-java-agent を追加しないでください。予期せぬ挙動が生じる場合があります。」とあるので、classpathには追加しないようにしてください。

2. タスク定義にDatadog Agent用サイドカーコンテナを追加

タスク定義にDatadog Agent用サイドカーコンテナを追加します。

{
  # ECS Fargate全体の設定は省略
  "containerDefinitions": [
    {
      # アプリケーション用コンテナの設定
    },
    {
      "name": "datadog-agent",
      "image": "public.ecr.aws/datadog/agent:latest",
      "cpu": 128,
      "memory": 512,
      "memoryReservation": 512,
      "portMappings": [
        {
          "containerPort": 8126
        }
      ],
      "essential": true,
      "environment": [
        {
          "name": "ECS_FARGATE",
          "value": "true"
        },
        # Trace Agentを有効に
        {
          "name": "DD_APM_ENABLED",
          "value": "true"
        },
        # Datadog上での環境識別子
        {
          "name": "DD_ENV",
          "value": "dev"
        }
      ],
      "secrets": [
        # AWS Systems Manager Parameter Storeに格納したAPI Key
        {
          "name": "DD_API_KEY",
          "valueFrom": "/datadog/DD_API_KEY"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-create-group": "true",
          "awslogs-group": "app-datadog",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "/datadog"
        }
      }
    }
  ]
}

3. dd-java-agentをDockerイメージに含めるように設定を追加

build.gradleに、dd-java-agentをDockerイメージに含めるように設定を追加してください。

jib {
    from {
        image = 'amazoncorretto:11-alpine-jdk'
    }
    to {
        // 任意のコンテナイメージ名
        image = 'app'
    }
    container {
        // アプリケーション実行時にJVMに渡すJVMフラグ
        jvmFlags = ['-javaagent:/opt/datadog/dd-java-agent.jar']
    }
    extraDirectories {
        paths {
            path {
                // dd-java-agent.jarをプロジェクトディレクトリからDockerイメージに追加
                from = file("${project.rootDir}/.datadog")
                into = '/opt/datadog'
            }
        }
    }
}

4. デプロイ

ECS Fargeteにデプロイし、Datadogダッシュボードで確認するとメトリクスが取れるようになります。