如何编写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: {...}}的形式展示,展开后能看到每个事件的维度数据。
注意事项
- 选择
innerjoin会只返回有对应自定义事件的请求,如果需要包含没有事件的请求,可以换成leftouterjoin。 - 如果需要调整聚合的请求字段,只需修改
summarize ... by后面的字段列表,保留你需要展示的请求属性即可。
内容的提问来源于stack exchange,提问作者learntofix

