From f4f5912960a429a939e34e3bd32b1b15b3dabcd4 Mon Sep 17 00:00:00 2001 From: Poornima Nayar Date: Thu, 8 Oct 2026 19:37:18 +0100 Subject: [PATCH 1/5] Add receive properties as pseudo-headers --- src/Directory.Packages.props | 2 +- src/ServiceControl.Audit/Auditing/AuditPersister.cs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 1a712572da..099ff4c023 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -54,7 +54,7 @@ - + diff --git a/src/ServiceControl.Audit/Auditing/AuditPersister.cs b/src/ServiceControl.Audit/Auditing/AuditPersister.cs index f6089e2f28..6392c1444e 100644 --- a/src/ServiceControl.Audit/Auditing/AuditPersister.cs +++ b/src/ServiceControl.Audit/Auditing/AuditPersister.cs @@ -144,6 +144,11 @@ async Task ProcessAuditMessage(MessageContext context, IMessageDispatcher dispat ["MessageIntent"] = context.Headers.MessageIntent() }; + foreach (var property in context.ReceiveProperties) + { + context.Headers.TryAdd($"ServiceControl.ReceiveProperties.{property.Key}", property.Value); + } + var commandsToEmit = new List(); var messagesToEmit = new List(); var enricherContext = new AuditEnricherContext(context.Headers, commandsToEmit, messagesToEmit, metadata); From 90041d23152a8959cba2fdde26c62636eaccd8c6 Mon Sep 17 00:00:00 2001 From: Poornima Nayar Date: Fri, 9 Oct 2026 15:20:07 +0100 Subject: [PATCH 2/5] Test --- ...ol.Audit.AcceptanceTests.PostgreSql.csproj | 4 + ...ssage_processed_with_receive_properties.cs | 100 ++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs diff --git a/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj b/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj index 4836ca191d..2b93676ed3 100644 --- a/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj +++ b/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj @@ -36,6 +36,10 @@ + + Shared\ + Shared\Auditing\When_a_message_sent_with_receiveproperties.cs + diff --git a/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs b/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs new file mode 100644 index 0000000000..824ced0961 --- /dev/null +++ b/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs @@ -0,0 +1,100 @@ +namespace ServiceControl.Audit.AcceptanceTests.Auditing +{ + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using AcceptanceTesting; + using AcceptanceTesting.EndpointTemplates; + using Audit.Auditing.MessagesView; + using NServiceBus; + using NServiceBus.AcceptanceTesting; + using NServiceBus.AcceptanceTesting.Customization; + using NServiceBus.Transport; + using NUnit.Framework; + + class When_a_message_processed_with_receive_properties : AcceptanceTest + { + [Test] + public async Task Should_save_audit_message_with_receive_properties() + { + const string Payload = "PAYLOAD"; + MessagesView auditedMessage = null; + byte[] body = null; + + var context = await Define() + .WithEndpoint(b => b.When((bus, c) => bus.Send(new MyMessage { Payload = Payload }))) + .WithEndpoint() + .Done(async c => + { + if (c.MessageId == null) + { + return false; + } + + var result = await this.TryGetSingle("/api/messages?include_system_messages=false&sort=id", m => m.MessageId == c.MessageId); + auditedMessage = result; + if (!result) + { + return false; + } + + body = await this.DownloadData($"/api{auditedMessage.BodyUrl}"); + + return true; + }) + .Run(); + + var hasReceivedProperties = auditedMessage.Headers.Any(x => x.Key.Equals("ServiceControl.ReceiveProperties.LearningTransport.ReceiveProperties.")); + + var receivedProperties = new KeyValuePair(); + if (hasReceivedProperties) + { + receivedProperties = auditedMessage.Headers.First(x => x.Key.Equals("ServiceControl.ReceiveProperties.LearningTransport.ReceiveProperties.")); + } + + using (Assert.EnterMultipleScope()) + { + Assert.That(hasReceivedProperties, Is.True, "The audit message should have receive properties"); + Assert.That(receivedProperties.Value, Is.EqualTo(context.ReceivedMessageFileCreatedAt), "The audit message should have receive properties"); + } + } + + public class Sender : EndpointConfigurationBuilder + { + public Sender() => + EndpointSetup(c => + { + var routing = c.ConfigureRouting(); + routing.RouteToEndpoint(typeof(MyMessage), typeof(Receiver)); + }); + } + + public class Receiver : EndpointConfigurationBuilder + { + public Receiver() => EndpointSetup(); + + [Handler] + public class MyMessageHandler(MyContext testContext) : IHandleMessages + { + public Task Handle(MyMessage message, IMessageHandlerContext context) + { + testContext.ReceivedMessageFileCreatedAt = context.Extensions.Get().ReceiveProperties["LearningTransport.FileCreatedAt"]; + testContext.MessageId = context.MessageId; + return Task.Delay(500, context.CancellationToken); + } + } + } + + public class MyMessage : ICommand + { + public string Payload { get; set; } + } + + public class MyContext : ScenarioContext + { + public string MessageId { get; set; } + + public string ReceivedMessageFileCreatedAt { get; set; } + } + } +} \ No newline at end of file From 807f4ef5394d39d4bed526377d62684538d982bb Mon Sep 17 00:00:00 2001 From: Poornima Nayar Date: Fri, 9 Oct 2026 19:45:44 +0100 Subject: [PATCH 3/5] Apply suggestion from @poornimanayar --- .../When_a_message_processed_with_receive_properties.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs b/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs index 824ced0961..56765952af 100644 --- a/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs +++ b/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs @@ -44,7 +44,7 @@ public async Task Should_save_audit_message_with_receive_properties() }) .Run(); - var hasReceivedProperties = auditedMessage.Headers.Any(x => x.Key.Equals("ServiceControl.ReceiveProperties.LearningTransport.ReceiveProperties.")); + var hasReceivedProperties = auditedMessage.Headers.Any(x => x.Key.Equals("ServiceControl.ReceiveProperties.LearningTransport.FileCreatedAt")); var receivedProperties = new KeyValuePair(); if (hasReceivedProperties) From 8293e9e00b8f1a965f667b284f54ce8f47b70997 Mon Sep 17 00:00:00 2001 From: Poornima Nayar Date: Fri, 9 Oct 2026 19:52:15 +0100 Subject: [PATCH 4/5] Apply suggestion from @poornimanayar --- .../ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj b/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj index 2b93676ed3..4836ca191d 100644 --- a/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj +++ b/src/ServiceControl.Audit.AcceptanceTests.PostgreSql/ServiceControl.Audit.AcceptanceTests.PostgreSql.csproj @@ -36,10 +36,6 @@ - - Shared\ - Shared\Auditing\When_a_message_sent_with_receiveproperties.cs - From 3a72ceb8a0a47164afc06a4ab23eb7328e841cd5 Mon Sep 17 00:00:00 2001 From: Poornima Nayar Date: Fri, 9 Oct 2026 20:27:16 +0100 Subject: [PATCH 5/5] Apply suggestion from @poornimanayar --- .../When_a_message_processed_with_receive_properties.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs b/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs index 56765952af..b6e807fd51 100644 --- a/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs +++ b/src/ServiceControl.Audit.AcceptanceTests/Auditing/When_a_message_processed_with_receive_properties.cs @@ -49,7 +49,7 @@ public async Task Should_save_audit_message_with_receive_properties() var receivedProperties = new KeyValuePair(); if (hasReceivedProperties) { - receivedProperties = auditedMessage.Headers.First(x => x.Key.Equals("ServiceControl.ReceiveProperties.LearningTransport.ReceiveProperties.")); + receivedProperties = auditedMessage.Headers.First(x => x.Key.Equals("ServiceControl.ReceiveProperties.LearningTransport.FileCreatedAt")); } using (Assert.EnterMultipleScope())