user3012708
user3012708

Reputation: 948

Azure Function v4 .net6 Event Hub Trigger - how to get EnqueuedTimeUTC?

I have a working Azure Functions app, with an Event Hub trigger. It's using Microsoft.Azure.Functions.Worker 1.10, functions runtime 4, .Net 6 and running as Isolated (not in-process).

The current function signature looks like:

    Function("MyFunction")]
        public async Task Run([EventHubTrigger("my-eventhub",
            ConsumerGroup = "a-consumer-group",
            Connection = "EventHub.ConnectionString")] string[] messages)
        {
         //Do stuff
        }

I would like to expand this to grab the Enqueue Time (the time at which the event ended up at the Event Hub).

So, i realise in Functions runtime v4, that i can't grab EventData[] like i could in older verions, instead i should use the BindingContext.

So i tried this:

    Function("MyFunction")]
        public async Task Run([EventHubTrigger("my-eventhub",
            ConsumerGroup = "a-consumer-group",
            Connection = "EventHub.ConnectionString")] string[] messages, FunctionContext context)
        {
            var data = context.BindingContext.BindingData["enqueuedTimeUtcArray"];
        
            //data would always be empty
        }

Figuring that this was the wrong approach, and seeing further examples breaking fields down, i tried the following:

    Function("MyFunction")]
        public async Task Run([EventHubTrigger("my-eventhub",
            ConsumerGroup = "a-consumer-group",
            Connection = "EventHub.ConnectionString")] string[] messages,
            DateTime[] enqueuedTimeUtcArray,
            long[] sequenceNumberArray,
            string[] offsetArray,
            Dictionary<string, JsonElement>[] propertiesArray,
            Dictionary<string, JsonElement>[] systemPropertiesArray))
        {
            var data = enqueuedTimeUtcArray;
        
            //data would always be empty
    }

I've tried various variations on those themes, including referencing the following:

The functions still trigger, and the functionality it provides (replaced with //do stuff) still goes off without a hitch, but still no EnqueueTimes... what am i doing wrong?

Upvotes: 0

Views: 1238

Answers (2)

user3012708
user3012708

Reputation: 948

For those reading in future, here's how the final, working solution looked, with massive help from David Browne in the comments:

        Function("MyFunction")]
        public async Task Run([EventHubTrigger("my-eventhub",
            ConsumerGroup = "a-consumer-group",
            Connection = "EventHub.ConnectionString")] string[] messages, FunctionContext context)
        {
            var data = context.BindingContext.BindingData["enqueuedTimeUtcArray"];
        
            var listOfDateTimes = JsonSerializer.Deserialize<string[]>(data["EnqueuedTimeUtcArray"].ToString())
                        .Select(a => DateTime.Parse(a.ToString())).ToList()

          //Do stuff
        }

I finally started receiving data from the FunctionContext after restarting my PC (I have no idea...), then realized i'd received a json array of strings, which were datetime compatible. So, deserializing them was the answer.

Upvotes: 2

David Browne - Microsoft
David Browne - Microsoft

Reputation: 89424

For isolated functions you have to dig around in the FunctionContext to get this data. The message enqueue times are available as a JSON array:

    [Function("EventHubTrigger1")]
    public void Run([EventHubTrigger("test", Connection = "myhub_all_EVENTHUB")] string[] input, FunctionContext context)
    {

        string enquedTimes = context.BindingContext.BindingData["EnqueuedTimeUtcArray"];

        _logger.LogInformation($"First Event Hubs triggered message: {input[0]}");
    }

Adding a function argument also worked:

public void Run([EventHubTrigger("test", Connection = "myhub_all_EVENTHUB")] string[] input, string[] enqueuedTimeUtcArray)

Upvotes: 1

Related Questions