pwsh/dev/functions/getResourceDiagnosticsCapability.ps1 (122 lines of code) (raw):
function getResourceDiagnosticsCapability {
Write-Host 'Checking Resource Types Diagnostics capability (1st party only)'
$startResourceDiagnosticsCheck = Get-Date
if (($resourcesAll).count -gt 0) {
$startGroupResourceIdsByType = Get-Date
$script:resourceTypesUnique = ($resourcesIdsAll | Group-Object -Property type)
$endGroupResourceIdsByType = Get-Date
Write-Host " GroupResourceIdsByType processing duration: $((New-TimeSpan -Start $startGroupResourceIdsByType -End $endGroupResourceIdsByType).TotalSeconds) seconds)"
$resourceTypesUniqueCount = ($resourceTypesUnique | Measure-Object).count
Write-Host " $($resourceTypesUniqueCount) unique Resource Types"
$script:resourceTypesSummarizedArray = [System.Collections.ArrayList]::Synchronized((New-Object System.Collections.ArrayList))
$script:resourceTypesDiagnosticsArray = [System.Collections.ArrayList]::Synchronized((New-Object System.Collections.ArrayList))
$microsoftResourceTypes = $resourceTypesUnique.where({ $_.Name.StartsWith('microsoft') })
if ($microsoftResourceTypes.Count -gt 0) {
$microsoftResourceTypes | ForEach-Object -Parallel {
$resourceTypesUniqueGroup = $_
$resourcetype = $resourceTypesUniqueGroup.Name
#region UsingVARs
#fromOtherFunctions
$azAPICallConf = $using:azAPICallConf
$scriptPath = $using:ScriptPath
#Array&HTs
$ExcludedResourceTypesDiagnosticsCapable = $using:ExcludedResourceTypesDiagnosticsCapable
$resourceTypesDiagnosticsArray = $using:resourceTypesDiagnosticsArray
$htResourceTypesUniqueResource = $using:htResourceTypesUniqueResource
$resourceTypesSummarizedArray = $using:resourceTypesSummarizedArray
#endregion UsingVARs
$skipThisResourceType = $false
if (($ExcludedResourceTypesDiagnosticsCapable).Count -gt 0) {
foreach ($excludedResourceType in $ExcludedResourceTypesDiagnosticsCapable) {
if ($excludedResourceType -eq $resourcetype) {
$skipThisResourceType = $true
}
}
}
if ($skipThisResourceType -eq $false) {
$resourceCount = $resourceTypesUniqueGroup.Count
#thx @Jim Britt (Microsoft) https://github.com/JimGBritt/AzurePolicy/tree/master/AzureMonitor/Scripts Create-AzDiagPolicy.ps1
$responseJSON = ''
$logCategories = [System.Collections.ArrayList]@()
$metrics = $false
$logs = $false
$resourceAvailability = ($resourceCount - 1)
$counterTryForResourceType = 0
do {
$counterTryForResourceType++
if ($resourceCount -gt 1) {
$resourceId = $resourceTypesUniqueGroup.Group.Id[$resourceAvailability]
}
else {
$resourceId = $resourceTypesUniqueGroup.Group.Id
}
$resourceAvailability = $resourceAvailability - 1
if ($resourceId -like '*+*') {
Write-Host "resourceId '$resourceId' contains bad character '+'; skipping resourceId"
$responseJSON = 'skipResource'
}
else {
$currentTask = "Checking if ResourceType '$resourceType' is capable for Resource Diagnostics using $counterTryForResourceType ResourceId: '$($resourceId)'"
$uri = "$($azAPICallConf['azAPIEndpointUrls'].ARM)/$($resourceId)/providers/microsoft.insights/diagnosticSettingsCategories?api-version=2021-05-01-preview"
$method = 'GET'
$responseJSON = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri ([uri]::EscapeUriString($uri)) -method $method -currentTask $currentTask
}
if ($responseJSON -ne 'skipResource') {
if ($responseJSON -eq 'ResourceTypeOrResourceProviderNotSupported') {
Write-Host " ResourceTypeOrResourceProviderNotSupported | The resource type '$($resourcetype)' does not support diagnostic settings."
}
else {
Write-Host " ResourceTypeSupported | The resource type '$($resourcetype)' supports diagnostic settings."
}
}
else {
Write-Host "resId '$resourceId' skipped"
}
}
until ($resourceAvailability -lt 0 -or $responseJSON -ne 'skipResource')
if ($resourceAvailability -lt 0 -and $responseJSON -eq 'skipResource') {
Write-Host "tried for all available resourceIds ($($resourceCount)) for resourceType $resourceType, but seems all resourceIds needed to be skipped"
$null = $script:resourceTypesDiagnosticsArray.Add([PSCustomObject]@{
ResourceType = $resourcetype
Metrics = "n/a - $responseJSON"
Logs = "n/a - $responseJSON"
LogCategories = 'n/a'
ResourceCount = $resourceCount
})
}
else {
if ($responseJSON) {
foreach ($response in $responseJSON) {
if ($response.properties.categoryType -eq 'Metrics') {
$metrics = $true
}
if ($response.properties.categoryType -eq 'Logs') {
$logs = $true
$null = $logCategories.Add($response.name)
}
}
}
$null = $script:resourceTypesDiagnosticsArray.Add([PSCustomObject]@{
ResourceType = $resourcetype
Metrics = $metrics
Logs = $logs
LogCategories = $logCategories
ResourceCount = $resourceCount
})
}
}
else {
Write-Host "Skipping ResourceType $($resourcetype) as per parameter '-ExcludedResourceTypesDiagnosticsCapable'"
}
} -ThrottleLimit $ThrottleLimit
}
else {
Write-Host ' No 1st party Resource Types at all'
}
}
else {
Write-Host ' No Resources at all'
}
$endResourceDiagnosticsCheck = Get-Date
Write-Host "Checking Resource Types Diagnostics capability duration: $((New-TimeSpan -Start $startResourceDiagnosticsCheck -End $endResourceDiagnosticsCheck).TotalMinutes) minutes ($((New-TimeSpan -Start $startResourceDiagnosticsCheck -End $endResourceDiagnosticsCheck).TotalSeconds) seconds)"
}