是否可以在App Insights内联函数中获取查询结果?

问题描述 投票:1回答:1

我正在尝试编写一个App Insights查询,它将报告两个已知事件之间的时间跨度,特别是断路器打开和关闭事件。假设这些事件总是成对出现,因此我们需要知道两个时间段内每次出现的时间。

我的第一次尝试是使用内联函数。简化版本如下。

let timeOpened = (timeClosed:datetime)
{
    let result = customEvents
    | where name == 'CircuitBreakerStatusChange'
    | where customDimensions['State'] == 'Open'
    | where timestamp < timeClosed
    | order by timestamp desc
    | take 1
    | project timestamp;
    let scalar = toscalar(result);  
    scalar
};
customEvents
| where timestamp > ago(4h)
| where name == 'CircuitBreakerStatusChange'
| where customDimensions['State'] == 'Closed'
| extend timeOpen = timestamp - timeOpened(timestamp)

可能有更好的方法来做到这一点。如果是这样,欢迎您的想法!但是在这个特定的尝试中,我在运行时从Azure获得的唯一反馈是“语法错误”。但是,我不相信这里存在语法错误,因为如果我只是将函数的返回值从scalar更改为now(),则它会成功运行。此外,我可以成功隔离功能的主体。知道这里有什么问题吗?

azure azure-application-insights
1个回答
1
投票

我认为你得到语法错误,因为查询语言不允许可能的递归结构。 Now()有效,因为它在查询时静态(非动态)检索。

我认为你可以通过serializeprev()运营商达到预期的结果:

Table | order by timestamp asc | serialize
| extend previousTime = prev(timestamp,1)
| extend Diff = iff(customDimensions['State'] == 'Closed', timestamp - previousTime, 0)
| where Diff > 0

注意:我没有测试上面的例子,它可能需要一些额外的想法才能使它工作(例如,在进行previousTime计算之前确保先前的记录实际上是“已打开”)。

© www.soinside.com 2019 - 2024. All rights reserved.