====== 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.