I adapted an existing solution from 2azure.nl for monitoring Azure Backup status through PRTG in our environment.
I did some refactoring and I like to share the code with you.
Run the script in PRTG with these parameters:
-Password "XXXXX" -applicationid "XXXXX" -TenantId "XXXXX" -VaultName "XXXXX" -ResourceGroupName "XXXXX" The complete script is available in the code block below."
param( [Parameter(Mandatory = $true)] [string]$Password, [Parameter(Mandatory = $true)] [string]$ApplicationId, [Parameter(Mandatory = $true)] [string]$TenantId, [Parameter(Mandatory = $true)] [string]$VaultName, [Parameter(Mandatory = $true)] [string]$ResourceGroupName ) # Run Once: Install required modules # Install-Module -Name Az.Accounts # Install-Module -Name Az.RecoveryServices Import-Module Az.Accounts Import-Module Az.RecoveryServices # Login $securePassword = ConvertTo-SecureString $Password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($ApplicationId, $securePassword) Connect-AzAccount -Credential $credential -ServicePrincipal -TenantId $TenantId | Out-Null # Access specific vault $vault = Get-AzRecoveryServicesVault -Name $VaultName -ResourceGroupName $ResourceGroupName if ($vault) { # Set vault context $vault | Set-AzRecoveryServicesVaultContext # Check backups last 24 hours, only Backup operations $jobs = Get-AzRecoveryServicesBackupJob -From (Get-Date).AddDays(-1).ToUniversalTime() | Where-Object { $_.Operation -eq "Backup" } | Select-Object Status, WorkloadName $completed = ($jobs | Where-Object {$_.Status -eq 'Completed'}).Count $failed = ($jobs | Where-Object {$_.Status -eq 'Failed'}).Count $running = ($jobs | Where-Object {$_.Status -eq 'InProgress'}).Count # Get unique workload names $workloadNames = ($jobs | Select-Object -ExpandProperty WorkloadName -Unique) -join ', ' # Output for PRTG if ($failed -eq 0 -and $completed -gt 0) { $result = "<prtg> <result> <channel>Completed jobs</channel> <value>$completed</value> <LimitMode>1</LimitMode> <LimitMinError>1</LimitMinError> <LimitErrorMsg>No completed backups found!</LimitErrorMsg> </result> <result> <channel>Failed jobs</channel> <value>$failed</value> <LimitMode>1</LimitMode> <LimitMaxError>0</LimitMaxError> <LimitErrorMsg>Failed backup jobs detected!</LimitErrorMsg> </result> <result> <channel>Running jobs</channel> <value>$running</value> <LimitMode>1</LimitMode> <LimitMaxWarning>1</LimitMaxWarning> <LimitMaxError>2</LimitMaxError> <LimitWarningMsg>Multiple backup jobs running</LimitWarningMsg> <LimitErrorMsg>Too many backup jobs running!</LimitErrorMsg> </result> <text>Backup successful in vault: $($vault.Name) for workloads: $workloadNames</text> </prtg>" } else { $result = "<prtg> <error>1</error> <text>Backup failed in vault: $($vault.Name), failed jobs: $failed, workloads: $workloadNames</text> </prtg>" } } else { $result = "<prtg> <error>1</error> <text>Could not find vault $VaultName in resource group $ResourceGroupName</text> </prtg>" } Write-Host $result