如何通过Log Analytics查询运行超24小时的ADF管道详情?
解决方案
该需求完全可以通过Log Analytics查询实现。
你原有查询返回结果不符合预期,核心原因有两点:
- 查询首行
| where TimeGenerated > ago(1d)直接将日志检索范围限制在了过去24小时内生成的记录,无法获取到启动时间早于24小时、持续运行至今的管道数据 - 仅单独筛选了状态包含
progress的零散日志条目,没有按管道运行实例做聚合,也没有计算运行实例的实际启动时间与持续时长,甚至没有携带唯一运行ID做区分,会把不同批次的同名管道运行记录混为一谈。
正确查询逻辑
要筛选持续运行超过24小时的进行中ADF管道,核心思路是按唯一管道运行ID聚合每个运行实例的全量日志,提取实例的最早启动时间、最新上报状态,再筛选启动时间距现在超过24小时、且最新状态仍为进行中的实例即可,参考查询语句如下:
// 检索范围可根据你要排查的最长运行时长调整,比如要排查最长运行7天的管道就设为ago(7d) ADFPipelineRun | where TimeGenerated > ago(3d) // 按管道唯一运行ID分组聚合 | summarize StartTime = min(TimeGenerated), // 取该运行实例最早的日志时间作为启动时间 LatestStatus = arg_max(TimeGenerated, Status)[0].Status, // 取最新上报的状态 PipelineName = any(PipelineName), DataFactoryName = split(any(ResourceId), '/')[-1] by PipelineRunId // 筛选仍在进行中、且运行时长超过24小时的实例 | where LatestStatus == "InProgress" | where datetime_diff('hour', now(), StartTime) > 24 | project StartTime, DataFactoryName, PipelineName, PipelineRunId, LatestStatus, ContinuousRunHours = datetime_diff('hour', now(), StartTime) | sort by ContinuousRunHours desc
注意事项
- 如果你要排查的是活动级别而非管道级别的长运行任务,只需将查询的表替换为
ADFActivityRun,分组维度从PipelineRunId替换为ActivityRunId,补充ActivityName字段投影即可 - 检索的时间范围(即
where TimeGenerated > ago(xx)的取值)要大于你要排查的最长运行时长,否则启动时间早于检索范围的长运行实例会被漏掉 - 不要直接用管道名做唯一分组维度,ADF中同名管道可以多次触发运行,不带唯一运行ID的统计结果会完全失真
- 请确保Log Analytics工作区的日志保留期覆盖你要排查的最长运行周期,超过保留期被清理的启动日志无法用于准确计算运行时长
内容的提问来源于stack exchange,提问作者SONIA_29
相关产品推荐
相关产品推荐

