はじめに
Datadog の導入手順をメモする。
簡単な利用方法と使ってみた感想も最後に書いてみた。
導入対象は
- Kubernetes (AWS EKS)
- Javaアプリケーション
導入方法
Kubernets クラスタへ datadog-agent をデプロイ
詳細は公式ドキュメントを参照。Helmでデプロイする。
Datadog の helm チャート として datadog_values.yaml ファイルを作成して、ログの収集を有効にする設定を入れる。APMはデフォルトで有効になっているので設定不要。
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 に含まれている。
build.gradle.kts
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 はだいたいこんな感じになる。
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マニフェスト
DD_ENV
、DD_SERVICE
、DD_VERSION
を設定DD_LOGS_INJECTION
を true に設定- Unix ドメインソケット上の DogStatsD を有効にするため、volumes と volumeMounts に設定を追加
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 がつく。
- これによって、マイクロサービスをまたいだ通信のログを一括で見ることができる。