DCSIMG
איך ליצור MRTG graphs עבור חוות TS או Citrix - Gadi's Blog

Gadi's Blog

SBC, Application Delivery, Scripting ושאר ירקות

איך ליצור 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 יהיה משהו כמו זה:
New Picture (1)
 
החלק שמתייחס לנתונים הנ"ל בקובץ ה 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

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

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 שלי נראה כך:
ts01
ts02
ts03
ts04
והסקריפט:

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
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 5 and 8 and type the answer here:


Enter the numbers above: