🐕

Datadog の導入手順 (Kubernates, Java)

2022/09/18に公開約6,500字

はじめに

Datadog の導入手順をメモする。

簡単な利用方法と使ってみた感想も最後に書いてみた。

導入対象は

  • Kubernetes (AWS EKS)
  • Javaアプリケーション

導入方法

Kubernets クラスタへ datadog-agent をデプロイ

詳細は公式ドキュメントを参照。Helmでデプロイする。

Datadog の helm チャート として datadog_values.yaml ファイルを作成して、ログの収集を有効にする設定を入れる。APMはデフォルトで有効になっているので設定不要。

datadog_values.yaml
datadog:
  logs:
    enabled: true
    containerCollectAll: true

Helmのv3をインストールする。Helmドキュメント

Helm の Datadog リポジトリを追加

$ helm repo add datadog https://helm.datadoghq.com
$ helm repo update

Datadog API Key を発行してから、helm install する。

$ helm install datadog-agent -f values.yaml  --set datadog.apiKey=<DATADOG_API_KEY> datadog/datadog

datadog-agent が起動したのを確認。datadog-cluster-agent もデプロイされている。

$ kubectl get pod -n default
NAME                                     READY   STATUS    RESTARTS   AGE
datadog-cluster-agent-6b9db794c8-qzwfv   1/1     Running   0          19m
datadog-jzlbw                            3/3     Running   0          19m

Javaアプリケーションのログ設定

ログを JSON 形式で出力する。ここでは loback を使う。

logstash を dependencies に追加。logback は spring-boot-starter-web に含まれている。

dependencies {
    ...
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("net.logstash.logback:logstash-logback-encoder:7.2")
    ...
}

logback.xml を追加

src/main/resources/logback.xml
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

Java アプリケーションの Docker コンテナ設定

詳細は公式ドキュメントを参照。

javaコマンドの javaagent に dd-java-agent.jar を指定する。

Dockerfile はだいたいこんな感じになる。

Dockerfile
FROM amazoncorretto:18-alpine-jdk
RUN addgroup -S spring \
    && adduser -S spring -G spring \
    && mkdir /app \
    && chown -R spring:spring /app \
    && chmod 755 /app
USER spring:spring
WORKDIR /app

ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
RUN wget -O dd-java-agent.jar 'https://dtdg.co/latest-java-tracer'

ENTRYPOINT ["java","-javaagent:./dd-java-agent.jar","-jar","app.jar"]

特定のバージョンをインストーする場合は Maven repository からダウンロードする。

Docker イメージを ECR にプッシュしておく

$ aws ecr get-login-password | docker login --username AWS --password-stdin {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com

$ TAG=0.0.1
$ docker build --build-arg -t sample-app:$TAG .
$ docker tag sample-app:$TAG {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/sample-app:$TAG
$ docker push {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/sample-app:$TAG

Deployment マニフェスト設定

詳細は公式ドキュメントを参照。

Deploymentマニフェスト

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample
  labels:
    app: sample
    tags.datadoghq.com/env: "dev"
    tags.datadoghq.com/service: "sample"
    tags.datadoghq.com/version: "0.0.1"

spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample
  template:
    metadata:
      labels:
        app: sample
        tags.datadoghq.com/env: "dev"
        tags.datadoghq.com/service: "sample"
        tags.datadoghq.com/version: "0.0.1"
    spec:
      volumes:
        - hostPath:
            path: /var/run/datadog/
          name: apmsocketpath
      containers:
        - name: sample
          image: {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/sample-app:0.0.1
          ports:
          - containerPort: 8080
          volumeMounts:
            - name: apmsocketpath
              mountPath: /var/run/datadog
          env:
            - name: DD_ENV
              valueFrom:
                fieldRef:
                  fieldPath: metadata.labels['tags.datadoghq.com/env']
            - name: DD_SERVICE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.labels['tags.datadoghq.com/service']
            - name: DD_VERSION
              valueFrom:
                fieldRef:
                  fieldPath: metadata.labels['tags.datadoghq.com/version']
            - name: DD_LOGS_INJECTION
              value: "true"

このDeploymentマニフェストでアプリケーションをデプロイする。

利用方法

APM

APM > Traces にアプリケーションへのリクエストの一覧が出ている。

トレースの詳細はこんな内容。

トレースに紐づくログも見れる

Logs

アプリケーションのログは datadog-agent が自動的に収集して、Datadog へ送信している。
Logs メニューからログの一覧を確認できる。

ログの詳細も確認できる

ログに紐づくトレースも見れる

Monitor

trace.servlet.request.* のメトリクスで、エンドポイントごとやステータスコードごとに細かい監視が設定できる。

Dashboard

trace.servlet.request.* のメトリクスで、エンドポイントごとやステータスコードごとに細かくグラフが作れる。

使ってみた感想

今回は、簡単なアプリケーションなのでトレースも単純だったが、複雑なアプリケーションで本領を発揮すると思う。

分散トレーシングできたりログとトレースが紐付いているおかげで、障害時のエラー原因の特定に役立っている。

分散トレーシングが便利

  • Kubernetesクラスター内部のマイクロサービス間のアクセスがある場合、通信先のマイクロサービスや通信元のマイクロサービスのトレースが同じトレースとして一覧できる
  • Kuberentesクラスター外部のサービスへのアクセスも、同じトレースの一部として見れる。外部のサービスが遅延してたらひと目で分かる。
  • DBへアクセスしている場合は、実行した SQL や実行を確認できる。(Prepared Statetme で実行しているためか、具体的な値は表示されないのでセキュリティ的にも問題ない)

ログとトレースの接続が便利

  • トレースとログが trace_id によって自動的に紐付けされる。また複数のマイクロサービスをまたぐ通信のログに同じ trace_id がつく。
  • これによって、マイクロサービスをまたいだ通信のログを一括で見ることができる。

Discussion

ログインするとコメントできます