Как получить Azure EventHub Depth - PullRequest
0 голосов
/ 21 января 2019

Мой EventHub ежедневно получает миллионы сообщений. Я обрабатываю эти сообщения из функции Azure и печатаю смещение и значение порядкового номера в журналах.

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, Offset 78048157161248 и SequenceNumber 442995283

Вопросы

  1. Значение параметра PartitionKey пустое? У меня есть 2 раздела в этом EventHub

  2. Есть ли способ проверить резервы? В какой-то момент я хочу узнать, сколько сообщений нужно обработать моей функции.

1 Ответ

0 голосов
/ 23 января 2019

Да, вы можете включить объект 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
        }            
    }
}

Теперь вы получаете доступ к RuntimeInformation в PartitionContext, который содержит некоторую информацию о 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);
    }
}

Я написал статью на носителе, в которой более подробно рассказывается, как вы можете использовать данные в графане,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...