如何获取Azure EventHub深度

时间:2019-01-21 14:35:24

标签: azure azure-eventhub

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

public static async Task Run([EventHubTrigger("%tsfEventHub%", Connection = "tsfEventHubConnection", ConsumerGroup = "%tsfEventHubConsumerGroup%")]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. 是否有任何方法可以检查积压?在某个时间点,我想获取我的函数需要处理的消息数量。

2 个答案:

答案 0 :(得分:1)

是的,您可以将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);
    }
}

我在媒体上写了一篇文章,其中有更详细的介绍,并展示了如何使用grafana中的数据,

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

答案 1 :(得分:0)

PartitionKey值空白吗?我在该EventHub中有2个分区

分区键与分区ID不同。将事件发布到事件中心时,可以设置分区键。如果未设置该分区键,则在使用它时将为null。

分区键用于事件,您不必关心它最终位于哪个分区,而只是希望具有相同键的事件最终位于同一分区中。

一个例子是,如果您有数百个IoT设备传输遥测数据。您不必担心这些IoT设备将数据发布到哪个分区,只要它始终位于同一分区即可。您可以将分区键设置为IoT设备的序列号。 当该设备使用该密钥发布其事件数据时,Event Hubs服务将为该分区密钥计算一个哈希,将其映射到特定的Event Hub分区,并将所有带有该密钥的事件路由到同一分区。

"Event Hubs Features: Publishing an Event"的文档对此进行了很好的描述。

partition key