Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

สวัสดีกับ Jaeger ระบบ Distributed Tracing จาก Uber

$
0
0

หลังจากใช้งาน 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 ดังนี้ [code] 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 [/code] จากนั้นเข้า URL localhost:16686 สำหรับหน้าแสดงผลข้อมูลต่าง ๆ แสดงดังรูป แต่ถ้าต้องการ deploy ให้งานจริง ๆ ดูเพิ่มเติมจาก Deployment

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

เป็นตัวอย่างของการเขียนด้วยภาษา Go ดังนั้นจึงใช้ Client library ชื่อว่า Jaeger client go สามารถเขียน code ง่าย ๆ ได้ดังนี้ ทำการสร้าง Jaeger tracer ขึ้นมาก่อน จากนั้นก็ระบบชื่อของ Span ไป ชื่อว่า service01 [gist id="6c85e901224cd1489972956e14fd72a3" file="main.go"] โดยในส่วนอื่น ๆ เราจะส่ง tracer นี้เข้าไปเช่นกัน จากนั้นก็กำหนดชื่อของ span ตามที่ต้องการ จะได้ผลการทำงานดังนี้ เพียงเท่านี้เราก็ได้ระบบ tracing ของระบบแบบง่าย ๆ แล้วครับ วันนี้เรา tracing ระบบกันอย่างไร ? ขอให้สนุกกับการเขียน code ครับ Referencen Websites https://eng.uber.com/distributed-tracing/

Viewing all articles
Browse latest Browse all 1997

Trending Articles