Как отслеживать SLA группы доступности виртуальных машин (или зоны доступности) через тактовые импульсы с помощью Log Analytics (KQL)

Я хочу отслеживать SLA наших виртуальных машин в рабочей книге монитора с помощью запроса Log Analytics. Для этого я использую таблицу «Heartbeat», в которой указаны тактовые импульсы каждой виртуальной машины. Однако некоторые из наших виртуальных машин находятся в группе / зоне доступности, и поэтому соглашение об уровне обслуживания нарушается только в том случае, если в интервале в 1 минуту отсутствуют оба контрольных сигнала. Таким образом, мне нужно иметь возможность группировать тактовые импульсы по набору доступности / зоне в запросе, но, похоже, такого свойства в тактовом импульсе нет.

Я могу использовать отдельный запрос Azure Resource Graph для поиска виртуальных машин в группе / зоне доступности, но когда я объединяю этот запрос с моим запросом Log Analytics, я не могу выполнять дальнейшую обработку запроса на языке запросов Kusto (я можно только объединить таблицы).

Для информации это мой запрос пульса Log Analytics и мой запрос SLA по графику ресурсов:

      let timeRangeStart = {TimeRange:start};
let timeRangeEnd = {TimeRange:end};
Heartbeat
| where ResourceType == "virtualMachines"
| extend ResourceGroup = case(ResourceGroup <> "", ResourceGroup, "On-Prem")
| where TimeGenerated > timeRangeStart and TimeGenerated < timeRangeEnd and Computer in ({Servers})
| extend Resource=tolower(iff(isempty(_ResourceId), Resource, _ResourceId))
| summarize heartbeat_tot = count() by Resource,ResourceGroup, SubscriptionId
| extend total_number_of_buckets=round((timeRangeEnd-timeRangeStart)/1m)
| extend round(availability_rate=heartbeat_tot*100/total_number_of_buckets,2)
| extend availability_rate = min_of(availability_rate, 100)
| order by availability_rate asc
      Resources // VMs
| where type == 'microsoft.compute/virtualmachines'
| extend AvSet = properties.availabilitySet.id
| extend AvZone = properties.availabilityZone.id
| extend VMname_SLA = iff(isnotempty(AvZone), AvZone, iff(isnotempty(AvSet), AvSet, id))
| extend SLA_VM = iff(isnotnull(AvZone), '99.99%', iff(isnotnull(AvSet), '99.95%', ''))
| extend managedBy = tolower(id)
| join kind = leftouter (
Resources // Disks
| where type == 'microsoft.compute/disks'
| where isnotempty(managedBy)
| extend managedBy = tolower(managedBy)
// What do Standard HDD disks have as SKU tag??? I used StandardHDD for the time being
| extend Tier_disk = sku.tier
| extend SLA_disk = iff(Tier_disk == 'StandardHDD', '95%', iff(Tier_disk == 'Standard', '99.5%', '99.9%'))
) on managedBy
| extend SLA_tot = iff(isnotempty(SLA_VM), SLA_VM, SLA_disk)
| project managedBy, VMname_SLA, SLA_tot
| order by managedBy asc

1 ответ

Сколько это ресурсов?

Если количество ресурсов невелико, обходной путь:

  1. запустите свой запрос ARG в текстовом параметре и отформатируйте результаты запроса, чтобы эффективно сгенерировать массив объектов json с идентификатором, местоположением и т. д., которые вам нужны. затем отметьте этот параметр как скрытый

  2. в запросе журналов укажите этот параметр json text перед запросом и используйте операторы KQL, чтобы превратить эту структуру JSON в таблицу. тогда вы можете присоединиться / отфильтровать эту таблицу в запросе

он не является оптимальным, и не будет работать хорошо , если есть большое количество ресурсов , поскольку каждый раз , когда вы запускаете запрос вы эффективны «загрузка» а JSON блоба , а затем сразу же разбор его на части снова.