diff --git a/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs b/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs index be49b2f21..aa20aa34b 100644 --- a/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs +++ b/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs @@ -70,8 +70,11 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi services.AddFusionCacheNeueccMessagePackSerializer(); + services.AddStackExchangeRedisCache(options => + options.ConnectionMultiplexerFactory = () => Task.FromResult( + ConnectionMultiplexer.Connect(infrastructureSettings.Redis.ConnectionString) + )); - services.AddStackExchangeRedisCache(opt => opt.Configuration = infrastructureSettings.Redis.ConnectionString); services.AddFusionCacheStackExchangeRedisBackplane(opt => opt.Configuration = infrastructureSettings.Redis.ConnectionString); services.AddGraphQlRedisSubscriptions(infrastructureSettings.Redis.ConnectionString); diff --git a/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj b/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj index 845eaa9d2..d6298a9ff 100644 --- a/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj +++ b/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj @@ -8,12 +8,20 @@ + + + + + + + + @@ -25,4 +33,4 @@ - \ No newline at end of file + diff --git a/src/Digdir.Domain.Dialogporten.WebApi/Program.cs b/src/Digdir.Domain.Dialogporten.WebApi/Program.cs index 22fd4ac89..32ad1709c 100644 --- a/src/Digdir.Domain.Dialogporten.WebApi/Program.cs +++ b/src/Digdir.Domain.Dialogporten.WebApi/Program.cs @@ -3,6 +3,7 @@ using System.Reflection; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; +using Azure.Monitor.OpenTelemetry.AspNetCore; using Digdir.Domain.Dialogporten.Application; using Digdir.Domain.Dialogporten.Application.Common.Extensions; using Digdir.Domain.Dialogporten.Application.Common.Extensions.OptionExtensions; @@ -20,9 +21,12 @@ using FastEndpoints; using FastEndpoints.Swagger; using FluentValidation; -using Microsoft.ApplicationInsights.Extensibility; using Microsoft.AspNetCore.Authorization; +using Npgsql; using NSwag; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; +using OpenTelemetry.Metrics; using Serilog; using Microsoft.Extensions.Options; @@ -31,9 +35,7 @@ .MinimumLevel.Warning() .Enrich.FromLogContext() .WriteTo.Console(formatProvider: CultureInfo.InvariantCulture) - .WriteTo.ApplicationInsights( - TelemetryConfiguration.CreateDefault(), - TelemetryConverter.Traces) + .WriteTo.ApplicationInsights(TelemetryConverter.Traces) .CreateBootstrapLogger(); try @@ -59,9 +61,7 @@ static void BuildAndRun(string[] args) .ReadFrom.Configuration(context.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext() - .WriteTo.ApplicationInsights( - services.GetRequiredService(), - TelemetryConverter.Traces)); + .WriteTo.ApplicationInsights(TelemetryConverter.Traces)); builder.Configuration .AddAzureConfiguration(builder.Environment.EnvironmentName) @@ -100,7 +100,6 @@ static void BuildAndRun(string[] args) .AddHttpContextAccessor() .AddValidatorsFromAssembly(thisAssembly, ServiceLifetime.Transient, includeInternalTypes: true) .AddAzureAppConfiguration() - .AddApplicationInsightsTelemetry() .AddEndpointsApiExplorer() .AddFastEndpoints() .SwaggerDocument(x => @@ -135,6 +134,34 @@ static void BuildAndRun(string[] args) .Select(z => z.WellKnown) .ToList() ?? []) + // OpenTelemetry + .AddOpenTelemetry() + .ConfigureResource(resource => resource + .AddService(serviceName: builder.Environment.ApplicationName)) + .WithTracing(tracing => + { + if (builder.Environment.IsDevelopment()) + { + tracing.SetSampler(new AlwaysOnSampler()); + } + + tracing.AddAspNetCoreInstrumentation(options => + { + options.Filter = (httpContext) => + !httpContext.Request.Path.StartsWithSegments("/health"); + }); + + tracing.AddHttpClientInstrumentation(); + tracing.AddNpgsql(); + tracing.AddRedisInstrumentation(options => options.SetVerboseDatabaseStatements = true); + }) + .WithMetrics(metrics => + { + metrics.AddRuntimeInstrumentation(); + }) + .UseAzureMonitor() + .Services + // Auth .AddDialogportenAuthentication(builder.Configuration) .AddAuthorization(); diff --git a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json index e1067c8d2..c44ec303c 100644 --- a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json +++ b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json @@ -66,15 +66,15 @@ } }, "LocalDevelopment": { - "UseLocalDevelopmentUser": true, - "UseLocalDevelopmentResourceRegister": true, - "UseLocalDevelopmentOrganizationRegister": true, - "UseLocalDevelopmentNameRegister": true, - "UseLocalDevelopmentAltinnAuthorization": true, + "UseLocalDevelopmentUser": false, + "UseLocalDevelopmentResourceRegister": false, + "UseLocalDevelopmentOrganizationRegister": false, + "UseLocalDevelopmentNameRegister": false, + "UseLocalDevelopmentAltinnAuthorization": false, "UseLocalDevelopmentCloudEventBus": true, "UseLocalDevelopmentCompactJwsGenerator": true, "DisableShortCircuitOutboxDispatcher": true, - "DisableCache": true, - "DisableAuth": true + "DisableCache": false, + "DisableAuth": false } } diff --git a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.json b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.json index ffd6358a4..6ea407a46 100644 --- a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.json +++ b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.json @@ -1,4 +1,7 @@ { + "AzureMonitor": { + "ConnectionString": "InstrumentationKey=00000000-0000-0000-0000-APP-SETTING" + }, "Logging": { "LogLevel": { "Default": "Warning" diff --git a/tests/Digdir.Domain.Dialogporten.WebApi.Integration.Tests/Features/V1/SwaggerSnapshotTests.cs b/tests/Digdir.Domain.Dialogporten.WebApi.Integration.Tests/Features/V1/SwaggerSnapshotTests.cs index ed2d01235..187a1269d 100644 --- a/tests/Digdir.Domain.Dialogporten.WebApi.Integration.Tests/Features/V1/SwaggerSnapshotTests.cs +++ b/tests/Digdir.Domain.Dialogporten.WebApi.Integration.Tests/Features/V1/SwaggerSnapshotTests.cs @@ -35,7 +35,7 @@ public async Task FailIfSwaggerSnapshotDoesNotMatch() // The order of the properties in the swagger.json file is not cross-platform deterministic. // Running client.GetAsync("/swagger/v1/swagger.json"); on Windows and Mac will produce // different ordering of the results (although the content is the same). So we force an - // alphabetical ordering of the properties to make the test deterministic. + // alphabetical ordering of the properties to make the test deterministic. // Ref: https://github.com/digdir/dialogporten/issues/996 var orderedSwagger = SortJson(newSwagger);