【Azure Event Hub】自定义告警(Alert Rule)用来提示Event Hub的消息incoming(生产)与outgoing(消费)的异常情况
问题描述
在使用Azure Service Bus的时候,我们可以根据Queue中目前存在的消息数来判断当前消息是否有积压的情况。
但是,在Event Hub中,因为所有消息都会被存留到预先设定的保留时间(默认是7天), 所以无法通过消息数来判断当前的消息是否有积压或者是有多余重复消费。
当消费端出现异常情况,在没有incoming的情况下,还是存在大量的outgoing,这种情况如何来提前预警呢?是否可以通过设置告警规则来及时通知运维人员呢?
如下图这样Outgoing 大于 incoming的情况
问题解答
在Azure服务中,PaaS资源都可以根据指标数据来设置告警,但是这是基于该服务有这类型指标的情况。
如现在Event Hub中 Outgoing Message 和Incoming Message不匹配的情况,由于Event Hub自身的指标中,并没有一个指标表示 Outgoing 与 Incoming 之间的差距值。 如果需要知道两个指标间的差值,就需要从收集的Metrics指标中进行自定义查询语句,并根据结果进行阈值设定。
主要的步骤有:
1)收集Event Hub Metrics指标到Log A中
- 设置诊断日志,日志发送到Log Analytics Workspace中
详细步骤,可参考官网:https://docs.azure.cn/zh-cn/event-hubs/monitor-event-hubs#log-analytics
2)自定义查询语句,在Kusto中进行行列转换,绝对值转换
示例Kusto语句
AzureMetrics | where ResourceProvider =="MICROSOFT.EVENTHUB" | where MetricName =="EHOUTMSGS" | project TimeGenerated,EHOUTMSGS=MetricName, OutMsgTotal=Total | join kind = leftouter ( AzureMetrics | where ResourceProvider =="MICROSOFT.EVENTHUB" | where MetricName =="EHINMSGS" | project TimeGenerated,EHINMSGS=MetricName, InMsgTotal=Total ) on $left.TimeGenerated == $right.TimeGenerated | project TimeGenerated,EHINMSGS,EHOUTMSGS,OutMsgTotal,InMsgTotal |extend OutMsgTotal=case(isnull(OutMsgTotal),0.0,OutMsgTotal), InMsgTotal=case(isnull(InMsgTotal),0.0,InMsgTotal) | project TimeGenerated, AlertValue = abs(OutMsgTotal - InMsgTotal)
说明:
1: EHOUTMSGS 表示Event Hub Outgoing Messages 统计值
2: EHINMSGS表示 Event Hub Incoming Messages 统计值
3: 使用 Left Outer Join的方式,把 EHOUTMSGS 和 ENINMSGS 的值组合在一行中,并且通过 EXTEND CASE 补齐数据,缺少的行用0代替。
4:AlertValue = abs(EHOUTMSGS - EHINMSGS), 计算差值并取绝对值,然结果显示为正
3)设置自定义指标
- 选择 Signal Name 为 Custom Log search
- 输入第二步中的Kusto Query 语句
- 在Measurement选择 AlertVaule, Average, 并以5分钟为一个时间周期进行判断
4)设置阈值
在Alert Logic 部分中,这是阈值即可。这里也是触发Alert的关键点,需要根据实际情况来决定一个合理的值。
【结束】
附录:为什么pivot 语句中特意的添加了 输出格式的结构体呢?
| evaluate pivot(MetricName,sum(Total)):(TimeGenerated:datetime, EHOUTMSGS:long, EHINMSGS:long,AlertValue:long)
添加OutputSchema的目的就为了避免查询结构体中缺少了需要统计的字段值而报错('project' operator: Failed to resolve scalar expression named 'EHINMSGS' I)。
如下效果对比:
附录二: PIVOT 示例
pivot 函数执行把多行数据转换为多列。此处通过MetricsName的值的不同而转换为 EHOUTMSGS 和 EHINMSGS 两列,并且根据TimeGenerated时间值进行Total统计。在同一个时间点的数据归并为一行数据。
PIVOT使用的前后对比效果:
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-07-06 【Azure 应用服务】PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢?
2021-07-06 【Azure API 管理】解决调用REST API操作APIM(API Management)需要认证问题(Authentication failed, The 'Authorization' header is missing)