From 3e4d4369bfc6fa2033253b0a84b42ab1d91eeb05 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 1 Jun 2026 07:34:26 -0400 Subject: [PATCH] feat(telemetry): MapZbMetrics Prometheus scrape endpoint --- .../ZbMetricsEndpointExtensions.cs | 22 +++++++++++ .../MapZbMetricsTests.cs | 38 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 ZB.MOM.WW.Telemetry/src/ZB.MOM.WW.Telemetry/ZbMetricsEndpointExtensions.cs create mode 100644 ZB.MOM.WW.Telemetry/tests/ZB.MOM.WW.Telemetry.Tests/MapZbMetricsTests.cs diff --git a/ZB.MOM.WW.Telemetry/src/ZB.MOM.WW.Telemetry/ZbMetricsEndpointExtensions.cs b/ZB.MOM.WW.Telemetry/src/ZB.MOM.WW.Telemetry/ZbMetricsEndpointExtensions.cs new file mode 100644 index 0000000..ee1f88b --- /dev/null +++ b/ZB.MOM.WW.Telemetry/src/ZB.MOM.WW.Telemetry/ZbMetricsEndpointExtensions.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; + +namespace ZB.MOM.WW.Telemetry; + +/// +/// Endpoint extension for mounting the Prometheus /metrics scrape endpoint. +/// +public static class ZbMetricsEndpointExtensions +{ + /// + /// Mounts the Prometheus /metrics endpoint. Only valid when + /// = . + /// Call after app.UseRouting(). + /// + /// The endpoint route builder. + public static IEndpointConventionBuilder MapZbMetrics(this IEndpointRouteBuilder endpoints) + { + ArgumentNullException.ThrowIfNull(endpoints); + return endpoints.MapPrometheusScrapingEndpoint(); + } +} diff --git a/ZB.MOM.WW.Telemetry/tests/ZB.MOM.WW.Telemetry.Tests/MapZbMetricsTests.cs b/ZB.MOM.WW.Telemetry/tests/ZB.MOM.WW.Telemetry.Tests/MapZbMetricsTests.cs new file mode 100644 index 0000000..e6243fb --- /dev/null +++ b/ZB.MOM.WW.Telemetry/tests/ZB.MOM.WW.Telemetry.Tests/MapZbMetricsTests.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using ZB.MOM.WW.Telemetry; + +namespace ZB.MOM.WW.Telemetry.Tests; + +public sealed class MapZbMetricsTests +{ + [Fact] + public async Task MapZbMetrics_ServesPrometheusEndpoint() + { + var builder = WebApplication.CreateBuilder(); + builder.WebHost.UseUrls("http://127.0.0.1:0"); + builder.AddZbTelemetry(o => + { + o.ServiceName = "t"; + o.Exporter = ZbExporter.Prometheus; + o.Meters = ["Test.Meter"]; + }); + + await using var app = builder.Build(); + app.MapZbMetrics(); + + await app.StartAsync(); + + var address = app.Urls.First(); + using var client = new HttpClient { BaseAddress = new Uri(address) }; + + var response = await client.GetAsync("/metrics"); + + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content.Headers.ContentType); + Assert.Equal("text/plain", response.Content.Headers.ContentType!.MediaType); + + await app.StopAsync(); + } +}