ใช้ FluentD เพียง 1 Container เพื่อให้ Monitor log ของทุก Application ในเครื่องเดียวกัน
สวัสดีครับทั่นผู้อ่าน ก่อนอื่นขอทักทายเป็นการเริ่มต้นบทความแรกของผมครับ ขอฝากเนื้อฝากตัวด้วยนะครับ :) สำหรับบทความที่ผมจะนำมาเขียนนั้น พยายามกลั่นกรองมาจากประสบการณ์ที่ได้ทำมาเอง ทุกคนสามารถ comment ได้เลยนะครับหากมีอะไรอยากชี้แนะ
เอาละเข้าเรื่อง ~ วันนี้ก็จะมาเขียนบทความเกี่ยวกับใช้ Tool Log Collector ตัวนึงที่ชื่อ Fluentd และนำมาประยุกต์นะครับ
เกริ่นกันสักหน่อย
ในยุคการพัฒนา Microservice ที่มีการแบ่งกลุ่ม Service ที่ทำงานคล้ายกันเป็น Application Service หลายๆ อัน เป็นเรื่องที่ยุ่ง หากเราจำเป็นต้องดู Log ทุกแอปพลิเคชัน อย่างไรก็ตามเราสามารถลดความยุ่งดังกล่าวได้โดยการใช้ Centralize Log ในการรวบรวม Log จากทุกแอปพลิเคชันไว้ในที่เดียวกัน ซึ่ง 1 ใน tools ที่ใช้ในการทำ Centralize Log ที่นิยมคือ FluentD โดยปกติเราอาจจะทำ FluentD 1 Container / 1 แอพพลิเคชั่น เพื่อคอย monitor log แต่ถ้าทำตามแบบนี้มันคงจะมีหลาย FluentD หลายคอนเทนเนอร์ ให้ดูรกเต็มไปหมดใน Server แน่ถ้าเครื่อง Server นั้นมีหลายแอพพลิเคชั่น →ในบทความนี้เราจะสอนวิธีการ Setup FluentD ให้มี 1 คอนเทนเนอร์รองรับทุกแอพพลิเคชั่นในเครื่องเดียวกันครับ
Fluentd คืออะไร
Fluentd คือโปรแกรมที่ทำหน้าในการเป็นตัวกลางในกระบวนการเก็บรวบรวมและจัดการข้อมูล log และเหตุการณ์ต่าง ๆ ที่เกิดขึ้นใน ทำให้เราสามารถเก็บรวบรวมข้อมูลจากแหล่งต่าง ๆ ไว้ที่เดียว และส่งข้อมูลนั้นไปยัง tool ปลายทางได้
โครงสร้างการทำงานของ FluentD ถูกแบ่งหน้าที่ออกเป็น 3 กลุ่มคร่าวๆ
- กลุ่ม Input เป็นส่วนที่ใช้ในการรับข้อมูล log จากแหล่งต้นทาง โดย Input Plugin จะรับข้อมูลจากแหล่งต้นทางต่าง ๆ เช่น ไฟล์ log, แอปพลิเคชัน, บริการเครื่องมือต่าง ๆ และแปลงข้อมูลเหล่านี้เป็นรูปแบบที่ Fluentd เข้าใจได้
- กลุ่ม Engine เป็นส่วนที่จัดการควบคุม คัดแยก(Filter) เพื่อให้สามารถรับข้อมูล log จากแหล่งต้นทาง แยกแยะข้อมูล log ในรูปแบบที่กำหนด -> ปรับแต่งข้อมูลที่จะแสดงเพิ่มเติม -> ส่งข้อมูลไปยังตัวเก็บข้อมูลหรือระบบปลายทางที่กำหนดไว้ใน Output Plugin ต่างๆ
- กลุ่ม Output เป็นส่วนที่ไว้รับข้อมูล ที่ถูกปรับแต่งแล้ว และนำส่งข้อมูลนี้ออกไปยัง ระบบปลายทางที่ใช้ เช่น Elastic Search ฯลฯ
ซึ่งโครงสร้างทั้งหมดนี้จะถูกเขียนไว้ในไฟล์ fluent.conf
ซึ่งท่านผู้อ่านสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับการใช้ tag / reserve word / plugin ต่างๆ เพิ่มได้ที่ document ของ Fluntd Log Collector https://docs.fluentd.org/input
มาถึงโจทย์ที่เราสนใจแล้ว
โดยปกติแล้วเรามักจะใช้ fluentd.conf 1 conf / 1 application แต่ถ้า Server เรามีหลาย Application ละ จะต้องมีหลาย Fluentd Container งั้นหรือ ? รกน่าดู หาก docker ps -a ไปจะเจอแต่ container ของ fluentd
แต่ช้าก่อน เรามีทางออกให้ท่านผู้อ่านสามารถทำให้ 1 Fluentd สามารถรันหลายๆ Application ด้วยการใช้ @Include ใน file fluent.conf ครับ
จากภาพในแต่ละแอพนั้นเราจะมีการกำหนดไฟล fluentd.conf ของแต่ละแอพพลิเคชั่นไว้แล้วซึ่ง fluentd.conf ของแต่ละแอพนั้นเราจะกำหนดให้ครบทุก partเลยทั้ง input, engine , output เหมือนที่เราได้อธิบายใน section ก่อนหน้า
ดังนั้นแต่ละ fluent.conf ของแต่ละแอพนั้นจะมีการกำหนด source , การ filter , การส่งออก output ที่เป็นอิสระ ไม่จำเป็นต้องเหมือนกันได้เลย
ทีนี้เราจะสร้าง fluentd.conf ตัวแม่มา 1 อันเพื่อจะเอาตัวนี้และไป run container สำหรับ fluentd.conf ของตัวแม่นั้นเราจะมีการใช้
@include แบบในภาพด้านล่างเท่านั้น เมื่อตอน runtime ก็จะไปเรียก file config fluentd ของแต่ละแอพเข้ามาทำงานเองเลยครับ
เพียงเท่านี้เราก็มีแค่ 1 containner /1 เครื่อง / multiple app แล้วครับ
ทำให้อัจฉริยะยิ่งขึ้น
เราอาจจะมีปัญหาวุ่นวายหาก เราต้องมานั่งเพิ่ม @include ไปเรื่อยๆหากเราเพิ่ม /หรือลด Application ในเครื่อง Server เดียวกัน ไปอีกเรื่อยๆ
เราสามารถแก้เรื่องนี้ได้ โดยตัวอย่างที่ทางทีมผมใช้คือการเอา Script มาใช้ตอนสร้าง docker ครับ ตอน run jenkins ครับ
จากต.ย. script จะใช้ script ในการ find โครงสร้าง application ต่างๆ ที่เก็บไว้ใน server เดียวกัน ที่มี folder ด้วย path */fluentd/fluentd.conf ถูกสร้างอยู่
= แสดงว่า application นั้นจะใช้ fluentd ก็จะนำ path นั้นมาเขียน @include ลง fluentd master ที่จะเอาไปทำ container
จบแล้ว ขอบคุณที่แวะเวียนมา+หวังว่าบทความนี้จะเป็นประโยชน์ต่อท่านผู้อ่านน่ะครับ ~