หลังจากใช้งาน Zipkin มาสักพัก
ก็มีเจอสิ่งที่คล้าย ๆ กันและน่าสนใจมาก ๆ คือ Jaeger จาก Uber
โดยมีแรงบันดาลใจมาจาก Dapper และ OpenZipkin

เป้าหมายหลักของเครื่องมือตัวนี้
คือทำการ tracing การทำงานต่าง ๆ ของระบบงาน
ไม่ว่าจะอยู่ในรูปแบบไหนก็ตาม
แน่นอนว่าทุก ๆ ระบบน่าจะมีหรือคิดหรือทำไว้บ้าง
เพื่อทำการ monitoring การทำงานของระบบ
เพื่อช่วยวิเคราห์เรื่อง dependency ต่าง ๆ ของระบบ
เพื่อช่วยหา root cause ของปัญหาต่าง ๆ
เพื่อช่วยดู performance การทำงานของส่วนต่าง ๆ ของระบบ

โดยที่ Jaeger ก็มีเป้าหมายเช่นเดียวกัน

แต่เขียนว่าสร้างมาเพื่อ Microservice เลยนะ
พร้อมกับรูปแบบก็เข้ากันกับ OpenTracing
นั่นหมายความว่าจะไปใช้พวก ZipKin ก็เปลี่ยนได้สบาย ๆ
แถมมี Client library หลายตัวเลย เช่น Go, Java, NodeJS, Python และ C++
ดังนั้นคิดว่าทุกอย่างน่าจะพร้อม

ส่วนโครงสร้างของ Jaeger เป็นดังนี้

  • Frontend พัฒนาด้วย React
  • Backend พัฒนาด้วยภาษา Go
  • ในส่วนของที่จัดเก็บข้อมูลประกอบไปด้วย Cassandra และ Elasticsearch
  • มี Spark สำหรับ aggregation ข้อมูลจากหลาย ๆ ที่ด้วย

สิ่งที่ควรรู้ไว้บ้าง เพื่อทำให้เข้าใจมากขึ้น

Span คือส่วนการทำงานต่าง ๆ ของระบบ
ประกอบไปด้วยชื่อ เวลาเริ่มต้น และเวลาการทำงาน
โดยที่ Span สามารถซ้อนการและเรียงลำดับ
เหมือนกับการทำงานทั่วไปนั่นเอง
ยกตัวอย่างเช่น web -> api -> caching -> database เป็นต้น

ยังไม่พอนะ Jaeger มันมี component มากมาย

ดังรูป

จะรออะไรมาลองใช้งานกันดีกว่า

Jaeger นั้นประกอบไปด้วย 3 ส่วนการทำงานหลักคือ

  1. Agent เป็น process ที่จะ run อยู่ที่ client หรือ host ต่าง ๆ ที่ต้องการจัดเก็บข้อมูล
  2. Collector เป็นส่วนการจัดเก็บข้อมูล ซึ่งมีทั้ง Cassandra และ Elasticsearch
  3. Query เป็นส่วนการดึงข้อมูลไปแสดงผล

สามารถติดตั้งง่าย ๆ ด้วย Docker แบบ all in one ดังนี้

docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp \
  -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest

จากนั้นเข้า URL localhost:16686 สำหรับหน้าแสดงผลข้อมูลต่าง ๆ
แสดงดังรูป

แต่ถ้าต้องการ deploy ให้งานจริง ๆ
ดูเพิ่มเติมจาก Deployment

มาลองเขียน code เพื่อ tracing การทำงานของระบบด้วย Jaeger กันดีกว่า

เป็นตัวอย่างของการเขียนด้วยภาษา Go
ดังนั้นจึงใช้ Client library ชื่อว่า Jaeger client go
สามารถเขียน code ง่าย ๆ ได้ดังนี้

ทำการสร้าง Jaeger tracer ขึ้นมาก่อน
จากนั้นก็ระบบชื่อของ Span ไป ชื่อว่า service01

โดยในส่วนอื่น ๆ เราจะส่ง tracer นี้เข้าไปเช่นกัน
จากนั้นก็กำหนดชื่อของ span ตามที่ต้องการ
จะได้ผลการทำงานดังนี้

เพียงเท่านี้เราก็ได้ระบบ tracing ของระบบแบบง่าย ๆ แล้วครับ
วันนี้เรา tracing ระบบกันอย่างไร ?

ขอให้สนุกกับการเขียน code ครับ

Referencen Websites
https://eng.uber.com/distributed-tracing/