Как установить systemProperties для привязок EventHub в функции Azure - PullRequest
0 голосов
/ 21 февраля 2020

Вот мой Azure конвейер:

IoTHub → EventHub sr c → Azure Функция в JavaScript → EventHub dest

В функции Azure мне нужно применить какое-либо преобразование к телу события, полученному в качестве входных данных, и поместить это преобразованное событие в конечный EventHub.

Через context.bindingData.systemPropertiesArray я могу получить важные метаданные, такие как iothub-connection-device-id:

module.exports = async function (context, messageBodies) {
   messageBodies.forEach((messageBody, index) => {
        const transformedMessageBody = transform(messageBody)
        const deviceId = context.bindingData.systemPropertiesArray[index]['iothub-connection-device-id']
        context.log(deviceId)

        // here I can only set the messageBody. What's the way to attach back the original systemProperties?
        context.bindings.eventHubDest = transformedMessageBody
    })
}

Проблема : systemProperties потеряны в целевом EventHub, потому что я могу найти способ установить их обратно в Azure Код функции:

Source Событие EventHub:

   {
      body: { foo: 'bar' },
      properties: undefined,
      offset: '143360',
      sequenceNumber: 392,
      enqueuedTimeUtc: 2020-02-21T11:30:32.294Z,
      partitionKey: undefined,
      systemProperties: {
        'iothub-connection-device-id': 'qux',
        'iothub-connection-auth-method': '{"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}',
        'iothub-connection-auth-generation-id': '637177867069071846',
        'iothub-enqueuedtime': 1582284632134,
        'iothub-message-source': 'Telemetry'
      }
    }

Событие Destination EventHub:

   {
      body: { foo: 'transformedBar' },
      properties: undefined,
      offset: '34',
      sequenceNumber: 456,
      enqueuedTimeUtc: 2020-02-21T11:30:33.256Z,
      partitionKey: undefined,
      systemProperties: undefined
   }

Примечание. Мне известно, что я могу «обмануть» и прикрепить deviceId в теле нового события, но Мне нужно, чтобы это значение было чисто разделено в systemProperties для дальнейшей обработки в дальнейшем.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

SystemProperties нельзя установить на издателе Event Hubs, потому что он предназначен только для служебного использования. Я не уверен, как это сделать в триггере JS, но вместо этого вы должны использовать сумку eventData.properties.

1 голос
/ 21 февраля 2020

Это (context.bindings.eventHubDest = transformedMessageBody) только устанавливает тело сообщения, которое будет отправлено. Это совершенно новое сообщение, а не просто пересылка входящего. Следовательно, любые метаданные также теряются.

Чтение это звучит так, как будто вы не можете привязаться к EventData при использовании Javascript - как вы можете при использовании C# . Привязка к EventData позволяет вам также устанавливать метаданные, в отличие от привязки к строке тела.

Так что, если вам это нужно, вам нужно использовать C# (Java может также Работа). Или используйте что-то совершенно другое, например Azure Stream Analytics.

...