From b31b54ed9d0c3333f2a2eefb9a944dbfc7a371f6 Mon Sep 17 00:00:00 2001 From: Koen Metsu Date: Fri, 24 Jan 2025 15:26:51 +0100 Subject: [PATCH] feat: or-2583 Add more telemetry --- .../Function.cs | 23 ++++---- .../OpenTelemetrySetup.cs | 58 ++++++++++++------- 2 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/AssociationRegistry.KboMutations.SyncLambda/Function.cs b/src/AssociationRegistry.KboMutations.SyncLambda/Function.cs index 97648de5e..a061638c1 100644 --- a/src/AssociationRegistry.KboMutations.SyncLambda/Function.cs +++ b/src/AssociationRegistry.KboMutations.SyncLambda/Function.cs @@ -20,16 +20,11 @@ using Npgsql; using Weasel.Core; using PostgreSqlOptionsSection = AssociationRegistry.KboMutations.SyncLambda.Logging.PostgreSqlOptionsSection; -using SsmClientWrapper = AssociationRegistry.KboMutations.SsmClientWrapper; namespace AssociationRegistry.KboMutations.SyncLambda; -using global::OpenTelemetry.Metrics; -using global::OpenTelemetry.Trace; using KboMutations.Configuration; using Notifications; -using OpenTelemetry.Metrics; -using OpenTelemetry.Trace; using System.Diagnostics.Metrics; public class Function @@ -76,13 +71,6 @@ private static async Task FunctionHandler(SQSEvent @event, ILambdaContext contex var eventConflictResolver = new EventConflictResolver(Array.Empty(), Array.Empty()); - _openTelemetrySetup = new OpenTelemetrySetup(); - - var meter = new Meter(OpenTelemetrySetup.MeterName); - - var counter = meter.CreateCounter("kbosync_started"); - counter.Add(1); - var loggerFactory = LoggerFactory.Create(builder => { builder.AddProvider(new LambdaLoggerProvider(context.Logger)); @@ -90,6 +78,13 @@ private static async Task FunctionHandler(SQSEvent @event, ILambdaContext contex _openTelemetrySetup.SetUpLogging(builder); }); + _openTelemetrySetup = new OpenTelemetrySetup(context.Logger); + + var meter = new Meter(OpenTelemetrySetup.MeterName); + + var counter = meter.CreateCounter("kbosync_started"); + counter.Add(1); + var repository = new VerenigingsRepository(new EventStore.EventStore(store, eventConflictResolver, loggerFactory.CreateLogger())); var geefOndernemingService = new MagdaGeefVerenigingService( @@ -147,6 +142,10 @@ private static async Task SetUpDocumentStore(IConfiguration confi throw new ApplicationException("PostgresSqlOptions is missing some values"); var opts = new StoreOptions(); + + opts.OpenTelemetry.TrackConnections = TrackLevel.Normal; + opts.OpenTelemetry.TrackEventCounters(); + var connectionStringBuilder = new NpgsqlConnectionStringBuilder(); connectionStringBuilder.Host = postgresSection.Host; connectionStringBuilder.Database = postgresSection.Database; diff --git a/src/AssociationRegistry.KboMutations.SyncLambda/OpenTelemetrySetup.cs b/src/AssociationRegistry.KboMutations.SyncLambda/OpenTelemetrySetup.cs index 14779f13e..bfb1e36dc 100644 --- a/src/AssociationRegistry.KboMutations.SyncLambda/OpenTelemetrySetup.cs +++ b/src/AssociationRegistry.KboMutations.SyncLambda/OpenTelemetrySetup.cs @@ -1,6 +1,8 @@ namespace AssociationRegistry.KboMutations.SyncLambda; +using Amazon.Lambda.Core; using Microsoft.Extensions.Logging; +using Npgsql; using OpenTelemetry; using OpenTelemetry.Exporter; using OpenTelemetry.Logs; @@ -12,7 +14,6 @@ namespace AssociationRegistry.KboMutations.SyncLambda; public class OpenTelemetrySetup : IDisposable { private readonly OpenTelemetryResources _resources; - private readonly Object _resource; private const string OtelAuthHeader = "OTEL_AUTH_HEADER"; private const string MetricsUri = "OTLP_METRICS_URI"; private const string TracingUri = "OTLP_TRACING_URI"; @@ -20,11 +21,12 @@ public class OpenTelemetrySetup : IDisposable public TracerProvider TracerProvider { get; } public MeterProvider MeterProvider { get; } - public const string MeterName = "KboMutations.SyncLambda.Metrics"; + public const string MeterName = "kbomutations.sync.lambda.metrics"; - public OpenTelemetrySetup() + public OpenTelemetrySetup(ILambdaLogger contextLogger) { - _resources = GetResources(); + _resources = GetResources(contextLogger); + MeterProvider = SetupMeter(); TracerProvider = SetUpTracing(); } @@ -35,7 +37,8 @@ public MeterProvider SetupMeter() var builder = Sdk.CreateMeterProviderBuilder() .ConfigureResource(_resources.ConfigureResourceBuilder) - .AddMeter(MeterName.ToLowerInvariant()) + .AddMeter(MeterName) + .AddMeter("Marten") .AddConsoleExporter() .AddRuntimeInstrumentation() .AddHttpClientInstrumentation(); @@ -58,8 +61,9 @@ public TracerProvider SetUpTracing() var otlpTracingUri = Environment.GetEnvironmentVariable(TracingUri); var builder = Sdk.CreateTracerProviderBuilder() + .AddHttpClientInstrumentation() + .AddNpgsql() .ConfigureResource(_resources.ConfigureResourceBuilder) - .AddSource("AssociationRegistry") .AddConsoleExporter(); if (!string.IsNullOrEmpty(otlpTracingUri)) @@ -84,30 +88,42 @@ public void SetUpLogging(ILoggingBuilder builder) if (!string.IsNullOrEmpty(otlpLogssUri)) - options.AddOtlpExporter(options => + options.AddOtlpExporter(exporterOptions => { - options.Endpoint = new Uri(otlpLogssUri); + exporterOptions.Endpoint = new Uri(otlpLogssUri); - AddAuth(options); + AddAuth(exporterOptions); }); }); } - public OpenTelemetryResources GetResources() + public OpenTelemetryResources GetResources(ILambdaLogger contextLogger) { - var serviceName = "KboMutations.SyncLambda"; // Explicit service name + var serviceName = "KboMutations.SyncLambda"; var assemblyVersion = Assembly.GetExecutingAssembly()?.GetName()?.Version?.ToString() ?? "unknown"; + var serviceInstanceId = Environment.GetEnvironmentVariable("AWS_LAMBDA_FUNCTION_NAME") ?? Environment.MachineName; + var environment = Environment.GetEnvironmentVariable("ENVIRONMENT")?.ToLowerInvariant() ?? "unknown"; - Action configureResource = r => r - .AddService( - serviceName, - serviceVersion: assemblyVersion, - serviceInstanceId: Environment.GetEnvironmentVariable("AWS_LAMBDA_FUNCTION_NAME") ?? Environment.MachineName) - .AddAttributes( - new Dictionary - { - ["deployment.environment"] = Environment.GetEnvironmentVariable("ENVIRONMENT")?.ToLowerInvariant() ?? "unknown", - }); + Action configureResource = r => + { + r + .AddService( + serviceName, + serviceVersion: assemblyVersion, + serviceInstanceId: serviceInstanceId) + .AddAttributes( + new Dictionary + { + ["deployment.environment"] = environment, + }); + }; + + contextLogger.LogInformation("Resource configuration: " + + "Service name '{ServiceName}', " + + "ServiceVersion '{AssemblyVersion}', " + + "Service Instance Id '{ServiceInstanceId}', " + + "Env '{Env}'", + serviceName, assemblyVersion, serviceInstanceId, environment); return new OpenTelemetryResources(serviceName, configureResource); }