Skip to content

Commit b57116f

Browse files
author
bnasslahsen
committed
Spring boot actuator endpoint parameters. Fixes #775
1 parent 2da39aa commit b57116f

File tree

9 files changed

+79
-25
lines changed

9 files changed

+79
-25
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.springdoc.core.customizers;
2+
3+
import java.util.regex.Matcher;
4+
import java.util.regex.Pattern;
5+
6+
import io.swagger.v3.oas.models.OpenAPI;
7+
import io.swagger.v3.oas.models.PathItem;
8+
import io.swagger.v3.oas.models.media.StringSchema;
9+
import io.swagger.v3.oas.models.parameters.PathParameter;
10+
11+
/**
12+
* The type Actuator open api customiser.
13+
* @author bnasslahsen
14+
*/
15+
public class ActuatorOpenApiCustomiser implements OpenApiCustomiser {
16+
17+
private final Pattern pathPathern = Pattern.compile("\\{(.*?)}");
18+
19+
@Override
20+
public void customise(OpenAPI openApi) {
21+
openApi.getPaths().entrySet().stream()
22+
.filter(stringPathItemEntry -> stringPathItemEntry.getKey().startsWith("/actuator/"))
23+
.forEach(stringPathItemEntry -> {
24+
String path = stringPathItemEntry.getKey();
25+
Matcher matcher = pathPathern.matcher(path);
26+
while (matcher.find()) {
27+
String pathParam = matcher.group(1);
28+
PathItem pathItem = stringPathItemEntry.getValue();
29+
pathItem.readOperations().forEach(operation -> operation.addParametersItem(new PathParameter().name(pathParam).schema(new StringSchema())));
30+
}
31+
});
32+
}
33+
}

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/OpenApiResource.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@
2828
import java.util.Set;
2929

3030
import com.fasterxml.jackson.core.JsonProcessingException;
31-
import com.fasterxml.jackson.databind.ObjectMapper;
3231
import io.swagger.v3.core.util.Json;
3332
import io.swagger.v3.core.util.PathUtils;
34-
import io.swagger.v3.core.util.Yaml;
3533
import io.swagger.v3.oas.annotations.Operation;
3634
import io.swagger.v3.oas.models.OpenAPI;
3735
import org.springdoc.api.AbstractOpenApiResource;

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/SpringDocWebFluxConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springdoc.core.RequestBodyBuilder;
3434
import org.springdoc.core.ReturnTypeParser;
3535
import org.springdoc.core.SpringDocConfigProperties;
36+
import org.springdoc.core.customizers.ActuatorOpenApiCustomiser;
3637
import org.springdoc.core.customizers.ActuatorOperationCustomizer;
3738
import org.springdoc.core.customizers.OpenApiCustomiser;
3839
import org.springdoc.core.customizers.OperationCustomizer;
@@ -175,5 +176,16 @@ ActuatorProvider actuatorProvider(WebFluxEndpointHandlerMapping webFluxEndpointH
175176
OperationCustomizer actuatorCustomizer(ActuatorProvider actuatorProvider) {
176177
return new ActuatorOperationCustomizer(actuatorProvider);
177178
}
179+
180+
/**
181+
* Actuator customizer open api customiser.
182+
*
183+
* @return the open api customiser
184+
*/
185+
@Bean
186+
@Lazy(false)
187+
OpenApiCustomiser actuatorOpenApiCustomiser() {
188+
return new ActuatorOpenApiCustomiser();
189+
}
178190
}
179191
}

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/api/OpenApiResource.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.fasterxml.jackson.core.JsonProcessingException;
3333
import io.swagger.v3.core.util.Json;
3434
import io.swagger.v3.core.util.PathUtils;
35-
import io.swagger.v3.core.util.Yaml;
3635
import io.swagger.v3.oas.annotations.Operation;
3736
import io.swagger.v3.oas.models.OpenAPI;
3837
import org.springdoc.api.AbstractOpenApiResource;

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springdoc.core.ReturnTypeParser;
3636
import org.springdoc.core.SecurityOAuth2Provider;
3737
import org.springdoc.core.SpringDocConfigProperties;
38+
import org.springdoc.core.customizers.ActuatorOpenApiCustomiser;
3839
import org.springdoc.core.customizers.ActuatorOperationCustomizer;
3940
import org.springdoc.core.customizers.OpenApiCustomiser;
4041
import org.springdoc.core.customizers.OperationCustomizer;
@@ -194,5 +195,16 @@ ActuatorProvider actuatorProvider(WebMvcEndpointHandlerMapping webMvcEndpointHan
194195
OperationCustomizer actuatorCustomizer(ActuatorProvider actuatorProvider) {
195196
return new ActuatorOperationCustomizer(actuatorProvider);
196197
}
198+
199+
/**
200+
* Actuator customizer OpenAPI customiser.
201+
*
202+
* @return the OpenAPI customiser
203+
*/
204+
@Bean
205+
@Lazy(false)
206+
OpenApiCustomiser actuatorOpenApiCustomiser() {
207+
return new ActuatorOpenApiCustomiser();
208+
}
197209
}
198210
}

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app126/HelloController.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,18 @@
1818

1919
package test.org.springdoc.api.app126;
2020

21-
import static org.springframework.http.MediaType.APPLICATION_PROBLEM_JSON_VALUE;
22-
import static org.springframework.http.ResponseEntity.ok;
23-
2421
import java.util.ArrayList;
2522
import java.util.Collection;
2623

24+
import io.swagger.v3.oas.annotations.Operation;
25+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
26+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
27+
2728
import org.springframework.http.ResponseEntity;
2829
import org.springframework.web.bind.annotation.GetMapping;
2930
import org.springframework.web.bind.annotation.RestController;
3031

31-
import io.swagger.v3.oas.annotations.Operation;
32-
import io.swagger.v3.oas.annotations.media.Content;
33-
import io.swagger.v3.oas.annotations.media.Schema;
34-
import io.swagger.v3.oas.annotations.responses.ApiResponse;
35-
import io.swagger.v3.oas.annotations.responses.ApiResponses;
32+
import static org.springframework.http.ResponseEntity.ok;
3633

3734
@RestController
3835
@ApiResponses(value = {

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app126/SecurityProblemResponsesConfiguration.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package test.org.springdoc.api.app126;
22

3-
import static org.springframework.http.MediaType.APPLICATION_PROBLEM_JSON_VALUE;
4-
53
import java.io.IOException;
64
import java.util.AbstractMap;
75
import java.util.Map;
86

9-
import org.springframework.beans.factory.parsing.Problem;
10-
import org.springframework.context.annotation.Bean;
11-
import org.springframework.context.annotation.Configuration;
12-
137
import io.swagger.v3.oas.models.media.Content;
148
import io.swagger.v3.oas.models.media.MediaType;
159
import io.swagger.v3.oas.models.media.Schema;
1610
import io.swagger.v3.oas.models.responses.ApiResponse;
1711

12+
import org.springframework.beans.factory.parsing.Problem;
13+
import org.springframework.context.annotation.Bean;
14+
import org.springframework.context.annotation.Configuration;
15+
16+
import static org.springframework.http.MediaType.APPLICATION_PROBLEM_JSON_VALUE;
17+
1818
/**
1919
* Configuration class defining standard OpenAPI Specification for operations
2020
*/

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app126/SpringDocApp126Test.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,12 @@
2828
import io.swagger.v3.core.converter.AnnotatedType;
2929
import io.swagger.v3.core.converter.ModelConverters;
3030
import io.swagger.v3.core.converter.ResolvedSchema;
31-
import io.swagger.v3.oas.models.media.Schema;
31+
import io.swagger.v3.oas.models.responses.ApiResponse;
3232
import org.springdoc.core.customizers.OpenApiCustomiser;
33+
import test.org.springdoc.api.AbstractSpringDocTest;
34+
3335
import org.springframework.boot.autoconfigure.SpringBootApplication;
3436
import org.springframework.context.annotation.Bean;
35-
import org.springframework.test.context.TestPropertySource;
36-
import org.springframework.util.Assert;
37-
38-
import io.swagger.v3.oas.models.responses.ApiResponse;
39-
import test.org.springdoc.api.AbstractSpringDocTest;
4037

4138

4239
/**

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app36/SpringDocApp36Test.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,19 @@
3131
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
3232
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
3333

34-
@TestPropertySource(properties = "springdoc.show-actuator=true")
34+
@TestPropertySource(properties = {
35+
"springdoc.show-actuator=true",
36+
"management.endpoints.web.exposure.include=*"})
3537
public class SpringDocApp36Test extends AbstractSpringDocTest {
3638

3739
@Test
3840
public void testApp() throws Exception {
3941
mockMvc.perform(get(Constants.DEFAULT_API_DOCS_URL)).andExpect(status().isOk())
40-
.andExpect(jsonPath("$.openapi", is("3.0.1"))).andExpect(jsonPath("$.paths./actuator/info.get.operationId", containsString("handle"))).andExpect(jsonPath("$.paths./actuator/health.get.operationId", containsString("handle")));
42+
.andExpect(jsonPath("$.openapi", is("3.0.1")))
43+
.andExpect(jsonPath("$.paths./actuator/info.get.operationId", containsString("handle")))
44+
.andExpect(jsonPath("$.paths./actuator/health.get.operationId", containsString("handle")))
45+
.andExpect(jsonPath("$.paths./actuator/metrics/{requiredMetricName}.get.parameters[0].in", is("path")))
46+
.andExpect(jsonPath("$.paths./actuator/metrics/{requiredMetricName}.get.parameters[0].name", is("requiredMetricName")));
4147
}
4248

4349
@SpringBootApplication

0 commit comments

Comments
 (0)