Кусто язык. Получить одно значение, только если предыдущее значение во времени не совпадает - PullRequest
0 голосов
/ 11 апреля 2019

Контекст для моего очень расплывчатого названия: у меня есть 4 виртуальные машины, которые отправляют свои журналы для анализа приложений. Я извлекаю логи и преобразую их в таблицу с языком kusto.

Таблица результатов enter image description here

Query: 
AzureActivity
| where ResourceProvider == "Microsoft.Compute" and ActivityStatus == "Succeeded" and OperationName == "Deallocate Virtual Machine"
| project DeallocateResource=Resource ,DeallocatedDate=format_datetime(EventSubmissionTimestamp, 'yyyy-MM-dd') ,DeallocatedTime=format_datetime(EventSubmissionTimestamp, 'HH:mm:ss')
| join kind=fullouter
(
AzureActivity
| where ResourceProvider == "Microsoft.Compute" and ActivityStatus == "Succeeded" and OperationName == "Start Virtual Machine"
| project StartupResource=Resource ,StartDate=format_datetime(EventSubmissionTimestamp, 'yyyy-MM-dd') ,StartTime=format_datetime(EventSubmissionTimestamp, 'HH:mm:ss')
)
on $right.StartupResource == $left.DeallocateResource
| where StartDate == DeallocatedDate
| project Resource=coalesce(StartupResource, DeallocateResource) ,
Date=format_datetime(todatetime(coalesce(StartDate, DeallocatedDate)), 'dd/MM/yyyy' ) 
 , StartTime= StartTime ,StopTime=DeallocatedTime , 
Runtime_Hours = format_datetime(datetime_add('minute',datetime_diff('minute', todatetime(strcat(StartDate , " " , DeallocatedTime )) , todatetime(strcat(StartDate , " " , StartTime ))), make_datetime(2017,1,1)), 'hh:mm') 
| sort by Date asc , Resource asc

Как вы видите, время выполнения некорректно, когда виртуальная машина запускается в 8:15 и останавливается в 8:58 и имеет время выполнения 12:43 часа, тогда что-то не так. В журнале активности виртуальной машины я вижу, что какой-то коллега сделал что-то странное с виртуальной машиной. И запустил его пару раз (через минуту после того, как он запустил его снова, вероятно, сбой, когда вы дважды нажмете кнопку пуска одновременно).

Журналы активности enter image description here

Я нашел теоретическое решение моей проблемы: Мой запрос должен измениться так, чтобы время выполнения и даже время запуска и остановки регистрировались в таблице времени только тогда, когда виртуальная машина запускается и сопровождается остановкой. Но я получил все «Запустить виртуальные машины» и все «Остановить виртуальные машины» и просто упорядочил их в таблице, что привело к путанице в моей таблице результатов.

Но я не могу найти способ изменить это в своем запросе. Сказать Получить стартовую виртуальную машину можно только в том случае, если это первый день (когда предыдущая не является стартовой виртуальной машиной) или предыдущий журнал - «освободить виртуальную машину», потому что это не по порядку start-stop. время суток должно быть в формуле. Получите освобождение виртуальной машины только тогда, когда предыдущая является стартовой виртуальной машиной. и вычислять время выполнения каждого прогона не для каждого дня.

Поскольку я очень новичок в SQL и в Kusto, и я здесь не для того, чтобы кто-то передавал мне решение или делал работу за меня. Я надеялся, найдется ли кто-нибудь, кто может помочь мне или направить меня в правильном направлении, чтобы найти решение моей проблемы.

Заранее спасибо !!!

1 Ответ

2 голосов
/ 12 апреля 2019

Пожалуйста, проверьте, подходит ли следующий подход к тому, что вам нужно.

datatable(Resource:string, Event:string, EventTime:datetime)
[
    'Machine1', 'Start', datetime(2019-04-12 00:00),
    'Machine1', 'Stop', datetime(2019-04-12 01:00),
    'Machine1', 'Start', datetime(2019-04-12 01:30),
    'Machine1', 'Start', datetime(2019-04-12 01:45),
    'Machine1', 'Stop', datetime(2019-04-12 11:45),
    // Machine2
    'Machine2', 'Start', datetime(2019-04-12 00:00),
    'Machine2', 'Stop', datetime(2019-04-12 01:00),
    'Machine2', 'Stop', datetime(2019-04-12 01:20),
    'Machine2', 'Start', datetime(2019-04-12 01:30),
    'Machine2', 'Stop', datetime(2019-04-12 11:45),
]
| order by Resource asc, EventTime asc
| extend IsSameResource = (prev(Resource) == Resource)
| extend PrevState = iif(IsSameResource, prev(Event), Event), CurrentState = Event
| extend RunTime = iif(PrevState == 'Start' and CurrentState == 'Stop', EventTime - prev(EventTime), time(null)), 
         StartTime = prev(EventTime)
| where isnotnull(RunTime)
| project Resource, StartTime, EndTime = EventTime, RunTime

[Изменить]

Тот же подход - но с использованием столбцов в вопросе:

let AzureActivity = datatable(ResourceProvider:string, Resource:string, ActivityStatus:string, OperationName:string, EventSubmissionTimestamp:datetime)
[
"Microsoft.Compute", 'Machine1', "Succeeded", 'Start Virtual Machine', datetime(2019-04-12 00:00),
"Microsoft.Compute", 'Machine1',  "Succeeded", 'Deallocate Virtual Machine', datetime(2019-04-12 01:00),
"Microsoft.Compute", 'Machine1',  "Succeeded", 'Start Virtual Machine', datetime(2019-04-12 01:30),
"Microsoft.Compute", 'Machine1',  "Succeeded", 'Start Virtual Machine', datetime(2019-04-12 01:45),
"Microsoft.Compute", 'Machine1',  "Succeeded", 'Deallocate Virtual Machine', datetime(2019-04-12 11:45),
    // Machine2
"Microsoft.Compute", 'Machine2',  "Succeeded", 'Start Virtual Machine', datetime(2019-04-12 00:00),
"Microsoft.Compute", 'Machine2',  "Succeeded", 'Deallocate Virtual Machine', datetime(2019-04-12 01:00),
"Microsoft.Compute", 'Machine2',  "Succeeded", 'Deallocate Virtual Machine', datetime(2019-04-12 01:20),
"Microsoft.Compute", 'Machine2',  "Succeeded", 'Start Virtual Machine', datetime(2019-04-12 01:30),
"Microsoft.Compute", 'Machine2',  "Succeeded", 'Deallocate Virtual Machine', datetime(2019-04-12 11:45),
];
AzureActivity
| where ResourceProvider == "Microsoft.Compute"
| where OperationName in ('Deallocate Virtual Machine','Start Virtual Machine')
| where ActivityStatus == 'Succeeded'
| order by Resource asc, EventSubmissionTimestamp asc
| extend IsSameResource = (prev(Resource) == Resource)
| extend PrevState = iif(IsSameResource, prev(OperationName), OperationName), CurrentState = OperationName
| extend RunTime = iif(PrevState == 'Start Virtual Machine' and CurrentState == 'Deallocate Virtual Machine', EventSubmissionTimestamp - prev(EventSubmissionTimestamp), time(null)), 
         StartTime = prev(EventSubmissionTimestamp)
| where isnotnull(RunTime)
| project Resource, StartTime, EndTime = EventSubmissionTimestamp, RunTime
...