You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Kusto查询返回单个Operation行并关联所有事件

问题描述

我有一个RequestTelemetry操作,其中包含两个事件。当仅查询该操作时,会为每个TrackEvent项返回一行;在结果面板中展开操作的>后,会显示两行(对应两个事件)但属于同一个操作。

查询语句:

requests
| where operation_Name == 'my_operation'

上述查询会返回每行对应一个事件,因为这些事件拥有相同的operation_id。

用得到的operation_id查询customEvents:

customEvents
| where operation_id == 'myid'

此时会得到两个事件行,符合预期,和requests查询结果类似。

我尝试过用join语句:

requests 
| join kind=inner customEvents on operation_Name
| where operation_Name == 'my_operation'

结果仍是每行对应一个不同的customEvent(即我创建的两个事件);即使添加额外过滤条件| where operation_id == 'myid',结果也一样。

我想要的是:编写Kusto查询,返回单个操作行,在结果面板中展开该行的>后可查看所有关联事件。而非每个事件对应一行,而是单个操作行,展开后显示所有事件,且事件需保持单独查询时的可展开性。

我了解过mv-expand、mv_bag和Kusto查询摄入命令,但不确定方向是否正确。

补充说明:结果面板中应显示为单个行,格式如下:

  • SendOperation
    • myevent1
    • myevent2

对应代码示例(不保证可编译):

using(IOperationHolder<DependencyTelemetry> op = new TelemetryClient().StartOperation<DependencyTelemetry>("SendOperation"))
{
    TelemetryClient telemetry = new TelemetryClient();
    telemetry.TrackEvent
    (
        "myevent1",
        new Dictionary<string, string>()
        {
            {"some_var_value", JsonConvert.SerializeObject(myobjFromSomewhere)},
            {"some_other_var", theVariableINeedToTrack}
        }
    );
    telemetry.TrackEvent
    (
        "myevent2",
        new Dictionary<string, string>()
        {
            {"useful_metric", usefulVariableValue},
        }
    );
}

或者结果格式如下:

timestamp:
id:
name: "my operation"
event: event1
event: event2

或:

timestamp:
id: 
name: "my operation"
CustomDimensions: {event1:{...}, event2:{...}}
解决方案

要实现单个操作行关联所有事件的效果,你可以用summarize配合make_list()或make_bag()将同operation_id下的customEvents聚合起来,同时保留请求的核心字段。

方法1:用make_list()聚合完整事件对象

这个方法会把每个事件的完整数据作为列表元素,展开后能看到每个事件的所有原始字段,保持可展开性:

requests
| where operation_Name == 'my_operation'
| join kind=inner customEvents on operation_id
| summarize events = make_list(customEvents) by operation_id, operation_Name, timestamp, id
  • 说明:通过operation_id等请求核心字段分组,用make_list(customEvents)把当前操作下的所有自定义事件打包成列表。结果面板中展开events字段就能看到所有关联的事件,每个事件都能单独展开查看详细内容。

方法2:用make_bag()按事件名聚合维度

如果只需要事件的自定义维度,且想按事件名整理,可以用make_bag():

requests
| where operation_Name == 'my_operation'
| join kind=inner customEvents on operation_id
| summarize CustomDimensions = make_bag(pack(name, customDimensions)) by operation_id, operation_Name, timestamp, id
  • 说明:pack(name, customDimensions)会把每个事件的名称和对应的自定义维度打包成键值对,再通过make_bag()合并成一个大的字典。结果中CustomDimensions字段会以{event1: {...}, event2: {...}}的形式展示,展开后能看到每个事件的维度数据。

注意事项

  • 选择inner join会只返回有对应自定义事件的请求,如果需要包含没有事件的请求,可以换成leftouter join。
  • 如果需要调整聚合的请求字段,只需修改summarize ... by后面的字段列表,保留你需要展示的请求属性即可。

内容的提问来源于stack exchange,提问作者learntofix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:26:27