【问题标题】:Error when empty data is passed to mv-expand in kusto将空数据传递给 kusto 中的 mv-expand 时出错
【发布时间】: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 键存在并且为真,基本上只返回真。如果这是真的,我们不会向我们的最终用户显示给定的日志(我们在我们的应用程序中使用它)。复杂性来自列表中的对象,我猜可能有更好的方法来做到这一点,但我不知道。
  • 任何进展?...

标签: azure-data-explorer kql


【解决方案1】:

尝试使用 defaultifempty() 运算符,如下所示:

defaultifempty()

或者你可以使用

| project DynamicProperties = iff(isnull(DynamicProperties) or isempty(DynamicProperties), [{"Key": "ExcludeToUser", "Value": false}], DynamicProperties)

如果我理解正确的话,两者都应该适用于你的用例,尽管 iff 语句可能非常密集,所以就像我经常被告知的那样,它应该在摄取之前进行不同的配置

【讨论】:

  • 默认为空?
  • 我找不到任何对 defaultifempty 的引用。使用iff(isnull(DynamicProperties))时,我得到与以前相同的错误:'project' operator: Failed to resolve scalar expression named 'DynamicProperties'它无法检查不存在的值的空值...
  • 抱歉,这真的应该是评论,因为我没有代表发表评论。我认为 defaultifempty 也适用于 KQL。经过我自己的研究,看起来 column_ifexists() 是最好的选择。
【解决方案2】:

我认为不需要 bag_unpack,您可以只提供一个空数组,以防 DynamicPropertiesnull。以下应该工作:

let ExcludeToUser = toscalar(
Events
| where TimeGenerated between (datetime(2022-12-05 10:15) .. datetime(2022-12-05 10:25))
| project dp = coalesce(Properties.DynamicProperties, dynamic([]))
| mv-expand dp
| project Key = tostring(dp.Key), Value = tostring(dp.Value)
| where Key == 'ExcludeToUser' and Value == false
| summarize result = count() >= 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2020-03-22
    • 2018-06-28
    • 2019-12-10
    • 2022-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多