Как использовать скалярную операцию в одном столбце?
У меня возникают проблемы с пониманием того, как правильно написать запрос, который возвращает время работы виртуальной машины на основе журналов активности Azure. Запрос ниже возвращает последние значения, когда ВМ была запущена и когда она была освобождена. Поэтому мне нужно вернуть значение, которое говорит мне, как долго машина работает, или отрицательное значение для ситуации, когда виртуальная машина была освобождена. Как мне сделать это правильно?
AzureActivity | where TimeGenerated >= ago(30d) and OperationName == "Deallocate Virtual Machine" or OperationName == "Start Virtual Machine" and ActivityStatus == "Succeeded"
| summarize arg_max(EventSubmissionTimestamp, *) by OperationName
1 ответ
Решение
Предполагая, что у вас есть таблица AzureActivity со столбцами OperationName, TimeGenerated, EventSubmissionTimestamp, MachineId, ActivityStatus (я извлекаю столбцы из вашего вопроса), вы можете использовать следующий запрос:
// Inline data for the purpose of the query demonstration
let AzureActivity = datatable(OperationName:string, TimeGenerated:datetime, EventSubmissionTimestamp:datetime, MachineId:string, ActivityStatus:string)
[
// Machine 1
'Start Virtual Machine', datetime(2019-01-27 00:00), datetime(2019-01-27 00:00), 'Machine1', 'Succeeded',
'Deallocate Virtual Machine', datetime(2019-01-27 00:00), datetime(2019-01-27 01:00), 'Machine1', 'Succeeded',
// Machine 2
'Start Virtual Machine', datetime(2019-01-27 00:00), datetime(2019-01-27 00:00), 'Machine2', 'Succeeded',
];
// Query starts here
let _data = materialize(
AzureActivity
| where TimeGenerated >= ago(30d)
and (OperationName == "Deallocate Virtual Machine" or OperationName == "Start Virtual Machine")
and ActivityStatus == "Succeeded"
| summarize arg_max(EventSubmissionTimestamp, *) by OperationName, MachineId
);
let startEvents = _data | where OperationName == 'Start Virtual Machine' | project StartTime = EventSubmissionTimestamp, MachineId;
let deallocateEvents = _data | where OperationName == 'Deallocate Virtual Machine' | project DeallocateTime = EventSubmissionTimestamp, MachineId;
startEvents | join kind = fullouter (deallocateEvents) on MachineId
| project MachineId, StartTime, DeallocateTime,
UpTime=iif(isnotnull(DeallocateTime),
(DeallocateTime-now()),
(now()-StartTime))