𝗖𝗲𝗻𝘁𝗿𝗮𝗹𝗶𝘇𝗲𝗱 𝗟𝗼𝗴𝗴𝗶𝗻𝗴 𝗪𝗶𝘁𝗵 𝗚𝗿𝗮𝗳𝗮𝗻𝗮 𝗔𝗹𝗹𝗼𝘆 𝗮𝗻𝗱 𝗟𝗼𝗸𝗶
เมื่อก่อนการหา log หมายถึงการต้อง SSH เข้าไปยังเซิร์ฟเวอร์เฉพาะเครื่องแล้วรัน grep
ในช่วงที่เกิด incident คุณมักจะไม่รู้ว่า error อยู่ที่เครื่องไหน สุดท้ายคุณต้องคอยสลับไปมาระหว่าง host และพยายามเทียบ timestamp ด้วยตาเปล่า ซึ่งกระบวนการนี้ใช้ไม่ได้ผลเลยเมื่อคุณต้องการความรวดเร็ว
ผมจึงเปลี่ยนมาใช้ centralized logging แทน ตอนนี้ log ทุกบรรทัดจากทุกเซิร์ฟเวอร์จะถูกรวมไว้ที่เดียว โดยผมใช้ Grafana Alloy บนแต่ละ host เพื่อส่ง log ไปยัง Loki
ทำไมต้องเป็น stack นี้?
- ELK นั้นหนักเกินไป Elasticsearch ต้องใช้การดูแลรักษาและฮาร์ดแวร์สูงมาก
- Loki ทำการ index เฉพาะ labels แทนที่จะเป็น full text ทำให้ประหยัดค่าใช้จ่ายและรันได้ง่ายกว่า
- เครื่องมือแบบ SaaS จะมีราคาแพงขึ้นอย่างรวดเร็วเมื่อจำนวนเครื่องใน fleet ของคุณเพิ่มขึ้น
- Alloy คือ agent มาตรฐานตัวใหม่จาก Grafana ซึ่งมีประสิทธิภาพและเชื่อถือได้
การตั้งค่า (The Setup)
Alloy จะอ่านไฟล์บนแต่ละ host และเพิ่ม labels เช่น host, environment และ service จากนั้นจึงส่งข้อมูลเหล่านี้ไปยัง Loki นอกจากนี้ผมยังสร้าง Slack bot ขึ้นมาด้วย โดยมันจะเรียกใช้งาน Loki API เพื่อให้ทีมสามารถดึง log มาดูได้โดยไม่ต้องออกจากช่องแชท
ความท้าทายในโลกความเป็นจริงที่ผมพบ:
- Permissions: Alloy รันด้วย user ของตัวเอง หาก log ของแอปคุณถูกจำกัดสิทธิ์ Alloy จะทำงานล้มเหลวโดยไม่แจ้งเตือน (fails silently) คุณต้องเพิ่ม alloy user เข้าไปในกลุ่ม (groups) ของแอปคุณด้วย
- Mixed OS fleets: คุณจะมีทั้งเครื่อง Debian, Ubuntu และ RHEL ซึ่งคุณต้องใช้ package manager ที่ถูกต้องสำหรับแต่ละระบบ
- Legacy agents: ตัวส่ง log รุ่นเก่าอาจทำให้เกิดการส่งข้อมูลซ้ำซ้อน (double-shipping) คุณต้องค้นหาและลบพวกมันออกในระหว่างการติดตั้ง (rollout)
- Multiline logs: Java stack traces มักจะกินพื้นที่หลายบรรทัด หากไม่มี multiline regex error เพียงหนึ่งเดียวอาจกลายเป็น entry แยกกันถึง 40 รายการที่ใช้งานไม่ได้
กฎเหล็กของการใช้ Labels
อย่าใส่ข้อมูลที่มี high-cardinality ใน labels ห้ามใช้ request IDs หรือ user IDs เป็น labels เด็ดขาด เพราะจะทำให้ index พัง ให้ใช้ labels สำหรับสิ่งต่างๆ เช่น ชื่อ service หรือ environment ส่วนข้อมูลอื่นๆ ให้ใช้การ filter แทน
ผลลัพธ์ที่ได้
การทำ centralized logging เปลี่ยน log ให้กลายเป็น metrics คุณสามารถตั้ง alert ตามอัตราการเกิด error ได้ แทนที่จะต้องรอให้คนสังเกตเห็นปัญหา เมื่อเกิด incident ขึ้น คำตอบก็อยู่แค่การพิมพ์คำสั่งใน Slack เพียงคำสั่งเดียว
Optional learning community: https://t.me/GyaanSetuAi
