This document explains the configuration of PowerShell script to define a Custom Monitor.

PowerShell script configuration

Custom monitor PowerShell scripts are provided with below input parameters from Agent while invoking the script.

Cscript custom_script.ps1 
    "
    /metricName::metricName1|metricName2 
    /metric::metric1|metric2 
    /warn::warn1|warn2 
    /critical::crit1|crit2 
    /alert::do_alert1|do_alert2 
    /params::"args_string1|args_string2"
    "

Note: The input parameters must not contain the following string: $$$_$$$

Parsing parameters

Use the following block of code in all the PowerShell custom monitor scripts to parse the parameters.

 if($args.count -gt 0)
	{
	for($i=0 ;$i -le $args.count-1 ;$i++)
	{
		$strArgs = $strArgs + [string]($args[$i])
  	}
	}
	if($strArgs.Contains("/metricName::") -ne 0)
	{
		$MetricNameTokens1 = $strArgs -split "/metricName::", 2
                       $MetricNameTokens= $MetricNameTokens1[1].Trim() 
		if($MetricNameTokens.Contains("/") -ne 0)
		 {
			$MetricNameTokens1 = $MetricNameTokens -split "/", 2
                  		$MetricNameTokens = $MetricNameTokens1[0].Trim()
                  			#write-host "metricName " + $MetricNameTokens
	      		 }
	}
		if($strArgs.Contains("/metric::") -ne 0)
	{
                  $MetricTokens1 = $strArgs -split "/metric::", 2
                  	    $MetricTokens = $MetricTokens1[1].Trim()
	    if($MetricTokens.Contains("/") -ne 0)
	    {
	         $MetricTokens1 = $MetricTokens -split "/", 2
		    $MetricTokens = $MetricTokens1[0].Trim()
		    #write-host "Metric is " + $MetricTokens
	   }
         }

                if($strArgs.Contains("/warn::") -ne 0)
	 {
		   $Warning_ThresTokens1 = $strArgs -split "warn::", 2
		   $Warning_ThresTokens = $Warning_ThresTokens1[1].Trim()
        		   if($Warning_ThresTokens.Contains("/") -ne 0)
		   {
			   $Warning_ThresTokens1 = $Warning_ThresTokens  -split "/", 2
			   $Warning_ThresTokens =  $Warning_ThresTokens1[0].Trim()
			     #write-host "warn is " + $Warning_ThresTokens
		   }
          }
                 if($strArgs.Contains("/critical::") -ne 0)
	  {
		  $Critical_ThresTokens1 = $strArgs -split "/critical::", 2
		  $Critical_ThresTokens = $Critical_ThresTokens1[1].Trim()
		  if($Critical_ThresTokens.Contains("/") -ne 0)
		  {
	  	$Critical_ThresTokens1 = $Critical_ThresTokens -split "/", 2
		$Critical_ThresTokens = $Critical_ThresTokens1[0].Trim()
	#write-host "critical is " + $Critical_ThresTokens
		  }
	  }
                if($strArgs.Contains("/alert::") -ne 0)
	  {
		   $Alert_FlagTokens1 =  $strArgs -split "/alert::", 2
		   $Alert_FlagTokens = $Alert_FlagTokens1[1].Trim()
		   if($Alert_FlagTokens.Contains("/") -ne 0)
		   {
		    $Alert_FlagTokens1= $Alert_FlagTokens -split "/", 2
		    $Alert_FlagTokens=  $Alert_FlagTokens1[0].Trim()
		            #write-host "Alert_FlagTokens " + $Alert_FlagTokens
		   }
	    }
            if($strArgs.Contains("/params::") -ne 0)
	    {
		$ParamsTokens1 = $strArgs -split "/params::", 2
		$ParamsTokens = $ParamsTokens1[1].Trim()
		if($ParamsTokens.Contains("/") -ne 0)
    {
		$ParamsTokens1 = $ParamsTokens -split "/", 2
			$ParamsTokens = $ParamsTokens1[0].Trim()
			#write-host "params are " + $ParamsTokens
		}
     }

Sending performance data

The write-host parameter is used to send performance data.

For example: write-host "The Alert Flag tokens are " + $Alert_FlagTokens

Sending alerts

Use the following code to send alert.

 Function SendAlertToAB					
 {
    	param([string]$MetricInstance,[string]$Instance,[string]$OldState,[string]$NewState,[int]$Value)
	$currTime = [System.DateTime]::Now
		$timeStamp = [string]$currTime.Year + "-" + [String]$currTime.Month + "-" + [String]$currTime.Day + " " +
[string]$currTime.Hour + ":" + [string]$currTime.Minute + ":" + [string]$currTime.Second
	$SocketXML = ""
	$SocketXML = $SocketXML + "AlertOutput"
	$SocketXML = $SocketXML + ""+ $MetricInstance+""
	$SocketXML = $SocketXML + ""+ $NewState+""
	$SocketXML = $SocketXML + ""+ $OldState+""
	$SocketXML = $SocketXML + "Value of metric " + $MetricInstance + ":" + $Instance + " is " + $Value +""
	$SocketXML = $SocketXML + "" + $timeStamp + ""
	$SocketXML = $SocketXML + "Monitoring"
	$SocketXML = $SocketXML + ""+ $MetricInstance+ "_" +$Instance+""
	$SocketXML = $SocketXML + "Value of metric " + $MetricInstance + ":" + $Instance + " is "+ $Value +"  "
	$SocketXML = $SocketXML + ""

# Invoke exe which sends data through socket if($fileAccessPath.contains("x86"))
        {
		& "C:\Program Files (x86)\OpsRamp\Agent\bin\AgentSockIPC.exe" $SocketXml
	}
	else
	{
		& "C:\Program Files\OpsRamp\Agent\bin\AgentSockIPC.exe" $SocketXml
	}
     }