จากการแบ่งปันเรื่อง Observability ของระบบงาน
ใน Course Microservices workshop ที่ Skooldio มานั้น
โดย Observability นั่นประกอบไปด้วย 3 ส่วนหลัก ๆ คือ

  • Application metric
  • Distributed tracing
  • Log aggregation

ต่อจากนั้นก็เอาไปทำ dashboard และ alert system ได้อีก
เพื่อช่วยให้เราสามารถดูได้ว่า application ทำงานอย่างไร
มีปัญหาตรงไหนบ้าง ?
หรือมีสัญญาณของปัญหาที่อาจจะเกิดขึ้นไหม ?
ถ้าเจอแล้ว สามารถเข้าถึงจุดเกิดเหตุได้ง่ายและรวดเร็วมากยิ่งขึ้น

จากแนวคิด นำมาสู่วิธีการจัดการ นั่นคือเครื่องมือที่ใช้งาน
หนึ่งในชุดของเครื่องมือที่แนะนำกันมาคือ Grafana platform
ประกอบไปด้วย

  • Grafana สำหรับ dashboard
  • Loki สำหรับเก็บ logging
  • Tempo สำหรับเก็บ tracing
  • ใช้งาน Prometheus สำหรับ data source ที่จัดเก็บข้อมูล metric

ตัวใหม่ที่น่าสนใจคือ Tempo

ใช้ในการจัดการ distributed tracing
แสดงการทำงานดังรูป

โดยที่ตัว Agent นั้น สามารถกำหนดได้ว่า exporter หรือปลายทางที่เก็บคืออะไร
เช่น

  • OTLP (http, grpc)
  • Zipkin
  • Jaeger (http, grpc)

ตัว Tempo นั้น สร้างมาเพื่อเป้าหมายของ high-scale distributed tracing backend
นั่นคือ เลือก data storage ได้เยอะขึ้น ทั้ง local และ remote
ช่วยให้เก็บได้ทั้ง 100% ดีขึ้น ลดพื้นนที่ในการจัดเก็บ
สนับสนุน TraceQL สำหรับการดึงข้อมูล tracing
และใช้งานได้ง่าย

เพื่อความเข้าใจมาดูการใช้งาน Grafana platform กับ Spring Boot 3 กัน

แสดงโครงสร้างการทำงานดังรูป

ใน Sprint Boot นั้นทำงานเรื่อง Tracing เหมือนเดิม
เพิ่มเติมคือ จะมี Grafana Agenet สำหรับ Java เข้ามา เข้ามา
เพื่อทำการส่งข้อมูลจากเครื่องที่ service ของ Spring Boot ทำงานอยู่
ไปเก็บที่ Tempo นั่นเอง

ตัวอย่างการกำหนดค่าใน docker compose ของ Spring Boot 3

  • ทำการกำหนด Grafana agent และกำหนด environment variable ได้อีก
  • เก็บ trace ผ่าน OTLP
  • ที่จัดเก็บ trace คือ Tempo server ผ่าน HTTP protocol

มาดูตัวอย่างการ config Tempo และ Grafana กัน

ผลการทำงาน เมื่อมีการ access เข้า Spring Boot 3 application
ข้อมูล trace จะเข้าไปที่ Tempo และแสดงผลผ่าน Grafana Explore ดังรูป

ชุดเครื่องมืออื่น ๆ ประกอบไปด้วย

  • Application metric => Prometheus, Grafana Loki
  • Distributed tracing => Zipkin, Jaeger และ Grafana Tempo
  • Log aggregation => ELK stack

Reference Websites