如何在Logic Apps中捕获ADF各Databricks Notebook活动的时间并展示时间差
解决方案:捕获ADF中Databricks Notebook运行时间并在Logic Apps邮件中展示
一、在ADF中捕获单个Notebook的运行时间
ADF会自动记录每个活动的运行元数据,直接通过活动输出或管道变量提取即可:
- 为每个Databricks Notebook活动创建对应的管道变量(字符串类型),比如
Notebook1_StartTime、Notebook1_EndTime。 - 在Notebook活动的成功后操作中,将活动的开始/结束时间赋值给变量:
- 赋值
Notebook1_StartTime:@activity('Notebook1').output.runStartTime - 赋值
Notebook1_EndTime:@activity('Notebook1').output.runEndTime
- 赋值
- 重复此步骤,为所有Notebook活动配置对应的时间变量。
二、将时间数据传递至Logic Apps
有两种常用方式传递数据:
方式1:直接通过ADF的Logic Apps连接器传递参数
在ADF管道末尾添加Logic Apps活动,构造包含所有Notebook时间信息的JSON作为输入:
{ "notebookRuns": [ { "name": "Notebook1", "startTime": "@variables('Notebook1_StartTime')", "endTime": "@variables('Notebook1_EndTime')" }, { "name": "Notebook2", "startTime": "@variables('Notebook2_StartTime')", "endTime": "@variables('Notebook2_EndTime')" } ] }
方式2:通过ADF REST API在Logic Apps中拉取数据
如果不想在ADF中维护大量变量,可在Logic Apps中调用ADF的Get Activity Runs API:
- 在Logic Apps中配置ADF服务连接,确保服务主体拥有ADF的Reader权限。
- 使用
HTTP动作调用API:GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DataFactory/factories/{factoryName}/pipelineruns/{runId}/activityruns?api-version=2018-06-01 - 传入管道运行ID(可通过ADF管道的
@pipeline().RunId传递给Logic Apps),获取所有活动的运行日志后筛选出Databricks Notebook的记录。
三、在Logic Apps中计算时长并生成邮件
- 解析输入数据:
- 如果是通过参数传递的JSON,使用
Parse JSON动作解析notebookRuns数组,提前生成JSON schema以确保字段匹配。 - 如果是API返回的数据,同样解析返回的
value数组,筛选出activityType为DatabricksNotebook的记录。
- 如果是通过参数传递的JSON,使用
- 计算运行时长:
对每个Notebook的时间对,用ticks函数计算时间差(转成秒数),再格式化为时分秒:- 计算总秒数:
@div(sub(ticks(items('Apply_to_each')?['endTime']), ticks(items('Apply_to_each')?['startTime'])), 10000000) - 格式化为可读字符串:
@concat( string(div(variables('TotalSeconds'), 3600)), '小时 ', string(mod(div(variables('TotalSeconds'), 60), 60)), '分钟 ', string(mod(variables('TotalSeconds'), 60)), '秒' )
Apply to each循环处理每个Notebook数据,将计算结果存入变量。 - 计算总秒数:
- 构建邮件正文:
用Compose动作拼接HTML表格,展示所有Notebook的运行信息:<h3>Databricks Notebook运行统计报告</h3> <table style="border-collapse: collapse; width: 100%;"> <tr> <th style="border:1px solid #ddd; padding:8px;">Notebook名称</th> <th style="border:1px solid #ddd; padding:8px;">开始时间</th> <th style="border:1px solid #ddd; padding:8px;">结束时间</th> <th style="border:1px solid #ddd; padding:8px;">运行时长</th> </tr> <tr> <td style="border:1px solid #ddd; padding:8px;">@{items('Apply_to_each')?['name']}</td> <td style="border:1px solid #ddd; padding:8px;">@{items('Apply_to_each')?['startTime']}</td> <td style="border:1px solid #ddd; padding:8px;">@{items('Apply_to_each')?['endTime']}</td> <td style="border:1px solid #ddd; padding:8px;">@{variables('FormattedDuration')}</td> </tr> </table> - 发送邮件:
使用Office 365 Outlook或其他邮件连接器,将Compose生成的HTML作为邮件正文,设置主题、收件人等参数后发送。
关键注意事项
- 确保时间格式为ISO 8601(如
2024-05-20T14:30:00Z),避免计算时出现格式错误。 - 若使用API拉取数据,注意ADF的API调用限额,避免触发限流。
- 如需展示本地时区时间,可在Logic Apps中使用
Convert Time Zone动作转换时间格式。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

