איך ליצור MRTG graphs עבור חוות TS או Citrix
ניטור סביבות TS\Citrix הוא די פשוט אם משתמשים בכל מיני מערכות שו"ב כאלה ואחרות, אבל משום מה תמיד היתה לי החיבה ל MRTG, ולגרפים החביבים שלו.
והחיבה הזאת היא לא סתם, עם ה MRTG ניתן ליצור גרפים של כמעט כל דבר שרק רוצים, דרושה רק יוזמה ויצרתיות.
בהתייחס לסביבות TS\Citrix, זה מאוד עוזר לראות גרפים על מספר sessions בחווה/שרת, גם כדי לקבל מושג על מה קורה בשרתים וללמוד על מידת העומס בטווח המידי וגם לראות נתונים היסטוריים (מאוד עוזר בתכנון לטווח ארוך).
אז מה זה MRTG בכלל, Multi Router Traffic Grapher הוא כלי חופשי לניטור עומסי תקשורת בעיקר, הוא במקור הוא משתמש ב SNMP ושולח בקשות תגובה בקשר לרכיב המרוחק, הסבר מפורט יותר פה: MRTG.
אבל, מכיוון שה MRTG רק מציג נתונים יבשים, לא ממש משנה לו מאיפה הוא מקבל אותם, האם זה יהיה מה MIB המרוחק, קובץ טקסט או סקריפט, וזה מה שמאפשר לנו ליצור גרפים של כמעט כל דבר ולא רק נתוני תקשורת.
אני לא הולך לכתוב כאן על איך מרימים את תשתית ה MRTG (אפשר לקרוא כאן), אלה אני הולך לקחת כהנחה שישנה סביבת MRTG עובדת.
סביבת Citrix
אם לא זכיתם להיות בעליהם הגאה של גירסת ה Presentation Server Enterprise\Platinum למעשה אין לכם דרך אחרת ליצור תצוגה גרפית לגבי ה sessions בחווה (כן, אני יודע, אפשר תמיד להריץ reports על שרת הרשיונות, אבל בואו נהיה רציניים לרגע, זה לא בדיוק אותו הדבר), אם החווה שלכם דווקא כן Enterprise או Platinum אז אתם יכולים להשתמש ב Resource Manager בכדי לאסוף את הנתונים על החווה ואז להשתמש ב Web Interface for Resource Manager של ג'ייסון קוגנר להצגה של כל הנתונים.
אז אתם לא יכולים ליצור Resource Manager, מה עושים עכשיו? בשביל זה אני פה... משתמשים ב MRTG.
כמו שציינתי כבר, ל MRTG לא ממש משנה מאיפה הוא מקבל את הנתונים המספריים שלהם הוא זקוק ליצירת הגרפים, אז אם לא אכפת לו, אנחנו נשתמש ב vbscript פשוט אשר ימשוך את הנתונים הרלוונטיים לנו מהחווה, הערה קטנה לסדר, מכיוון שאני משתמש ב mfcom של citrix, הסקריפט יעבוד רק אם הוא ירוץ על שרתי ה Citrix או על מחשב/שרת עליו יותקן ה SDK.
אז הנה הסקריפט אשר ה output שלו הוא מספר ה sessions בחווה ומספר ה disconnected sessions:
| ("Set theFarm = CreateObject("MetaFrameCOM.MetaFrameFarm theFarm.Initialize 1 Set SessionList = theFarm.Sessions mycount = 0 dis_count = 0 For Each aSession In SessionList if aSession.SessionState = 5 then dis_count = dis_count + 1 end if mycount = mycount + 1 Next Wscript.Echo mycount WScript.Echo dis_count Wscript.Echo now "WScript.Echo "Active Sessions "WScript.Echo "Inactive Sessions |
ה- output יהיה משהו כמו זה:
החלק שמתייחס לנתונים הנ"ל בקובץ ה cfg שישמש את ה MRTG אמור להראות ככה:
| YLegend[CommartFarm-sessions]: Sessions Options[CommartFarm-sessions]: gauge, nopercent Target[CommartFarm-sessions]: `cscript d:\mrtg\gadis\numofsessions.vbs //nologo` MaxBytes[CommartFarm-sessions]: 523444000 Title[CommartFarm-sessions]: TermServName: # Sessions ShortLegend[CommartFarm-sessions]: # Legend1[CommartFarm-sessions]: Active Sessions Legend2[CommartFarm-sessions]: Disconnected Sessions LegendI[CommartFarm-sessions]: Active: LegendO[CommartFarm-sessions]: Disconnected: PageTop[CommartFarm-sessions]: Active / Disconnected Sessions |
וככה יראה הגרף בסופו של דבר:
אחלה, אז יש לנו נתונים לגבי החווה כולה, עכשיו מה עם נתונים לגבי כל שרת, אין בעיה... הנה הסקריפט:
Set theServer = CreateObject("MetaFrameCOM.MetaFrameServer")
theServer.Initialize 6, "citrixserver"
count1 = 0
dis_count = 0
For Each aSession In theServer.Sessions
if (asession.sessionstate <> 7) and (asession.username <> "") then
if asession.sessionstate = 5 then
dis_count = dis_count + 1
end if
count1 = count1 + 1
end if
Next
Wscript.Echo count1
WScript.Echo dis_count
Wscript.Echo now
WScript.Echo "Active Sessions"
WScript.Echo "Inactive Sessions"
בדוגמה הנ"ל, צריך רק להחליף את citrixserver לשם השרת המקורי ו... וואאאלההה...
קובץ ה cfg יהיה די דומה לקובץ ששימש אותנו לחווה כולה, רק בשינוי של שם הסקריפט שנריץ מתוך הקובץ ושהם שישתנה למשהו מתאים יותר.
לדוגמא, שם השרת שלי הוא Citrix01 וקובץ ה vbs נמצא ב: d:\mrtg\gadis\server_sessions.vbs, אז המקטע שיתייחס ל sessions לשרת Citrix01 בתוך קובץ ה cfg ייראה כך:
YLegend[citrix01-sessions]: Sessions
Options[citrix01-sessions]: gauge, nopercent
Target[citrix01-sessions]: `cscript d:\mrtg\gadis\server_sessions.vbs //nologo`
MaxBytes[citrix01-sessions]: 523444000
Title[citrix01-sessions]: TermServName: # Sessions
ShortLegend[citrix01-sessions]: sessions
Legend1[citrix01-sessions]: Active Sessions
Legend2[citrix01-sessions]: Disconnected Sessions
LegendI[citrix01-sessions]: Active:
LegendO[citrix01-sessions]: Disconnected:
PageTop[citrix01-sessions]: # of Active / Disconnected Sessions
סביבת Terminal Server
מכיוון שב TS אין את מושג החווה, נצטרך לעבור שרת שרת ולראות מה מצב ה sessions אצלו.
לשם כך נכין קובץ טקסט עם השרתים הרלוונטיים כדי שהסקריפט ישתמש בו.
לדוגמא, קובץ ה servers.txt שלי נראה כך:
והסקריפט:
Set Fs1 = WScript.CreateObject("Scripting.FileSystemObject")
Set Servers = Fs1.OpenTextFile("d:\mrtg\gadis\servers.txt",1)
count = 0
dis_count = 0
Do
serverline=Servers.ReadLine
if serverline="" then
WScript.Quit
end if
Sessions(serverline)
Loop while Servers.AtEndOfStream <> True
wscript.echo count
wscript.echo dis_count
wscript.echo now
wscript.echo "Active Sessions"
wscript.echo "Inactive Sessions"
Sub Sessions(strComputer)
'Gets the number of terminal services sessions
set oSvc = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
wqlQuery = "select ActiveSessions, InactiveSessions " & _
" from Win32_PerfRawData_TermService_TerminalServices"
for each oData in oSvc.ExecQuery(wqlQuery)
for each oProperty in oData.Properties_
if oProperty.Name = "ActiveSessions" then
ActiveSessions = oProperty.Value
elseif oProperty.Name = "InactiveSessions" then
InactiveSessions = oProperty.Value
end if
next
next
count = count + ActiveSessions
dis_count = dis_count + InactiveSessions
End Sub
כמו שאפשר לראות, הסקריפט עובר על כל שורה בקובץ ה servers.txt ומשתמש בה כשם השרת אותו יש לדגום, count אוסף את מספר Active sessions ו- dis_count את ה Inactive sessions, דבר קטן לקחת בחשבון, ש console session תמיד יתווסף ל Inactive sessions.
מקטע ההגדרות הרלוונטי בקובץ ה cfg של mrtg ייראה כך:
YLegend[ts-sessions]: Sessions
Options[ts-sessions]: gauge, nopercent
Target[ts-sessions]: `cscript d:\mrtg\gadis\ts_sessions.vbs //nologo`
MaxBytes[ts-sessions]: 523444000
Title[ts-sessions]: TermServName: # Sessions
ShortLegend[ts-sessions]: sessions
Legend1[ts-sessions]: Active Sessions
Legend2[ts-sessions]: Disconnected Sessions
LegendI[ts-sessions]: Active:
LegendO[ts-sessions]: Disconnected:
PageTop[ts-sessions]: # of Active / Disconnected Sessions