====== ASP.NET Application Specific Performance Counters ====== ^ Neil Franken| [[ neil_franken@yahoo.com | Neil Franken]] | ^ Compatibility | Xymon 4.2 | ^ Requirements | IIS, VBS| ^ Download | None | ^ Last Update | 2010-06-21 | ===== Description ===== This script will monitor ASP.Net Application Specific Performance Counters. You will need to modify the script to point to a specific ASP application. For example you have a mission critical asp.net application called Warehouse you will need to change the script to monitor the application called Warehouse. You can also use the Total instance to get a specific overview. See the code for instructions on where to change the script to point to a specific application. ===== Installation ===== === Client side === Edit the script to monitor the ASP Application of your choice. See Script for more instructions. 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 sql 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 aspapplications=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. Once again remember to change the value aspapplications to reflect the name of the test. NCV_aspapplications="ErrorsPerSecond:GAUGE ,RequestExecuting:GAUGE ,RequestFailed:GAUGE ,RequestNotAuthorized:GAUGE ,RequestNotFound:GAUGE ,RequestPerSecond:GAUGE ,RequestTimedOut:GAUGE" * Restart Xymon == 2) Adding Graph Definition to the hobbitgraph.cfg file == * Add the following to the file.Remember to chance the aspapplications name to reflect your test name [aspapplications] TITLE YOUR ASP.NET Application Health YAXIS Number DEF:ErrorsPerSecond=genisyshealth.rrd:ErrorsPerSecond:AVERAGE VDEF:ErrorsPerSecondmax=ErrorsPerSecond,MAXIMUM VDEF:ErrorsPerSecondavg=ErrorsPerSecond,AVERAGE VDEF:ErrorsPerSecondmin=ErrorsPerSecond,MINIMUM VDEF:ErrorsPerSecondlast=ErrorsPerSecond,LAST DEF:RequestExecuting=genisyshealth.rrd:RequestExecuting:AVERAGE VDEF:RequestExecutingmax=RequestExecuting,MAXIMUM VDEF:RequestExecutingavg=RequestExecuting,AVERAGE VDEF:RequestExecutingmin=RequestExecuting,MINIMUM VDEF:RequestExecutinglast=RequestExecuting,LAST DEF:RequestFailed=genisyshealth.rrd:RequestFailed:AVERAGE VDEF:RequestFailedmax=RequestFailed,MAXIMUM VDEF:RequestFailedavg=RequestFailed,AVERAGE VDEF:RequestFailedmin=RequestFailed,MINIMUM VDEF:RequestFailedlast=RequestFailed,LAST DEF:RequestNotAuthorize=genisyshealth.rrd:RequestNotAuthorize:AVERAGE VDEF:RequestNotAuthorizemax=RequestNotAuthorize,MAXIMUM VDEF:RequestNotAuthorizeavg=RequestNotAuthorize,AVERAGE VDEF:RequestNotAuthorizemin=RequestNotAuthorize,MINIMUM VDEF:RequestNotAuthorizelast=RequestNotAuthorize,LAST DEF:RequestNotFound=genisyshealth.rrd:RequestNotFound:AVERAGE VDEF:RequestNotFoundmax=RequestNotFound,MAXIMUM VDEF:RequestNotFoundavg=RequestNotFound,AVERAGE VDEF:RequestNotFoundmin=RequestNotFound,MINIMUM VDEF:RequestNotFoundlast=RequestNotFound,LAST DEF:RequestPerSecond=genisyshealth.rrd:RequestPerSecond:AVERAGE VDEF:RequestPerSecondmax=RequestPerSecond,MAXIMUM VDEF:RequestPerSecondavg=RequestPerSecond,AVERAGE VDEF:RequestPerSecondmin=RequestPerSecond,MINIMUM VDEF:RequestPerSecondlast=RequestPerSecond,LAST DEF:RequestTimedOut=genisyshealth.rrd:RequestTimedOut:AVERAGE VDEF:RequestTimedOutmax=RequestTimedOut,MAXIMUM VDEF:RequestTimedOutavg=RequestTimedOut,AVERAGE VDEF:RequestTimedOutmin=RequestTimedOut,MINIMUM VDEF:RequestTimedOutlast=RequestTimedOut,LAST COMMENT: COMMENT:\t\t Maximum COMMENT:\tAverage COMMENT:\tMinimum COMMENT:\tCurrent \l LINE2:ErrorsPerSecond#FF0000:Errors/Second GPRINT:ErrorsPerSecondmax:%8.0lf %S GPRINT:ErrorsPerSecondavg:\t%8.0lf %S GPRINT:ErrorsPerSecondmin:\t%8.0lf %S GPRINT:ErrorsPerSecondlast:\t%8.0lf %S\l LINE2:RequestExecuting#00FF66:Executing GPRINT:RequestExecutingmax:%8.0lf %S GPRINT:RequestExecutingavg:\t%8.0lf %S GPRINT:RequestExecutingmin:\t%8.0lf %S GPRINT:RequestExecutinglast:\t%8.0lf %S\l LINE2:RequestPerSecond#1ebdf8:Request/Second GPRINT:RequestPerSecondmax:%8.0lf %S GPRINT:RequestPerSecondavg:\t%8.0lf %S GPRINT:RequestPerSecondmin:\t%8.0lf %S GPRINT:RequestPerSecondlast:\t%8.0lf %S\l COMMENT:Data Not On Graph\l #LINE2:RequestFailed#ff6c00:Failed COMMENT:Request Failed GPRINT:RequestFailedmax:%8.0lf %S GPRINT:RequestFailedavg:\t%8.0lf %S GPRINT:RequestFailedmin:\t%8.0lf %S GPRINT:RequestFailedlast:\t%8.0lf %S\l #LINE2:RequestNotAuthorize#000000:Not Authorized COMMENT:Not Authorized GPRINT:RequestNotAuthorizemax:%8.0lf %S GPRINT:RequestNotAuthorizeavg:\t%8.0lf %S GPRINT:RequestNotAuthorizemin:\t%8.0lf %S GPRINT:RequestNotAuthorizelast:\t%8.0lf %S\l #LINE2:RequestNotFound#b527d4:Not Found COMMENT:Not Found GPRINT:RequestNotFoundmax:%8.0lf %S GPRINT:RequestNotFoundavg:\t%8.0lf %S GPRINT:RequestNotFoundmin:\t%8.0lf %S GPRINT:RequestNotFoundlast:\t%8.0lf %S\l #LINE2:RequestTimedOut#d4ce27:Timed Out COMMENT:Timed Out GPRINT:RequestTimedOutmax:%8.0lf %S GPRINT:RequestTimedOutavg:\t%8.0lf %S GPRINT:RequestTimedOutmin:\t%8.0lf %S GPRINT:RequestTimedOutlast:\t%8.0lf %S\l ===== Source ===== ==== aspapplicationperfmon.vbs==== ' ASP.NET Applications Performancer Counters ' Author: Neil Franken ' email: neil_franken@yahoo.com ' Description: ' This script collects some performance counters related to a specific ASP Application. ' ' 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. ' BEFORE RUNNING THIS SCRIPT: ' 1) Change the following token <> to the name of the ASP.NET Application you wish to profile. ' 2) Change the str Name to something like applicationname_asp i.e. google_asp, sharepoint_asp etc. ' 3) If you use the graph definition please change the name from aspapplications to the name you give the file. ' 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: 18/06/2010 ' strAlarmState = "green" strTestName = "aspapplication" '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 ' 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 Application Check Starts Here strOutput = strOutput & vbCrLf & "ASP.NET Application Information:" & vbCrLf Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") '------------------------------------------------------------------------------------ ' YOU NEED TO MODIFY THIS SECTION TO MAKE IT WORK | '------------------------------------------------------------------------------------ ' Change the token <> to the application name you want to monitor ' To Check what name your application runs under you can use the peformance monitor ' to add a ASP.NET application performance counter. The applications running on the ' server will be listed under instance names. '------------------------------------------------------------------------------------ Set colItems = objWMIService.ExecQuery("Select * from Win32_PerfFormattedData_ASPNET_ASPNETApplications Where name ='<>'",,48) '------------------------------------------------------------------------------------ ' END OF SECTION YOU NEED TO MODIFY | '------------------------------------------------------------------------------------ For Each objItem In colItems ErrorPerSec=objItem.ErrorsTotalPerSec ReqExecuting= objItem.RequestsExecuting ReqFailed=objItem.RequestsFailed ReqNotAuthorized=objItem.RequestsNotAuthorized ReqNotFound=objItem.RequestsNotFound ReqPerSeq=objItem.RequestsPerSec ReqTimedOut=objItem.RequestsTimedOut Exit For Next strOutput = strOutput & CheckValue(ErrorPerSec,"ErrorsPerSecond",100, 300) strOutput = strOutput & CheckValue(ReqExecuting,"RequestExecuting",100, 300) strOutput = strOutput & CheckValue(ReqFailed,"RequestFailed",100, 300) strOutput = strOutput & CheckValue(ReqNotAuthorized,"RequestNotAuthorized",100, 300) strOutput = strOutput & CheckValue(ReqNotFound,"RequestNotFound",25, 75) strOutput = strOutput & CheckValue(ReqPerSeq,"RequestPerSecond",300, 600) strOutput = strOutput & CheckValue(ReqTimedOut,"RequestTimedOut",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\aspapplicationperfmon.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 ===== It would be nice to have this script retrieve a list of all ASP.NET applications and list all of the applications and their respective performance counters. The main problem then would be to generate a graph with all these values. I could create a script to read the result set and then create the appropriate graph definition. However this is sufficient for now. ===== Credits ===== * Neil Franken * Chris Walker, Liberty Enterprises for his original IISHealth script. ===== Changelog ===== * **2010-06-21** * Initial release * **2010-06-22** * Initial release had debug functionallity included which was removed. Thanks to Carlos Arroba for reporting the issue. Copy and Paste is a blessing and curse.