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 @@ + + + + + opentracing-spring-cloud-parent + io.opentracing.contrib + 0.3.3-SNAPSHOT + ../../ + + 4.0.0 + + opentracing-spring-cloud-gateway-starter + + + ${project.basedir}/../.. + + + + + io.opentracing.contrib + opentracing-spring-tracer-configuration-starter + + + + io.opentracing.contrib + opentracing-spring-web-starter + ${version.io.opentracing.contrib-opentracing-spring-web} + + + + org.springframework.cloud + spring-cloud-starter-gateway + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + diff --git a/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/java/io/opentracing/contrib/spring/cloud/gateway/GatewayAutoConfiguration.java b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/java/io/opentracing/contrib/spring/cloud/gateway/GatewayAutoConfiguration.java new file mode 100644 index 00000000..d68af361 --- /dev/null +++ b/instrument-starters/opentracing-spring-cloud-gateway-starter/src/main/java/io/opentracing/contrib/spring/cloud/gateway/GatewayAutoConfiguration.java @@ -0,0 +1,50 @@ +/** + * 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 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 @@ instrument-starters/opentracing-spring-cloud-jdbc-starter instrument-starters/opentracing-spring-cloud-jms-starter instrument-starters/opentracing-spring-cloud-feign-starter + instrument-starters/opentracing-spring-cloud-gateway-starter instrument-starters/opentracing-spring-cloud-mongo-starter instrument-starters/opentracing-spring-cloud-websocket-starter instrument-starters/opentracing-spring-cloud-zuul-starter