Skip to content

Commit d388844

Browse files
jeastham1993claude
andcommitted
fix: address scottgerring PR review feedback
- Fix wrong SubscribeOperation type in ServiceBusStickerPrintedWorker (was StickerClaimedEventV1, now StickerPrintedEventV1) - Align envelope handling in ServiceBusStickerPrintedWorker to match ServiceBusStickerClaimedWorker (check ContentType, handle both CloudEvents and plain JSON) - Register printJobs.completed.v1 Service Bus queue in Aspire setup so ServiceBusStickerPrintedWorker doesn't fail on Azure startup - Fix activity tag in StickerPrintedHandler: stickerClaim.failed -> stickerPrint.failed - Add unit tests for StickerPrintedHandler covering null event, empty userId, user not found, and successful update paths - Inject DatadogTransactionTracker into EventBridgeEventPublisher and call TrackTransactionAsync after publishing PrintJobQueuedEvent, matching the Kafka publisher behaviour - Fix DLQ producer in KafkaStickerPrintedWorker: create once in StartAsync and reuse, rather than creating a new instance per call - Remove duplicate StopAsync override in StickerPrintedWorker and StickerClaimedWorker that was calling messagingWorker.StopAsync twice (already called in ExecuteAsync finally block) - Fix log level mismatches in LogMessages.cs: ReceivedMessage Critical->Information, GenericWarning Error->Warning - Fix duplicate EventId 5 in LogMessages.cs: StoppingMessageProcessor reassigned to EventId 13 - Fix copy-pasta comment in integration test: "claimed sticker count" -> "printed sticker count" - Rename KafakStickerClaimedWorker -> KafkaStickerClaimedWorker (filename and class name typo) Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
1 parent ce1040c commit d388844

13 files changed

Lines changed: 141 additions & 40 deletions

File tree

print-service/src/Stickerlandia.PrintService.AWS/EventBridgeEventPublisher.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ namespace Stickerlandia.PrintService.AWS;
3131
public class EventBridgeEventPublisher(
3232
ILogger<EventBridgeEventPublisher> logger,
3333
IAmazonEventBridge client,
34-
IOptions<AwsConfiguration> awsConfiguration) : IPrintServiceEventPublisher
34+
IOptions<AwsConfiguration> awsConfiguration,
35+
DatadogTransactionTracker transactionTracker) : IPrintServiceEventPublisher
3536
{
3637
[Channel("printJobs.queued.v1")]
3738
[PublishOperation(typeof(PrintJobQueuedEvent))]
@@ -49,6 +50,7 @@ public async Task PublishPrintJobQueuedEvent(PrintJobQueuedEvent printJobQueuedE
4950
};
5051

5152
await PublishCloudEventAsync(cloudEvent);
53+
await transactionTracker.TrackTransactionAsync(printJobQueuedEvent.PrintJobId, "print-job-queued");
5254
}
5355

5456
[Channel("printJobs.failed.v1")]

print-service/src/Stickerlandia.PrintService.Core/Observability/LogMessages.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static partial class Log
1717

1818
[LoggerMessage(
1919
EventId = 0,
20-
Level = LogLevel.Critical,
20+
Level = LogLevel.Information,
2121
Message = "Received message from transport: {MessageTransport}")]
2222
public static partial void ReceivedMessage(
2323
ILogger logger, string messageTransport);
@@ -87,7 +87,7 @@ public static partial void UnknownException(
8787

8888
[LoggerMessage(
8989
EventId = 10,
90-
Level = LogLevel.Error,
90+
Level = LogLevel.Warning,
9191
Message = "{Message}")]
9292
public static partial void GenericWarning(
9393
ILogger logger, string message, Exception? exception);
@@ -106,7 +106,7 @@ public static partial void TransactionTrackingFailed(
106106
ILogger logger, string transactionId, string checkpoint, Exception exception);
107107

108108
[LoggerMessage(
109-
EventId = 5,
109+
EventId = 13,
110110
Level = LogLevel.Trace,
111111
Message = "Stopping message processor for transport: {MessageTransport}")]
112112
public static partial void StoppingMessageProcessor(

user-management/src/Stickerlandia.UserManagement.Agnostic/KafakStickerClaimedWorker.cs renamed to user-management/src/Stickerlandia.UserManagement.Agnostic/KafkaStickerClaimedWorker.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
namespace Stickerlandia.UserManagement.Agnostic;
2121

2222
[AsyncApi]
23-
public class KafakStickerClaimedWorker(
24-
ILogger<KafakStickerClaimedWorker> logger,
23+
public class KafkaStickerClaimedWorker(
24+
ILogger<KafkaStickerClaimedWorker> logger,
2525
IServiceScopeFactory serviceScopeFactory,
2626
ConsumerConfig consumerConfig,
2727
ProducerConfig producerConfig,

user-management/src/Stickerlandia.UserManagement.Agnostic/KafkaStickerPrintedWorker.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class KafkaStickerPrintedWorker(
3333
private const string dlqTopic = "printJobs.completed.v1.dlq";
3434

3535
private IConsumer<string, string>? _consumer;
36+
private IProducer<string, string>? _dlqProducer;
3637

3738
[Channel("printJobs.completed.v1")]
3839
[SubscribeOperation(typeof(StickerPrintedEventV1))]
@@ -67,9 +68,7 @@ private async Task<bool> ProcessMessageAsync(StickerPrintedHandler handler,
6768

6869
private void SendToDLQ(ConsumeResult<string, string> consumeResult, StickerPrintedEventV1 evtData)
6970
{
70-
using var producer = new ProducerBuilder<string, string>(producerConfig).Build();
71-
72-
producer.Produce(dlqTopic,
71+
_dlqProducer!.Produce(dlqTopic,
7372
new Message<string, string> { Key = evtData.UserId, Value = consumeResult.Message.Value },
7473
(deliveryReport) =>
7574
{
@@ -78,8 +77,6 @@ private void SendToDLQ(ConsumeResult<string, string> consumeResult, StickerPrint
7877
else
7978
Log.MessageSentToDlq(logger, "", null);
8079
});
81-
82-
producer.Flush(TimeSpan.FromSeconds(10));
8380
}
8481

8582
public Task StartAsync()
@@ -89,6 +86,8 @@ public Task StartAsync()
8986
_consumer = consumerFactory.Create(consumerConfig);
9087
_consumer.Subscribe(topic);
9188

89+
_dlqProducer = new ProducerBuilder<string, string>(producerConfig).Build();
90+
9291
return Task.CompletedTask;
9392
}
9493

@@ -130,6 +129,11 @@ public Task StopAsync(CancellationToken cancellationToken)
130129
_consumer?.Close();
131130
_consumer?.Dispose();
132131
_consumer = null;
132+
133+
_dlqProducer?.Flush(TimeSpan.FromSeconds(10));
134+
_dlqProducer?.Dispose();
135+
_dlqProducer = null;
136+
133137
return Task.CompletedTask;
134138
}
135139
}

user-management/src/Stickerlandia.UserManagement.Agnostic/ServiceExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public static IServiceCollection AddKafkaMessaging(this IServiceCollection servi
9292

9393
// Register event publisher as singleton
9494
services.AddSingleton<IUserEventPublisher, KafkaEventPublisher>();
95-
services.AddKeyedSingleton<IMessagingWorker, KafakStickerClaimedWorker>("stickerClaimed");
95+
services.AddKeyedSingleton<IMessagingWorker, KafkaStickerClaimedWorker>("stickerClaimed");
9696
services.AddKeyedSingleton<IMessagingWorker, KafkaStickerPrintedWorker>("stickerPrinted");
9797

9898
return services;

user-management/src/Stickerlandia.UserManagement.Aspire/AppBuilderExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,9 @@ public static InfrastructureResources WithAzureNativeServices(this IDistributedA
253253
.AddServiceBusQueue("users-stickerClaimed-v1", "users.stickerClaimed.v1")
254254
.WithServiceBusTestCommands();
255255

256+
serviceBus
257+
.AddServiceBusQueue("printJobs-completed-v1", "printJobs.completed.v1");
258+
256259
var topic = serviceBus
257260
.AddServiceBusTopic("users-userRegistered-v1", "users.userRegistered.v1");
258261
topic.AddServiceBusSubscription("noop");

user-management/src/Stickerlandia.UserManagement.Azure/ServiceBusStickerPrintedWorker.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@
88
// This product includes software developed at Datadog (https://www.datadoghq.com/).
99
// Copyright 2025 Datadog, Inc.
1010

11+
using System.Text.Json;
1112
using Azure.Messaging.ServiceBus;
12-
using CloudNative.CloudEvents;
13-
using CloudNative.CloudEvents.SystemTextJson;
1413
using Datadog.Trace;
1514
using Microsoft.Extensions.DependencyInjection;
1615
using Microsoft.Extensions.Logging;
1716
using Saunter.Attributes;
1817
using Stickerlandia.UserManagement.Core;
19-
using Stickerlandia.UserManagement.Core.StickerClaimedEvent;
2018
using Stickerlandia.UserManagement.Core.StickerPrintedEvent;
2119
using Log = Stickerlandia.UserManagement.Core.Observability.Log;
2220

@@ -46,7 +44,7 @@ public ServiceBusStickerPrintedWorker(ILogger<ServiceBusStickerPrintedWorker> lo
4644
}
4745

4846
[Channel("printJobs.completed.v1")]
49-
[SubscribeOperation(typeof(StickerClaimedEventV1))]
47+
[SubscribeOperation(typeof(StickerPrintedEventV1))]
5048
private async Task ProcessMessageAsync(ProcessMessageEventArgs args)
5149
{
5250
using var processSpan = Tracer.Instance.StartActive($"process printJobs.completed.v1");
@@ -57,11 +55,18 @@ private async Task ProcessMessageAsync(ProcessMessageEventArgs args)
5755
var messageBody = args.Message.Body.ToString();
5856
Log.ReceivedMessage(_logger, "ServiceBus");
5957

60-
var detailBytes = System.Text.Encoding.UTF8.GetBytes(messageBody);
61-
var formatter = new JsonEventFormatter<StickerPrintedEventV1>();
62-
var cloudEvent = await formatter.DecodeStructuredModeMessageAsync(
63-
new MemoryStream(detailBytes), null, new List<CloudEventAttribute>());
64-
var stickerPrinted = (StickerPrintedEventV1?)cloudEvent.Data;
58+
StickerPrintedEventV1? stickerPrinted;
59+
if (string.Equals(args.Message.ContentType, "application/cloudevents+json", StringComparison.OrdinalIgnoreCase))
60+
{
61+
using var document = JsonDocument.Parse(messageBody);
62+
stickerPrinted = document.RootElement.TryGetProperty("data", out var dataElement)
63+
? JsonSerializer.Deserialize<StickerPrintedEventV1>(dataElement.GetRawText())
64+
: null;
65+
}
66+
else
67+
{
68+
stickerPrinted = JsonSerializer.Deserialize<StickerPrintedEventV1>(messageBody);
69+
}
6570

6671
if (stickerPrinted == null) await args.DeadLetterMessageAsync(args.Message, "Message body cannot be deserialized");
6772

user-management/src/Stickerlandia.UserManagement.Core/StickerPrintedEvent/StickerPrintedHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public async Task Handle(StickerPrintedEventV1 eventV1)
3737
}
3838
catch (Exception ex)
3939
{
40-
Activity.Current?.AddTag("stickerClaim.failed", true);
40+
Activity.Current?.AddTag("stickerPrint.failed", true);
4141
Activity.Current?.AddTag("error.message", ex.Message);
4242

4343
throw;

user-management/src/Stickerlandia.UserManagement.Worker/StickerClaimedWorker.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,4 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
6161
await messagingWorker.StopAsync(stoppingToken);
6262
}
6363
}
64-
65-
public override async Task StopAsync(CancellationToken cancellationToken)
66-
{
67-
await messagingWorker.StopAsync(cancellationToken);
68-
await base.StopAsync(cancellationToken);
69-
}
7064
}

user-management/src/Stickerlandia.UserManagement.Worker/StickerPrintedWorker.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,4 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
6161
await messagingWorker.StopAsync(stoppingToken);
6262
}
6363
}
64-
65-
public override async Task StopAsync(CancellationToken cancellationToken)
66-
{
67-
await messagingWorker.StopAsync(cancellationToken);
68-
await base.StopAsync(cancellationToken);
69-
}
7064
}

0 commit comments

Comments
 (0)