Datadog agents

หลังจากที่ไปทำ product ใหม่แล้วต้องทำระบบ monitoring ผ่าน Datadog เป็นครั้งที่สอง พบว่าบันทึกไปถึงแค่การติดตั้ง Datadog agent ภายใน cluster เท่านั้น กลับมาดูอีกทีเลยหาไม่เจอ จึงขอบันทึกการเปิด metrics logging และ tracing ไว้กันลืม

สิ่งที่จะใช้ในบทความนี้

  • Java application (ในตัวอย่างจะใช้ Spring อีกแล้ว ฮ่าๆๆ)
  • Datadog subscription พร้อมกับ API key และ Application key
  • Kubernetes ที่ provision ไว้แล้ว
  • Helm

คำเตือน บทความนี้จะไม่ลงพื้นฐาน Docker Helm หรือ Datadog นะครับ เพื่อความกระชับ

1. ติดตั้ง Datadog Java agent ลงไปใน Docker container ของเรา

ทำการ download agent มาเพิ่มเข้าไปใน Java class ที่ถูก compile แล้ว ตามแนวคิด Java Instrumentation API

2. Expose metrics ออกไป

เราจะใช้ Micrometer Prometheus สำหรับ expose JVM metrics ง่ายๆ โดยเราจะให้ Datadog Java agent ไปดึง metrics ผ่าน service-name:8080/actuator/health

พอเรา start application ขึ้นมา และเข้าไปที่ http://localhost:8080/actuator/prometheus ก็จะมี metrics ขึ้นมาละ

Actuator Prometheus

3. Configure logs ใน application ให้อยู่ในรูปของ JSON format

เราจะใช้ logstash-logback-encoder ในการ encode logs ในรูป JSON เพื่อให้ Datadog ingest ไปได้ จากนั้นเราก็จะสร้างไฟล์ logback-spring.xml ไว้ใน classpath เพื่อ configure หน้าตาของ JSON keys ต่างๆ เช่น status level trace_id เพื่อให้เราสามารถ filter logs ได้ง่ายขึ้นเมื่อค้นหาผ่าน Datadog

ข้อสังเกต เราควรแยก log format สำหรับ local และ non-local ไว้ด้วย เนื่องจากใน local การดู logs ผ่าน console หรือ terminal ในรูปแบบ inline สำหรับผมมันดูง่ายกว่า

4. Configure Kubernetes Deployment สำหรับ Datadog

ปิดท้ายด้วยการเพิ่ม annotations และ environment ให้ Java agent ไปเก็บข้อมูลมา โดยที่ผมจะให้ agent ไปเก็บ metrics ทุกอย่างผ่าน http://%%host%%:8080/actuator/prometheus ตามที่ทำไว้ข้อ 2 รวมถึงเปิด logs และ tracing ผ่าน environment variable ชื่อ DD_LOGS_INJECTION และ DD_TRACE_ANALYTICS_ENABLED ในส่วนของ DD_AGENT_HOST เนื่องจากเราลง agent ไว้กับตัว Java container แล้ว เราก็เชื่อมกับ container IP ได้เลย จบด้วย DD_SERVICE_NAME เอาไว้ filter ใน Datadog เพื่อหา metrics ของเรา

จากนั้นเราก็ build และ push Docker image ขึ้นไปบน Docker registry ผ่านคำสั่ง

docker build -t your-docker-image-name /path/to/Dockerfile
docker push your-docker-image-name:tag

ตามด้วยการ deploy resource ขึ้น Kubernetes ผ่าน Helm

helm upgrade --namespace your-namespace --install --values path/to/values.yaml --set image.version=your-image-version --wait --timeout 10m0s --atomic your-helm-chart-name /path/to/helm/directory

Datadog JVM metrics

References: https://docs.datadoghq.com/agent/docker/prometheus/?tab=standard

Sample code: https://github.com/raksit31667/example-spring-order