【发布时间】:2022-12-11 11:21:16
【问题描述】:
我正在使用 kusto 查询日志记录数据,其中一些具有动态属性列表(省略不相关的详细信息):
{
"OperationId": "b07f6e4aa0ed180a8131e90a374665cb",
"TimeGenerated [UTC]": "12/5/2022, 10:19:14.271 AM",
...
"Properties": {
"Message": "Updating label",
"AspNetCoreEnvironment": "Debug",
"Category": "General",
"DeveloperMode": "true",
"DynamicProperties":
"[
{"Key":"Id","Value":"{GUID}"},
{"Key":"Source","Value":1},
{"Key":"ExcludeToUser","Value":true}
]"
},
...
}
我在读取 ExcludeToUser 字段时遇到了一些问题,因为它是列表中的一个 JSON 对象,但是这个 kusto 查询为我解决了这个问题:
let ExcludeToUser = toscalar(
Events
| project-keep Properties, TimeGenerated
| where TimeGenerated between ( datetime(2022-12-05, 10:15) .. datetime(2022-12-05, 10:25) )
| project p = Properties | evaluate bag_unpack(p) | mv-expand todynamic(DynamicProperties)| evaluate bag_unpack(DynamicProperties)
| project-keep Key, Value
| where Key == 'ExcludeToUser' and Value == false
| summarize result = count() >= 1);
关键是使用 mv-expand 和 bag_unpack。
我的问题是,如果我将搜索查询更改为不返回任何内容或 DynamicProperties 为 null 的内容,我会收到以下错误:
“mvexpand”运算符:无法解析名为“DynamicProperties”的标量表达式
在我看来,当没有数据可供扩展时,mv-expand 会失败。有没有办法检查是否没有返回数据?
以下是导出为 csv 的示例数据,良好数据示例:
OperationId,Properties,"TimeGenerated [UTC]" b07f6e4aa0ed180a8131e90a374665cb,"{""Message"":""Updating label"",""AspNetCoreEnvironment"":""Debug"",""Category"":""General"",""DeveloperMode"":""true"",""DynamicProperties"":[{""Key"":""Id"",""Value"":""guid""},{""Key"":""Source"",""Value"":1},{""Key"":""ExcludeToUser"",""Value"":true}]}","12/5/2022, 10:19:14.271 AM"查询此数据的输出将是:True(存在 DynamicProperty ExcludeToUser 存在的行和是真的。完全相同但 ExcludeToUser 设置为 false 的数据应返回 False。
不良数据示例:
OperationId,Properties,"TimeGenerated [UTC]" b07f6e4aa0ed180a8131e90a374665cb,"{""Message"":""Updating label"",""AspNetCoreEnvironment"":""Debug"",""Category"":""General"",""DeveloperMode"":""true""}","12/5/2022, 10:19:14.271 AM"查询此数据应该返回 false,但抛出上面的错误。
【问题讨论】:
-
请以 csv 格式提供样本数据作为数据表 + 所需结果。确保示例数据包含一个“好”示例和一个“坏”示例。还请解释您要计算的内容,以及如果一切都以计数结束,为什么您需要所有这些复杂性。
-
感谢您的快速评论!我将编辑并添加一些数据。我正在尝试计算动态属性 ExcludeToUser 的出现次数,如果 ExcludeToUser 键存在并且为真,基本上只返回真。如果这是真的,我们不会向我们的最终用户显示给定的日志(我们在我们的应用程序中使用它)。复杂性来自列表中的对象,我猜可能有更好的方法来做到这一点,但我不知道。
-
任何进展?...