Azure / azure-functions-eventhubs-extension

Event Hubs extension for Azure Functions
MIT License
20 stars 26 forks source link

Incorrect EventHubTrigger properties received in deviceLifecycleEvents when "cardinality:"one" #123

Closed lsojian closed 1 month ago

lsojian commented 1 year ago

We have configured our IoT Hub to route deviceLifecycleEvents messages to the builtin IoT Hub "events" endpoint. We have also configured an EventHubTrigger function app to listen for events from that route.

function.json

{
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "message",
      "direction": "in",
      "eventHubName": "iothub_name-lena",
      "connection": "iothub_events_endpoint-lena",
      "cardinality": "one",
      "consumerGroup": "lena"
    }
  ]
}

When "cardinality":"one" is set in the function.json, the deviceLifecycleEvent received by the function shows incorrect properties object:

context.bindingData for deviceLifecycleEvent when "cardinality":"one"

{
  "invocationId": "",
  "partitionContext": {
    "cancellationToken": {
      "isCancellationRequested": false,
      "canBeCanceled": true,
      "waitHandle": {
        "handle": {
          "value": 2788
        },
        "safeWaitHandle": {
          "isInvalid": false,
          "isClosed": false
        }
      }
    },
    "consumerGroupName": "",
    "eventHubPath": "",
    "partitionId": "2",
    "owner": "",
    "runtimeInformation": {
      "partitionId": "2",
      "lastSequenceNumber": -1,
      "lastEnqueuedTimeUtc": "0001-01-01T00:00:00",
      "lastEnqueuedOffset": null,
      "retrievalTime": "0001-01-01T00:00:00"
    },
    "lease": {
      "offset": "639950258224",
      "sequenceNumber": 595,
      "partitionId": "2",
      "owner": "",
      "token": "",
      "epoch": 182
    }
  },
  "offset": 639950258968,
  "sequenceNumber": 596,
  "enqueuedTimeUtc": "2023-02-13T22:33:23.239Z",
  "properties": {
    "desired": {
      "$metadata": {
        "$lastUpdated": "2023-02-13T22:33:23.0850409Z"
      },
      "$version": 1
    },
    "reported": {
      "$metadata": {
        "$lastUpdated": "2023-02-13T22:33:23.0850409Z"
      },
      "$version": 1
    }
  },
  "systemProperties": {
    "iothub-connection-device-id": "Device1",
    "iothub-enqueuedtime": "2023-02-13T22:33:23.098Z",
    "iothub-message-source": "deviceLifecycleEvents",
    "x-opt-sequence-number": 596,
    "x-opt-offset": "639950258968",
    "x-opt-enqueued-time": "2023-02-13T22:33:23.239Z",
    "user-id": [
    ],
    "correlation-id": {
      "encodeSize": 12
    },
    "content-type": {
      "value": "application/json",
      "valueSize": 16
    },
    "content-encoding": {
      "value": "utf-8",
      "valueSize": 5
    },
    "sequenceNumber": 596,
    "offset": "639950258968",
    "partitionKey": null,
    "enqueuedTimeUtc": "2023-02-13T22:33:23.239Z"
  },
  "deviceId": "Device1",
  "etag": "AAAAAAAAAAE=",
  "version": 2
}

When using "cardinality":"one", the deviceLifecycleEvent properties object does not contain an 'opType' to identify whether the deviceLifecycleEvent is a deleteDeviceIdentity or createDeviceIdentity.

context.bindingData.properties with "cardinality":"one"

"properties": {
    "desired": {
      "$metadata": {
        "$lastUpdated": "2023-02-13T22:33:23.0850409Z"
      },
      "$version": 1
    },
    "reported": {
      "$metadata": {
        "$lastUpdated": "2023-02-13T22:33:23.0850409Z"
      },
      "$version": 1
    }
  },

When "cardinality":"many" is set in the function.json, the deviceLifecycleEvent contains correct properties->opType information:

function.json with "cardinality":"many"

{
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "message",
      "direction": "in",
      "eventHubName": "iothub_name-lena",
      "connection": "iothub_events_endpoint-lena",
      "cardinality": "many",
      "consumerGroup": "lena"
    }
  ]
}

deviceLifecycleEvent context.bindingData with "cardinality":"many"

{
  "invocationId": "",
  "partitionContext": {
    "cancellationToken": {
      "isCancellationRequested": false,
      "canBeCanceled": true,
      "waitHandle": {
        "handle": {
          "value": 2780
        },
        "safeWaitHandle": {
          "isInvalid": false,
          "isClosed": false
        }
      }
    },
    "consumerGroupName": "",
    "eventHubPath": "",
    "partitionId": "3",
    "owner": "",
    "runtimeInformation": {
      "partitionId": "3",
      "lastSequenceNumber": -1,
      "lastEnqueuedTimeUtc": "0001-01-01T00:00:00",
      "lastEnqueuedOffset": null,
      "retrievalTime": "0001-01-01T00:00:00"
    },
    "lease": {
      "offset": "631360264008",
      "sequenceNumber": 249,
      "partitionId": "3",
      "owner": "",
      "token": "",
      "epoch": 174
    }
  },
  "partitionKeyArray": [],
  "offsetArray": [
    "631360264752"
  ],
  "sequenceNumberArray": [
    "250"
  ],
  "enqueuedTimeUtcArray": [
    "2023-02-13T23:02:21.612Z"
  ],
  "propertiesArray": [
    {
      "hubName": "",
      "deviceId": "Device3",
      "operationTimestamp": "2023-02-13T23:02:21.4632744Z",
      "opType": "createDeviceIdentity",
      "iothub-message-schema": "deviceLifecycleNotification",
      "connection": ""
    }
  ],
  "systemPropertiesArray": [
    {
      "iothub-connection-device-id": "Device3",
      "iothub-enqueuedtime": "2023-02-13T23:02:21.472Z",
      "iothub-message-source": "deviceLifecycleEvents",
      "x-opt-sequence-number": 250,
      "x-opt-offset": "631360264752",
      "x-opt-enqueued-time": "2023-02-13T23:02:21.612Z",
      "user-id": [
      ],
      "correlation-id": {
        "EncodeSize": 14
      },
      "content-type": {
        "Value": "application/json",
        "ValueSize": 16
      },
      "content-encoding": {
        "Value": "utf-8",
        "ValueSize": 5
      },
      "SequenceNumber": 250,
      "Offset": "631360264752",
      "PartitionKey": null,
      "EnqueuedTimeUtc": "2023-02-13T23:02:21.612Z"
    }
  ]
}

context.bindingData.properties with "cardinality":"many"

"propertiesArray": [
    {
      "hubName": "",
      "deviceId": "Device3",
      "operationTimestamp": "2023-02-13T23:02:21.4632744Z",
      "opType": "createDeviceIdentity",
      "iothub-message-schema": "deviceLifecycleNotification",
      "connection": ""
    }
  ],