Kusto函数无法封装控制命令,如何实现Ingestion失败触发邮件告警?
解决ADX摄取失败自动告警(邮件)的方案
既然控制命令没法封装到函数里,我们可以换几种原生Azure工具结合的方式来实现自动告警,下面是几个实用的方案:
方案一:用Azure Monitor原生告警(最快上手)
这是最直接的无代码方案,完全靠Azure Portal配置就能搞定:
- 打开你的ADX集群资源页,进入监控 → 警报 → 创建警报规则
- 在「信号逻辑」里,选择日志作为信号类型,然后输入Kusto查询语句:
.show ingestion failures | where ingestion_time() > ago(30m) // 按需调整检测时间范围 | project OperationId, Database, Table, FailureReason, IngestionSourcePath // 只保留你关心的列 - 设置警报条件:当查询返回的记录数大于0时触发告警
- 添加动作组,选择「电子邮件/短信/推送/语音」,填入要接收告警的邮箱地址
- 保存规则后,只要有符合条件的摄取失败,就会自动发邮件通知你
方案二:Azure Functions + Kusto SDK(自定义灵活性高)
如果需要对失败数据做更复杂的过滤或处理(比如只告警特定表的数据损坏失败),可以用这个方案:
- 创建一个定时器触发的Azure Function(比如每5分钟执行一次)
- 在Function代码中,用Kusto SDK调用ADX的摄取失败查询(以Python为例):
from azure.kusto.data import KustoClient, KustoConnectionStringBuilder # 配置ADX连接信息 cluster = "https://<你的ADX集群名>.kusto.windows.net" client_id = "<你的服务主体ID>" client_secret = "<你的服务主体密钥>" authority_id = "<你的租户ID>" # 建立连接 kcsb = KustoConnectionStringBuilder.with_aad_application_key_authentication(cluster, client_id, client_secret, authority_id) client = KustoClient(kcsb) # 执行摄取失败查询,只过滤数据损坏相关的失败 query = """ .show ingestion failures | where ingestion_time() > ago(30m) | where FailureReason contains "data corruption" | project OperationId, Table, FailureReason """ response = client.execute_query("<你的数据库名>", query) failures = response.to_dict() # 如果有失败记录,触发邮件告警 if len(failures["data"]) > 0: # 这里可以集成SendGrid或Office 365 Outlook发送邮件,示例省略具体实现 send_custom_alert_email(failures["data"]) - 集成邮件发送功能:可以用Azure的SendGrid服务,或者Office 365 Outlook连接器,把失败详情格式化后塞进邮件正文
方案三:Event Grid + Logic Apps(事件驱动型)
ADX支持将摄取失败事件实时推送到Event Grid,然后用Logic Apps自动处理并发邮件:
- 进入ADX集群的数据连接 → 添加 → Event Grid,配置时选择「摄取失败」作为要订阅的事件类型
- 创建一个新的Azure Logic Apps,选择「Event Grid触发器」,触发条件设为接收ADX的摄取失败事件
- 在Logic Apps的工作流中,添加「发送电子邮件」动作(比如用Office 365 Outlook),把事件中的关键信息(比如
tableName、failureReason)插入到邮件内容里 - 保存工作流后,每次ADX发生摄取失败,Event Grid会自动把事件推给Logic Apps,触发邮件发送
几个实用注意点
- 权限配置:不管用哪种方案,都要确保对应的服务有足够的权限访问ADX(比如服务主体需要ADX的
Viewer权限) - 过滤无效告警:可以在查询里添加条件,排除临时网络波动等非关键失败,比如
where FailureReason !contains "timeout" - 获取详细错误:如果需要更深入的失败详情,可以在
.show ingestion failures后加上with (details=true),获取完整的错误堆栈信息
内容的提问来源于stack exchange,提问作者Ada Pongaya
相关产品推荐
相关产品推荐

