问题描述

在使用Azure Service Bus的时候,我们可以根据Queue中目前存在的消息数来判断当前消息是否有积压的情况。【Azure Event Hub】自定义告警(Alert Rule)用来提示Event Hub的消息incoming(生产)与outgoing(消费)的异常情况-LMLPHP

但是,在Event Hub中,因为所有消息都会被存留到预先设定的保留时间(默认是7天), 所以无法通过消息数来判断当前的消息是否有积压或者是有多余重复消费。

【Azure Event Hub】自定义告警(Alert Rule)用来提示Event Hub的消息incoming(生产)与outgoing(消费)的异常情况-LMLPHP

当消费端出现异常情况,在没有incoming的情况下,还是存在大量的outgoing,这种情况如何来提前预警呢?是否可以通过设置告警规则来及时通知运维人员呢?

如下图这样Outgoing 大于 incoming的情况

【Azure Event Hub】自定义告警(Alert Rule)用来提示Event Hub的消息incoming(生产)与outgoing(消费)的异常情况-LMLPHP

问题解答

在Azure服务中,PaaS资源都可以根据指标数据来设置告警,但是这是基于该服务有这类型指标的情况。

如现在Event Hub中 Outgoing Message 和Incoming Message不匹配的情况,由于Event Hub自身的指标中,并没有一个指标表示 Outgoing 与 Incoming 之间的差距值。 如果需要知道两个指标间的差值,就需要从收集的Metrics指标中进行自定义查询语句,并根据结果进行阈值设定。

主要的步骤有:

1)收集Event Hub Metrics指标到Log A中

  • 设置诊断日志,日志发送到Log Analytics Workspace中

【Azure Event Hub】自定义告警(Alert Rule)用来提示Event Hub的消息incoming(生产)与outgoing(消费)的异常情况-LMLPHP

详细步骤,可参考官网:https://docs.azure.cn/zh-cn/event-hubs/monitor-event-hubs#log-analytics

2)自定义查询语句,在Kusto中进行行列转换,绝对值转换

示例Kusto语句

AzureMetrics

| where ResourceProvider =="MICROSOFT.EVENTHUB"

| where MetricName =="EHOUTMSGS" or MetricName =="EHINMSGS"

| project  TimeGenerated, MetricName, Total, TimeGrain

| evaluate pivot(MetricName,sum(Total)):(TimeGenerated:datetime, EHOUTMSGS:long, EHINMSGS:long,AlertValue:long)

| project TimeGenerated,EHOUTMSGS, EHINMSGS, AlertValue = abs(EHOUTMSGS - EHINMSGS)
07-07 04:56