ปัญหาที่พบกับ Fluentd

หลังจากทะเลาะกับ Fluentd มาสองวันเต็ม ๆ ก็ได้ฤกษ์สร้าง Post นี้เพื่อเอาไว้จดรายละเอียดการแก้ไขว่าจะทำยังไงเมื่อเกิดปัญหาขึ้นครับ อาจจะมีการปรับปรุงเรื่อย ๆ เป็นระยะ ๆ นะครับการทดลองแรก กับการทดลองที่ 2 ทำเมื่อวันที่ 14 กุมภาพันธ์ วันวาเลนไทน์พอดีครับ


การทดลองแรก



          มาเริ่มกันเลยประเด็นคือผมต้องการทำ Test ทีละส่วนก่อนว่ามันทำงานยังไง จึงได้ติดตั้ง Fluentd ขึ้นมาเครื่องนึงแล้วทดลองส่ง Log เข้ามาที่ Fluentd Server โดยเริ่มแรกผมทดลองทำที่เครื่องเดียวกันก่อนโดยติดตั้ง rsyslog แล้วให้ rsyslog ส่ง log มาที่ตัว Fluentd Agent (Fluent Server ที่ตั้งค่าให้เปิด port รอรับ log นั่นเอง) โดยมีการเขียน config ดังนี้

ส่วนรับข้อมูลเข้ามีการตั้งค่าแบบนี้

  @type syslog  <<  บอกให้ Agent รู้ว่าเราจะใช้ syslog plugin ในการรับข้อมูลเข้ามาจาก rsyslog
  port 5140  <<  บอกให้ Agent รู้ว่าเราจะเปิดรับ log ผ่านทางพอร์ตหมายเลข 5140
  tag system  <<  บอกให้ Agent รู้ว่าถ้าได้รับ event เข้ามาให้ติด tag ลงไปใน event นั้น ๆ ว่า system
</source>

ส่วนของการ match event ที่ได้รับเข้ามา
  <<  เป็นการบอกว่าให้ตรวจสอบข้อมูลว่ามีคำว่า system อยุ่ข้างใน event นั้น ๆ หรือไม่
  @type stdout  <<  ถ้ามีให้เขียน event นี้ลง log ในที่นี้คือไฟล์ /var/log/td-agent/td-agent.log

จากการตั้งค่าสำหรับทดลองให้ rsyslog ส่งข้อมูลเข้า fluentd ผลปรากฏว่าข้อมูลเข้าถูกต้องดีครับ

การทดลองที่ 2

          คราวนี้ผมลองตั้งเครื่องเซิฟเวอร์อีกเครื่องนึงติดตั้ง rsyslog แล้วติดตั้ง graylog 2 ไว้ ที่ติดตั้ง graylog 2 ไว้ก็แค่คิดว่ามันควรจะมี service อะไรทำงานเพื่อให้เกิด log ขึ้นแล้วค่อยส่ง log มาเก็บที่ fluentd server นั่นเองที่ตัวเครื่อง graylog 2 ผมได้ทำการติดตั้ง graylog 2 แล้วโปรแกรมที่จำเป็นทั้งหมดไว้ จากนั้นผมไปที่ /etc/rsyslog.conf แล้วตั้งค่าด้วยการพิมพ์คำสั่งเพิ่มไปอีกบรรทัดนึง
*.* @192.168.33.6:5140
เนื่องจากว่าที่เครื่อง fluentd server นั้นผมได้เปิดพอร์ตหมายเลข 5140 เอาไว้อยู่แล้ว เมื่อรู้แบบนี้เลยสั่งให้ rsyslog ส่งข้อมูลมาที่ช่องทางนี้เลยนะครับ ผลการทดลองคือสามารถส่งข้อมูลเข้ามาที่ fluentd server ได้ครับ

การทดลองที่ 3

          คราวนี้ผมต้องการ forward apache log ผ่าน rsyslog มาที่ fluentd server ครับ คือให้ rsyslog ไปอ่าน log จาก apache แล้วส่งข้อมูลที่ได้มาที่ fluentd server ครับทดลองอยู่ครึ่งวันเช้าไม่ผ่านครับ อาจจะเป็นเพราะผมคิดเยอะด้วยครับ แต่พยายาม config ยังไงก็ยังติดอยู่ดีครับ เลยตัดสินใจตัด rsyslog ออกจากสาระบบแล้วไป config fluentd agent ให้ไปอ่าน access log ของ apache แล้วส่งข้อมูลที่ได้เข้ามาที่ fluentd server เลยแต่แก้ config ไปแก้ config มาก็ยังคงมีปัญหาอยู่ดี

  @type tail  <<  บรรทัดนี้ใช้สำหรับบอกประเภทของ input plugin ที่จะใช้ **ต้องไม่ลืมว่าข้อมูลทุกชนิดต้องใช้ plugin ให้เหมาะสม
  path /var/log/apache2/access.log  <<  บรรทัดนี้ใช้สำหรับอ้างอิง Path ที่จะดึงข้อมูลมา เรียกง่าย ๆ ว่า path ของไฟล์ที่เราจะไปเปิดอ่านนั่นเอง
  pos_file /var/log/td-agent/apache-access.log.pos  <<  เป็นการจดจำว่า agent อ่าน log ไปถึงไหนแล้วถ้าอยากรู้ให้ไปดูไฟล์นี้ ถ้าอ่าน log เสร็จแล้วก็ให้มาอัพเดทไฟล์นี้ว่าอ่านถึงตรงไหนนั่นเอง
  tag apache.access  <<  เป็นการติด tag ให้กับ event เพื่อแยกข้อมูลระหว่าง apache log กับ log event อื่น ๆ นั่นเอง
    <<  ตอนแรกไม่ได้ใส่หรอก แต่ error เลยไปอ่านจากหน้าเว็บมาเจอว่าต้องใส่เพื่อ parse ค่าให้ agent รู้ว่าไอ้สิ่งที่จะรับเข้ามาเนี่ยมันเป็น log ของโปรแกรมอะไร
    @type apache2  <<  บอก agent ว่า log event ต่อไปนี้เป็นชนิด apache2 log นะ
  
</source>
#  <<  ตอนแรกให้ตัว agent ที่อยู่ในเครื่อง wordpress ทดลองรับค่าแล้วเซฟค่าลง log ไฟล์เก็บไว้ก่อน
#  @type file  <<  บอก agent ว่าเราจะส่งข้อมูล output ออกในรูปแบบไฟล์ข้อมูลนะ
#  path /var/log/td-agent/phaonix.log  <<  ระบุ path ให้กับ agent
#
  <<  อันนี้สร้างฟิลเตอร์ขึ้นมาตัวนึงเพื่อจะดึง event ที่เป็น apache มาเพิ่มค่าต่อท้ายลงไป
  @type record_transformer  <<  บอก Agent ว่าเราจะใช้ฟิลเตอร์ record_transformer
  
    host_param "#{Socket.gethostname}"  <<  โดยเราจะให้ agent ดึงชื่อเครื่องออกมาแล้วแทรกค่าต่อท้าย event เข้าไปนะครับ
  


  <<  สร้าง match ขึ้นมาเพื่อจัดการกับ event ที่มี tag apache นั่นเอง
  @type forward  <<  เป็นการบอก agent ว่าเราจะส่งต่อ event ที่มี tag apache ทั้งหมดต่อไปยัง fluentd server หรือ fluentd agent ตัวอื่น ๆ
  @id output_system_forward  <<  เป็นการระบุ id ลงไปใน event
  
    host 192.168.33.6  <<  เป็นการระบุหมายเลข IP ของเครื่อง fluentd agent หรือ fluentd server ที่เราจะส่งต่อ event ไป
    port 5141  <<  และจะส่งข้อมูลไปที่พอร์ตหมายเลข 5141 นั่นเอง
  
ที่เครื่อง fluentd server เราก็ต้องทำการตั้งค่าเพิ่มเติมให้มันสามารถรับ event log จากเครื่อง wordpress แล้วนำมาแสดงผลให้เราดูต่อได้

<source>
  @type forward
  @id agent_apache
  bind 0.0.0.0
  port 5141
<source/>

เท่านี้ก็เป็นอันเสร็จพิธี



============================================================================
====                     วิธีตรวจสอบว่าเราตั้งค่าผิดรึเปล่า หรือตัว Agent มีปัญหารึเปล่า
============================================================================
          เนื่องจากผมติดปัญหาบ่อยมากครับ ทำให้เราต้องหาทางทราบว่าเราทำอะไรผิดตรงไหนบ้าง โดยปกติแล้วเราจะเข้าไปดูที่ path : /var/log/td-agent/td-agent.log แต่ว่าเราจะรู้ได้ยังไงว่ามีการตั้งค่าผิดตรงไหนบ้าง ให้ดำเนินการตั้งค่าให้กับ config file ให้ทำการพ่น log ออกมาให้เราอ่านกันนั่นเอง โดยมีเรื่องที่ต้องรู้ก่อนคือ fluentd มี log อยู่กี่ระดับอะไรบ้าง คำตอบคือ fluentd มีเนื้อ log อยู่ 6 ระดับ จะไม่เหมือนกับ linux ที่มี 7 ระดับนะครับ โดยมีดังนี้

  1. Fatal
  2. Error
  3. Warn
  4. Info
  5. Debug
  6. Trace
โดย default ของ fluentd จะอยุ่ที่ระดับที่ 4 หรือ Info นั่นเองครับ การทำงานของ logging ใน fluentd จะเหมือนกับ logging ใน linux นะครับคือ ถ้าตั้งไว้ที่ระดับไหนจะได้รับข้อมูลของระดับที่อยู่สูงกว่าโดยปริยายครับ นั่นหมายความว่าถ้าตั้งไว้ที่ระดับ 4 จะได้ข้อมูล log ของระดับ 1-4 ครับ 5 กับ 6 จะถือว่าอยุ่ระดับต่ำกว่านะครับ เรามาดูการตั้งค่ากันดีกว่าครับว่าทำยังไง

<source>
  @type tail
  @log_level debug
  path /var/log/data.log
  ...
</source>
<source>
  @type http
  @log_level fatal
  ...
</source>

code ข้างบนที่เห็นเป็นการกำหนดให้ใช้งานให้มีการเปิดใช้งาน logging
สำหรับหัวข้อนี้ไว้มาเขียนเพิ่มทีหลังนะครับ




No comments:

Post a Comment

วิธีการติดตั้ง และตั้งค่า Apache2 พร้อมเปิดใช้งาน HTTPS ด้วยวิธี Self-Sign บน Ubuntu 18.04.1 LTS

ดีจร้า วันนี้ช่วงเช้าว่างเลยมาเขียนบทความเพิ่มเติมเกี่ยวกับการติดตั้ง และตั้งค่า Apache2 ให้สามารถใช้งานผ่าน HTTPS ได้กันมาเริ่มกันเลยครับ ...