Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Azure Event Hub] Event Message with Partition Key is Null from kafkacat #18460

Closed
chongzhang opened this issue Apr 30, 2021 · 17 comments
Closed
Assignees
Labels
customer-reported Issues that are reported by GitHub users external to the Azure organization. Event Hubs Messaging Messaging crew needs-author-feedback Workflow: More information is needed from author to address the issue. needs-team-attention Workflow: This issue needs attention from Azure service team or SDK team no-recent-activity There has been no recent activity on this issue. question The issue doesn't require a change to the product in order to be resolved. Most issues start as that Service Attention Workflow: This issue is responsible by Azure service team. Service This issue points to a problem in the service.
Milestone

Comments

@chongzhang
Copy link

chongzhang commented Apr 30, 2021

  • azure-eventhub:
  • 5.4.0:
  • MacOS:
  • 3.8.7:

Describe the bug
After using azure-eventhub package to produce message with partitionKey, using azure-eventhub package to consume the message shows the body and partition_key in the event. But using kafkacat to consume the topic shows null/empty key for the message.

To Reproduce
Steps to reproduce the behavior:

  1. Use azure-eventhub to produce message:

event_data_batch_with_partition_key = producer.create_batch(partition_key='key1') event_data_batch_with_partition_key.add( EventData(msg)) producer.send_batch(event_data_batch_with_partition_key)

  1. use azure-eventhub to consume the message

async def on_event(partition_context, event): logging.info(f'event {event}')
the consumer log shows the event message with body, partition_key, and other fields, e.g

event { body: '{"name": "myname", "data": "msg 18"}', offset: 133144046968, sequence_number: 66430, partition_key=b'key1', enqueued_time=datetime.datetime(2021, 4, 30, 19, 41, 19, 410000, tzinfo=datetime.timezone.utc) }

  1. use kafkacat to consume the topic:

kafkacat -b $BROKER -t $TOPIC -f '\n%t Key (%K bytes): %k :\nValue (%S bytes): %s\n%T \Partition: %p\tOffset: %o\n--\n' -o end

kafkacat consumes the msg with empty/null key:

mytopic Key (-1 bytes): : Value (36 bytes): {"name": "myname", "data": "msg 18"} 1619811679410 Partition: 1 Offset: 66430

  1. similar result with empty key by using kakfa library e.g https://github.com/Shopify/sarama

Expected behavior

  1. the msg partitionKey is visible and available for kafkacat (or other kafka consumers)

Screenshots

Additional context

@ghost ghost added needs-triage Workflow: This is a new issue that needs to be triaged to the appropriate team. customer-reported Issues that are reported by GitHub users external to the Azure organization. question The issue doesn't require a change to the product in order to be resolved. Most issues start as that labels Apr 30, 2021
@rakshith91 rakshith91 added Client This issue points to a problem in the data-plane of the library. Event Hubs Messaging Messaging crew labels Apr 30, 2021
@ghost ghost removed the needs-triage Workflow: This is a new issue that needs to be triaged to the appropriate team. label Apr 30, 2021
@rakshith91 rakshith91 added bug This issue requires a change to an existing behavior in the product in order to be resolved. and removed question The issue doesn't require a change to the product in order to be resolved. Most issues start as that labels Apr 30, 2021
@rakshith91
Copy link
Contributor

Thanks for reporting the bug!! We'll take a look asap

@rakshith91 rakshith91 added this to the [2021] May milestone Apr 30, 2021
@yunhaoling
Copy link
Contributor

@chongzhang , thanks for reaching out.

as far as I know, the partition_key is used by the service to decide partition, but I'm not sure whether or not the service would set the kafka message key using the partition_key.

hey @serkantkaraca , could you help give some more context on this one?

@yunhaoling yunhaoling added question The issue doesn't require a change to the product in order to be resolved. Most issues start as that Service Attention Workflow: This issue is responsible by Azure service team. and removed bug This issue requires a change to an existing behavior in the product in order to be resolved. labels May 6, 2021
@ghost
Copy link

ghost commented May 6, 2021

Thanks for the feedback! We are routing this to the appropriate team for follow-up. cc @jfggdl.

Issue Details
  • azure-eventhub:
  • 5.4.0:
  • MacOS:
  • 3.8.7:

Describe the bug
After using azure-eventhub package to produce message with partitionKey, using azure-eventhub package to consume the message shows the body and partition_key in the event. But using kafkacat to consume the topic shows null/empty key for the message.

To Reproduce
Steps to reproduce the behavior:

  1. Use azure-eventhub to produce message:

event_data_batch_with_partition_key = producer.create_batch(partition_key='key1') event_data_batch_with_partition_key.add( EventData(msg)) producer.send_batch(event_data_batch_with_partition_key)

  1. use azure-eventhub to consume the message

async def on_event(partition_context, event): logging.info(f'event {event}')
the consumer log shows the event message with body, partition_key, and other fields, e.g

event { body: '{"name": "myname", "data": "msg 18"}', offset: 133144046968, sequence_number: 66430, partition_key=b'key1', enqueued_time=datetime.datetime(2021, 4, 30, 19, 41, 19, 410000, tzinfo=datetime.timezone.utc) }

  1. use kafkacat to consume the topic:

kafkacat -b $BROKER -t $TOPIC -f '\n%t Key (%K bytes): %k :\nValue (%S bytes): %s\n%T \Partition: %p\tOffset: %o\n--\n' -o end

kafkacat consumes the msg with empty/null key:

mytopic Key (-1 bytes): : Value (36 bytes): {"name": "myname", "data": "msg 18"} 1619811679410 Partition: 1 Offset: 66430

  1. similar result with empty key by using kakfa library e.g https://github.com/Shopify/sarama

Expected behavior

  1. the msg partitionKey is visible and available for kafkacat (or other kafka consumers)

Screenshots

Additional context

Author: chongzhang
Assignees: yunhaoling
Labels:

Client, Event Hubs, Messaging, Service Attention, customer-reported, question

Milestone: [2021] May

@yunhaoling yunhaoling added Service This issue points to a problem in the service. and removed Client This issue points to a problem in the data-plane of the library. labels May 6, 2021
@chongzhang
Copy link
Author

chongzhang commented May 6, 2021

@yunhaoling
I did another test to use https://pypi.org/project/kafka-python/ 2.0.2 to produce msg with key:
producer.send('mytopic', key='key1, value=msg)

  • from kafka-python consumer

for msg in consumer: logging.info('{} {} {} {}'.format(msg.partition, msg.offset, msg.key, msg.value))
the log shows the msg.key:
0 67212 b'key1' b'{"data": "msg 1"}'

  • similar with kafkacat and sarama consumer, which both print out the key (also offset and value fields).

  • The azure-eventhub consumer doesn't have the partition_key in the event:

event { body: '{"data": "msg 1"}', properties: {}, offset: 137438954224, sequence_number: 67212, enqueued_time=datetime.datetime(2021, 5, 6, 18, 1, 51, 674000, tzinfo=datetime.timezone.utc) }

@yunhaoling
Copy link
Contributor

thanks for more information! yeah, this makes me further wonder whether the PartitionKey concept in Event Hub and Key concept in Kafka are the same thing -- apologize that I didn't have enough background to answer it.

I've looped in the service team to help answer your question.

@chongzhang
Copy link
Author

Hi @yunhaoling, any update on this with service team?

@serkantkaraca
Copy link
Member

Can you examine the messages with Service Bus Explorer and see if partition keys are present? Better to pinpoint whether the issue is on the producer side or the consumer side.

@swathipil swathipil self-assigned this May 17, 2021
@yunhaoling
Copy link
Contributor

I have tried the confluent-kafka python sdk to send and receive events by following azure-event-hubs-for-kafka python sample.

I'm using the following steps to check the behavior difference between kafka sdk and python event hub sdk:

Step1. check kafka producer and consumer behavior on message key

The confluent-kafka producer and consumer sample are good with message key -- I have tweaked the producer.py and consumer.py in the confluent-kafka sample to set and get message key.

# on the producer, produce message with key-value pair
p.produce(topic, key='partition key', value=str(i), callback=delivery_callback)

# on the consumer side, print out the key-value pari
print(msg.key())
print(msg.value())

Step2. Use ServiceBusExplorer to check whether partition key is populated.

No, the partition key is NOT showing up in the explorer

image

Step3. receive the events sent by kafka sdk by python eventhub sdk

the received event doesn't have a partition key -- the python eventhub sdk inspect the "x-opt-partition-key" entry in the internal amqp message annotation.

however, the internal amqp message annotation contains an entry "x-opt-kafka-key" and the value is exactly the key set by the kafka producer.
image


@serkantkaraca , looks like "x-opt-partition-key" and "x-opt-kafka-key" are treated differently, is this a by-design difference?

@lmazuel lmazuel modified the milestones: [2021] May, Backlog May 19, 2021
@chongzhang
Copy link
Author

Hi, is there any update on this?

@yunhaoling
Copy link
Contributor

yunhaoling commented Jun 3, 2021

hey @chongzhang , confirmed with @serkantkaraca that x-opt-kafka-key (which is set when event is sent by kafka sdk and which is not set when event is sent by the Event Hub sdk) is not used as partition key in the Event Hubs Service, so it is an expected behavior.

hey @hmlam do you have any thoughts on this issue? is there anything we could or should do on the service/sdk side or we handover it to the kafka developer?

@yunhaoling yunhaoling removed this from the Backlog milestone Jun 14, 2021
@yunhaoling yunhaoling added this to the [2021] July milestone Jun 14, 2021
@yunhaoling
Copy link
Contributor

hey @chongzhang, I have discussed with the service team. The summary is as follows:

  • The partition key of the EventHubs event is available in the kafka record headers, the protocol specific key being "x-opt-partition-key" in the header.
  • It is by-design that we don't promote the Kafka message key to be the Event Hubs partition key and nor the reverse because with the same value the Kafka client and the EH client likely send the message to two different partitions. It might cause some confusion if we set the value in the cross protocol communication case. Exposing the properties with a protocol specific key to the other protocol client should be good enough.
  • We should document it clearly for this scenario and will improve on the documentations.

Please let me know if you have any other questions and really appreciate your feedbacks!

@yunhaoling yunhaoling added the needs-author-feedback Workflow: More information is needed from author to address the issue. label Jun 14, 2021
@chongzhang
Copy link
Author

@yunhaoling Thanks for your detail info.

  • For producer, my understanding is that in order for different languages/libraries to send same msg to same partition, they should use custom hash partitioner function to make sure that the same msg maps to same partition id. Could you share some info on what hash function EH client uses to map the key to partition id, or how to provide custom partitioner?

  • For consumer, the msg Headers could have the msg key, but it's not standardized, so it would be great if EH consumer client can return msg key based on the 'x-opt-partition-key' or 'key' in the header.

Thanks again for your help!

@ghost ghost added needs-team-attention Workflow: This issue needs attention from Azure service team or SDK team and removed needs-author-feedback Workflow: More information is needed from author to address the issue. labels Jun 15, 2021
@ramya-rao-a ramya-rao-a assigned kasun04 and unassigned yunhaoling Jun 15, 2021
@serkantkaraca
Copy link
Member

You can print the partition key via message headers as below.

Formatting
Headers: %h

Sample output
Headers: x-opt-partition-key=�↑this-is-my-partition-key,

@yunhaoling yunhaoling modified the milestones: [2021] July, Backlog Jun 21, 2021
@kasun04
Copy link

kasun04 commented Jun 21, 2021

@chongzhang If we use the same key across multiple SDKs, messages go to the same partition as the hashing happens at the service side.

@chongzhang
Copy link
Author

@kasun04 thanks! Just to clarify, what do you mean on "multiple SDKs"? I thought Adam @yunhaoling mentioned above that "because with the same value the Kafka client and the EH client likely send the message to two different partitions".

@kasun04
Copy link

kasun04 commented Jul 23, 2021

I was referring to using same partition keys from SDKs for different languages.

@kasun04 kasun04 added the needs-author-feedback Workflow: More information is needed from author to address the issue. label Jul 23, 2021
@ghost ghost added the no-recent-activity There has been no recent activity on this issue. label Jul 31, 2021
@ghost
Copy link

ghost commented Jul 31, 2021

Hi, we're sending this friendly reminder because we haven't heard back from you in a while. We need more information about this issue to help address it. Please be sure to give us your input within the next 7 days. If we don't hear back from you within 14 days of this comment the issue will be automatically closed. Thank you!

@ghost ghost closed this as completed Aug 14, 2021
azure-sdk pushed a commit to azure-sdk/azure-sdk-for-python that referenced this issue Jun 24, 2022
Web ant97 2022 03 01 (Azure#19430)

* Adds base for updating Microsoft.Web from version stable/2021-03-01 to version 2022-03-01

* Updates readme

* Updates API version in new specs and examples

* Carry fwd Microsoft.CertificateRegistration and Microsoft.DomainRegis… (Azure#18460)

* Carry fwd Microsoft.CertificateRegistration and Microsoft.DomainRegistration RPs to Api-version 2022-03-01

* Add x-ms-enum for array of inline enums. Fix reference to older api version for common defs

* Add examples for App Service Certificate orders

* Add suppressions back

* Add examples for Microsoft.DomainRegistration RP

* Fixes from prettier

* Remove unused example

* Add Unhealthy CustomDomainStatus for StaticSites (Azure#18557)

* Adding VnetRouteAllEnabled, VnetImagePullEnabled, VnetContentShareEnabled site properties to CommonDefinitions (Azure#18627)

* Added vnet realted site properties to common definitions

* removed tab

Co-authored-by: Tanay Bhartia <tanaybhartia@microsoft.com>

* Add Ftp/Remote debug properties to Ase network config (Azure#18549)

* Add Ftp/Remote debug properties to Ase network config

* Switched changes to the right file

* Add Networking config to hosting environment creates

* Added some of the missing examples

* Remove disallowed properties from example Ase GET response

* Adjusted responses from other gets

* Added a bunch more examples

* Added other missing examples for Ase.

* Added more missing examples for Ase.

* fixed formatting

* Edit some examples, add back privatelink apis and try to supress the errors for missing examples.

* Fix suppress spelling and fix prettier

* Added missing privatelink examples since suppressing did not work

* Add Bring your own Backend operations (Azure#18517)

* add bring your own backend operations

* add missing files

* fix json formattin

* validation fixes

* fix

* fix more validation

* fix ids

* fix model validation

* fix descriptions

* fix environmentName description

* change to 202

* revert change to 202

* customhostnamesites optional param for 2022 API version (Azure#18670)

* fix DUPLICATE_PARAMETER

* prettier

* fix  OBJECT_ADDITIONAL_PROPERTIES

* fix random sub in examples

* add optional hostname param to customHostnameSites RT and add examples

* move changes from 2021 api version to 2022

* move examples to 2022

* Revert "add optional hostname param to customHostnameSites RT and add examples"

This reverts commit 7fc318e190de2108222dbb869d9a6219a02cae2f.

* remove examples from 2021

* fix lintDiff

* prettier fix

* model validation fix

* suppress model validation in readme

Co-authored-by: Elle Tojaroon <patojaro@microsoft.com>

* [Microsoft.Web] Add CustomDnsSuffixConfiguration to ASE (Azure#18553)

* [Microsoft.Web] Add CustomDnsSuffixConfiguration to AppServiceEnvironments

* Add examples

* Fix style issues

* Add customdnssuffix to custom-words

* Add CustomDnsSuffixConfiguration to AppServiceEnvironment definition

* Address remaining model validation errors

* Adjusted networking configuration definitions

* Addressed Arm review feedback

Co-authored-by: Jarod Aerts <jarodaerts@microsoft.com>

* Fork/web ant97 2022 03 01 (Azure#19259)

* Added DeploymentStatus API specs and examples

* change status to enum, rm extra dot

* suppress missing examples for now

* rm id from List Deployment Slot examples

* rm location, and rename deploymentId in GetSiteDeploymentStatus examples

* change model as string to true, add 202 operations for DeploymentStatus ops to spec

* rename operationId to deploymentStatusId, undo deploymentId rename

* add long running op, as per linter

Co-authored-by: Shubham Dhond <shdhond@microsoft.com>
Co-authored-by: Weidong Xu <weidxu@microsoft.com>

* PublicNetworkAccess Swagger Change (Azure#19352)

* add publicNetworkAccess property in site for swagger

* add suppression to fix Model Validation CI

* Add allowed values in the description

* Add specs for Hosting Environment Maintenance Control (Azure#18691)

* Add documentation for Hosting Environment Maintenance Control

* Update example file name

* Make UpgradePreference non-nullable

* Correct indentation to 2 spaces

* Fix upgradePreference indentation

* Address swagger feedback. Add enums with descriptions.

* Move testNotification to request body. Update description text

* Fix testNotification

* Fix example

* Replace TestNotification parameter with TestUpgradeNotification API

* Rename to TestUpgradeAvailableNotification

* Added logic apps operations (Azure#18604)

* Added Initial Operations and some definitions

* Adding additional objects to support Logic Apps operations

* Updated path and parameters to match testing

* Prettier Fixes

* oav validat-example fixes

* Github validation fixes

* Prettier

* Updated examples and paths

* Prettier

* Revert "Prettier"

This reverts commit da090adf8005e0bd6fdc2ddebbd4390e5c4b6b20.

* Prettier

* Fixed model validation errors

* Filled in nextLinkName values

* Fixing swagger lintdiff errors

* added x-ms-long-running to async calls

* Adds numberOfWorkers to app service plan (Azure#19475)

* Adds numberOfWorkers to app service plan

* Add suppression for missing ASP examples

* Updating to fix workflow errors (Azure#19490)

* Removed conflicting resource definition and added reference to CommonDefinitions.json (Azure#19507)

* Removed conflicting resource definition and added reference to CommonDefinitions.json

* Updated resource to have workflow version

* Updated nextLink object to be correctly tagged (Azure#19560)

* Updated nextLink object to be correctly tagged

* Adding value placeholder

* Updated SKU to remove conflict

* Updated x-ms-enum

* Added missing model

* Adding more missing models

* Add suppressions for missing examples (Azure#19563)

Co-authored-by: Joseph Lin <54335291+joslinmicrosoft@users.noreply.github.com>
Co-authored-by: Tanay Bhartia <tanaybhartia@gmail.com>
Co-authored-by: Tanay Bhartia <tanaybhartia@microsoft.com>
Co-authored-by: JarodAertsMs <90280240+JarodAertsMs@users.noreply.github.com>
Co-authored-by: annikel <92825476+annikel@users.noreply.github.com>
Co-authored-by: Paviya (Elle) Tojaroon <pt335@cornell.edu>
Co-authored-by: Elle Tojaroon <patojaro@microsoft.com>
Co-authored-by: Chris Chen <chrc@microsoft.com>
Co-authored-by: Jarod Aerts <jarodaerts@microsoft.com>
Co-authored-by: edwin-msft <71858592+edwin-msft@users.noreply.github.com>
Co-authored-by: Shubham Dhond <shdhond@microsoft.com>
Co-authored-by: Weidong Xu <weidxu@microsoft.com>
Co-authored-by: jiansong-msft <77516279+jiansong-msft@users.noreply.github.com>
Co-authored-by: Derek Johnson <47129225+dejo-msft@users.noreply.github.com>
Co-authored-by: Alex Karcher <alkarche@microsoft.com>
@github-actions github-actions bot locked and limited conversation to collaborators Apr 12, 2023
This issue was closed.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
customer-reported Issues that are reported by GitHub users external to the Azure organization. Event Hubs Messaging Messaging crew needs-author-feedback Workflow: More information is needed from author to address the issue. needs-team-attention Workflow: This issue needs attention from Azure service team or SDK team no-recent-activity There has been no recent activity on this issue. question The issue doesn't require a change to the product in order to be resolved. Most issues start as that Service Attention Workflow: This issue is responsible by Azure service team. Service This issue points to a problem in the service.
Projects
None yet
Development

No branches or pull requests

7 participants