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

[Messaging Extensions] Release Prep (Feb 2023) #34477

Merged
merged 3 commits into from
Feb 23, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
# Release History

## 5.2.0-beta.1 (Unreleased)
## 5.2.0 (2023-02-23)

### Features Added

- Added the an overload for `IAsyncCollector<EventData>` allowing a partition key to be specified. Because `IAsyncCollector<T>` is owned by the Functions runtime, this method could not be directly added. Instead, this has been implemented as an extension method within the Event Hubs extension package. Unfortunately, this knowingly makes the overload unable to be mocked.

### Breaking Changes
- Target-based scaling support has been added, allowing instances for Event Hubs-triggered Functions to more accurately calculate their scale needs, adjust more quickly as the number of events waiting to be processed changes. This will also reduce duplicate event processing as the instance count changes.
jsquire marked this conversation as resolved.
Show resolved Hide resolved

- A new setting, `UnprocessedEventThreshold` has been added to help tune target-based scaling. More details can be found in the [host.json documentation](https://learn.microsoft.com/azure/azure-functions/functions-bindings-event-hubs?tabs=in-process%2Cextensionv5&pivots=programming-language-csharp#hostjson-settings).

### Bugs Fixed

- Fixed a bug with creation of the event processor used by the trigger, where configuring an `eventHubName` that does not match the one that appears as `EntityPath` in the connection string would throw. The behavior now follows that of other clients and gives precedence to the entity path in the connection string.

### Other Changes

## 5.1.2 (2022-08-10)

### Bugs Fixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<Description>Microsoft Azure WebJobs SDK EventHubs Extension</Description>
<Version>5.2.0-beta.1</Version>
<Version>5.2.0</Version>
<!--The ApiCompatVersion is managed automatically and should not generally be modified manually.-->
<ApiCompatVersion>5.1.2</ApiCompatVersion>
<NoWarn>$(NoWarn);AZC0001;CS1591;SA1636</NoWarn>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
# Release History

## 5.9.0-beta.1 (Unreleased)
## 5.9.0 (2023-02-23)

### Features Added

### Breaking Changes

### Bugs Fixed

### Other Changes
- Target-based scaling support has been added, allowing instances for Service Bus-triggered Functions to more accurately calculate their scale needs and adjust more quickly as the number of messages waiting to be processed changes.

## 5.8.1 (2022-11-09)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,11 @@ public void Initialize(ExtensionConfigContext context)

internal static ParameterBindingData ConvertReceivedMessageToBindingData(ServiceBusReceivedMessage message)
{
ReadOnlyMemory<byte> messageBytes = message.GetRawAmqpMessage().ToBytes().ToMemory();
// TEMP (target scale release):
jsquire marked this conversation as resolved.
Show resolved Hide resolved
//ReadOnlyMemory<byte> messageBytes = message.GetRawAmqpMessage().ToBytes().ToMemory();
ReadOnlyMemory<byte> messageBytes = Array.Empty<byte>();
// END TEMP

byte[] lockTokenBytes = Guid.Parse(message.LockToken).ToByteArray();

// The lock token is a 16 byte GUID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<Description>Microsoft Azure WebJobs SDK ServiceBus Extension</Description>
<Version>5.9.0-beta.1</Version>
<Version>5.9.0</Version>
<!--The ApiCompatVersion is managed automatically and should not generally be modified manually.-->
<ApiCompatVersion>5.8.1</ApiCompatVersion>
<NoWarn>$(NoWarn);AZC0001;CS1591;SA1636</NoWarn>
Expand Down Expand Up @@ -35,8 +35,10 @@
<Compile Include="$(AzureCoreSharedSources)AppContextSwitchHelper.cs" LinkBase="Shared" />
</ItemGroup>

<!--
<ItemGroup>
<ProjectReference Include="..\..\Azure.Messaging.ServiceBus\src\Azure.Messaging.ServiceBus.csproj" />
</ItemGroup>
-->

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -36,55 +36,57 @@ public void RunSerializerTests(string testCaseName)
Assert.AreEqual(book, returned);
}

[Test]
public void ParameterBindingDataTest()
{
var lockToken = Guid.NewGuid();
var message = ServiceBusModelFactory.ServiceBusReceivedMessage(
body: BinaryData.FromString("body"),
messageId: "messageId",
correlationId: "correlationId",
sessionId: "sessionId",
replyTo: "replyTo",
replyToSessionId: "replyToSessionId",
contentType: "contentType",
subject: "label",
to: "to",
partitionKey: "partitionKey",
viaPartitionKey: "viaPartitionKey",
deadLetterSource: "deadLetterSource",
enqueuedSequenceNumber: 1,
lockTokenGuid: lockToken);

var bindingData = ServiceBusExtensionConfigProvider.ConvertReceivedMessageToBindingData(message);
Assert.AreEqual("application/octet-stream", bindingData.ContentType);
Assert.AreEqual("1.0", bindingData.Version);
Assert.AreEqual("AzureServiceBusReceivedMessage", bindingData.Source);

var bytes = bindingData.Content.ToMemory();
var lockTokenBytes = bytes.Slice(0, 16).ToArray();
Assert.AreEqual(lockToken.ToByteArray(), lockTokenBytes);

var deserialized = ServiceBusReceivedMessage.FromAmqpMessage(
AmqpAnnotatedMessage.FromBytes(
BinaryData.FromBytes(bytes.Slice(16, bytes.Length - 16))),
BinaryData.FromBytes(lockTokenBytes));

Assert.AreEqual(message.Body.ToArray(), deserialized.Body.ToArray());
Assert.AreEqual(message.MessageId, deserialized.MessageId);
Assert.AreEqual(message.CorrelationId, deserialized.CorrelationId);
Assert.AreEqual(message.SessionId, deserialized.SessionId);
Assert.AreEqual(message.ReplyTo, deserialized.ReplyTo);
Assert.AreEqual(message.ReplyToSessionId, deserialized.ReplyToSessionId);
Assert.AreEqual(message.ContentType, deserialized.ContentType);
Assert.AreEqual(message.Subject, deserialized.Subject);
Assert.AreEqual(message.To, deserialized.To);
Assert.AreEqual(message.PartitionKey, deserialized.PartitionKey);
Assert.AreEqual(message.TransactionPartitionKey, deserialized.TransactionPartitionKey);
Assert.AreEqual(message.DeadLetterSource, deserialized.DeadLetterSource);
Assert.AreEqual(message.EnqueuedSequenceNumber, deserialized.EnqueuedSequenceNumber);
Assert.AreEqual(message.LockToken, deserialized.LockToken);
}
// TEMP (target scale release):
//[Test]
//public void ParameterBindingDataTest()
//{
// var lockToken = Guid.NewGuid();
// var message = ServiceBusModelFactory.ServiceBusReceivedMessage(
// body: BinaryData.FromString("body"),
// messageId: "messageId",
// correlationId: "correlationId",
// sessionId: "sessionId",
// replyTo: "replyTo",
// replyToSessionId: "replyToSessionId",
// contentType: "contentType",
// subject: "label",
// to: "to",
// partitionKey: "partitionKey",
// viaPartitionKey: "viaPartitionKey",
// deadLetterSource: "deadLetterSource",
// enqueuedSequenceNumber: 1,
// lockTokenGuid: lockToken);

// var bindingData = ServiceBusExtensionConfigProvider.ConvertReceivedMessageToBindingData(message);
// Assert.AreEqual("application/octet-stream", bindingData.ContentType);
// Assert.AreEqual("1.0", bindingData.Version);
// Assert.AreEqual("AzureServiceBusReceivedMessage", bindingData.Source);

// var bytes = bindingData.Content.ToMemory();
// var lockTokenBytes = bytes.Slice(0, 16).ToArray();
// Assert.AreEqual(lockToken.ToByteArray(), lockTokenBytes);

// var deserialized = ServiceBusReceivedMessage.FromAmqpMessage(
// AmqpAnnotatedMessage.FromBytes(
// BinaryData.FromBytes(bytes.Slice(16, bytes.Length - 16))),
// BinaryData.FromBytes(lockTokenBytes));

// Assert.AreEqual(message.Body.ToArray(), deserialized.Body.ToArray());
// Assert.AreEqual(message.MessageId, deserialized.MessageId);
// Assert.AreEqual(message.CorrelationId, deserialized.CorrelationId);
// Assert.AreEqual(message.SessionId, deserialized.SessionId);
// Assert.AreEqual(message.ReplyTo, deserialized.ReplyTo);
// Assert.AreEqual(message.ReplyToSessionId, deserialized.ReplyToSessionId);
// Assert.AreEqual(message.ContentType, deserialized.ContentType);
// Assert.AreEqual(message.Subject, deserialized.Subject);
// Assert.AreEqual(message.To, deserialized.To);
// Assert.AreEqual(message.PartitionKey, deserialized.PartitionKey);
// Assert.AreEqual(message.TransactionPartitionKey, deserialized.TransactionPartitionKey);
// Assert.AreEqual(message.DeadLetterSource, deserialized.DeadLetterSource);
// Assert.AreEqual(message.EnqueuedSequenceNumber, deserialized.EnqueuedSequenceNumber);
// Assert.AreEqual(message.LockToken, deserialized.LockToken);
//}
// END TEMP

private ServiceBusMessage GetBrokeredMessage(XmlObjectSerializer serializer, TestBook book)
{
Expand Down