ASP.NET Application Specific Performance Counters

Neil Franken Neil Franken
Compatibility Xymon 4.2
Requirements IIS, VBS
Download None
Last Update 2010-06-21

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.

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. <load value=“cscript c:\VBSScripts\aspapplicationperfmon.vbs” timer=“5m” />

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

Show Graph Definition ⇲

Hide Graph Definition ⇱

[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

aspapplicationperfmon.vbs

Show Code ⇲

Hide Code ⇱

' 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 <<ASPNETAPPLICATION>> 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 <<ASPNETAPPLICATION>> 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 ='<<ASPNETAPPLICATION>>'",,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
  • 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.

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.

  • Neil Franken
  • Chris Walker, Liberty Enterprises for his original IISHealth script.
  • 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.
  • monitors/aspapplicationperfmon.txt
  • Last modified: 2010/06/22 08:37
  • (external edit)