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