จากที่เคยเขียน blog เรื่อง Jaeger ระบบ Distributed Tracing นั้น
ใช้งานผ่าน library ชื่อว่า OpenTracing
สำหรับจัดการรูปแบบข้อมูลของ tracing message
และจัดเก็บข้อมูลด้วย Jaeger
ในตอนนี้ OpenTracing ได้รวมกับ OpenCensus ในชื่อ OpenTelemetry
จึงมาดูการใช้งานหน่อย เห็นเขาว่าง่ายดี
จากคำถามใน course Microservices เกี่ยวกับ Tracing ว่า
ถ้าจะทำการ tracing ของ producer และ consumer
ที่ทำงานผ่าน messaging เช่น ActiveMQ, RabbitMQ และ Kafka เป็นต้น
จะต้องทำอย่างไร ?
ซึ่งผู้ถามนั้นได้ใช้งาน RabbitMQ ซึ่งแน่นอนว่า
มี library สำหรับการติดต่อสื่อสารผ่าน AMQP protocol
แต่ผลที่ออกมา สามารถดู tracing ได้
แต่ไม่สามารถแยก producer และ consumer ออกจากกันได้
นั่นคือ ในส่วนของ graph depenency ไม่สามารถแสดงผลได้
คำถามคือ ทำอย่างไรดี ?
คำตอบคือ กลับมาสู่เรื่องพื้นฐาน
คือทำเองนั่นเอง
จากรูปโครงสร้างของ tracing เป็นดังรูป
จากปัญหา ความต้องการคือ
- Service A คือ Producer
- Service B คือ Consumer ซึ่งจะเป็นลูกของ Service A นั่นเอง
โดยจากแนวคิดจะทำการสร้างฝั่ง Producer ขึ้นมาก่อน
จากนั้นเมื่อทำการสร้าง message ส่งไปยัง messaging
ใน message ที่ส่งนั้นต้องมีข้อมูลของ
- Trace ID (group ของการทำงาน)
- Span ID (parent span)
ดังนั้นจำเป็นต้องดึงค่าทั้งสองออกมาด้วย code ตัวอย่าง
[gist id="ab7d7cadcca1f8cff4a6803754927d15" file="1.go"]ต่อมาในส่วนของ Consumer นั้น ก็ต้องสร้าง Parent span จาก Trace ID และ Span ID ที่ส่งมา
ก่อนที่จะทำการสร้าง Span ของตัวเองต่อไป
ซึ่งก็สร้างไม่ยากถ้าไปอ่านชุดการทดสอบของ Trace นะ ดังนี้
ได้ผลการทำงานดังนี้
และในส่วนของ Dependency แสดงดังนี้
เท่านี้ก็สามารถสร้าง tracing แบบง่าย ๆ ในทุก ๆ ส่วนได้
โดยไม่ต้องไปง้อ library เพิ่มเติมในแต่ละ protocol แล้ว
พื้นฐานสำคัญมาก ๆ ครับ
สามารถดู code ตัวอย่างได้ท่ี Github:: Up1