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

Hub,Event ,outgoing,Rule · 浏览次数 : 96

小编点评

## 问题解答 **Event Hub 中如何判断消息积压?** Event Hub 没有直接提供消息积压的指标,无法通过消息数等方式判断。事件流中所有消息都会被保留 7 天,因此无法通过消息数判断当前消息是否有积压。 **如何进行预警?** 当消费端出现异常情况时,Event Hub 会记录异常信息并发送到 Log Analytics Workspace。但是,由于 Log Analytics Workspace 的指标可能滞后更新,所以无法在预警时及时通知运维人员。 **设置告警规则:** 在 Event Hub 中设置告警规则可以解决此问题。但由于 Event Hub 的指标数据可能滞后更新,因此无法使用简单的指标数据设置告警规则。 **解决方案:** 1. **收集 Event Hub Metrics 指标到 Log A 中设置诊断日志:** - 使用 Kusto 查询语句将 Metrics 数据从 Event Hub 中收集到 Log A 中。 - 将日志发送到 Log Analytics Workspace 中。 2. **编写自定义查询语句:** - 使用 Kusto 查询语句对 Metrics 数据进行分析。 - 计算 EHOUTMSGS 和 EHINMSGS 之间的差值。 - 设置阈值以触发告警。 3. **设置自定义指标:** - 选择 Signal Name 为 Custom Log search 输入。 - 在 Measurement 中选择 AlertValue。 - 设置时间周期为 5 分钟。 - 设置阈值为 EHOUTMSGS - EHINMSGS 的绝对值。 4. **设置告警规则:** - 在 Alert Logic 中选择自定义指标。 - 设置阈值为设置的阈值。 - 设置告警策略为 email 或其他通知方式。 **注意:** - 建议使用 Kusto 查询语句进行指标数据分析,因为 Log Analytics Workspace 指标可能存在滞后更新的问题。 - 可以根据实际需求调整告警阈值。

正文

问题描述

在使用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使用的前后对比效果:

 

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

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

问题描述 在使用Azure Service Bus的时候,我们可以根据Queue中目前存在的消息数来判断当前消息是否有积压的情况。 但是,在Event Hub中,因为所有消息都会被存留到预先设定的保留时间(默认是7天), 所以无法通过消息数来判断当前的消息是否有积压或者是有多余重复消费。 当消费端出

【Azure 事件中心】Event Hubs中存在非常多的错误数据,是否能提前删除这些数据呢?

问题描述 因为一些特殊原因,Event Hub 里面堆积了很多不需要的数据事件,正常要等事件中的过期时间到后才有Event Hub自动删除掉,但希望能够尽快马上删除,有没有什么手动的方法吗? 问题解答 Event Hub是一个数据事件处理服务,最主要的功能就是:接收和发送事件。它并不是一个数据存储服

【Azure 事件中心】Azure Event Hub中的数据能不能存储大于7天呢?如果7天之后是不是会自动删除呢?

问题描述 Event Hub中有个retention的设置为7天,有没有办法增大这个Retention的时间? 如果没办法,是不是超过7天的数据就会被删除? 问题解答 因为Azure Event Hub(事件中心)是一个实时事件流引擎,其设计意图并不是用于代替数据库以及/或者用作无限期保存的事件流的

【Azure Event Hub】Event Hub的Process Data页面无法通过JSON格式预览数据

问题描述 在Event Hub的门户页面中,可以通过Process Data页面查看Event Hub中的数据,但是当使用JSON格式预览时(View in JSON),却出现错误。 消息一: No data was found for preview from 'test01'. Make sur

【Azure 事件中心】Event Hubs如何获取其中存放的历史消息

问题描述 使用Azure Event Hub服务,除了正常的生产,消费消息以外,如果想拿到Event Hub中存储的历史消息?有什么方法呢? 问题解答 获取 Event Hubs 存储的历史消息,首先需要确保消息进入Event Hub的时间处于保留期限(Retention Days)内,因为超过这个

【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存

问题描述 在使用Azure Event Hub的SDK时候,常规情况下,发现示例代码中并没有SDK内部的日志输出。因为在Java项目中,没有添加 SLF4J 依赖,已致于在启动时候有如下提示: SLF4J: Failed to load class "org.slf4j.impl.StaticLog

【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能

问题描述 Azure Event Hub支持 kafka,所以为了测试消息生产者所在环境与Azure Event Hub之间发送消息的性能如何,特别使用 kafka 官方测试生产者,消费者的性能工具 : kafka-producer-perf-test.bat kafka-consumer-perf

【Azure 事件中心】如何查看Event Hub的生产者或者是消费者端的IP地址呢?

问题描述 哪些客户端 IP 正在向/从Azure Event Hub发送/接收事件?如何来查看Event Hub的生产者端,消费者端的IP地址呢? 问题解答 如果需要查看Event Hub 服务端的日志,可以在Azure门户上开启诊断日志来查看。默认情况下,我们并不能看见Event Hub的生产者,

【Azure 事件中心】使用Apache Flink 连接 Event Hubs 出错 Kafka error: No resolvable bootstrap urls

问题描述 参考Github上 Event Hub的示例代码(Using Apache Flink with Event Hubs for Apache Kafka Ecosystems : https://github.com/Azure/azure-event-hubs-for-kafka/tre

【Azure 事件中心】向Event Hub发送数据异常 : partitionId[null]: Sending messages timed out

问题描述 在使用Java 代码向 Azure Event Hub发送数据时,先后遇见了如下两种异常消息: 1)ERROR c.t.d.h.s.source.EventHubLogConsumer - Error occurred in partition processor for partitio