LogAnalyticsAlerts.psm1
function Get-AccessTokenFromContext { try { $accesstoken = (New-Object Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient([Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile)).AcquireAccessToken((Get-AzureRmContext).Subscription.TenantId).AccessToken $buildheaders = @{ 'Authorization' = "Bearer $accesstoken" 'Content-Type' = "application/json" } return $buildheaders } catch { Write-Output "No context found! Please run 'Login-AzureRMAccount' to login to Azure" break } } <# .Synopsis Gets the Log Analytics alerts. .Description Displays a list Log Analytics alerts, based in the new Azure API, Scheduled Query Rules: https://docs.microsoft.com/en-us/rest/api/monitor/scheduledqueryrules This function currently does not take any parameters, so it will display all the alerts for the past 24h, for the current subscription. For further information on the new API (SQR), please review this document: https://docs.microsoft.com/en-us/azure/azure-monitor/platform/alerts-log-api-switch .Example Get-LogAnalyticsAlerts # This command will show all the Log Analytics alerts (Log and Metric) of the current subscription, of the last 24 hours. #> function Get-LogAnalyticsAlerts { param( ) $headers = Get-AccessTokenFromContext $cur_sub = (Get-AzureRmContext).Subscription.Id $ruleidURI = "https://management.azure.com/subscriptions/$cur_sub/providers/Microsoft.AlertsManagement/alerts" + "?api-version=2018-05-05&targetResourceType=Microsoft.OperationalInsights/workspaces" $laAlerts = (Invoke-RestMethod -Method GET $ruleidURI -Headers $headers).value $laAlerts | Select-Object name,@{Name="Sev.";Expression={$_.properties.essentials.severity}}, @{Name="MonitorCondition";Expression={$_.properties.essentials.monitorCondition}}, @{Name="State";Expression={$_.properties.essentials.alertState}},@{Name="Workspace";Expression={$_.properties.essentials.targetResourceName}}, @{Name="MonitorService";Expression={$_.properties.essentials.monitorService}} ,@{Name="SignalType";Expression={$_.properties.essentials.signalType}} ,@{Name="StartTime";Expression={$_.properties.essentials.startDateTime}},@{Name="LastModifiedTime";Expression={$_.properties.essentials.lastModifiedDateTime}},@{Name="MonitorResolvedTime";Expression={$_.properties.essentials.monitorConditionResolvedDateTime}} | Format-Table -AutoSize -Wrap } <# .Synopsis Gets the Log Analytics alert rules. .Description Displays a list Log Analytics alerts rule, based in the new Azure API, Scheduled Query Rules: https://docs.microsoft.com/en-us/rest/api/monitor/scheduledqueryrules This function currently does not take any parameters, so it will display all the alert rules of the current subscription. For further information on the new API (SQR), please review this document: https://docs.microsoft.com/en-us/azure/azure-monitor/platform/alerts-log-api-switch .Example Get-LogAnalyticsAlertRule # This command will show all the Log Analytics SQR alert rules based of the current subscription. #> function Get-LogAnalyticsAlertRule { param( ) $headers = Get-AccessTokenFromContext $cur_sub = (Get-AzureRmContext).Subscription.Id $ruleidURI = "https://management.azure.com/subscriptions/$cur_sub/providers/microsoft.insights/scheduledQueryRules" + "?api-version=2018-04-16" $sqrs = (Invoke-RestMethod -Method GET $ruleidURI -Headers $headers).value #$sqrs | Select-Object @{Name="DisplayName";Expression={$_.properties.displayname}},@{Name="IsEnabled";Expression={$_.properties.enabled}}, @{Name="LastModified";Expression={$_.properties.lastUpdatedTime}},@{Name="Workspace";Expression={[regex]::Match($_.properties.source.dataSourceId,"(?<=\/workspaces\/)(.*)").value}},@{Name="Resource Group";Expression={[regex]::Match($_.properties.source.dataSourceId,"(?<=\/resourceGroups\/)(.*)(?=\/providers)").value}} | Format-Table $sqrs | Select-Object name, @{Name="DisplayName";Expression={$_.properties.displayname}},@{Name="IsEnabled";Expression={$_.properties.enabled}},@{Name="Workspace";Expression={[regex]::Match($_.properties.source.dataSourceId,"(?<=\/workspaces\/)(.*)").value}},@{Name="Resource Group";Expression={[regex]::Match($_.properties.source.dataSourceId,"(?<=\/resourceGroups\/)(.*)(?=\/providers)").value}} | Format-Table -AutoSize -Wrap } <# .Synopsis Enables a Log Analytics alert rule. .Description Enables a Log Analytics alert rule, based on the rule name and the resource group name where the alert rule is contained. As the rule name may not match the display name, please run the 'Get-LogAnalyticsAlertRule' cmdlet to get the correct alert rule name. .Example Enable-LogAnalyticsAlertRule -rulename "Dev machine is running out of memory" -ResourceGroupName "mms-weu" # This command will enable the rule named "Dev machine is running out of memory" that # is contained on the "mms-weu" resource group of the current subscription. #> function Enable-LogAnalyticsAlertRule { param( [Parameter(Position=0,mandatory=$true)] [string] $Rulename, [Parameter(Position=1,mandatory=$true)] [string] $ResourceGroupName) $headers = Get-AccessTokenFromContext $cur_sub = (Get-AzureRmContext).Subscription.Id $ruleUri = "https://management.azure.com/subscriptions/$cur_sub/resourcegroups/$resourceGroupName/providers/microsoft.insights/scheduledQueryRules/$RuleName"+"?api-version=2018-04-16" $bodyEnable = " { 'properties': { 'enabled': 'true' } } " Write-Verbose "ResourceURI being invoked: $ruleUri" try { $enablerule = Invoke-RestMethod -Method PATCH -Uri $ruleUri -Headers $headers -Body $bodyEnable $enablerule | Select-Object @{Name="displayName";Expression={$_.properties.displayName}}, @{Name="IsEnabled";Expression={$_.properties.enabled}},@{Name="lastUpdate";Expression={$_.properties.lastUpdatedTime}}, @{Name="provisioningState";Expression={$_.properties.provisioningState}} | Format-Table -AutoSize -Wrap Write-Verbose "Output of Invoke-RestMethod: $enablerule" } catch { Write-Error "$_" } } <# .Synopsis Disables a Log Analytics alert rule. .Description Disables a Log Analytics alert rule, based on the rule name and the resource group name where the alert rule is contained. As the rule name may not match the display name, please run the 'Get-LogAnalyticsAlertRule' cmdlet to get the correct alert rule name. .Example Disable-LogAnalyticsAlertRule -rulename "Dev machine is running out of memory" -ResourceGroupName "mms-weu" # This command will disable the rule named "Dev machine is running out of memory" that # is contained on the "mms-weu" resource group of the current subscription. #> function Disable-LogAnalyticsAlertRule { param( [Parameter(Position=0,mandatory=$true)] [string] $Rulename, [Parameter(Position=1,mandatory=$true)] [string] $ResourceGroupName) $headers = Get-AccessTokenFromContext $cur_sub = (Get-AzureRmContext).Subscription.Id $ruleUri = "https://management.azure.com/subscriptions/$cur_sub/resourcegroups/$resourceGroupName/providers/microsoft.insights/scheduledQueryRules/$RuleName"+"?api-version=2018-04-16" $bodyEnable = " { 'properties': { 'enabled': 'false' } } " Write-Verbose "ResourceURI being invoked: $ruleUri" try { $disablerule = Invoke-RestMethod -Method PATCH -Uri $ruleUri -Headers $headers -Body $bodyEnable $disablerule | Select-Object @{Name="displayName";Expression={$_.properties.displayName}}, @{Name="IsEnabled";Expression={$_.properties.enabled}},@{Name="lastUpdate";Expression={$_.properties.lastUpdatedTime}}, @{Name="provisioningState";Expression={$_.properties.provisioningState}} | Format-Table -AutoSize -Wrap Write-Verbose "Output of Invoke-RestMethod: $disablerule" } catch { Write-Error "$_" } } <# .Synopsis Switches a Log Analytics workspace to the new Log Alerts API. .Description Switches a Log Analytics workspace to the new Log Alerts API, so you can use all the cmdlets of this module and/or manage your Log Analytics alerts using the new Scheduled Query Rules API. This is an irreversible action, so please review the following document before proceeding: https://docs.microsoft.com/en-us/azure/azure-monitor/platform/alerts-log-api-switch .Example Enable-LogAnalyticsAlertsNewAPI -WorkspaceName "joselindo" -ResourceGroupName "joseRG" # This command will prompt you to switch the workspace names "joselindo" that is # contained on the "joseRG" resource group to use the new Azure API, Scheduled Query Rules. # Once prompt, you will have to type the word "YES" to confirm the switch. # Enable-LogAnalyticsAlertsNewAPI -WorkspaceName "joselindo" -ResourceGroupName "joseRG" -Force # This command will switch the workspace names "joselindo" that is contained on the "joseRG" # resource group to use the new Azure API, Scheduled Query Rules, without any user prompt. # Using the -Force switch implies you have read the API switch document #> function Enable-LogAnalyticsAlertsNewAPI { param( [Parameter(Position=0,mandatory=$true)] [string] $WorkspaceName, [Parameter(Position=1,mandatory=$true)] [string] $ResourceGroupName, [switch] $Force) $Readhost = "No" $headers = Get-AccessTokenFromContext $cur_sub = (Get-AzureRmContext).Subscription.Id $workspaceURI = "https://management.azure.com/subscriptions/$cur_sub/resourceGroups/$ResourceGroupName/providers/Microsoft.OperationalInsights/workspaces/$WorkspaceName/alertsversion" + "?api-version=2017-04-26-preview" Write-Verbose "WorkspaceURI being invoked: $workspaceURI" <#Let's check if the new API is enabled; if so, no need to make the PATCH call#> try { $isInabled = Invoke-RestMethod -Method GET $workspaceURI -Headers $headers Write-Verbose "Output of Invoke-RestMethod: $disablerule" } catch { Write-Error "$_" break } if ( $isInabled.scheduledQueryRulesEnabled) { Write-Output "New SQR API is already enabled for workspace $workspaceName in resource group $ResourceGroupName" break } <#Checking if -Force parameter was used#> if ($Force -ne $true) { <#Informing that this is a irreversible action and that they should check the documentaiont before proceeding#> Write-Output "This is an irreversible action, so please sure you have read the following doc: https://docs.microsoft.com/en-us/azure/azure-monitor/platform/alerts-log-api-switch#process-of-switching-from-legacy-log-alerts-api" Write-Output "Please type YES to continue? (Default is NO)" $Readhost = Read-Host " ( YES / NO ) " } If ( ($Readhost.Trim().ToUpper() -eq "YES") -or ($Force -eq $true)) { $jsonpayload = '{"scheduledQueryRulesEnabled": true}' try { $enableSQR = Invoke-RestMethod -Method PUT $workspaceURI -Headers $headers -Body $jsonpayload Write-Verbose "Output of Invoke-RestMethod: $enableSQR" Write-Output "Changes were applied!" } catch { Write-Error "$_" break } } else {Write-Output "No changes were applied!"} } Export-ModuleMember -Function Get-LogAnalyticsAlerts Export-ModuleMember -Function Get-LogAnalyticsAlertRule Export-ModuleMember -Function Enable-LogAnalyticsAlertRule Export-ModuleMember -Function Disable-LogAnalyticsAlertRule Export-ModuleMember -Function Enable-LogAnalyticsAlertsNewAPI |