From ef72d647001c4f70d2e5317a01964fa9dfbc81c1 Mon Sep 17 00:00:00 2001 From: Pc Date: Sun, 30 Jul 2023 00:58:05 +0330 Subject: [PATCH] feat: Add monitoring with prometheus and grafana --- .../docker-compose/docker-compose.yaml | 39 +++++++++++ .../docker-compose/infrastracture.yaml | 40 ++++++++++++ .../data/alerting/1/__default__.tmpl | 53 +++++++++++++++ .../monitoring/grafana-data/data/grafana.db | Bin 0 -> 929792 bytes .../monitoring/prom/prometheus.yml | 61 ++++++++++++++++++ src/ApiGateway/Dockerfile | 4 +- src/ApiGateway/dev.Dockerfile | 4 +- src/ApiGateway/src/ApiGateway.csproj | 2 +- src/BuildingBlocks/BuildingBlocks.csproj | 15 +++-- .../OpenTelemetry/Extensions.cs | 35 ++++++++-- src/Services/Booking/Dockerfile | 4 +- src/Services/Booking/dev.Dockerfile | 4 +- .../src/Booking.Api/Booking.Api.csproj | 2 +- .../Booking/src/Booking/Booking.csproj | 2 +- .../InfrastructureExtensions.cs | 4 +- .../IntegrationTest/Integration.Test.csproj | 2 +- src/Services/Flight/Dockerfile | 4 +- src/Services/Flight/dev.Dockerfile | 4 +- .../Flight/src/Flight.Api/Flight.Api.csproj | 2 +- .../InfrastructureExtensions.cs | 7 +- src/Services/Flight/src/Flight/Flight.csproj | 2 +- .../tests/EndToEndTest/EndToEnd.Test.csproj | 2 +- .../IntegrationTest/Integration.Test.csproj | 2 +- .../Flight/tests/UnitTest/Unit.Test.csproj | 2 +- src/Services/Identity/Dockerfile | 4 +- src/Services/Identity/dev.Dockerfile | 4 +- .../src/Identity.Api/Identity.Api.csproj | 2 +- .../InfrastructureExtensions.cs | 5 +- .../Identity/src/Identity/Identity.csproj | 2 +- .../IntegrationTest/Integration.Test.csproj | 2 +- src/Services/Passenger/Dockerfile | 4 +- src/Services/Passenger/dev.Dockerfile | 4 +- .../src/Passenger.Api/Passenger.Api.csproj | 2 +- .../InfrastructureExtensions.cs | 5 +- .../Passenger/src/Passenger/Passenger.csproj | 2 +- .../IntegrationTest/Integration.Test.csproj | 2 +- 36 files changed, 272 insertions(+), 62 deletions(-) create mode 100644 deployments/docker-compose/monitoring/grafana-data/data/alerting/1/__default__.tmpl create mode 100644 deployments/docker-compose/monitoring/grafana-data/data/grafana.db create mode 100644 deployments/docker-compose/monitoring/prom/prometheus.yml diff --git a/deployments/docker-compose/docker-compose.yaml b/deployments/docker-compose/docker-compose.yaml index 83a84f3..6b419c9 100644 --- a/deployments/docker-compose/docker-compose.yaml +++ b/deployments/docker-compose/docker-compose.yaml @@ -144,7 +144,46 @@ services: networks: - booking + ####################################################### + # prometheus + ####################################################### + prometheus: + image: prom/prometheus:latest + container_name: prometheus + ports: + - "9090:9090" + environment: + - TZ=UTC + volumes: + - ./monitoring/prom/prometheus.yml:/etc/prometheus/prometheus.yml + networks: + - booking + ####################################################### + # grafana + ####################################################### + grafana: + image: grafana/grafana + container_name: grafana + ports: + - "3000:3000" + volumes: + - ./monitoring/grafana-data/data:/var/lib/grafana + networks: + - booking + + ####################################################### + # node_exporter + ####################################################### + node_exporter: + image: prom/node-exporter + container_name: node_exporter + restart: unless-stopped + ports: + - 9101:9100 + networks: + - booking + ###################################################### # Gateway ###################################################### diff --git a/deployments/docker-compose/infrastracture.yaml b/deployments/docker-compose/infrastracture.yaml index 808c430..e0fca93 100644 --- a/deployments/docker-compose/infrastracture.yaml +++ b/deployments/docker-compose/infrastracture.yaml @@ -158,6 +158,46 @@ services: ports: - 6379:6379 + ####################################################### + # prometheus + ####################################################### + prometheus: + image: prom/prometheus:latest + container_name: prometheus + ports: + - "9090:9090" + environment: + - TZ=UTC + volumes: + - ./monitoring/prom/prometheus.yml:/etc/prometheus/prometheus.yml + networks: + - booking + + ####################################################### + # grafana + ####################################################### + grafana: + image: grafana/grafana + container_name: grafana + ports: + - "3000:3000" + volumes: + - ./monitoring/grafana-data/data:/var/lib/grafana + networks: + - booking + + ####################################################### + # node_exporter + ####################################################### + node_exporter: + image: prom/node-exporter + container_name: node_exporter + restart: unless-stopped + ports: + - 9101:9100 + networks: + - booking + networks: booking: diff --git a/deployments/docker-compose/monitoring/grafana-data/data/alerting/1/__default__.tmpl b/deployments/docker-compose/monitoring/grafana-data/data/alerting/1/__default__.tmpl new file mode 100644 index 0000000..b8633d1 --- /dev/null +++ b/deployments/docker-compose/monitoring/grafana-data/data/alerting/1/__default__.tmpl @@ -0,0 +1,53 @@ + +{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ if gt (.Alerts.Resolved | len) 0 }}, RESOLVED:{{ .Alerts.Resolved | len }}{{ end }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }} + +{{ define "__text_values_list" }}{{ if len .Values }}{{ $first := true }}{{ range $refID, $value := .Values -}} +{{ if $first }}{{ $first = false }}{{ else }}, {{ end }}{{ $refID }}={{ $value }}{{ end -}} +{{ else }}[no value]{{ end }}{{ end }} + +{{ define "__text_alert_list" }}{{ range . }} +Value: {{ template "__text_values_list" . }} +Labels: +{{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }}Annotations: +{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }}{{ if gt (len .GeneratorURL) 0 }}Source: {{ .GeneratorURL }} +{{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: {{ .SilenceURL }} +{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }} +{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }} +{{ end }}{{ end }}{{ end }} + +{{ define "default.title" }}{{ template "__subject" . }}{{ end }} + +{{ define "default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** +{{ template "__text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} + +{{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** +{{ template "__text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} + + +{{ define "__teams_text_alert_list" }}{{ range . }} +Value: {{ template "__text_values_list" . }} +Labels: +{{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }} +Annotations: +{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }} +{{ if gt (len .GeneratorURL) 0 }}Source: [{{ .GeneratorURL }}]({{ .GeneratorURL }}) + +{{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: [{{ .SilenceURL }}]({{ .SilenceURL }}) + +{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: [{{ .DashboardURL }}]({{ .DashboardURL }}) + +{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: [{{ .PanelURL }}]({{ .PanelURL }}) + +{{ end }} +{{ end }}{{ end }} + + +{{ define "teams.default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** +{{ template "__teams_text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} + +{{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** +{{ template "__teams_text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} diff --git a/deployments/docker-compose/monitoring/grafana-data/data/grafana.db b/deployments/docker-compose/monitoring/grafana-data/data/grafana.db new file mode 100644 index 0000000000000000000000000000000000000000..f8713c0e2ce0dc6b382eeabb919309d8c433610f GIT binary patch literal 929792 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 - net7.0 + net8.0 enable diff --git a/src/BuildingBlocks/BuildingBlocks.csproj b/src/BuildingBlocks/BuildingBlocks.csproj index 8595b07..e7a1937 100644 --- a/src/BuildingBlocks/BuildingBlocks.csproj +++ b/src/BuildingBlocks/BuildingBlocks.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable @@ -37,7 +37,8 @@ - + + all @@ -117,11 +118,11 @@ - - - - - + + + + + all diff --git a/src/BuildingBlocks/OpenTelemetry/Extensions.cs b/src/BuildingBlocks/OpenTelemetry/Extensions.cs index d842616..a31a3d9 100644 --- a/src/BuildingBlocks/OpenTelemetry/Extensions.cs +++ b/src/BuildingBlocks/OpenTelemetry/Extensions.cs @@ -6,17 +6,38 @@ using OpenTelemetry.Trace; namespace BuildingBlocks.OpenTelemetry; +using global::OpenTelemetry.Metrics; + public static class Extensions { public static IServiceCollection AddCustomOpenTelemetry(this IServiceCollection services) { - services.AddOpenTelemetryTracing(builder => builder - .AddGrpcClientInstrumentation() - .AddMassTransitInstrumentation() - .AddAspNetCoreInstrumentation() - .AddHttpClientInstrumentation() - .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(services.GetOptions("AppOptions").Name)) - .AddJaegerExporter()); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddGrpcClientInstrumentation() + .AddMassTransitInstrumentation() + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .SetResourceBuilder(ResourceBuilder.CreateDefault() + .AddService(services.GetOptions("AppOptions").Name)) + .AddJaegerExporter()) + .WithMetrics(builder => + { + builder.AddPrometheusExporter(); + builder.AddMeter( + "Microsoft.AspNetCore.Hosting", + "Microsoft.AspNetCore.Server.Kestrel" + ); + builder.AddView("request-duration", + new ExplicitBucketHistogramConfiguration + { + Boundaries = new[] + { + 0, 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 + } + }); + } + ); return services; } diff --git a/src/Services/Booking/Dockerfile b/src/Services/Booking/Dockerfile index 1d61dcc..9ccec65 100644 --- a/src/Services/Booking/Dockerfile +++ b/src/Services/Booking/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder WORKDIR / # Setup working directory for the project @@ -27,7 +27,7 @@ WORKDIR /Services/Booking/src/Booking.Api # and no build, as we did it already RUN dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Booking/dev.Dockerfile b/src/Services/Booking/dev.Dockerfile index a75037f..212ab55 100644 --- a/src/Services/Booking/dev.Dockerfile +++ b/src/Services/Booking/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder WORKDIR / # Setup working directory for the project @@ -30,7 +30,7 @@ WORKDIR /Services/Booking/src/Booking.Api RUN --mount=type=cache,id=booking_nuget,target=/root/.nuget/packages\ dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Booking/src/Booking.Api/Booking.Api.csproj b/src/Services/Booking/src/Booking.Api/Booking.Api.csproj index af8b754..fb05520 100644 --- a/src/Services/Booking/src/Booking.Api/Booking.Api.csproj +++ b/src/Services/Booking/src/Booking.Api/Booking.Api.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable diff --git a/src/Services/Booking/src/Booking/Booking.csproj b/src/Services/Booking/src/Booking/Booking.csproj index 22fd0ed..e1c5ef5 100644 --- a/src/Services/Booking/src/Booking/Booking.csproj +++ b/src/Services/Booking/src/Booking/Booking.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable diff --git a/src/Services/Booking/src/Booking/Extensions/Infrastructure/InfrastructureExtensions.cs b/src/Services/Booking/src/Booking/Extensions/Infrastructure/InfrastructureExtensions.cs index 036912a..928f3ed 100644 --- a/src/Services/Booking/src/Booking/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/src/Services/Booking/src/Booking/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -88,15 +88,15 @@ public static class InfrastructureExtensions var env = app.Environment; var appOptions = app.GetOptions(nameof(AppOptions)); + app.MapPrometheusScrapingEndpoint(); + app.UseCustomProblemDetails(); app.UseSerilogRequestLogging(options => { options.EnrichDiagnosticContext = LogEnrichHelper.EnrichFromRequest; }); app.UseCorrelationId(); - app.UseHttpMetrics(); app.UseCustomHealthCheck(); - app.MapMetrics(); app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name)); if (env.IsDevelopment()) diff --git a/src/Services/Booking/tests/IntegrationTest/Integration.Test.csproj b/src/Services/Booking/tests/IntegrationTest/Integration.Test.csproj index 6b0d8b3..b100fdf 100644 --- a/src/Services/Booking/tests/IntegrationTest/Integration.Test.csproj +++ b/src/Services/Booking/tests/IntegrationTest/Integration.Test.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 false enable diff --git a/src/Services/Flight/Dockerfile b/src/Services/Flight/Dockerfile index 21154ac..a3acedd 100644 --- a/src/Services/Flight/Dockerfile +++ b/src/Services/Flight/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder WORKDIR / # Setup working directory for the project @@ -27,7 +27,7 @@ WORKDIR /Services/Flight/src/Flight.Api # and no build, as we did it already RUN dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Flight/dev.Dockerfile b/src/Services/Flight/dev.Dockerfile index c7b76cb..11026f0 100644 --- a/src/Services/Flight/dev.Dockerfile +++ b/src/Services/Flight/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder WORKDIR / # Setup working directory for the project @@ -30,7 +30,7 @@ WORKDIR /Services/Flight/src/Flight.Api RUN --mount=type=cache,id=flight_nuget,target=/root/.nuget/packages \ dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Flight/src/Flight.Api/Flight.Api.csproj b/src/Services/Flight/src/Flight.Api/Flight.Api.csproj index 3bfc53c..7eb9df1 100644 --- a/src/Services/Flight/src/Flight.Api/Flight.Api.csproj +++ b/src/Services/Flight/src/Flight.Api/Flight.Api.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable diff --git a/src/Services/Flight/src/Flight/Extensions/Infrastructure/InfrastructureExtensions.cs b/src/Services/Flight/src/Flight/Extensions/Infrastructure/InfrastructureExtensions.cs index 25837e1..7890a8e 100644 --- a/src/Services/Flight/src/Flight/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/src/Services/Flight/src/Flight/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -23,13 +23,10 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Prometheus; using Serilog; namespace Flight.Extensions.Infrastructure; -using BuildingBlocks.PersistMessageProcessor.Data; - public static class InfrastructureExtensions { public static WebApplicationBuilder AddInfrastructure(this WebApplicationBuilder builder) @@ -95,15 +92,15 @@ public static class InfrastructureExtensions var env = app.Environment; var appOptions = app.GetOptions(nameof(AppOptions)); + app.MapPrometheusScrapingEndpoint(); + app.UseCustomProblemDetails(); app.UseSerilogRequestLogging(options => { options.EnrichDiagnosticContext = LogEnrichHelper.EnrichFromRequest; }); app.UseCorrelationId(); - app.UseHttpMetrics(); app.UseMigration(env); - app.MapMetrics(); app.UseCustomHealthCheck(); app.MapGrpcService(); app.UseRateLimiter(); diff --git a/src/Services/Flight/src/Flight/Flight.csproj b/src/Services/Flight/src/Flight/Flight.csproj index 5ec1a9a..0b9e03c 100644 --- a/src/Services/Flight/src/Flight/Flight.csproj +++ b/src/Services/Flight/src/Flight/Flight.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable diff --git a/src/Services/Flight/tests/EndToEndTest/EndToEnd.Test.csproj b/src/Services/Flight/tests/EndToEndTest/EndToEnd.Test.csproj index 6acf245..8726cab 100644 --- a/src/Services/Flight/tests/EndToEndTest/EndToEnd.Test.csproj +++ b/src/Services/Flight/tests/EndToEndTest/EndToEnd.Test.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable false diff --git a/src/Services/Flight/tests/IntegrationTest/Integration.Test.csproj b/src/Services/Flight/tests/IntegrationTest/Integration.Test.csproj index ed55732..ca1dc0a 100644 --- a/src/Services/Flight/tests/IntegrationTest/Integration.Test.csproj +++ b/src/Services/Flight/tests/IntegrationTest/Integration.Test.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 false enable diff --git a/src/Services/Flight/tests/UnitTest/Unit.Test.csproj b/src/Services/Flight/tests/UnitTest/Unit.Test.csproj index d69eeb2..d4c3137 100644 --- a/src/Services/Flight/tests/UnitTest/Unit.Test.csproj +++ b/src/Services/Flight/tests/UnitTest/Unit.Test.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 false enable diff --git a/src/Services/Identity/Dockerfile b/src/Services/Identity/Dockerfile index 9a6c0c6..f18ef44 100644 --- a/src/Services/Identity/Dockerfile +++ b/src/Services/Identity/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder # Setup working directory for the project WORKDIR / @@ -26,7 +26,7 @@ WORKDIR /Services/Identity/src/Identity.Api # and no build, as we did it already RUN dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Identity/dev.Dockerfile b/src/Services/Identity/dev.Dockerfile index e7072b3..5f59253 100644 --- a/src/Services/Identity/dev.Dockerfile +++ b/src/Services/Identity/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder # Setup working directory for the project WORKDIR / @@ -29,7 +29,7 @@ WORKDIR /Services/Identity/src/Identity.Api RUN --mount=type=cache,id=identity_nuget,target=/root/.nuget/packages \ dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Identity/src/Identity.Api/Identity.Api.csproj b/src/Services/Identity/src/Identity.Api/Identity.Api.csproj index 51a2b7c..0dd41d7 100644 --- a/src/Services/Identity/src/Identity.Api/Identity.Api.csproj +++ b/src/Services/Identity/src/Identity.Api/Identity.Api.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable diff --git a/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs b/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs index e9333e3..db0b96e 100644 --- a/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -92,6 +92,8 @@ public static class InfrastructureExtensions var env = app.Environment; var appOptions = app.GetOptions(nameof(AppOptions)); + app.MapPrometheusScrapingEndpoint(); + app.UseForwardedHeaders(); app.UseCustomProblemDetails(); @@ -101,11 +103,8 @@ public static class InfrastructureExtensions }); app.UseMigration(env); app.UseCorrelationId(); - app.UseHttpMetrics(); app.UseCustomHealthCheck(); app.UseIdentityServer(); - app.MapMetrics(); - app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name)); diff --git a/src/Services/Identity/src/Identity/Identity.csproj b/src/Services/Identity/src/Identity/Identity.csproj index cf433e1..f7fa9d7 100644 --- a/src/Services/Identity/src/Identity/Identity.csproj +++ b/src/Services/Identity/src/Identity/Identity.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable diff --git a/src/Services/Identity/tests/IntegrationTest/Integration.Test.csproj b/src/Services/Identity/tests/IntegrationTest/Integration.Test.csproj index 7153e37..6730933 100644 --- a/src/Services/Identity/tests/IntegrationTest/Integration.Test.csproj +++ b/src/Services/Identity/tests/IntegrationTest/Integration.Test.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 false enable diff --git a/src/Services/Passenger/Dockerfile b/src/Services/Passenger/Dockerfile index a95093c..d94b450 100644 --- a/src/Services/Passenger/Dockerfile +++ b/src/Services/Passenger/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder WORKDIR / # Setup working directory for the project @@ -27,7 +27,7 @@ WORKDIR /Services/Passenger/src/Passenger.Api # and no build, as we did it already RUN dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Passenger/dev.Dockerfile b/src/Services/Passenger/dev.Dockerfile index f8809ac..a59b524 100644 --- a/src/Services/Passenger/dev.Dockerfile +++ b/src/Services/Passenger/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder +FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS builder WORKDIR / # Setup working directory for the project @@ -30,7 +30,7 @@ WORKDIR /Services/Passenger/src/Passenger.Api RUN --mount=type=cache,id=passenger_nuget,target=/root/.nuget/packages \ dotnet publish -c Release --no-build -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview # Setup working directory for the project WORKDIR / diff --git a/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj b/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj index f18f014..1fabf7c 100644 --- a/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj +++ b/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable diff --git a/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/InfrastructureExtensions.cs b/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/InfrastructureExtensions.cs index f2efd59..2a4c7f5 100644 --- a/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -21,7 +21,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Passenger.Data; using Passenger.GrpcServer.Services; -using Prometheus; using Serilog; namespace Passenger.Extensions.Infrastructure; @@ -87,6 +86,8 @@ public static class InfrastructureExtensions var env = app.Environment; var appOptions = app.GetOptions(nameof(AppOptions)); + app.MapPrometheusScrapingEndpoint(); + app.UseCustomProblemDetails(); app.UseSerilogRequestLogging(options => { @@ -94,9 +95,7 @@ public static class InfrastructureExtensions }); app.UseMigration(env); app.UseCorrelationId(); - app.UseHttpMetrics(); app.UseCustomHealthCheck(); - app.MapMetrics(); app.MapGrpcService(); app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name)); diff --git a/src/Services/Passenger/src/Passenger/Passenger.csproj b/src/Services/Passenger/src/Passenger/Passenger.csproj index 40cf04a..7718fe1 100644 --- a/src/Services/Passenger/src/Passenger/Passenger.csproj +++ b/src/Services/Passenger/src/Passenger/Passenger.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable diff --git a/src/Services/Passenger/tests/IntegrationTest/Integration.Test.csproj b/src/Services/Passenger/tests/IntegrationTest/Integration.Test.csproj index 686c844..9b417a2 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Integration.Test.csproj +++ b/src/Services/Passenger/tests/IntegrationTest/Integration.Test.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 false enable