diff --git a/instrument-starters/opentracing-spring-cloud-gateway-starter/pom.xml b/instrument-starters/opentracing-spring-cloud-gateway-starter/pom.xml
new file mode 100644
index 00000000..d6b5229c
--- /dev/null
+++ b/instrument-starters/opentracing-spring-cloud-gateway-starter/pom.xml
@@ -0,0 +1,57 @@
+
+
+
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + *
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package io.opentracing.contrib.spring.cloud.gateway; + +import io.opentracing.Tracer; +import io.opentracing.contrib.spring.cloud.gateway.propagation.TextMapAdapter; +import io.opentracing.contrib.spring.tracer.configuration.TracerAutoConfiguration; +import io.opentracing.propagation.Format; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.server.reactive.ServerHttpRequest; + +@Configuration +@ConditionalOnWebApplication +@ConditionalOnBean(Tracer.class) +@AutoConfigureAfter(TracerAutoConfiguration.class) +@ConditionalOnClass(GatewayFilter.class) +@ConditionalOnProperty(name = "opentracing.spring.cloud.gateway.enabled", havingValue = "true", matchIfMissing = true) +public class GatewayAutoConfiguration { + @Bean + public GlobalFilter traceIdTransfer(Tracer tracer) { + return (exchange, chain) -> { + ServerHttpRequest request = exchange.getRequest(); + ServerHttpRequest.Builder requestBuilder = request.mutate(); + + tracer.inject(tracer.activeSpan().context(), Format.Builtin.HTTP_HEADERS, + new TextMapAdapter(request, requestBuilder)); + + return chain.filter(exchange.mutate().request(requestBuilder.build()).build()); + }; + } +} diff --git a/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/java/io/opentracing/contrib/spring/cloud/gateway/propagation/TextMapAdapter.java b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/java/io/opentracing/contrib/spring/cloud/gateway/propagation/TextMapAdapter.java new file mode 100644 index 00000000..5ac44362 --- /dev/null +++ b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/java/io/opentracing/contrib/spring/cloud/gateway/propagation/TextMapAdapter.java @@ -0,0 +1,20 @@ +package io.opentracing.contrib.spring.cloud.gateway.propagation; + +import io.opentracing.propagation.TextMap; +import io.opentracing.propagation.TextMapExtractAdapter; +import org.springframework.http.server.reactive.ServerHttpRequest; + +public class TextMapAdapter extends TextMapExtractAdapter implements TextMap { + private ServerHttpRequest.Builder requestBuilder; + + public TextMapAdapter(ServerHttpRequest serverHttpRequest, ServerHttpRequest.Builder requestBuilder) { + super(serverHttpRequest.getHeaders().toSingleValueMap()); + this.requestBuilder = requestBuilder; + } + + @Override + public void put(String key, String value) { + this.requestBuilder.header(key, value); + } +} + diff --git a/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 00000000..577f64d2 --- /dev/null +++ b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,10 @@ +{ + "properties": [ + { + "name": "opentracing.spring.cloud.gateway.enabled", + "type": "java.lang.Boolean", + "description": "Enable Gateway tracing.", + "defaultValue": true + } + ] +} diff --git a/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/resources/META-INF/spring.factories b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..8d795991 --- /dev/null +++ b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +io.opentracing.contrib.spring.cloud.gateway.GatewayAutoConfiguration diff --git a/instrument-starters/opentracing-spring-cloud-gateway-starter/src/test/java/io/opentracing/contrib/spring/cloud/gateway/TestController.java b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/test/java/io/opentracing/contrib/spring/cloud/gateway/TestController.java new file mode 100644 index 00000000..00b6186c --- /dev/null +++ b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/test/java/io/opentracing/contrib/spring/cloud/gateway/TestController.java @@ -0,0 +1,34 @@ +/** + * Copyright 2017-2018 The OpenTracing Authors + *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + *
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package io.opentracing.contrib.spring.cloud.gateway;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Ales Justin
+ */
+@RestController
+public class TestController {
+
+ @RequestMapping("/hello")
+ public String hello() {
+ return "Hello";
+ }
+
+ @RequestMapping("/notTraced")
+ public String notTraced() {
+ return "Not traced";
+ }
+}
diff --git a/pom.xml b/pom.xml
index df387be6..2c9bce23 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,6 +26,7 @@