====== ASP.NET Performance Counter Pack ====== ^ Author | [[ neil_franken@yahoo.com | Neil Franken]] | ^ Compatibility | Xymon 4.2 | ^ Requirements | IIS, ASP.NET, VBS | ^ Download | None | ^ Last Update | 2010-06-22 | ===== Description ===== This script will monitor some basic performance counters for the overall ASP.NET Health on a server. The counters monitored are: * Applications Restarts * Applications Running * Requests Current * Requests Queued ===== Installation ===== === Client side === Place the script on the IIS Server you want to monitor and add a appropriate section to the BBWin.cfg externals section. Typically it would be configured like this. Once this is added to the cfg file it should create a aspnethealth file in the tmp directory of BBwin for upload. If this is the case it is working. === Server side === While the Xymon server does not require any installation you can add the following to the hobbitserver.cfg to create a graph with some of the more important values on. == 1) Adding NCV Definition to the hobbitserver.cfg file == * Add aspnethealth=ncv to the TEST2RRD section of the hobbitserver.cfg file. Please note that the aspapplications name must reflect the name of the test. You will change this to monitor a specific application. * Add the following definition to the hobbitserver.cfg. NCV_asphealth="RequestsQueued:GAUGE,RequestCurrent:GAUGE,ApplicationRestarts:GAUGE,ApplicationRunning:GAUGE" * Restart Xymon == 2) Adding Graph Definition to the hobbitgraph.cfg file == * Add the following to the file [aspnethealth] TITLE ASP Overall Health YAXIS Number DEF:RequestsQueued=asphealth.rrd:RequestsQueued:AVERAGE DEF:RequestCurrent=asphealth.rrd:RequestCurrent:AVERAGE LINE2:RequestsQueued#FF0000:RequestsQueued LINE2:RequestCurrent#00FF66:RequestCurrent COMMENT:\n GPRINT:RequestsQueued:LAST:RequestsQueued\: %5.1lf%s (cur) GPRINT:RequestsQueued:MAX: \: %5.1lf%s (max) GPRINT:RequestsQueued:MIN: \: %5.1lf%s (min) GPRINT:RequestsQueued:AVERAGE: \: %5.1lf%s (avg)\n GPRINT:RequestCurrent:LAST:RequestCurrent\: %5.1lf%s (cur) GPRINT:RequestCurrent:MAX: \: %5.1lf%s (max) GPRINT:RequestCurrent:MIN: \: %5.1lf%s (min) GPRINT:RequestCurrent:AVERAGE: \: %5.1lf%s (avg)\n ===== Source ===== ==== aspnethealth.vbs==== ' ASP.NET Applications Performancer Counters ' Author: Neil Franken ' email: neil_franken@yahoo.com ' Description: ' This script collects some performance counters related to a overall ASP health i.e. the server. ' ' You are welcome to use, modify, mangle and do what you please with this script just please ' keep me in the loop about bugs,updates and or improvements. ' ' IMPORTANT NOTES: ' Before running this script please do the following. Open a command prompt on the SQL server where the script ' runs. Run the following command wmiadap/f. ' Open the services manager screen and restart/start the WMI performance adapter service. This service must be running ' to read the performance counters via the WMI interface. ' KNOWN ISSUE: ' I encountered a problem where the CPU was 64 Bit but the installed OS was 32Bit. This caused the registry read to fail. ' If you have a 32 Bit OS running on a 64 bit system yuo will have to change the script to point to the BBWin\tmp folder ' as the script will attempt to read the value from a registry key that dont exist. Also comment out the ProcessorCheck function. ' ' Version 0.5 Released: 22/06/2010 ' strAlarmState = "green" strTestName = "aspnethealth" 'this Is the filename i.e. column name in xymon. strOutput = "" Const strComputer = "." Dim objWMIService, colItems, objItem Dim ErrorPerSec, ReqExecuting, ReqFailed, ReqNotAuthorized, ReqNotFound, ReqPerSeq,ReqTimedOut Set ws = WScript.CreateObject("WScript.Shell") ProcessorCheck If Proc = "x86" Then ' extPath = "c:\" extPath = ws.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\BBWin\tmppath") 'Registry key that stores the ext script path on 32bit Architecture ' WScript.Echo Proc Else ' extPath = "c:\" extPath = ws.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\BBWin\tmppath") 'Registry key that stores the ext script path on 64bit Architecture ' WScript.Echo Proc End If extPath = "c:\" ' Usage of the CheckValue,CheckReserveValue Functions: ' CheckValue takes the Performance Counter value,a description which appears on Xymon,the warning value and the Alarm value and does a check for values above the warn and alarm thresholds. ' CheckReverseValue takes the Performance Counter value,a description which appears on Xymon,the warning value and the Alarm value and does a check for values below the warn and alarm thresholds. ' ' ASP.NET Check Starts Here strOutput = strOutput & vbCrLf & "ASP.NET Application Information:" & vbCrLf Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select * from Win32_PerfFormattedData_ASPNET_ASPNET",,48) For Each objItem in colItems AppRestarts =objItem.ApplicationRestarts AppRunning =objItem.ApplicationsRunning ReqCurrent =objItem.RequestsCurrent ReqQueued =objItem.RequestsQueued Exit For Next strOutput = strOutput & CheckValue(AppRestarts,"ApplicationRestarts",1, 5) strOutput = strOutput & CheckValue(AppRunning,"ApplicationRunning",3, 5) strOutput = strOutput & CheckValue(ReqQueued,"RequestFailed",50, 150) strOutput = strOutput & CheckValue(ReqCurrent,"RequestCurrent",100, 300) ' Write the file for BB WriteFile extPath, strTestName, strAlarmState, strOutput '=========================================================== ' FUNCTIONS and SUBS start here Sub ProcessorCheck () Dim WshShell, WshSysEnv Set WshShell = WScript.CreateObject("WScript.Shell") Set WshSysEnv = WshShell.Environment("SYSTEM") Proc = WshSysEnv("PROCESSOR_ARCHITECTURE") End Sub ' This is used to check the actual value against the warning and alarm. Function CheckValue(iObjectValue,strObjectDesc,iWarnValue,iAlarmValue) If iWarnValue > iAlarmValue Then CheckValue = "&red" & " " & strObjectDesc & ":" & vbTab & "Object is Misconfigured" If strAlarmState <> "red" Then strAlarmState = "red" End If Else If CDbl(iObjectValue) > CDbl(iWarnValue) Then If CDbl(iObjectValue) > CDbl(iAlarmValue) Then CheckValue = "&red" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf SetAlarmStatus "red" Else CheckValue = "&yellow" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf 'CheckValue = "&yellow" & strObjectDesc & vbTab & iObjectValue & vbCrLf SetAlarmStatus "yellow" End If Else CheckValue = "&green" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf 'CheckValue = "&green" & strObjectDesc & vbTab & iObjectValue & vbCrLf End If End If End Function ' This is used to check the actual value against the warning and alarm. ' This one the alarm will be a lower value than the warning. (Values Decrease rather than increase) Function CheckReverseValue(iObjectValue,strObjectDesc,iWarnValue,iAlarmValue) If CDbl(iWarnValue) < CDbl(iAlarmValue) Then CheckReverseValue = "&red" & " " & strObjectDesc & ":" & vbTab & "Object is Misconfigured" If strAlarmState <> "red" Then strAlarmState = "red" End If Else If CDbl(iObjectValue) < CDbl(iWarnValue) Then If CDbl(iObjectValue) < CDbl(iAlarmValue) Then CheckReverseValue = "&red" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf SetAlarmStatus "red" Else CheckReverseValue = "&yellow" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf SetAlarmStatus "yellow" End If Else CheckReverseValue = "&green" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf End If End If End Function ' This is called to set the overall alarm status. Sub SetAlarmStatus(strnewAlarmState) If strnewAlarmState = "red" Then strAlarmState = strnewAlarmState ElseIf strnewAlarmState = "yellow" Then If strAlarmState <> "red" Then strAlarmState = strnewAlarmState End If End If End Sub ' This SUB is used for outputting the file to the external's directory in bb Sub WriteFile(strExtPath, strTestName, strAlarmState, strOutput) Set fso = CreateObject("Scripting.FileSystemObject") strOutput = strAlarmState & " " & Date & " " & Time & vbCrLf & vbCrLf & strOutput & vbCrLf Set f = fso.OpenTextFile(strExtPath & "\" & strTestName , 8 , True) f.Write strOutput f.Close Set fso = Nothing End Sub ===== Known Bugs and Issues ===== * Running a 32 Bit Windows on a 64 Bit CPU(It happens apparently). This causes the script to look for the HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\BBWin\tmppath registry key. This does not exist in a 32 windows version and the script will bomb. To fix comment out the Processor check and hard code(yuck) the bath to the BBwin\tmp folder. * When running the script it throws a null exception which looks something like C:\Program Files (x86)\BBWin\ext\aspnethealth.vbs(103, 2) (null). To fix this problem open a command prompt and execute the following command wmiadap/f. Open the administrative tools under control panel and run the windows services manager. Right at the bottom of the list there is a WMI Performance Adapter service. Restart the service if started, if the service is not running please start it. ===== To Do ===== * I am not a IIS/ASP.NET expert so these performance counters are just what I used to monitor a problematic server. I am sure they can be improved. Let me know and I can help. ===== Credits ===== * Neil Franken * Chris Walker, Liberty Enterprises for his original IISHealth script. ===== Changelog ===== * **2010-06-22** * Initial release