มาใช้ Google Analytics ช่วยทำ Tracing แบบบ้าน ๆ บน Node.js กัน
ของบ้าน ๆ ก็เอามาสร้างสิ่งที่ยิ่งใหญ่ได้เหมือนกัน
ยาวไป ไม่อยากอ่าน
ใช้ Express.js middlewere สร้าง Timestampใส่ลงไปใน Request header ตอนเริ่มทำ Request process ด้วย performance.now()
และอย่าลืมเพิ่ม Trace ID ให้กับ Request ด้วย ส่วนถ้าระหว่างทางต้องการ Trace ด้วย ก็ให้ทำ Timestamp ติดไว้ในแต่ละขั้นด้วย จากนั้น เมื่อทำ Request process เสร็จแล้ว ก็อ่าน Timestamp ตอนแรกมาลบกันกับ Timestamp ปัจจุบัน ก็จะได้เวลาที่ใช้งานจริง แล้วจึงส่งเวลาที่ได้ขึ้นไปบน Google Analytics แนะนำว่าตั้งชื่อ Event Category, Event Action และ Event Label ให้ดี จะได้อ่านค่าได้ง่าย ๆ ครับ
Tracing คืออะไร
ใครที่หลงเข้ามาแล้ว แต่ยังไม่รู้จักว่า Tracing คืออะไร ทำงานอย่างไร ข้ามไปอ่านที่ References ได้เลยครับ
เมื่อพูดถึงการทำ Tracing จริง ๆ แล้วมี Tools ที่ดีมาก ๆ ให้ใช้งานเยอะเลย ไม่ว่าจะเป็น Jaeger, Zipkin และอีกหลาย ๆ ตัว แต่ถ้าอยู่ในสถานการณ์อื่น ๆ ที่เราไม่สามารถใช้ Tools พวกนั้นได้ล่ะ เราพอจะมีทางเลือกอื่นบ้างหรือไม่ นี่คือโจทย์หลักของบล็อกนี้ครับ
ทำไมต้องใช้ Google Analytics ล่ะ
เพราะว่า มันสามารถเก็บ Metrics พื้นฐานที่เราต้องการได้ และที่สำคัญคือฟรีครับ นอกจากนี้ เราสามารถใช้ Google Studio ช่วยทำ Versualization เพิ่มเติมได้ด้วย ถ้าของที่ Google Analytics มีให้ ยังไม่ถูกใจครับ
Requirements
- Google Analytic Tracking Id (UA-XXXXX)
- Node.js + Express.js Application
Go Go Go
ขอแบ่งเนื้อหาเป็น 2 ส่วนนะครับ คือ
- ทำ Tracing ให้ Request
- ส่ง Metrics ขึ้น Google Analytics
1. ทำ Tracing ให้ Request
หลักการคือ เราจะใส่ ID ให้กับ Request ที่เข้ามา ฉะนั้นเราสามารถทำผ่าน Middleware ของ Express ได้ครับ
นอกจากนี้ เราจะต้องใส่ Timestamp ตอนที่ Request เริ่มทำงานด้วย เพราะตอนที่ Request ทำงานเสร็จ เราจะได้เอาเวลาเริ่มกับเวลาที่จบ มาลบกัน ก็จะได้เป็นเวลาที่ Request นี้ใช้ไปครับ
อธิบาย
บรรทัดที่ 1 เอา Performace API ออกมาใช้งาน
บรรทัดที่ 2 อันนี้เป็น Utility ที่ผมทำมาใช้เอง เวลาส่งข้อมูลขึ้น Google Analytics จะได้ใช้ง่าย ๆ (แอบเขียนไม่สวย)
บรรทัดที่ 4-11 จะเป็น Express Middleware ที่ทำหน้าที่ดังนี้
บรรทัดที่ 5 สร้าง UUIDv4 ให้กับ Request ถือว่าเป็น Trace Id ละกัน
บรรทัดที่ 6 สร้าง Timestamp ให้กับ Request ตอนที่เริ่มนับ โดยใช้ Performance API
บรรทัดที่ 8 สร้าง Listener ตัวนึงขึ้นมาคือ onFinish และเมื่อ Listener ตัวนี้ทำงาน ก็จะใช้ Timestamp ปัจจุบัน ลบกับ Timestamp ตอนที่เริ่มนับ ก็จะได้เวลาที่ Request ใช้ทำงาน
2. ส่ง Metrics ขึ้น Google Analytics
ในส่วนนี้ ถือว่าเป็นทริคสำคัญเลยครับ นั่นคือการส่ง Metric ที่เราสนใจไปเก็บไว้ที่ Google Analytics ตรงนี้อาจจะมีบางคนยังไม่รู้ว่า เราสามารถส่งข้อมูลเข้าไปตรง ๆ ได้ที่ Measurement Protocol ครับ
จุดที่ต้องระวังอยู่ตรงนี้ครับ cid กับ uid ครับ แนะนำให้เอา Trace Id มาใส่ครับ
ในส่วนของ Event Category, Event Action และ Event Label ก็ลองตั้ง ๆ กันนะครับ ลองหาจุดที่พอใจ และดูง่ายดูครับ เช่น ผมมักจะตั้ง Original Url ให้เป็นส่วนหนึ่งของ Event Label ด้วย
Value ต้องเป็น Integer เท่านั้น
ส่วน Value ต้องเป็น Integer เท่านั้นนะครับ เป็นพวก Double ไม่ได้ เพราะถ้าเราใส่ค่าเป็น Double ไป เวลาส่งไปที่ Google Analytics จะได้ผลกลับมาเป็น HTTP code 200 แต่ผลจะไม่ขึ้นบน Google Analytics นะครับ
ถ้าไม่มีอะไรผิดพลาด ก็ลองรันตัวแอพพลิเคชันดู เราควรจะเห็นผลไปปรากฏอยู่บน Google Analytics นะครับ
ในภาพตัวอย่าง ผมต้องการเห็นว่า ในฝั่ง API ระหว่างใช้ Cache กับไม่ใช้ Cache จะใช้เวลาต่างกันขนาดไหน ฉะนั้น Label ก็จะยาว ๆ หน่อยครับ เพื่อจะได้ดูง่าย ๆ ว่า Endpoint ไหน ใช้เวลาขนาดไหนครับ
Conclusions
ขั้นตอนแอบทำยาก
อันนี้ก็จริงครับ แต่ว่าเราสามารถส่ง Metrics ในเชิง Performance บางอย่างไปเก็บไว้ที่ Google Analytics เพื่อให้ฝั่ง Business นำไปใช้งานต่อได้ด้วยครับ
Tracing ต้องมีกราฟดูสิ
ใช่แล้วครับ แต่ Google Analytics ทำกราฟแบบนั้นไม่ได้ครับ ผมก็พยายามลองทำบน Data Studio แล้ว แต่ก็ยังไม่ดีเท่าใช้ Tool เฉพาะทางอยู่ดีครับ
ทำแจ้งเตือนอะไรได้บ้างมั้ย
พอจะทำได้ผ่าน Goal ที่เป็นฟีเจอร์ของ Google Analytics ครับ
สำหรับข้อสรุปง่าย ๆ ของการเอา Google Analytics มาช่วยทำ Tracing ก็คือ
ยังไม่ดีเท่า Tool เฉพาะ แต่ก็พอถูไถได้
สวัสดีครับ