From a52db677e23e6ebe3be3ca345567f85053773e98 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sun, 22 Feb 2026 22:25:00 -0500 Subject: [PATCH] fix: track HTTP request stats for all monitoring endpoints --- src/NATS.Server/Monitoring/MonitorServer.cs | 83 ++++++++++++++++----- src/NATS.Server/Monitoring/VarzHandler.cs | 3 - src/NATS.Server/NatsServer.cs | 2 +- 3 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/NATS.Server/Monitoring/MonitorServer.cs b/src/NATS.Server/Monitoring/MonitorServer.cs index 0abdf56..fd2335d 100644 --- a/src/NATS.Server/Monitoring/MonitorServer.cs +++ b/src/NATS.Server/Monitoring/MonitorServer.cs @@ -14,7 +14,7 @@ public sealed class MonitorServer : IAsyncDisposable private readonly WebApplication _app; private readonly ILogger _logger; - public MonitorServer(NatsServer server, NatsOptions options, ILoggerFactory loggerFactory) + public MonitorServer(NatsServer server, NatsOptions options, ServerStats stats, ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger(); @@ -27,26 +27,75 @@ public sealed class MonitorServer : IAsyncDisposable var varzHandler = new VarzHandler(server, options); - _app.MapGet(basePath + "/", () => Results.Ok(new + _app.MapGet(basePath + "/", () => { - endpoints = new[] + stats.HttpReqStats.AddOrUpdate("/", 1, (_, v) => v + 1); + return Results.Ok(new { - "/varz", "/connz", "/healthz", "/routez", - "/gatewayz", "/leafz", "/subz", "/accountz", "/jsz", - }, - })); - _app.MapGet(basePath + "/healthz", () => Results.Ok("ok")); - _app.MapGet(basePath + "/varz", async () => Results.Ok(await varzHandler.HandleVarzAsync())); + endpoints = new[] + { + "/varz", "/connz", "/healthz", "/routez", + "/gatewayz", "/leafz", "/subz", "/accountz", "/jsz", + }, + }); + }); + _app.MapGet(basePath + "/healthz", () => + { + stats.HttpReqStats.AddOrUpdate("/healthz", 1, (_, v) => v + 1); + return Results.Ok("ok"); + }); + _app.MapGet(basePath + "/varz", async () => + { + stats.HttpReqStats.AddOrUpdate("/varz", 1, (_, v) => v + 1); + return Results.Ok(await varzHandler.HandleVarzAsync()); + }); // Stubs for unimplemented endpoints - _app.MapGet(basePath + "/routez", () => Results.Ok(new { })); - _app.MapGet(basePath + "/gatewayz", () => Results.Ok(new { })); - _app.MapGet(basePath + "/leafz", () => Results.Ok(new { })); - _app.MapGet(basePath + "/subz", () => Results.Ok(new { })); - _app.MapGet(basePath + "/subscriptionsz", () => Results.Ok(new { })); - _app.MapGet(basePath + "/accountz", () => Results.Ok(new { })); - _app.MapGet(basePath + "/accstatz", () => Results.Ok(new { })); - _app.MapGet(basePath + "/jsz", () => Results.Ok(new { })); + _app.MapGet(basePath + "/connz", () => + { + stats.HttpReqStats.AddOrUpdate("/connz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/routez", () => + { + stats.HttpReqStats.AddOrUpdate("/routez", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/gatewayz", () => + { + stats.HttpReqStats.AddOrUpdate("/gatewayz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/leafz", () => + { + stats.HttpReqStats.AddOrUpdate("/leafz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/subz", () => + { + stats.HttpReqStats.AddOrUpdate("/subz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/subscriptionsz", () => + { + stats.HttpReqStats.AddOrUpdate("/subscriptionsz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/accountz", () => + { + stats.HttpReqStats.AddOrUpdate("/accountz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/accstatz", () => + { + stats.HttpReqStats.AddOrUpdate("/accstatz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); + _app.MapGet(basePath + "/jsz", () => + { + stats.HttpReqStats.AddOrUpdate("/jsz", 1, (_, v) => v + 1); + return Results.Ok(new { }); + }); } public async Task StartAsync(CancellationToken ct) diff --git a/src/NATS.Server/Monitoring/VarzHandler.cs b/src/NATS.Server/Monitoring/VarzHandler.cs index c24b910..9a2aff5 100644 --- a/src/NATS.Server/Monitoring/VarzHandler.cs +++ b/src/NATS.Server/Monitoring/VarzHandler.cs @@ -47,9 +47,6 @@ public sealed class VarzHandler _lastCpuUsage = currentCpu; } - // Track HTTP request count for /varz - stats.HttpReqStats.AddOrUpdate("/varz", 1, (_, v) => v + 1); - return new Varz { Id = _server.ServerId, diff --git a/src/NATS.Server/NatsServer.cs b/src/NATS.Server/NatsServer.cs index 0f9e5e0..4315cd7 100644 --- a/src/NATS.Server/NatsServer.cs +++ b/src/NATS.Server/NatsServer.cs @@ -65,7 +65,7 @@ public sealed class NatsServer : IMessageRouter, ISubListAccess, IDisposable if (_options.MonitorPort > 0) { - _monitorServer = new MonitorServer(this, _options, _loggerFactory); + _monitorServer = new MonitorServer(this, _options, _stats, _loggerFactory); await _monitorServer.StartAsync(ct); }