首页 > 解决方案 > 如何获取 Azure EventHub 深度

问题描述

我的 EventHub 每天有数百万条消息被摄取。我正在处理来自 Azure Function 的这些消息,并在日志中打印偏移量和序列号值。

public static async Task Run([EventHubTrigger("%EventHub%", Connection = "EventHubConnection", ConsumerGroup = "%EventHubConsumerGroup%")]EventData eventMessage,
        [Inject]ITsfService tsfService, [Inject]ILog log)
    {
log.Info($"PartitionKey {eventMessage.PartitionKey}, Offset {eventMessage.Offset} and SequenceNumber {eventMessage.SequenceNumber}");
}

日志输出

PartitionKey ,偏移量 78048157161248 和 SequenceNumber 442995283

问题

  1. PartitionKey 值为空?我在那个 EventHub 中有 2 个分区

  2. 有什么方法可以检查积压吗?某个时间点,我想知道我的函数需要处理多少条消息。

标签: azureazure-eventhub

解决方案


是的,您可以将 PartitionContext 对象作为签名的一部分,这将为您提供一些额外的信息,

public static async Task Run([EventHubTrigger("HubName", 
    Connection = "EventHubConnectionStringSettingName", 
    ConsumerGroup = "Consumer-Group-If-Applicable")] EventData[] messageBatch, PartitionContext partitionContext, ILogger log)

编辑您的 host.json 并将 enableReceiverRuntimeMetric 设置为 true,例如

"version":  "2.0",
"extensions": {
    "eventHubs": {
        "batchCheckpointFrequency": 100,
        "eventProcessorOptions": {
            "maxBatchSize": 256,
            "prefetchCount": 512,
            "enableReceiverRuntimeMetric": true
        }            
    }
}

您现在可以访问 PartitionContext 上的 RuntimeInformation,其中包含有关 LastSequenceNumber 的一些信息,并且您当前的消息具有它自己的序列号,因此您可以使用它们之间的差异来计算度量,例如,

public class EventStreamBacklogTracing
{
    private static readonly Metric PartitionSequenceMetric = 
        InsightsClient.Instance.GetMetric("PartitionSequenceDifference", "PartitionId", "ConsumerGroupName", "EventHubPath");

    public static void LogSequenceDifference(EventData message, PartitionContext context)
    {
        var messageSequence = message.SystemProperties.SequenceNumber;
        var lastEnqueuedSequence = context.RuntimeInformation.LastSequenceNumber;

        var sequenceDifference = lastEnqueuedSequence - messageSequence;

        PartitionSequenceMetric.TrackValue(sequenceDifference, context.PartitionId, context.ConsumerGroupName,
            context.EventHubPath);
    }
}

我在 medium 上写了一篇更详细的文章,展示了如何使用 grafana 中的数据,

https://medium.com/@dylanm_asos/azure-functions-event-hub-processing-8a3f39d2cd0f


推荐阅读