Advisor リソースが Azure Resource Graph に新たにオンボードされました。これは、Advisor の推奨事項が求められる多くの大規模な顧客シナリオの基盤となるものです。 次のシナリオは、以前は大規模に実行できませんでしたが、Azure Resource Graph を使用することで実現できるようになりました。
- Azure portal ですべてのサブスクリプションに対して複雑なクエリを実行する。
- カテゴリの種類 (信頼性、パフォーマンスなど) と影響の種類 (高、中、低) ごとに推奨事項をまとめる。
- 特定の推奨事項の種類に関するすべての推奨事項を表示する。
- 影響を受けるリソースを推奨事項カテゴリ別にカウントする。
Azure Graph における Advisor リソースの種類
Resource Graph で利用できる Advisor リソースの種類は次のとおりです。
Advisor リソースには、照会可能なリソースが 3 種類あります。 Resource Graph で照会できるようになった一連のリソースを次に示します。
- Microsoft.Advisor/configurations
- Microsoft.Advisor/推奨事項
- Microsoft.Advisor/suppressions
これらのリソースの種類は、AdvisorResources という名前で新しいテーブルにリストされます。Azure portal から Resource Graph エクスプローラーでこれらのリソースを照会することもできます。
例示
アクティブなコストに関する推奨事項を取得する
advisorresources
| where type =~ 'microsoft.advisor/recommendations'
| where (properties.category == 'Security' and properties.lastUpdated > ago(60h)) or properties.lastUpdated >= ago(1d)
| where isempty(properties.tracked) or properties.tracked == false
| project id, stableId = name, subscriptionId, resourceGroup, properties
| join kind = leftouter (
advisorresources
| where type =~ 'microsoft.advisor/suppressions'
| extend tokens = split(id, '/')
| extend stableId = iff(array_length(tokens) > 3, tokens[(array_length(tokens) - 3)], '')
| extend expirationTimeStamp = todatetime(iff(strcmp(tostring(properties.ttl), '-1') == 0, '9999-12-31', properties.expirationTimeStamp))
| where expirationTimeStamp > now()
| project
suppressionId = tostring(properties.suppressionId),
stableId,
expirationTimeStamp)
on stableId
| project
id,
stableId,
subscriptionId,
resourceGroup,
properties,
expirationTimeStamp,
suppressionId
| join kind = leftouter (
advisorresources
| where type =~ 'microsoft.advisor/configurations'
| where isempty(resourceGroup) == true
| project
subscriptionId,
excludeRecomm = properties.exclude,
lowCpuThreshold = properties.lowCpuThreshold)
on subscriptionId
| extend isActive1 = iff(isempty(excludeRecomm), true, tobool(excludeRecomm) == false)
| extend isActive2 = iff((properties.recommendationTypeId in ("e10b1381-5f0a-47ff-8c7b-37bd13d7c974", "94aea435-ef39-493f-a547-8408092c22a7")), iff((isnotempty(lowCpuThreshold) and isnotnull(properties.extendedProperties) and isnotempty(properties.extendedProperties.MaxCpuP95)), todouble(properties.extendedProperties.MaxCpuP95) < todouble(lowCpuThreshold), iff((isnull(properties.extendedProperties) or isempty(properties.extendedProperties.MaxCpuP95) or todouble(properties.extendedProperties.MaxCpuP95) < 100), true, false)), true)
| where isActive1 == true and isActive2 == true
| join kind = leftouter (
advisorresources
| where type =~ 'microsoft.advisor/configurations'
| where isnotempty(resourceGroup) == true
| project subscriptionId, resourceGroup, excludeProperty = properties.exclude)
on subscriptionId, resourceGroup
| extend isActive3 = iff(isempty(excludeProperty), true, tobool(excludeProperty) == false)
| where isActive3 == true
| summarize
expirationTimeStamp = max(expirationTimeStamp),
suppressionIds = make_list(suppressionId)
by id, stableId, subscriptionId, resourceGroup, tostring(properties)
| extend properties = parse_json(properties)
| extend extendedProperties = properties.extendedProperties
| extend properties = parse_json(properties)
| extend recommendationTypeId = tostring(properties.recommendationTypeId)
| extend resourceType = tostring(properties.impactedField)
| extend category = tostring(properties.category)
| extend impact = tolower(tostring(properties.impact))
| extend resourceId = tolower(substring(id, 0, strlen(id) - 81))
| extend description = tostring(properties.shortDescription.solution)
| extend lastUpdate = tostring(properties.lastUpdated)
| extend isRecommendationActive = (isnull(expirationTimeStamp) or isempty(expirationTimeStamp))
| extend extendedProperties = properties.extendedProperties
| extend recommendationSubcategory = tostring(extendedProperties.recommendationSubCategory)
| extend annualSavingsAmount = toreal(extendedProperties.annualSavingsAmount)
| extend savingsCurrency = tostring(extendedProperties.savingsCurrency)
| extend term = tostring(extendedProperties.term)
| extend lookbackPeriod = tostring(extendedProperties.lookbackPeriod)
| where isRecommendationActive == 1
| where category == 'Cost'
| project
subscriptionId,
recommendationTypeId,
recommendationSubcategory,
resourceType,
category,
impact,
resourceId,
description,
lastUpdate,
annualSavingsAmount,
savingsCurrency,
term,
lookbackPeriod,
resourceGroup,
extendedProperties,
joinID = toupper(resourceId)
| join kind=leftouter (resources | project joinID = toupper(id), tags) on $left.joinID == $right.joinID
| project
subscriptionId,
recommendationTypeId,
recommendationSubcategory,
resourceType,
category,
impact,
resourceId,
description,
lastUpdate,
annualSavingsAmount,
savingsCurrency,
term,
lookbackPeriod,
resourceGroup,
extendedProperties,
tags