มาเรียนรู้การทำระบบ 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 (Otel) เป็นโครงการที่รวมมาตรฐานและเครื่องมือสำหรับการเก็บและส่งข้อมูล Telemetry (เช่น Tracing, Metrics, และ Logs) จากระบบต่างๆ ในรูปแบบที่เป็นมาตรฐานเดียวกัน
Prometheus เป็นระบบเก็บ Metrics และระบบแจ้งเตือนที่ออกแบบมาเพื่อการมอนิเตอร์ระบบในลักษณะ Time Series Data แถมเอาไปใช้กับ Gafana เพื่อทำ Monitoring และ Alertได้อีก
Jaeger เป็นระบบ Distributed Tracing ที่ใช้ในการติดตามและวิเคราะห์การทำงานของระบบที่มีการกระจายงานในรูปแบบ Microservices จริงถามว่าใช้แค่ Jaeger อย่างเดียวได้ไหม ก็ได้แหละแต่มันเลิก Support แบบยิงเข้าไปหามันตรงๆแล้ว แต่ก็ยิงได้นะแต่ Official มันประกาศออกมาแล้วว่าเลิก Support หรือจะใช้ผ่าน Zipkins ก็ได้แต่บทความนี้จะเน้นไปที่ 3 ตัวที่กล่าวแหละ
สิ่งที่ต้องเตรียมสำหรับบทความนี้นะครับ
- Golang
- Docker
- VScode
- Git (https://github.com/open-telemetry/opentelemetry-go)
มาเริ่มเลยดีกว่า
จากนั้นเข้าไปที่ Folder ของ example/otel-collector
cd example/otel-collector
จริงๆเหมือนจะไม่ค่อยมีประโยชน์ใช่ไหมแต่ด้วย 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 เองแน่นอนครับ หวังว่าจะเป็นประโยชน์ไม่มากก็น้อยนะครับไว้ติดตามบทความหน้านะครับว่าผมจะเขียนอะไรต่อ