Skip to content

Commit

Permalink
feat: or-2583 Clean up observability
Browse files Browse the repository at this point in the history
  • Loading branch information
koenmetsu committed Jan 24, 2025
1 parent a4a7ef3 commit f1c39da
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 62 deletions.
21 changes: 3 additions & 18 deletions src/AssociationRegistry.KboMutations.SyncLambda/Function.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,16 @@ namespace AssociationRegistry.KboMutations.SyncLambda;

public class Function
{
private const string MetricsUri = "OTLP_METRICS_URI";
private const string TracingUri = "OTLP_TRACING_URI";
private const string OtlpLogsUri = "OTLP_LOGS_URI";

private static TracerProvider _tracerProvider;
private static MeterProvider _meterProvider;
private static OpenTelemetrySetup _openTelemetrySetup;

private static async Task Main()
{
var otlpMetricsUri = Environment.GetEnvironmentVariable(MetricsUri);
var otlpTracingUri = Environment.GetEnvironmentVariable(TracingUri);

if (!string.IsNullOrEmpty(otlpMetricsUri))
_meterProvider = OpenTelemetrySetup.SetupMeter(otlpMetricsUri);

if (!string.IsNullOrEmpty(otlpTracingUri))
_tracerProvider = OpenTelemetrySetup.SetUpTracing(otlpTracingUri);
_openTelemetrySetup = new OpenTelemetrySetup();

var handler = FunctionHandler;
await LambdaBootstrapBuilder.Create(handler, new SourceGeneratorLambdaJsonSerializer<LambdaFunctionJsonSerializerContext>())
.Build()
.RunAsync();

_meterProvider.ForceFlush(2000);
}

private static async Task FunctionHandler(SQSEvent @event, ILambdaContext context)
Expand Down Expand Up @@ -97,9 +83,8 @@ private static async Task FunctionHandler(SQSEvent @event, ILambdaContext contex
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddProvider(new LambdaLoggerProvider(context.Logger));
var otlpLogssUri = Environment.GetEnvironmentVariable(OtlpLogsUri);

OpenTelemetrySetup.SetUpLogging(otlpLogssUri, builder);
_openTelemetrySetup.SetUpLogging(builder);
});

var repository = new VerenigingsRepository(new EventStore.EventStore(store, eventConflictResolver, loggerFactory.CreateLogger<EventStore.EventStore>()));
Expand Down
150 changes: 107 additions & 43 deletions src/AssociationRegistry.KboMutations.SyncLambda/OpenTelemetrySetup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,66 +5,130 @@ namespace AssociationRegistry.KboMutations.SyncLambda;
using OpenTelemetry.Exporter;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using System.Reflection;

public class OpenTelemetrySetup
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";
private const string OtlpLogsUri = "OTLP_LOGS_URI";
public static TracerProvider TracerProvider { get; }
public static MeterProvider MeterProvider { get; }

public const string MeterName = "KboMutations.SyncLambda.Metrics";

public static MeterProvider SetupMeter(string otlpMetricsUri)
public OpenTelemetrySetup()
{
return Sdk.CreateMeterProviderBuilder()
.AddMeter(MeterName)
.AddRuntimeInstrumentation()
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.AddOtlpExporter(options =>
{
options.Endpoint =
new Uri(otlpMetricsUri);

AddAuth(options);
})
.Build();
_resources = GetResources();
}

private static void AddAuth(OtlpExporterOptions options)
public MeterProvider SetupMeter()
{
var authHeader = Environment.GetEnvironmentVariable(OtelAuthHeader);
var otlpMetricsUri = Environment.GetEnvironmentVariable(MetricsUri);

if (!string.IsNullOrEmpty(authHeader))
options.Headers = $"Authorization={authHeader}";
var builder = Sdk.CreateMeterProviderBuilder()
.ConfigureResource(_resources.ConfigureResourceBuilder)
.AddMeter(MeterName)
.AddRuntimeInstrumentation()
.AddHttpClientInstrumentation();

if (!string.IsNullOrEmpty(otlpMetricsUri))
builder
.AddOtlpExporter(options =>
{
options.Endpoint =
new Uri(otlpMetricsUri);

AddAuth(options);
});

return builder.Build();
}

public static TracerProvider SetUpTracing(string otlpTracingUri)
public TracerProvider SetUpTracing()
{
return Sdk.CreateTracerProviderBuilder()
.AddSource("KboMutations.SyncLambda.Tracing")
.AddAWSInstrumentation()// Optional: if Lambda is triggered by HTTP
.AddConsoleExporter() // Replace with a production exporter
.AddOtlpExporter(options =>
{
options.Endpoint =
new Uri(otlpTracingUri);

AddAuth(options);
})
.Build();
var otlpTracingUri = Environment.GetEnvironmentVariable(TracingUri);

var builder = Sdk.CreateTracerProviderBuilder()
.ConfigureResource(_resources.ConfigureResourceBuilder)
.AddSource("AssociationRegistry")
.AddConsoleExporter();

if (!string.IsNullOrEmpty(otlpTracingUri))
builder.AddOtlpExporter(options =>
{
options.Endpoint = new Uri(otlpTracingUri);
AddAuth(options);
});

return builder.Build();
}

public static void SetUpLogging(string? otlpLogssUri, ILoggingBuilder builder)
public void SetUpLogging(ILoggingBuilder builder)
{
if (!string.IsNullOrEmpty(otlpLogssUri))
builder.AddOpenTelemetry(options =>
{
options.AddConsoleExporter()
.AddOtlpExporter(options =>
{
options.Endpoint = new Uri(otlpLogssUri);
var otlpLogssUri = Environment.GetEnvironmentVariable(OtlpLogsUri);

AddAuth(options);
});
});
builder.AddOpenTelemetry(options =>
{
var resourceBuilder = ResourceBuilder.CreateDefault();
_resources.ConfigureResourceBuilder(resourceBuilder);
options.SetResourceBuilder(resourceBuilder);

if (!string.IsNullOrEmpty(otlpLogssUri))

options.AddOtlpExporter(options =>
{
options.Endpoint = new Uri(otlpLogssUri);

AddAuth(options);
});
});
}

public OpenTelemetryResources GetResources()
{
var executingAssembly = Assembly.GetEntryAssembly()!;
var serviceName = executingAssembly.GetName().Name!;
var assemblyVersion = executingAssembly.GetName().Version?.ToString() ?? "unknown";

Action<ResourceBuilder> configureResource = r => r
.AddService(
serviceName,
serviceVersion: assemblyVersion,
serviceInstanceId: Environment.MachineName)
.AddAttributes(
new Dictionary<string, object>
{
["deployment.environment"] =
Environment.GetEnvironmentVariable("ENVIRONMENT")
?.ToLowerInvariant()
?? "unknown",
});

return new OpenTelemetryResources(serviceName, configureResource);
}

public void Dispose()
{
MeterProvider.ForceFlush();
MeterProvider.Dispose();

TracerProvider.ForceFlush();
TracerProvider.Dispose();
}

private void AddAuth(OtlpExporterOptions options)
{
var authHeader = Environment.GetEnvironmentVariable(OtelAuthHeader);

if (!string.IsNullOrEmpty(authHeader))
options.Headers = $"Authorization={authHeader}";
}
}
public record OpenTelemetryResources(string ServiceName, Action<ResourceBuilder> ConfigureResourceBuilder);

Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ NodaTime
OpenTelemetry
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.Runtime
OpenTelemetry.Contrib.Instrumentation.AWS
OpenTelemetry.Exporter.OpenTelemetryProtocol
OpenTelemetry.Exporter.Console
OpenTelemetry.Instrumentation.Http
Expand Down

0 comments on commit f1c39da

Please sign in to comment.