427
1

Sysdig על קצה הקרחון – מה זה? למה כדאי לכם להשתמש בו ואיך אפשר להרחיב את השימוש בעזרת Chisels?

427
זמן קריאה: 6 דקות

מה זה Sysdig?

כלי קוד פתוח לניטור ופתרון בעיות של מערכת ההפעלה linux (ניתן להתקין ולהריץ גם על מערכות mac ו windows אך עם פונקציונאליות חלקית).
מה שמייחד את Sysdig הוא שהיא מחברת את עצמה לקרנל של המכונה ומושכת את כל מידע שנצטרך על הקונטיינר או המכונה שלנו.

עד היום, בדרך כלל כשהיינו רוצים לנטר את כל ה events שמתבצעים לנו במערכת ההפעלה, היינו משתמשים בכמה כלי ניטור מוכרים, שכל אחד מהם מתמקצע במשימה אחת. כך למשל- 

  • כדי לנטר processes בזמן ריצה היינו משתמשים ב htop או top (או בבמנהל המשימות בווינדוס)
  • כדי לנטר את הקריאות למערכת ההפעלה ואת הסיגנלים של פרוססים היינו משתמשים ב strace
  • כדי לנטר את תעבורת הרשת היינו משתמשים ב tcpdump (ב windows היינו משתמשים ב wireshark) 
  • כדי לנטר את חיבורי הרשת היינו משתמשים ב netstat

sysdig משלב בתוכו את כל היכולות של הכלים שציינו (וזה רק חלק מהפיצ’רים שהוא מספק) בכלי אחד פשוט. הוא מאפשר לנו לנטר, לשמור, לפלטר ולבחון את ההתנהגות של מערכת ההפעלה ישירות מה kernel. במילים אחרות- בזכותו אנחנו יכולים להשתמש בכלי אחד במקום ארבע.

תוכן עניינים

שימושים נפוצים בתעשייה

  1. מוניטורינג קונטיינרים של דוקר – מפורט כאן
  2. מוניטורינג על קוברנטיס – מפורט כאן
  3. מוניטורינג ישירות על מכונת לינוקס, ועל כך ארחיב בשאר המאמר, תתקינו, תשחקו עם זה וברגע שתבינו איך זה עובד ישירות על המכונה תוכלו בקלות להבין איך זה עובד על קונטיינרים.

מתחילים…

תחילה יש להתקין Sysdig על המכונת לינוקס שלכם, איך עושים את זה? לחצו כאן

כדי להריץ את sysdig (כמובן אחרי שהתקנו אותו על המערכת) נריץ בשורת הפקודה (terminal) את הפקודה הבאה:

				
					sysdig
%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
				
			

כאשר:

evt.num – המספר המצטבר של ה event. 

evt.time – חתימת התאריך של ה event.

evt.cpu – מספר המעבד ממנו ה event נקרא.

proc.name – שם ה process אשר יצר את ה event.

thread.tid – המספר המזהה של ה thread (בעברית: תהליכון) שיצר את ה event.

evt.dir – כיוון של ה event. ‘<‘ מסמן event-ים נכנסים ו ‘>’ מסמן event-ים יוצאים.

evt.type – סוג ה event שנקרא (כגון: ‘open’ או ‘read’ וכו׳)

evt.args – רשימה של הארגומנטים של ה event שנקרא.


דוגמא לפלט:

כפי שניתן לראות, הפלט לא מוצג באופן הכי יפה וקריאה, ובשנייה אחת ש sysdig רץ יכולות להיתפס מאות קריאות ממערכת ההפעלה מה שיכול להיות מייאש אם אנחנו רוצים לחקור משהו מסוים. לכן נשתמש ב chisels כדי להרחיב את השימוש ב sysdig.

מה זה chisel ואיך הוא בנוי? 

ה chisels שבאמצעותם מרחיבים את sysdig הם פשוט סקריפטים קטנים שמנתחים את ה event שנתפס על ידי sysdig , ויכולים לבצע פעולות על ה event. ה chisel-ים נכתבים בשפת lua שהיא שפת סקריפטים חזקה ומהירה (מקורות מומלצים ללמידה על שפת lua: מקור1, מקור2)

יצירת chisel –

את ה chisel  ניתן ליצור בקלות באמצעות כתבן רגיל כקובץ עם סיומת lua.

דוגמא:

בואו נבנה chisel אשר מקבל כפרמטר שם של system call (קריאה למערכת ההפעלה) ומדפיס כמה פעמים ה system call  שציינו נקרא במערכת.

בניית בסיס ה chisel:

בכדי שה sysdig ידע לזהות את ה chisel שלנו, הסקריפט lua שלנו חייב להכיל את המשתנים הגלובליים הבאים:

  • description  – תיאור ה chisel בצורה מורחבת.
  • short_description  – תיאור מקוצר של ה chisel שמסביר מה הוא עושה.
  • category  – קטגוריה של ה chisel  כגון: net ,security וכדומה.
  • rgsa – רשימה של ארגומנטים שה chisel מקבל.

כפי שניתן לראות בדוגמא, המשתנה args יכול להיות ריק. אבל אם נרצה להוסיף ארגומנטים נוסיף אותם באופן הבא:

בחזרה לדוגמא שלנו…

בנוסף לכל המשתנים שציינו למעלה, נוסיף ל chisel שלנו את הפונקציה on_event, כדי שכאשר ה event שלנו יקרא על ידי sysdig, נראה פלט מסוים.

ניקח את ה chisel שכתבנו, נשמור אותו בשם ״countsc.lua״ בתוך התיקייה שבה נמצא קובץ ההרצה של sysdig.

איך מריצים?

כדי להריץ את sysdig כך שידע לקרוא ל chisel  נריץ בשורת הפקודה (terminal) את הפקודה הבאה:

				
					sysdig -c  <chiselname>  <chislearguments>
				
			

כאשר:

chiselname – הוא שם ה chisel שאותו אנחנו רוצים להריץ.

chiselarguments – הם רשימת הארגומנטים שה chisel מקבל (כמו שאמרנו מקודם, לא סעיף חובה, אם יש נוסיף).

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

				
					Sysdig -c countsc
				
			
  • כפי שאתם רואים, לא חייב לכתוב את הסיומת של ה chisel בעת ההרצה.

אז עכשיו, כשנריץ את sysdig עם ה chisel שכתבנו, נראה את הפלט הבא:

וזהו- כתבתם את ה chisle הראשון שלכם! ☺

הוספת ארגומנטים

כמו שאמרנו אנחנו רוצים שה chisel שלנו יקבל כארגומנט את שם ה system call שנקרא על ידי המערכת. אז כמו שהוסבר, נוסיף את הארגומנט לרשימת הארגומנטים במשתנה args אך עכשיו אנחנו גם נוסיף פונקציה שנקראת

				
					 on_set_arg(name, val)
				
			

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

אתחול משתנים ב chisel 

אחרי שקיבלנו את הארגומנטים, ה chisel צריך לאתחל ארגומנטים ממש לפני שהניטור מתחיל. לשם כך נשתמש בפונקציה

				
					On_init()
				
			

אשר נקראת על ידי מנוע ההרצה ממש לפני ש event-ים מתחילים להיתפס.

בדוגמא שלנו, מכיוון שאנחנו רוצים לדעת כמה פעמים נקרא system call שבחרנו, נצטרך להוסיף לפונקציה on_init שני משתנים שאותם נאתחל.

  1. evt.type – מכיוון שאנחנו רוצים לדעת איזה system call נקרא, אנחנו צריכים לדעת מה ה type שלו.
  2. evt.dir – כמו שהוזכר בתחילת הכתבה, לכל system call יש 2 כיוונים: יוצא ונכנס. מכיוון שאנחנו לא רוצים כפילויות בספירה שלנו נבחר כיוון אחד שנספור.

על ידי הוספת המשתנים הללו לפונקציה אנחנו בעצם מנחים את מנוע ההרצה לחלץ את הנתונים הללו מתוך כל event שנתפס כדי שנעשה בו שימוש- במקרה שלנו בדיקת כיוון, ואם זה ה system call שאנחנו רוצים. את השימוש עם הנתונים שקיבלנו נבצע בתוך הפונקציה  on_event שמוכרת לנו מהסעיפים הקודמים.

הוספת פילטר

נכון לעכשיו הקוד שלנו מקבל כל event שמגיע לתוך הפונקציה on_event רק כדי לבדוק אם חלק מהם מתאימים לנו ואם כן אז לספור אותם. זהו לא מצב אידיאלי כיוון שאם נשנה את הפונקציונליות של ה chisel שלנו למשהו טיפה יותר מורכב מאשר לספור את כמות הפעמים ש system call מופיע, הקוד שלנו יכול להפוך למורכב מדי ולגרור טעויות. לשם כך נשתמש בפילטרים. 

כדי להשתמש בפילטר נוסיף לתוך הפונקציה on_init את chisel.set_filter אשר יעשה פילטור וישאיר רק את ה event-ים שאנחנו רוצים, במקרה שלנו כל ה event-ים הנכנסים של ה system call שביקשנו בארגומנטים.

בנקודה הזאת הפונקציה on_event הופכת להיות פשוט פונקציה שמבצעת לנו את הספירה של ה event-ים שקיבלנו.

ביצוע פעולות כשהריצה של sysdig מסתיימת

עד כה, עם ה chisel שכתבנו, בכל פעם שתפסנו event הוא נפלט ל terminal. מה יקרה כשיהיו לנו הרבה event-ים? איך נוכל לעמוד בקצב של הפלט?

בדיוק בשביל זה קיימת הפונקציה:

				
					On_capture_end()
				
			

הפונקציה יכולה לזהות:

  1. אם אנחנו רצים בלייב ובוצע CTRL + C מה שמסיים את הריצה של sysdig.
  2. אם אנחנו רצים באופן לא מקוון, והפקודה האחרונה של ה event הגיעה.

ברגע שהפונקציה זיהתה שהריצה של sysdig הפסיקה, במקרה שלנו, היא יכולה להדפיס סיכום של כמות הפעמים שנתפס ה system call שבחרנו.

קובץ ה chisel אחרי איחוד החלקים

מסקנות

sysdig הוא כלי חזק שיכול לייעל לנו את פעולות הניטור ומעבר על ה event-ים שקורים במערכת ההפעלה. הוא קל להרצה והשימוש בו מגוון מאוד.  כאן ראינו דוגמא פשוטה שמאפשרת לבדוק כמה פעמים system call לבחירתנו נקרא במערכת אבל השימוש ב sysdig יחד עם chisels מרחיבה לנו את הנוחות והיכולת להשתמש ב sysdig כדי לנטר את מערכת ההפעלה.

נופר חזן
WRITEN BY

נופר חזן

מהנדסת תוכנה, 3 שנים נסיון בתחום האוטומציה.
בעלת תשוקה למערכות Linux וכתיבת קוד.
חברה בקהילת CodeTime.

One thought on “Sysdig על קצה הקרחון – מה זה? למה כדאי לכם להשתמש בו ואיך אפשר להרחיב את השימוש בעזרת Chisels?

  1. תודה!! מעולה

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *