מדריך מקיף על Elastic Stack - חלק 1 - filebeat

במדריך הזה נלמד איך לבנות מערכת שבנויה מארבעת הכלים: 

  • Filebeat
  • Logstash
  • Elasticsearch
  • Kibana
כמו שמתואר באיור הבא:


נתחיל לפי הסדר, ולכל כלי נקדיש פוסט נפרד. 

מה שאני כותב רלוונטי ללינוקס. עבור win זה יהיה מאוד דומה, אבל כנראה שמיקומי הקבצים יהיו קצת שונים. הדוגמאות שלי נכתבו על גרסת 7.6.2, יתכן שבגרסאות שונות יהיה צורך בשינויים.

Filebeat

הכלי הזה נועד לקחת את המידע מהלוגים ולשלוח שורה אחרי שורה ל-Logstash. לשם כך צריך לקנפג אותו מאיפה לקחת את הלוגים ולאן לשלוח אותם.

קובץ הקונפיגורציה נקרא filebeat.yml והוא נמצא בד"כ בספריית /etc/filebeat. הוא מגיע עם קינפוג דיפולטיבי שהוא די טוב בשביל התחלה אבל בכל זאת יש צורך בכמה שינויים קטנים כל אחד בשביל המערכת שלו.

נקנפג את הדברים הבאים:

מיקום קבצי הלוג – בחלק ה-filebeat.inputs בשדה שנקרא paths נכניס את ה-path שבו יהיו קבצי הלוג למשל:

- /my_logs/*.log

לא לשכוח את המקף שבתחילת השורה. הכוכבית, כמקובל, מסמלת כל טקסט שהוא. זה אומר ש-filebeat ישתמש בכל קובץ שמסתיים ב “.log”. אם למשל אנחנו רוצים להשתמש בקבצים שמסתיימים ב-“.txt” נשנה את השדה paths ל:

- /my_logs/*.txt

ואם אנחנו רוצים רק קבצים שבשם שלהם יש “abc” ומסתיימים בסימות “.log” אז נכתוב:

- /my_logs/*abc*.log

לאן המידע ישלח – בחלק ה-Outputs בשדה שנקרא hosts נכניס את ה-IP וה-Port של המכונה שבה מותקן ה-logstash שאליו אנחנו רוצים לשלוח את המידע.  במקרה הפשוט שבו ה-logstash מותקן על אותה מכונה כמו ה-filebeat נכתוב:

hosts: ["localhost:5044"]

הפורט ה-default של logstash הוא 5044. ניתן כמובן לשנות אותו בקובץ הקונפיגורציה של logstash. אם נשנה את מספר הפורט אז גם נשנה אותו כאן ב-filebeat. הם חייבים להיות מתואמים כדי לתקשר.

יש עוד המון אפשרויות קינפוג ב-filebeat אבל בשביל המקרה הפשוט זה מספיק.

הצורה שבה filebeat עובד מבטיחה לנו שכל שורה תישלח לפחות פעם אחת ל-logstash. אני אומר לפחות כי יכול להיות שהיא תישלח יותר מפעם אחת. אבל אפשר להיות בטוחים (הכל יחסי) שלפחות פעם אחת כל שורה תישלח.

נסביר קצת איך filebeat מבטיח לנו את זה. ל-filebeat יש קובץ registery שבו הוא שומר את המצב הנוכחי שלו. הוא כותב שם עבור כל קובץ עד איזו נקודה (offset) הוא כבר שלח. אם filebeat נעצר מכל סיבה שהיא, או איבד תקשורת עם logstash, ברגע שהם חוזרים לפעולה – filebeat בודק בקובץ ה-registry עד איזו נקודה הוא כבר שלח וממשיך משם. עבור כל שליחה של מידע ל-logsatsh, filebeat מחכה לאישור (acknowledgement או בקיצור ack) מ-logstash שהמידע התקבל, ורק אז מעדכן את קובץ ה-registry. כך מובטח לנו שכל שורה תישלח לפחות פעם אחת.

יכול להיות מצב שהמידע נשלח ל-logstash אבל מכל סיבה שהיא filebeat לא קיבל את ה-ack, או שהוא קיבל את ה-ack אבל לא הספיק לעדכן את קובץ ה-regestry וה-filebeat נפל (למשל בגלל הפסקת חשמל), במקרה כזה כשהמערכת תחזור לפעול filebeat ישלח שוב את אותו מידע שהוא לא הספיק לעדכן ב-registry שכבר נשלח.

קובץ ה-registry נמצא ב-/usr/share/filebeat/bin/data/registry/filebeat והוא נקרא data.json. בתוך הקובץ הזה תמצאו עבור כל קובץ שנשלח ל-logstash שורה דומה לזו:

{"source":"/my_logs/myproject.log","offset":9510278,"timestamp":"2020-05-10T14:35:53.304316473+03:00","ttl":-2,"type":"log","meta":null,"FileStateOS":{"inode":1161454061,"device":22}}

כפי שניתן לראות מצוין מהו שם הקובץ ומה ה-offset שעד אליו ה-filebeat סיים לשלוח.

כדי לדעת אם הוא סיים לשלוח את כל הקובץ ניתן לכתוב ב-linux את הפקודה:

ll /my_logs/myproject.log

ואז נקבל בשדה החמישי את גודל הקובץ:

-rw-r--r--. 1 300 300 9510278

אם ה-offset שווה לגודל הקובץ זה אומר שהוא סיים לשלוח את כל הקובץ.

אם יש צורך שה-filebeat ישלח שוב קובץ שהוא כבר שלח ניתן פשוט למחוק אותו מה-registry. ואם רוצים שכל הקבצים ישלחו מחדש, למשל כשאנחנו רק בתחילת בניית מערכת ואנחנו עושים הרבה ניסויים, אפשר פשוט למחוק את ה-registry כולו:

rm -rf /usr/share/filebeat/bin/data/registry

ועכשיו מה שנשאר לנו זה רק להריץ את filebeat. לצורך כך נשתמש בפקודה הבאה:

/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"

ואז נתחיל לראות אותו עובד. עבור כל קובץ הוא פותח מה שנקרא Harvester ותיראו שורה כזו:

Harvester started for file: /my_logs/myproject.log

כשהוא סיים לעבוד על הקובץ והמתין את הזמן שמוגדר לו בקובץ הקונפיגורציה (5 דקות בדיפולט) הוא ידפיס שורה כזו עבור כל קובץ.

log/harvester.go:324    File is inactive: /my_logs/myproject.log. Closing because close_inactive of 5m0s reached.

הגדרת זמן ההמתנה מיועד בעיקר למידע שמגיע אונליין ולא לקבצים סטטיים. ולכן במקרה שלנו אין צורך לשנות אותו.

אם אהבתם, תכתבו משהו למטה...

אין תגובות:

הוסף רשומת תגובה