in internal/scanners/advisor.go [19:74]
func (s *AdvisorScanner) Scan(ctx context.Context, scan bool, cred azcore.TokenCredential, subscriptions map[string]string, filters *models.Filters) []models.AdvisorResult {
models.LogResourceTypeScan("Advisor Recommendations")
resources := []models.AdvisorResult{}
if scan {
graphClient := graph.NewGraphQuery(cred)
query := `
AdvisorResources
| join kind=inner (
resourcecontainers
| where type == 'microsoft.resources/subscriptions'
| project subscriptionId, subscriptionName = name)
on subscriptionId
| project Type=type, SubscriptionId=subscriptionId, SubscriptionName=subscriptionName,
ResourceGroup = resourceGroup, Category = properties.category, Impact = properties.impact,
ImpactedField = properties.impactedField, ImpactedValue = properties.impactedValue,
Problem = properties.shortDescription.problem, ResourceId = properties.resourceMetadata.resourceId,
RecommendationTypeId = properties.recommendationTypeId
`
log.Debug().Msg(query)
subs := make([]*string, 0, len(subscriptions))
for s := range subscriptions {
subs = append(subs, &s)
}
result := graphClient.Query(ctx, query, subs)
resources = []models.AdvisorResult{}
if result.Data != nil {
for _, row := range result.Data {
m := row.(map[string]interface{})
if filters.Azqr.IsSubscriptionExcluded(to.String(m["SubscriptionId"])) {
continue
}
resourceId := to.String(m["ResourceId"])
if filters.Azqr.IsServiceExcluded(resourceId) {
continue
}
resources = append(resources, models.AdvisorResult{
SubscriptionID: to.String(m["SubscriptionId"]),
SubscriptionName: to.String(m["SubscriptionName"]),
Name: to.String(m["ImpactedValue"]),
Type: to.String(m["ImpactedField"]),
ResourceID: resourceId,
Category: to.String(m["Category"]),
Impact: to.String(m["Impact"]),
Description: to.String(m["Problem"]),
RecommendationID: to.String(m["RecommendationTypeId"]),
})
}
}
}
return resources
}