-
-
Save scottames/d4e16bccdc1bc047a010 to your computer and use it in GitHub Desktop.
<# | |
.SYNOPSIS | |
VictorOps Alerting from Microsoft System Center Operations Manager (SCOM) through PowerShell | |
Call this script from SCOM's command notification channel - be sure to update the API key (parameter #2). See Example for usage. | |
.DESCRIPTION | |
Post alerts to VictorOps from Microsoft System Center Operations Manager (SCOM) through PowerShell | |
.EXAMPLE | |
FULL PATH OF THE COMMAND FILE: C:\windows\system32\WindowsPowerShell\v1.0\powershell.exe | |
COMMAND LINE PARAMETERS: "C:\scripts\VO_Send-Alert_Test.ps1" '"$Data[Default='Not Present']/Context/DataItem/AlertId$"' '"$RoutingKey"' '"api-key"' | |
# !Change $RoutingKey to the routing key you would like to pass in or remove it alltogether to default to 'everyone' | |
# !Change api-key to the organization api key or default it in parameter #2 | |
STARTUP FOLDER FOR THE COMMAND LINE: C:\windows\system32\WindowsPowerShell\v1.0\ | |
.EXAMPLE | |
# Easier to look at: | |
"C:\scripts\VO_Send-Alerts.ps1" ^ | |
'"$Data[Default='Not Present']/Context/DataItem/AlertId$"' ^ | |
'"$RoutingKey"'' ^ | |
'"api-key"' | |
# Change $RoutingKey to the routing key you would like to pass in, or remove it alltogether to default to 'everyone' | |
.NOTES | |
Credit to [PagerDuty's integration](http://www.pagerduty.com/docs/guides/scom-integration-guide/) | |
& [nategrieb](https://github.com/nategrieb/VictorOps-SalesForce/blob/master/VictorOpsTimeLine%20Apex%20Class) | |
& [Marion Garcia](http://www.systemcentercentral.com/forums-archive/topic/scom-2012-r2-command-notification-channel-using-powershell/) | |
#> | |
Param ( | |
[Parameter(Mandatory=$true ,Position=0,HelpMessage="Unique AlertID must be provided.")][GUID]$AlertID, | |
[Parameter(Mandatory=$false,Position=1,HelpMessage="Team routing key, optional.")] [String]$RoutingKey = "everyone", | |
[Parameter(Mandatory=$false,Position=2,HelpMessage="Organization API key (see REST API Integrations settings in VictorOps), optional.")][String]$API = "", | |
[Parameter(Mandatory=$false,Position=3,HelpMessage="Monitoring tool, optional.")] [String]$MonitoringTool = "Microsoft System Center Operations Manager" | |
) | |
# Required: OperationsManager Module | |
Import-Module OperationsManager | |
## Find the alert | |
$Alert = Get-SCOMAlert | where {$_.id -eq $AlertID.ToString()} | |
# Determine the status of the alert | |
switch ($Alert.ResolutionState){ | |
0 {$Status="CRITICAL"} | |
255 {$Status="RECOVERY"} | |
default {$Status="CRITICAL"} | |
} | |
# workaround for unix/linux hosts - hostnames do not come through clearly in SCOM | |
if($Alert.NetbiosComputerName -ne $null){ $hstname = $alert.NetbiosComputerName } | |
elseif($Alert.MonitoringObjectPath -ne $null){ $hstname = $alert.MonitoringObjectFullName } | |
else { $hstname = $alert.MonitoringObjectName } | |
## Setup our Subject & StateMessage to be passed | |
[String]$Subject = $Status + ": " + $Alert.Name + " [" + $hstname + "]" | |
[String]$StateMessage = "Description: " + $Alert.Description + "`n" ` | |
+ "Hostname: " + $hstname + "`n" ` | |
+ "Timestamp: " + $Alert.TimeRaised.ToLocalTime() + " PST `n" ` | |
+ "Team: " + $RoutingKey.ToUpper() + "`n" ` | |
+ "Last modified by: " + $Alert.LastModifiedBy + "`n" ` | |
+ "Last modified time: " + $Alert.LastModified + "`n" ` | |
## Convert to json | |
$props = @{ | |
message_type = $Status; #[String] One of the following values: INFO, WARNING, ACKNOWLEDGMENT, CRITICAL, RECOVERY | |
timestamp = $Alert.TimeRaised.ToLocalTime(); #[Number] Timestamp of the alert in seconds since epoch. Defaults to the time the alert is received at VictorOps. | |
entity_id = $Alert.id.ToString(); #[String] The name of alerting entity. If not provided, a random name will be assigned. | |
entity_display_name = $Subject; #[String] Used within VictorOps to display a human-readable name for the entity. | |
hostname = $hstname; #[String] System hostname (set above via logic) | |
monitoring_tool = $MonitoringTool; #[String] The name of the monitoring system software (eg. nagios, icinga, sensu, etc.) | |
state_message = $StateMessage; #[String] Any additional status information from the alert item. | |
Subject = $Subject; | |
} | |
$json = ConvertTo-Json -InputObject $props | |
## Log alert | |
# Event-log | |
$CheckEventLog = (Get-EventLog -List | ? Log -EQ "OM Alerts") | |
if($CheckEventLog -eq $null){ | |
try{New-EventLog -LogName "OM Alerts" -Source "VictorOps Alerts"} | |
catch{Write-Error "Please rerun the script from a Windows PowerShell console with admin rights ('Run As Administrator'). Cannot continue.";Break} | |
} | |
$event_message = $StateMessage + "`n Command: " + "Invoke-RestMethod -Method Post -ContentType `"application/json`" -Body `n$json`n -Uri `"https://alert.victorops.com/integrations/generic/20131114/alert/$API/$RoutingKey`"" | |
Write-EventLog -LogName "OM Alerts" -Source "VictorOps Alerts" -Message $event_message -EventId 2 -EntryType Information | |
<# Text file | |
$Logstring = $StateMessage.replace("`n"," ") | |
$Logfile = "C:\scripts\VO_Send-Alerts.log" | |
$DateTime = Get-Date -Uformat "%y-%m-%d %H:%M:%S" | |
$Logstring = $DateTime + " " + $Logstring | |
Add-content $Logfile -value $Logstring | |
$json | Out-File -FilePath "C:\scripts\VO_Send-Alerts.$RoutingKey.json" | |
#> | |
# Post the alert | |
Invoke-RestMethod -Method Post ` | |
-ContentType "application/json" ` | |
-Body $json ` | |
-Uri "https://alert.victorops.com/integrations/generic/20131114/alert/$API/$RoutingKey" |
Scott, your integration script works great with VictorOps.
ChrisD, I would like to try your integration with PagerDuty if you are willing to share.
When executing the Script it asks me to add the AlertID, any ideas?
:\Program Files\Microsoft System Center 2016\Operations Manager\PowerShell> C:\Scripts\VictorOps_Alert.ps1
cmdlet VictorOps_Alert.ps1 at command pipeline position 1
Supply values for the following parameters:
AlertID:
Achamblat - this script was developed in 2015 for a much older version of PowerShell, SCOM & Victorops (now Splunk Oncall). I cannot say whether or not it is compatible with the latest version of either. I cannot recommend using this in a production environment without a rewrite.
That being said, based on your question - you need to look up the SCOM Alert ID and pass that into the script as the AlertID
parameter.
Hi,
I came over this Gist after searching for SCOM and VictorOps integrations.
I have made a very similar integration, for PagerDuty. But as with your case, this is only one-way. Have you looked into further bi-directional sync, where a VictorOps activity is pushed/pulled to SCOM - either on a schedule, or with webhooks?
Best,
ChrisD