From e3f88bbe33b710f54a66c2603ac8986ec2d1f2e0 Mon Sep 17 00:00:00 2001 From: Tim Hess Date: Mon, 24 Feb 2025 10:35:01 -0600 Subject: [PATCH 1/3] Update content-type for mappings to v3, throw if SBA url wasn't set --- .../RouteMappings/RouteMappingsEndpointMiddleware.cs | 3 --- .../SpringBootAdminClientHostedService.cs | 5 +++++ .../test/Endpoint.Test/ActuatorContentNegotiationTests.cs | 2 +- .../Actuators/RouteMappings/ActuatorRouteMappingsTest.cs | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Management/src/Endpoint/Actuators/RouteMappings/RouteMappingsEndpointMiddleware.cs b/src/Management/src/Endpoint/Actuators/RouteMappings/RouteMappingsEndpointMiddleware.cs index 7b99dad36d..79de77e011 100644 --- a/src/Management/src/Endpoint/Actuators/RouteMappings/RouteMappingsEndpointMiddleware.cs +++ b/src/Management/src/Endpoint/Actuators/RouteMappings/RouteMappingsEndpointMiddleware.cs @@ -17,9 +17,6 @@ internal sealed class RouteMappingsEndpointMiddleware( IRouteMappingsEndpointHandler endpointHandler, IOptionsMonitor managementOptionsMonitor, ILoggerFactory loggerFactory) : EndpointMiddleware(endpointHandler, managementOptionsMonitor, loggerFactory) { - // There is no difference between v2 and v3 responses. This override is a workaround for Spring Boot Admin: https://github.com/codecentric/spring-boot-admin/issues/4001. - private protected override string ContentType => "application/vnd.spring-boot.actuator.v2+json"; - protected override async Task InvokeEndpointHandlerAsync(object? request, CancellationToken cancellationToken) { return await EndpointHandler.InvokeAsync(request, cancellationToken); diff --git a/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs b/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs index 7efd0a3e77..3d697b3032 100644 --- a/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs +++ b/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs @@ -49,6 +49,11 @@ public async Task StartAsync(CancellationToken cancellationToken) { SpringBootAdminClientOptions clientOptions = _clientOptionsMonitor.CurrentValue; + if (clientOptions.Url == null) + { + throw new InvalidOperationException("Spring Boot Admin Server Url must be provided in options."); + } + _logger.LogInformation("Registering with Spring Boot Admin Server at {Url}", clientOptions.Url); if (clientOptions.ApplicationName == null || !Uri.TryCreate(clientOptions.BasePath, UriKind.Absolute, out Uri? baseUri)) diff --git a/src/Management/test/Endpoint.Test/ActuatorContentNegotiationTests.cs b/src/Management/test/Endpoint.Test/ActuatorContentNegotiationTests.cs index 2e870fadd5..cc1c361d21 100644 --- a/src/Management/test/Endpoint.Test/ActuatorContentNegotiationTests.cs +++ b/src/Management/test/Endpoint.Test/ActuatorContentNegotiationTests.cs @@ -38,7 +38,7 @@ public sealed class ActuatorContentNegotiationTests [InlineData("httpexchanges", SpringBootStandardAccept, ActuatorV3)] [InlineData("info", $"{ActuatorV3},{SpringBootStandardAccept}", ActuatorV3)] [InlineData("loggers", SpringBootStandardAccept, ActuatorV3)] - [InlineData("mappings", SpringBootStandardAccept, ActuatorV2)] + [InlineData("mappings", SpringBootStandardAccept, ActuatorV3)] [InlineData("threaddump", SpringBootStandardAccept, ActuatorV3)] [Theory] public async Task Responses_for_SpringBootAdmin_match_expectations(string endpoint, string acceptHeader, string responseContentType) diff --git a/src/Management/test/Endpoint.Test/Actuators/RouteMappings/ActuatorRouteMappingsTest.cs b/src/Management/test/Endpoint.Test/Actuators/RouteMappings/ActuatorRouteMappingsTest.cs index ed817dd0e4..682fcdb7ea 100644 --- a/src/Management/test/Endpoint.Test/Actuators/RouteMappings/ActuatorRouteMappingsTest.cs +++ b/src/Management/test/Endpoint.Test/Actuators/RouteMappings/ActuatorRouteMappingsTest.cs @@ -651,7 +651,7 @@ public async Task Returns_endpoints_for_RouteMappings_actuator(HostBuilderType h "dispatcherServlet": [ { "handler": "/actuator/mappings", - "predicate": "{GET [/actuator/mappings], produces [application/vnd.spring-boot.actuator.v2+json]}", + "predicate": "{GET [/actuator/mappings], produces [application/vnd.spring-boot.actuator.v3+json]}", "details": { "handlerMethod": { "className": "Steeltoe.Management.Endpoint.Middleware.EndpointMiddleware`2", @@ -668,7 +668,7 @@ public async Task Returns_endpoints_for_RouteMappings_actuator(HostBuilderType h "consumes": [], "produces": [ { - "mediaType": "application/vnd.spring-boot.actuator.v2+json", + "mediaType": "application/vnd.spring-boot.actuator.v3+json", "negated": false } ], From d90145744eaeeb7c5718ce74e6c0d7f878ac4b75 Mon Sep 17 00:00:00 2001 From: Tim Hess Date: Tue, 25 Feb 2025 09:02:33 -0600 Subject: [PATCH 2/3] fix duplicate exception logging --- .../SpringBootAdminClient/SpringBootAdminClientHostedService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs b/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs index 3d697b3032..0ab4a02eab 100644 --- a/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs +++ b/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs @@ -74,7 +74,7 @@ public async Task StartAsync(CancellationToken cancellationToken) } catch (Exception exception) when (!exception.IsCancellation()) { - _logger.LogError(exception, "Error connecting to Spring Boot Admin Server: {Message}", exception.Message); + _logger.LogError(exception, "Error connecting to Spring Boot Admin Server."); return; } From 9325dac85066b18f30c8ad279cc278e0afbbc7d5 Mon Sep 17 00:00:00 2001 From: Tim Hess Date: Tue, 25 Feb 2025 10:24:12 -0600 Subject: [PATCH 3/3] fix another duplicated exception in logs --- .../SpringBootAdminClient/SpringBootAdminClientHostedService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs b/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs index 0ab4a02eab..e5728e71b3 100644 --- a/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs +++ b/src/Management/src/Endpoint/SpringBootAdminClient/SpringBootAdminClientHostedService.cs @@ -137,7 +137,7 @@ public async Task StopAsync(CancellationToken cancellationToken) } catch (Exception exception) when (!exception.IsCancellation()) { - _logger.LogError(exception, "Error connecting to Spring Boot Admin Server: {Message}", exception.Message); + _logger.LogError(exception, "Error connecting to Spring Boot Admin Server."); return; }