Skip to content

Commit a67d77e

Browse files
Add Diagnostics sections (#796)
* Outbox Diagnostics * Saga diagnostics * SynchronizedStorage diagnostics --------- Co-authored-by: Daniel Marbach <danielmarbach@users.noreply.github.com>
1 parent 01a917c commit a67d77e

File tree

5 files changed

+58
-12
lines changed

5 files changed

+58
-12
lines changed

src/NServiceBus.Storage.MongoDB/Outbox/OutboxInstaller.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ public async Task Install(string identity, CancellationToken cancellationToken =
2525
var databaseSettings = settings.Get<MongoDatabaseSettings>();
2626
var collectionSettings = settings.Get<MongoCollectionSettings>();
2727
var collectionNamingConvention = settings.Get<Func<Type, string>>(SettingsKeys.CollectionNamingConvention);
28-
29-
if (!settings.TryGet(SettingsKeys.TimeToKeepOutboxDeduplicationData, out TimeSpan timeToKeepOutboxDeduplicationData))
30-
{
31-
timeToKeepOutboxDeduplicationData = DefaultTimeToKeepOutboxDeduplicationData;
32-
}
28+
var timeToKeepOutboxDeduplicationData = settings.GetTimeToKeepOutboxDeduplicationData();
3329

3430
// We have to resolve the client provider here because at the time of the creation of the installer the provider might not be registered yet.
3531
var clientProvider = serviceProvider.GetRequiredService<IMongoClientProvider>();
@@ -84,7 +80,5 @@ await outboxCollection.Indexes.CreateOneAsync(indexModel, cancellationToken: can
8480
.ConfigureAwait(false);
8581
}
8682

87-
static readonly TimeSpan DefaultTimeToKeepOutboxDeduplicationData = TimeSpan.FromDays(7);
88-
8983
internal const string OutboxCleanupIndexName = "OutboxCleanup";
9084
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace NServiceBus.Storage.MongoDB;
2+
3+
using System;
4+
using Settings;
5+
6+
static class OutboxSettingsExtensions
7+
{
8+
public static TimeSpan GetTimeToKeepOutboxDeduplicationData(this IReadOnlySettings settings)
9+
{
10+
if (!settings.TryGet(SettingsKeys.TimeToKeepOutboxDeduplicationData, out TimeSpan timeToKeepOutboxDeduplicationData))
11+
{
12+
timeToKeepOutboxDeduplicationData = DefaultTimeToKeepOutboxDeduplicationData;
13+
}
14+
15+
return timeToKeepOutboxDeduplicationData;
16+
}
17+
18+
static readonly TimeSpan DefaultTimeToKeepOutboxDeduplicationData = TimeSpan.FromDays(7);
19+
}

src/NServiceBus.Storage.MongoDB/Outbox/OutboxStorage.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,20 @@ protected override void Setup(FeatureConfigurationContext context)
3535

3636
context.Services.AddSingleton<IOutboxStorage>(sp => new OutboxPersister(sp.GetRequiredService<IMongoClientProvider>().Client, databaseName, databaseSettings, collectionNamingConvention, collectionSettings));
3737

38-
RegisterOutboxClassMappings();
38+
var usesDefaultClassMap = RegisterOutboxClassMappings();
39+
40+
context.Settings.AddStartupDiagnosticsSection("NServiceBus.Storage.MongoDB.Outbox", new
41+
{
42+
UsesDefaultClassMap = usesDefaultClassMap,
43+
TimeToKeepDeduplicationData = context.Settings.GetTimeToKeepOutboxDeduplicationData(),
44+
});
3945
}
4046

41-
internal static void RegisterOutboxClassMappings()
47+
internal static bool RegisterOutboxClassMappings()
4248
{
4349
if (BsonClassMap.IsClassMapRegistered(typeof(StorageTransportOperation)))
4450
{
45-
return;
51+
return false;
4652
}
4753

4854
BsonClassMap.RegisterClassMap<StorageTransportOperation>(cm =>
@@ -57,5 +63,7 @@ internal static void RegisterOutboxClassMappings()
5763
new DictionaryInterfaceImplementerSerializer<Dictionary<string, string>>(
5864
DictionaryRepresentation.ArrayOfDocuments));
5965
});
66+
67+
return true;
6068
}
6169
}

src/NServiceBus.Storage.MongoDB/Sagas/SagaStorage.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace NServiceBus.Storage.MongoDB;
22

3+
using System.Collections.Generic;
34
using Features;
45
using global::MongoDB.Bson.Serialization;
56
using Microsoft.Extensions.DependencyInjection;
@@ -26,26 +27,45 @@ protected override void Setup(FeatureConfigurationContext context)
2627
context.Services.AddSingleton<ISagaPersister>(new SagaPersister(versionElementName, memberMapCache));
2728

2829
var sagaMetadataCollection = context.Settings.Get<SagaMetadataCollection>();
29-
RegisterSagaEntityClassMappings(sagaMetadataCollection, memberMapCache);
30+
var classMappings = RegisterSagaEntityClassMappings(sagaMetadataCollection, memberMapCache);
31+
32+
context.Settings.AddStartupDiagnosticsSection("NServiceBus.Storage.MongoDB.Sagas", new
33+
{
34+
VersionElement = versionElementName,
35+
ClassMappings = classMappings
36+
});
3037
}
3138

32-
internal static void RegisterSagaEntityClassMappings(SagaMetadataCollection sagaMetadataCollection, MemberMapCache memberMapCache)
39+
internal readonly struct MappingMetadata(string sagaEntity, bool usesDefaultClassMap)
3340
{
41+
public string SagaEntity { get; } = sagaEntity;
42+
public bool UsesDefaultClassMap { get; } = usesDefaultClassMap;
43+
}
44+
45+
internal static IReadOnlyCollection<MappingMetadata> RegisterSagaEntityClassMappings(SagaMetadataCollection sagaMetadataCollection, MemberMapCache memberMapCache)
46+
{
47+
var sagaEntityToClassMapDiagnostics = new List<MappingMetadata>();
3448
foreach (var sagaMetadata in sagaMetadataCollection)
3549
{
50+
var usesDefaultClassMap = false;
3651
if (!BsonClassMap.IsClassMapRegistered(sagaMetadata.SagaEntityType))
3752
{
3853
var classMap = new BsonClassMap(sagaMetadata.SagaEntityType);
3954
classMap.AutoMap();
4055
classMap.SetIgnoreExtraElements(true);
4156

4257
BsonClassMap.RegisterClassMap(classMap);
58+
59+
usesDefaultClassMap = true;
4360
}
4461

62+
sagaEntityToClassMapDiagnostics.Add(new(sagaMetadata.SagaEntityType.FullName!, usesDefaultClassMap));
63+
4564
if (sagaMetadata.TryGetCorrelationProperty(out var property) && property.Name != "Id")
4665
{
4766
_ = memberMapCache.GetOrAdd(sagaMetadata.SagaEntityType, property);
4867
}
4968
}
69+
return sagaEntityToClassMapDiagnostics;
5070
}
5171
}

src/NServiceBus.Storage.MongoDB/SynchronizedStorage/SynchronizedStorage.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ protected override void Setup(FeatureConfigurationContext context)
3030
useTransactions = true;
3131
}
3232

33+
context.Settings.AddStartupDiagnosticsSection("NServiceBus.Storage.MongoDB.StorageSession", new
34+
{
35+
UseTransaction = useTransactions
36+
});
37+
3338
context.RegisterStartupTask(sp => new VerifyClusterDetails(sp.GetRequiredService<IMongoClientProvider>(), databaseName, useTransactions));
3439

3540
context.Services.AddScoped<ICompletableSynchronizedStorageSession, SynchronizedStorageSession>();

0 commit comments

Comments
 (0)