Skip to content

Commit 84c351a

Browse files
author
Fredrich Ombico
committed
Refactor to use the actuator path set in properties
- Also cleaned up code and warnings
1 parent 8157363 commit 84c351a

File tree

4 files changed

+49
-40
lines changed

4 files changed

+49
-40
lines changed

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import reactor.core.publisher.Flux;
3333
import reactor.core.publisher.Mono;
3434

35+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
3536
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
3637
import org.springframework.cloud.gateway.filter.FilterDefinition;
3738
import org.springframework.cloud.gateway.filter.GlobalFilter;
@@ -71,8 +72,6 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis
7172

7273
private static final Log log = LogFactory.getLog(GatewayControllerEndpoint.class);
7374

74-
private static final String ENDPOINT_PREFIX = "/actuator/gateway";
75-
7675
protected RouteDefinitionLocator routeDefinitionLocator;
7776

7877
protected List<GlobalFilter> globalFilters;
@@ -88,25 +87,55 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis
8887

8988
protected ApplicationEventPublisher publisher;
9089

90+
protected WebEndpointProperties webEndpointProperties;
91+
92+
private final SimpleMetadataReaderFactory simpleMetadataReaderFactory = new SimpleMetadataReaderFactory();
93+
9194
public AbstractGatewayControllerEndpoint(RouteDefinitionLocator routeDefinitionLocator,
9295
List<GlobalFilter> globalFilters, List<GatewayFilterFactory> gatewayFilters,
9396
List<RoutePredicateFactory> routePredicates, RouteDefinitionWriter routeDefinitionWriter,
94-
RouteLocator routeLocator) {
97+
RouteLocator routeLocator, WebEndpointProperties webEndpointProperties) {
9598
this.routeDefinitionLocator = routeDefinitionLocator;
9699
this.globalFilters = globalFilters;
97100
this.GatewayFilters = gatewayFilters;
98101
this.routePredicates = routePredicates;
99102
this.routeDefinitionWriter = routeDefinitionWriter;
100103
this.routeLocator = routeLocator;
104+
this.webEndpointProperties = webEndpointProperties;
105+
}
106+
107+
@GetMapping("/")
108+
Mono<List<GatewayEndpointInfo>> getEndpoints() {
109+
List<GatewayEndpointInfo> endpoints = mergeEndpoints(
110+
getAvailableEndpointsForClass(AbstractGatewayControllerEndpoint.class.getName()),
111+
getAvailableEndpointsForClass(GatewayControllerEndpoint.class.getName()));
112+
113+
return Flux.fromIterable(endpoints).map(p -> p)
114+
.flatMap(path -> this.routeLocator.getRoutes().map(r -> generateHref(r, path)).distinct().collectList()
115+
.flatMapMany(Flux::fromIterable))
116+
.distinct() // Ensure overall uniqueness
117+
.collectList();
118+
}
119+
120+
private List<GatewayEndpointInfo> mergeEndpoints(List<GatewayEndpointInfo> listA,
121+
List<GatewayEndpointInfo> listB) {
122+
Map<String, List<String>> mergedMap = new HashMap<>();
123+
124+
Stream.concat(listA.stream(), listB.stream()).forEach(e -> mergedMap
125+
.computeIfAbsent(e.getHref(), k -> new ArrayList<>()).addAll(Arrays.asList(e.getMethods())));
126+
127+
return mergedMap.entrySet().stream().map(entry -> new GatewayEndpointInfo(entry.getKey(), entry.getValue()))
128+
.collect(Collectors.toList());
101129
}
102130

103131
private List<GatewayEndpointInfo> getAvailableEndpointsForClass(String className) {
104132
try {
105-
MetadataReader metadataReader = new SimpleMetadataReaderFactory().getMetadataReader(className);
133+
MetadataReader metadataReader = simpleMetadataReaderFactory.getMetadataReader(className);
106134
Set<MethodMetadata> annotatedMethods = metadataReader.getAnnotationMetadata()
107135
.getAnnotatedMethods(RequestMapping.class.getName());
108136

109-
return annotatedMethods.stream().map(method -> new GatewayEndpointInfo(ENDPOINT_PREFIX
137+
String gatewayActuatorPath = webEndpointProperties.getBasePath() + "/gateway";
138+
return annotatedMethods.stream().map(method -> new GatewayEndpointInfo(gatewayActuatorPath
110139
+ ((String[]) method.getAnnotationAttributes(RequestMapping.class.getName()).get("path"))[0],
111140
((RequestMethod[]) method.getAnnotationAttributes(RequestMapping.class.getName()).get("method"))[0]
112141
.name()))
@@ -118,35 +147,10 @@ private List<GatewayEndpointInfo> getAvailableEndpointsForClass(String className
118147
}
119148
}
120149

121-
public static List<GatewayEndpointInfo> mergeEndpoints(List<GatewayEndpointInfo> listA,
122-
List<GatewayEndpointInfo> listB) {
123-
Map<String, List<String>> mergedMap = new HashMap<>();
124-
125-
Stream.concat(listA.stream(), listB.stream()).forEach(e -> mergedMap
126-
.computeIfAbsent(e.getHref(), k -> new ArrayList<>()).addAll(Arrays.asList(e.getMethods())));
127-
128-
return mergedMap.entrySet().stream().map(entry -> new GatewayEndpointInfo(entry.getKey(), entry.getValue()))
129-
.collect(Collectors.toList());
130-
}
131-
132-
GatewayEndpointInfo generateHref(Route r, GatewayEndpointInfo path) {
150+
private GatewayEndpointInfo generateHref(Route r, GatewayEndpointInfo path) {
133151
return new GatewayEndpointInfo(path.getHref().replace("{id}", r.getId()), Arrays.asList(path.getMethods()));
134152
}
135153

136-
@GetMapping("/")
137-
public Mono<List<GatewayEndpointInfo>> getEndpoints() {
138-
List<GatewayEndpointInfo> endpoints = mergeEndpoints(
139-
getAvailableEndpointsForClass(AbstractGatewayControllerEndpoint.class.getName()),
140-
getAvailableEndpointsForClass(GatewayControllerEndpoint.class.getName()));
141-
142-
return Flux.fromIterable(endpoints).map(p -> p)
143-
.flatMap(path -> this.routeLocator.getRoutes().map(r -> generateHref(r, path)).distinct().collectList()
144-
.flatMapMany(Flux::fromIterable))
145-
.distinct() // Ensure overall uniqueness
146-
.collectList();
147-
148-
}
149-
150154
@Override
151155
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
152156
this.publisher = publisher;

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpoint.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import reactor.core.publisher.Flux;
2525
import reactor.core.publisher.Mono;
2626

27+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
2728
import org.springframework.boot.actuate.endpoint.web.annotation.RestControllerEndpoint;
2829
import org.springframework.cloud.gateway.filter.GatewayFilter;
2930
import org.springframework.cloud.gateway.filter.GlobalFilter;
@@ -47,9 +48,10 @@ public class GatewayControllerEndpoint extends AbstractGatewayControllerEndpoint
4748

4849
public GatewayControllerEndpoint(List<GlobalFilter> globalFilters, List<GatewayFilterFactory> gatewayFilters,
4950
List<RoutePredicateFactory> routePredicates, RouteDefinitionWriter routeDefinitionWriter,
50-
RouteLocator routeLocator, RouteDefinitionLocator routeDefinitionLocator) {
51-
super(routeDefinitionLocator, globalFilters, gatewayFilters, routePredicates, routeDefinitionWriter,
52-
routeLocator);
51+
RouteLocator routeLocator, RouteDefinitionLocator routeDefinitionLocator,
52+
WebEndpointProperties webEndpointProperties) {
53+
super(routeDefinitionLocator, globalFilters, gatewayFilters, routePredicates,
54+
routeDefinitionWriter, routeLocator, webEndpointProperties);
5355
}
5456

5557
@GetMapping("/routedefinitions")

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayLegacyControllerEndpoint.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import reactor.core.publisher.Mono;
2525

26+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
2627
import org.springframework.boot.actuate.endpoint.web.annotation.RestControllerEndpoint;
2728
import org.springframework.cloud.gateway.filter.GatewayFilter;
2829
import org.springframework.cloud.gateway.filter.GlobalFilter;
@@ -47,9 +48,9 @@ public class GatewayLegacyControllerEndpoint extends AbstractGatewayControllerEn
4748
public GatewayLegacyControllerEndpoint(RouteDefinitionLocator routeDefinitionLocator,
4849
List<GlobalFilter> globalFilters, List<GatewayFilterFactory> gatewayFilterFactories,
4950
List<RoutePredicateFactory> routePredicates, RouteDefinitionWriter routeDefinitionWriter,
50-
RouteLocator routeLocator) {
51+
RouteLocator routeLocator, WebEndpointProperties webEndpointProperties) {
5152
super(routeDefinitionLocator, globalFilters, gatewayFilterFactories, routePredicates, routeDefinitionWriter,
52-
routeLocator);
53+
routeLocator, webEndpointProperties);
5354
}
5455

5556
@GetMapping("/routes")

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.beans.factory.ObjectProvider;
4141
import org.springframework.beans.factory.annotation.Qualifier;
4242
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
43+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
4344
import org.springframework.boot.actuate.health.Health;
4445
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
4546
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
@@ -817,9 +818,9 @@ protected static class GatewayActuatorConfiguration {
817818
public GatewayControllerEndpoint gatewayControllerEndpoint(List<GlobalFilter> globalFilters,
818819
List<GatewayFilterFactory> gatewayFilters, List<RoutePredicateFactory> routePredicates,
819820
RouteDefinitionWriter routeDefinitionWriter, RouteLocator routeLocator,
820-
RouteDefinitionLocator routeDefinitionLocator) {
821+
RouteDefinitionLocator routeDefinitionLocator, WebEndpointProperties webEndpointProperties) {
821822
return new GatewayControllerEndpoint(globalFilters, gatewayFilters, routePredicates, routeDefinitionWriter,
822-
routeLocator, routeDefinitionLocator);
823+
routeLocator, routeDefinitionLocator, webEndpointProperties);
823824
}
824825

825826
@Bean
@@ -828,9 +829,10 @@ public GatewayControllerEndpoint gatewayControllerEndpoint(List<GlobalFilter> gl
828829
public GatewayLegacyControllerEndpoint gatewayLegacyControllerEndpoint(
829830
RouteDefinitionLocator routeDefinitionLocator, List<GlobalFilter> globalFilters,
830831
List<GatewayFilterFactory> gatewayFilters, List<RoutePredicateFactory> routePredicates,
831-
RouteDefinitionWriter routeDefinitionWriter, RouteLocator routeLocator) {
832+
RouteDefinitionWriter routeDefinitionWriter, RouteLocator routeLocator,
833+
WebEndpointProperties webEndpointProperties) {
832834
return new GatewayLegacyControllerEndpoint(routeDefinitionLocator, globalFilters, gatewayFilters,
833-
routePredicates, routeDefinitionWriter, routeLocator);
835+
routePredicates, routeDefinitionWriter, routeLocator, webEndpointProperties);
834836
}
835837

836838
}

0 commit comments

Comments
 (0)