มาเรียนรู้การทำระบบ Tracing ด้วย Otel, Prometheus, และ Jaeger กันเถอะ!

เกริ่นก่อนนะครับว่าทำไมถึงต้องมีระบบ Tracing ในระบบที่เราพัฒนาขึ้นมานั้น ส่วนใหญ่จะมีการทำ Monitoring และ Logging เพื่อเก็บข้อมูลและดูแลระบบให้ทำงานได้อย่างมีประสิทธิภาพ แต่บางครั้งการมีแค่ Monitoring และ Logging อาจจะไม่เพียงพอ โดยเฉพาะเมื่อเราต้องการหาต้นตอของปัญหาที่ทำให้ระบบทำงานช้า ยิ่งใครทำ Microservices แล้วไม่มีตอนไล่หาปัญหาน้ำตานองหน้าได้เลยนะ 55555

Logging vs Tracing

Logging คือการบันทึกเหตุการณ์ต่างๆ ที่เกิดขึ้นในระบบ แต่การบันทึกนี้อาจจะไม่ละเอียดเพียงพอที่จะบอกได้ว่าขั้นตอนใดในกระบวนการทำงานของระบบที่ใช้เวลามากที่สุด และทำให้ระบบช้าลง ในขณะที่ Tracing จะช่วยให้เราติดตาม Request ที่เข้ามาในระบบตั้งแต่ต้นจนจบ และดูได้ว่าทุกๆ ขั้นตอนในกระบวนการทำงานนั้นใช้เวลานานเท่าไร

Tracing คือการติดตาม Request ที่เข้ามาในระบบตั้งแต่ต้นจนจบ โดยจะสามารถดูได้ว่ามีการทำงานอะไรบ้างในเส้นทางนั้นและใช้เวลากับแต่ละขั้นตอนนานแค่ไหน ข้อมูลนี้จะช่วยให้เราสามารถระบุได้ว่าในกระบวนการทำงานส่วนไหนที่เป็นคอขวดและควรปรับปรุง

ซึ่งที่กล่าวมาไม่ใช่ว่าไม่ควรมี Loging นะจริงๆควรจะมีทั้ง Logging และ Tracing เพราะ Logging จะช่วยบันทึกเหตุการณ์ต่างๆ ที่เกิดขึ้นในระบบ ในขณะที่ Tracing จะช่วยให้เห็นภาพรวมของการทำงานของระบบและระบุคอขวดที่ทำให้ระบบทำงานช้า ขาดตัวใดตัวหนึ่งไปก็คงเหงาและคงจะแย่…

โดยบทความนี้จะใช้ Otel,Prometheus,Jaeger ทำไมต้องเป็น 3 ตัวนี้มาดูเลยดีกว่าว่าแต่ละตัวคืออะไร

OpenTelemetry

OpenTelemetry (Otel) เป็นโครงการที่รวมมาตรฐานและเครื่องมือสำหรับการเก็บและส่งข้อมูล Telemetry (เช่น Tracing, Metrics, และ Logs) จากระบบต่างๆ ในรูปแบบที่เป็นมาตรฐานเดียวกัน

Prometheus

Prometheus เป็นระบบเก็บ Metrics และระบบแจ้งเตือนที่ออกแบบมาเพื่อการมอนิเตอร์ระบบในลักษณะ Time Series Data แถมเอาไปใช้กับ Gafana เพื่อทำ Monitoring และ Alertได้อีก

Jaeger

Jaeger เป็นระบบ Distributed Tracing ที่ใช้ในการติดตามและวิเคราะห์การทำงานของระบบที่มีการกระจายงานในรูปแบบ Microservices จริงถามว่าใช้แค่ Jaeger อย่างเดียวได้ไหม ก็ได้แหละแต่มันเลิก Support แบบยิงเข้าไปหามันตรงๆแล้ว แต่ก็ยิงได้นะแต่ Official มันประกาศออกมาแล้วว่าเลิก Support หรือจะใช้ผ่าน Zipkins ก็ได้แต่บทความนี้จะเน้นไปที่ 3 ตัวที่กล่าวแหละ

ภาพรวมสุดท้ายที่จะได้ทั้งหมดโดยเพิ่ม Logs ไว้ด้วยว่าจะเอามาทำงานร่วมกันยังไง

สิ่งที่ต้องเตรียมสำหรับบทความนี้นะครับ

มาเริ่มเลยดีกว่า

Clone Git ลงมา

จากนั้นเข้าไปที่ Folder ของ example/otel-collector

cd example/otel-collector
จากนั้นก็ docker compose up -d
จากนั้นก็ go run .
เข้าไปที่ http://localhost:16686/ แล้วจะเห็นที่เรา run go ไปเมื่อซักครู่ หน้าจะเห็น request ที่เข้ามาแล้วกราฟช่วงเวลาที่ใช้และใช้ไปกี่วิ
คลิกเข้าไปก็จะเห็นว่า request นี้ทำอะไรบ้างและทำอะไรไปกี่วิ
จากนั้นไปที่ http://localhost:9090/ ก็จะเห็น Data ใน Prometheus ที่ไป scrape มา
รวมถึง Status และ Alert ต่างๆด้วย

จริงๆเหมือนจะไม่ค่อยมีประโยชน์ใช่ไหมแต่ด้วย Prometheus ตัวมันเองดูยากแหละเลยต้องใช้ Grafana เข้ามาช่วยดูและช่วย Alert ด้วย

ระดับความลึกของการทำ Tracing

ระดับพื้นฐาน (Basic Level):

  • ใช้สำหรับการติดตามการทำงานทั่วไปของระบบ
  • สร้าง spans สำหรับ endpoints หลักของ API หรือ Microservice
  • ตรวจสอบเวลาที่ใช้ในการดำเนินการของแต่ละ request

ระดับปานกลาง (Intermediate Level):

  • ใช้สำหรับการวิเคราะห์ปัญหาที่เกี่ยวกับประสิทธิภาพและการทำงานร่วมกันของ Microservices
  • สร้าง spans สำหรับการดำเนินการที่สำคัญภายใน Microservices แต่ละตัว เช่น การเรียกฐานข้อมูล, การเรียก API ภายนอก, การประมวลผลข้อมูล
  • เพิ่มการติดตาม errors และการทำ retry

ระดับลึก (Detailed Level):

  • ใช้สำหรับการวิเคราะห์และการตรวจสอบที่ละเอียดมากขึ้นในกรณีที่ต้องการระบุปัญหาหรือปรับปรุงประสิทธิภาพของระบบ
  • สร้าง spans สำหรับการดำเนินการเกือบทุกอย่างภายใน Microservices รวมถึงการทำงานภายในแต่ละฟังก์ชันหรือเมธอด
  • เพิ่มการติดตาม metrics ที่ละเอียด เช่น memory usage, CPU usage, และ I/O operations

อยู่ที่ว่าอยากแก้ปัญหาส่วนไหนก็ทำตามระดับที่ผมใส่ไว้เบื้องต้นถ้าปัญหาเรื้อรังยังไงก็ควรจะไปถึงระดับลึกสุดใจ Code อาจจะไม่สวยแต่ไม่เจอปัญหาดีกว่า Code สวยแต่ไม่รู้ว่าปัญหาอยู่ตรงไหน เพราะการทำ Tracing หวังจะให้ Code สวยมันเป็นไปไม่ได้อยู่แล้วครับ

ก็จบไปแล้วสำหรับการทำ Tracing ไม่ยากเลยใช่ไหมครับถ้าเราไปติดตั้งใน Code เราก็จะติดตามปัญหาและแก้ได้ตรงจุดดีกว่าเราไปงมจาก Logs เองแน่นอนครับ หวังว่าจะเป็นประโยชน์ไม่มากก็น้อยนะครับไว้ติดตามบทความหน้านะครับว่าผมจะเขียนอะไรต่อ

--

--

No responses yet