Compare commits

...

3 Commits

Author SHA1 Message Date
Marcin Grzejszczak c3080f4957
Added TracingProperties bean 2 years ago
Marcin Grzejszczak f26e715c9e
Added missing conditional 2 years ago
Marcin Grzejszczak 31f44f562e Shouldn't remove remote fields from gateway propagation 2 years ago
  1. 8
      spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayMetricsAutoConfiguration.java
  2. 13
      spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandler.java
  3. 6
      spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayMetricsAutoConfigurationTests.java
  4. 9
      spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/B3BraveObservedHttpHeadersFilterTests.java
  5. 6
      spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandlerTests.java
  6. 3
      spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservedHttpHeadersFilterTests.java

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

@ -27,6 +27,7 @@ import org.springframework.beans.factory.ObjectProvider; @@ -27,6 +27,7 @@ import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.tracing.TracingProperties;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@ -134,11 +135,12 @@ public class GatewayMetricsAutoConfiguration { @@ -134,11 +135,12 @@ public class GatewayMetricsAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(Propagator.class)
@ConditionalOnBean({ Propagator.class, TracingProperties.class })
@Order(Ordered.HIGHEST_PRECEDENCE + 5)
GatewayPropagatingSenderTracingObservationHandler gatewayPropagatingSenderTracingObservationHandler(
Tracer tracer, Propagator propagator) {
return new GatewayPropagatingSenderTracingObservationHandler(tracer, propagator);
Tracer tracer, Propagator propagator, TracingProperties tracingProperties) {
return new GatewayPropagatingSenderTracingObservationHandler(tracer, propagator,
tracingProperties.getBaggage().getRemoteFields());
}
}

13
spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandler.java

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.cloud.gateway.filter.headers.observation;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import io.micrometer.observation.Observation;
@ -34,19 +36,26 @@ public class GatewayPropagatingSenderTracingObservationHandler @@ -34,19 +36,26 @@ public class GatewayPropagatingSenderTracingObservationHandler
private final Propagator propagator;
private final List<String> remoteFieldsLowerCase;
/**
* Creates a new instance of {@link PropagatingSenderTracingObservationHandler}.
* @param tracer the tracer to use to record events
* @param propagator the mechanism to propagate tracing information into the carrier
* @param remoteFields remote fields to be propagated over the wire
*/
public GatewayPropagatingSenderTracingObservationHandler(Tracer tracer, Propagator propagator) {
public GatewayPropagatingSenderTracingObservationHandler(Tracer tracer, Propagator propagator,
List<String> remoteFields) {
super(tracer, propagator);
this.propagator = propagator;
this.remoteFieldsLowerCase = remoteFields.stream().map(s -> s.toLowerCase(Locale.ROOT)).toList();
}
@Override
public void onStart(GatewayContext context) {
this.propagator.fields().forEach(s -> Objects.requireNonNull(context.getCarrier()).remove(s));
this.propagator.fields().stream()
.filter(field -> !remoteFieldsLowerCase.contains(field.toLowerCase(Locale.ROOT)))
.forEach(s -> Objects.requireNonNull(context.getCarrier()).remove(s));
super.onStart(context);
}

6
spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayMetricsAutoConfigurationTests.java

@ -29,6 +29,7 @@ import org.mockito.Mockito; @@ -29,6 +29,7 @@ import org.mockito.Mockito;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.actuate.autoconfigure.tracing.TracingProperties;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability;
import org.springframework.boot.test.context.SpringBootTest;
@ -178,6 +179,11 @@ public class GatewayMetricsAutoConfigurationTests { @@ -178,6 +179,11 @@ public class GatewayMetricsAutoConfigurationTests {
return Mockito.mock(Propagator.class);
}
@Bean
TracingProperties tracingProperties() {
return new TracingProperties();
}
}
@SpringBootConfiguration

9
spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/B3BraveObservedHttpHeadersFilterTests.java

@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
package org.springframework.cloud.gateway.filter.headers.observation;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -67,9 +68,11 @@ class B3BraveObservedHttpHeadersFilterTests { @@ -67,9 +68,11 @@ class B3BraveObservedHttpHeadersFilterTests {
void shouldWorkWithB3SingleHeader() {
TestObservationRegistry observationRegistry = TestObservationRegistry.create();
observationRegistry.observationConfig()
.observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(
new GatewayPropagatingSenderTracingObservationHandler(tracer, propagator),
new DefaultTracingObservationHandler(tracer)));
.observationHandler(
new ObservationHandler.FirstMatchingCompositeObservationHandler(
new GatewayPropagatingSenderTracingObservationHandler(tracer, propagator,
Collections.singletonList("X-A")),
new DefaultTracingObservationHandler(tracer)));
Observation.createNotStarted("parent", observationRegistry).observe(() -> {
// given

6
spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandlerTests.java

@ -55,7 +55,7 @@ class GatewayPropagatingSenderTracingObservationHandlerTests { @@ -55,7 +55,7 @@ class GatewayPropagatingSenderTracingObservationHandlerTests {
};
GatewayPropagatingSenderTracingObservationHandler handler = new GatewayPropagatingSenderTracingObservationHandler(
tracer, propagator);
tracer, propagator, Collections.singletonList("remote"));
@Test
void shouldRemovePropagationFieldsFromTheRequestBeforePropagating() {
@ -63,13 +63,15 @@ class GatewayPropagatingSenderTracingObservationHandlerTests { @@ -63,13 +63,15 @@ class GatewayPropagatingSenderTracingObservationHandlerTests {
headers.put("foo", Collections.singletonList("foo value"));
headers.put("bar", Collections.singletonList("bar value"));
headers.put("baz", Collections.singletonList("baz value"));
headers.put("remote", Collections.singletonList("remote value"));
MockServerHttpRequest request = MockServerHttpRequest.get("/get").build();
MockServerWebExchange serverWebExchange = MockServerWebExchange.from(request);
GatewayContext gatewayContext = new GatewayContext(headers, request, serverWebExchange);
handler.onStart(gatewayContext);
then(headers).doesNotContainKeys("foo", "bar").containsEntry("baz", Collections.singletonList("baz value"));
then(headers).doesNotContainKeys("foo", "bar").containsEntry("baz", Collections.singletonList("baz value"))
.containsEntry("remote", Collections.singletonList("remote value"));
}
}

3
spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservedHttpHeadersFilterTests.java

@ -100,7 +100,8 @@ public class ObservedHttpHeadersFilterTests extends SampleTestRunner { @@ -100,7 +100,8 @@ public class ObservedHttpHeadersFilterTests extends SampleTestRunner {
@Override
public BiConsumer<BuildingBlocks, Deque<ObservationHandler<? extends Observation.Context>>> customizeObservationHandlers() {
return (bb, observationHandlers) -> observationHandlers
.addFirst(new GatewayPropagatingSenderTracingObservationHandler(bb.getTracer(), bb.getPropagator()));
.addFirst(new GatewayPropagatingSenderTracingObservationHandler(bb.getTracer(), bb.getPropagator(),
Collections.emptyList()));
}
}

Loading…
Cancel
Save