หลังจากใช้งาน 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 ส่วนการทำงานหลักคือ
- Agent เป็น process ที่จะ run อยู่ที่ client หรือ host ต่าง ๆ ที่ต้องการจัดเก็บข้อมูล
- Collector เป็นส่วนการจัดเก็บข้อมูล ซึ่งมีทั้ง Cassandra และ Elasticsearch
- 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/