【问题标题】:Kusto language. Get one value only if the previous value in time is not the same库斯托语。仅当时间上的前一个值不相同时才获取一个值
【发布时间】:2019-04-11 08:25:25
【问题描述】:

我非常模糊的标题的上下文:我有 4 台虚拟机,它们将它们的日志发送到应用程序洞察。 我检索日志并使用 kusto 语言将其转换为表格。

结果表

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 小时时,运行时间不正确,那么就会出现问题。在虚拟机的活动日志中,我看到一些同事对虚拟机做了一些奇怪的事情。并启动了几次(在他再次启动后一分钟,当您同时单击两次启动按钮时可能会出现故障)。

活动日志

我确实找到了解决问题的理论方法: 我的查询需要更改,以便仅在 VM 启动并随后停止时才需要将运行时甚至开始和停止时间记录在时间表中。但是 atm 我得到了所有的“启动虚拟机”和所有的“停止虚拟机”,只是将它们排列在一个表中,这会导致我的结果表混淆。

但我似乎无法在我的查询中找到调整它的方法。说仅在当天的第一天(前一个不是启动虚拟机时)或上一个日志是“解除分配虚拟机”时才启动虚拟机,因为这不是按顺序启动-停止。一天中的时间需要在公式中。 仅当前一个是启动虚拟机时才获取解除分配虚拟机。 并计算每次运行的运行时间而不是每天。

因为我对 SQL 和 kusto 还很陌生,所以我不是来找人给我解决方案或为我完成工作的。 我希望是否有人可以帮助我或引导我朝着正确的方向找到解决问题的方法。

提前致谢!!!

【问题讨论】:

    标签: azure azure-application-insights azure-virtual-machine azure-data-explorer


    【解决方案1】:

    请检查以下方法是否能让您更接近您的需要。

    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
    

    【讨论】:

    • 抱歉更新晚了。我已经用你的扩展更新了我的查询。但似乎找不到将事件或在我的情况下将操作名称放在扩展中的方法。这是我通过您的 extend 得到的查询。 codeshare.io/5wxwjB
    • 我已编辑答案以在 AzureActivity 中使用列。注意我没有使用'join'运算符 - 而是使用 order 运算符和 prev() 函数来引用前一行。
    • 非常感谢!
    猜你喜欢
    • 2022-12-06
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多