มาเปิด Logs กับ APM ของ Datadog ใน Java application ที่ deploy บน Kubernetes
หลังจากที่ไปทำ 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 ขึ้นมาละ
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
References: https://docs.datadoghq.com/agent/docker/prometheus/?tab=standard
Sample code: https://github.com/raksit31667/example-spring-order