diff --git a/src/SIL.XForge/EventMetrics/EventMetricLogger.cs b/src/SIL.XForge/EventMetrics/EventMetricLogger.cs index 3b8601de718..40fc20b50a4 100644 --- a/src/SIL.XForge/EventMetrics/EventMetricLogger.cs +++ b/src/SIL.XForge/EventMetrics/EventMetricLogger.cs @@ -35,7 +35,11 @@ namespace SIL.XForge.EventMetrics; /// See https://autofac.readthedocs.io/en/latest/advanced/interceptors.html for information on interceptors. /// /// -public class EventMetricLogger(IEventMetricService eventMetricService, ILogger logger) : IInterceptor +public class EventMetricLogger( + IEventMetricService eventMetricService, + IExceptionHandler exceptionHandler, + ILogger logger +) : IInterceptor { /// /// A task was started by the Interceptor. @@ -201,6 +205,7 @@ await eventMetricService.SaveEventMetricAsync( { // Just log any errors rather than throwing logger.LogError(e, "Error logging event metric for {methodName}", methodName); + exceptionHandler.ReportException(e); } finally { diff --git a/src/SIL.XForge/Services/EventMetricService.cs b/src/SIL.XForge/Services/EventMetricService.cs index ee25f4ab207..608beab8066 100644 --- a/src/SIL.XForge/Services/EventMetricService.cs +++ b/src/SIL.XForge/Services/EventMetricService.cs @@ -130,7 +130,7 @@ public async Task SaveEventMetricAsync( } // Generate the event metric - EventMetric eventMetric = new() + EventMetric eventMetric = new EventMetric { Id = ObjectId.GenerateNewId().ToString(), EventType = eventType, @@ -171,6 +171,7 @@ private static BsonValue GetBsonValue(object? objectValue) => decimal value => new BsonDecimal128(value), DateTime value => new BsonDateTime(value), Uri value => new BsonString(value.ToString()), + Enum value => new BsonString(value.ToString()), null => BsonNull.Value, _ => BsonDocument.Parse(JsonConvert.SerializeObject(objectValue)), }; diff --git a/test/SIL.XForge.Tests/Models/TestComplexObject.cs b/test/SIL.XForge.Tests/Models/TestComplexObject.cs index aeb3fed249f..1ce5f02fca9 100644 --- a/test/SIL.XForge.Tests/Models/TestComplexObject.cs +++ b/test/SIL.XForge.Tests/Models/TestComplexObject.cs @@ -12,5 +12,11 @@ public class TestComplexObject : TestSimpleObject public required int Integer { get; init; } public required long LongInteger { get; init; } public required float SingleFloat { get; init; } + public required TestEnum Enum { get; init; } // ReSharper restore UnusedAutoPropertyAccessor.Global } + +public enum TestEnum +{ + TestValue, +} diff --git a/test/SIL.XForge.Tests/Services/EventMetricLoggerTests.cs b/test/SIL.XForge.Tests/Services/EventMetricLoggerTests.cs index 453a16abec8..19c35c4b5ab 100644 --- a/test/SIL.XForge.Tests/Services/EventMetricLoggerTests.cs +++ b/test/SIL.XForge.Tests/Services/EventMetricLoggerTests.cs @@ -12,6 +12,7 @@ using NUnit.Framework; using SIL.XForge.EventMetrics; using SIL.XForge.Models; +using SIL.XForge.Realtime; using SIL.XForge.Utils; namespace SIL.XForge.Services; @@ -259,6 +260,7 @@ public async Task ObjectAsArgument_Success() DateAndTime = DateTime.UtcNow, DecimalNumber = 12.34M, DoubleFloat = 56.78, + Enum = TestEnum.TestValue, Integer = 1234, LongInteger = 5678L, ProjectId = Project01, @@ -618,6 +620,7 @@ public TestEnvironment(bool useTaskCompletionSource = true) var services = new ServiceCollection(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); var containerBuilder = new ContainerBuilder(); containerBuilder.Populate(services); containerBuilder.RegisterEventMetrics(); diff --git a/test/SIL.XForge.Tests/Services/EventMetricServiceTests.cs b/test/SIL.XForge.Tests/Services/EventMetricServiceTests.cs index 30a491decdb..ccc453b15b4 100644 --- a/test/SIL.XForge.Tests/Services/EventMetricServiceTests.cs +++ b/test/SIL.XForge.Tests/Services/EventMetricServiceTests.cs @@ -249,6 +249,7 @@ public async Task SaveEventMetricAsync_ComplexObjectAndThrowsException() DateAndTime = DateTime.UtcNow, DecimalNumber = 12.34M, DoubleFloat = 56.78, + Enum = TestEnum.TestValue, Integer = 1234, LongInteger = 5678L, ProjectId = Project01, @@ -307,6 +308,7 @@ public async Task SaveEventMetricAsync_ComplexArguments() const float singleFloat = 90.12F; string[] stringArray = ["string1", "string2"]; Uri uri = new Uri("https://example.com", UriKind.Absolute); + const TestEnum enumValue = TestEnum.TestValue; Dictionary argumentsWithNames = new Dictionary { { "projectId", Project01 }, @@ -320,6 +322,7 @@ public async Task SaveEventMetricAsync_ComplexArguments() { "singleFloat", singleFloat }, { "stringArray", stringArray }, { "uri", uri }, + { "enum", enumValue }, { "nullValue", null }, }; Dictionary expectedPayload = new Dictionary @@ -335,6 +338,7 @@ public async Task SaveEventMetricAsync_ComplexArguments() { "singleFloat", BsonDouble.Create(singleFloat) }, { "stringArray", BsonArray.Create(stringArray) }, { "uri", BsonValue.Create(uri.ToString()) }, + { "enum", BsonValue.Create(enumValue.ToString()) }, { "nullValue", BsonNull.Value }, }; const bool result = true;