Skip to content
This repository was archived by the owner on Dec 23, 2023. It is now read-only.

Commit ffd8c07

Browse files
authored
Provide an api to configure propagation for spring servlet and client (#1924)
* Provide an api to configure propagation method for spring servlet and client. * fix checkerframework error. * use enum for propagation. * use javax.annotations.Nullable
1 parent 2375b22 commit ffd8c07

4 files changed

Lines changed: 127 additions & 9 deletions

File tree

contrib/spring/src/main/java/io/opencensus/contrib/spring/autoconfig/OpenCensusProperties.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package io.opencensus.contrib.spring.autoconfig;
1818

19+
import static io.opencensus.contrib.spring.autoconfig.OpenCensusProperties.Trace.Propagation.TRACE_PROPAGATION_TRACE_CONTEXT;
20+
1921
import org.springframework.boot.context.properties.ConfigurationProperties;
2022

2123
/**
@@ -27,6 +29,7 @@
2729
public class OpenCensusProperties {
2830

2931
private boolean enabled = true;
32+
private Trace trace = new Trace();
3033

3134
public boolean isEnabled() {
3235
return this.enabled;
@@ -35,4 +38,55 @@ public boolean isEnabled() {
3538
public void setEnabled(boolean enabled) {
3639
this.enabled = enabled;
3740
}
41+
42+
public Trace getTrace() {
43+
return this.trace;
44+
}
45+
46+
public void setTrace(Trace trace) {
47+
this.trace = trace;
48+
}
49+
50+
/**
51+
* Trace properties.
52+
*
53+
* @since 0.23
54+
*/
55+
public static final class Trace {
56+
57+
public enum Propagation {
58+
/**
59+
* Specifies Trace Context format for span context propagation.
60+
*
61+
* @since 0.23
62+
*/
63+
TRACE_PROPAGATION_TRACE_CONTEXT,
64+
65+
/**
66+
* Specifies B3 format for span context propagation.
67+
*
68+
* @since 0.23
69+
*/
70+
TRACE_PROPAGATION_B3,
71+
}
72+
73+
private Propagation propagation = TRACE_PROPAGATION_TRACE_CONTEXT;
74+
private boolean publicEndpoint = false;
75+
76+
public Propagation getPropagation() {
77+
return propagation;
78+
}
79+
80+
public void setPropagation(Propagation propagation) {
81+
this.propagation = propagation;
82+
}
83+
84+
public boolean isPublicEndpoint() {
85+
return publicEndpoint;
86+
}
87+
88+
public void setPublicEndpoint(boolean publicEndpoint) {
89+
this.publicEndpoint = publicEndpoint;
90+
}
91+
}
3892
}

contrib/spring/src/main/java/io/opencensus/contrib/spring/autoconfig/TraceWebAsyncClientAutoConfiguration.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,18 @@
1717
package io.opencensus.contrib.spring.autoconfig;
1818

1919
import io.opencensus.common.ExperimentalApi;
20+
import io.opencensus.contrib.http.HttpExtractor;
21+
import io.opencensus.contrib.spring.autoconfig.OpenCensusProperties.Trace;
22+
import io.opencensus.contrib.spring.autoconfig.OpenCensusProperties.Trace.Propagation;
2023
import io.opencensus.contrib.spring.instrument.web.client.TracingAsyncClientHttpRequestInterceptor;
24+
import io.opencensus.trace.Tracing;
25+
import io.opencensus.trace.propagation.TextFormat;
2126
import java.util.ArrayList;
2227
import java.util.Collection;
2328
import java.util.List;
2429
import javax.annotation.PostConstruct;
2530
import org.springframework.beans.factory.annotation.Autowired;
31+
import org.springframework.beans.factory.annotation.Value;
2632
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2733
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2834
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -31,6 +37,8 @@
3137
import org.springframework.context.annotation.Bean;
3238
import org.springframework.context.annotation.ComponentScan;
3339
import org.springframework.context.annotation.Configuration;
40+
import org.springframework.http.HttpRequest;
41+
import org.springframework.http.client.ClientHttpResponse;
3442

3543
/**
3644
* {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration Auto-configuration} enables
@@ -49,12 +57,26 @@
4957
public class TraceWebAsyncClientAutoConfiguration {
5058
@Configuration
5159
@ConditionalOnBean(org.springframework.web.client.AsyncRestTemplate.class)
60+
@SuppressWarnings("initialization.fields.uninitialized")
5261
static class AsyncRestTemplateCfg {
5362

63+
@Value("${opencensus.spring.trace.propagation:TRACE_PROPAGATION_TRACE_CONTEXT}")
64+
private Trace.Propagation propagation;
65+
66+
@Autowired(required = false)
67+
HttpExtractor<HttpRequest, ClientHttpResponse> extractor;
68+
5469
@Bean
5570
public TracingAsyncClientHttpRequestInterceptor asyncTracingClientHttpRequestInterceptor() {
71+
TextFormat propagator;
72+
73+
if (propagation != null && propagation == Propagation.TRACE_PROPAGATION_B3) {
74+
propagator = Tracing.getPropagationComponent().getB3Format();
75+
} else {
76+
propagator = Tracing.getPropagationComponent().getTraceContextFormat();
77+
}
5678
return (TracingAsyncClientHttpRequestInterceptor)
57-
TracingAsyncClientHttpRequestInterceptor.create();
79+
TracingAsyncClientHttpRequestInterceptor.create(propagator, extractor);
5880
}
5981
}
6082

contrib/spring/src/main/java/io/opencensus/contrib/spring/instrument/web/HttpServletFilter.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,38 @@
1919
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2020
import io.opencensus.contrib.http.servlet.OcHttpServletFilter;
2121
import io.opencensus.contrib.spring.autoconfig.OpenCensusAutoConfiguration;
22+
import io.opencensus.contrib.spring.autoconfig.OpenCensusProperties.Trace;
23+
import io.opencensus.contrib.spring.autoconfig.OpenCensusProperties.Trace.Propagation;
24+
import io.opencensus.trace.Tracing;
2225
import javax.servlet.Filter;
26+
import javax.servlet.FilterConfig;
27+
import javax.servlet.ServletContext;
28+
import javax.servlet.ServletException;
29+
import org.springframework.beans.factory.annotation.Value;
2330
import org.springframework.core.annotation.Order;
2431
import org.springframework.stereotype.Component;
2532

2633
@Component
2734
@Order(OpenCensusAutoConfiguration.TRACE_FILTER_ORDER)
2835
@SuppressFBWarnings("RI_REDUNDANT_INTERFACES")
29-
public class HttpServletFilter extends OcHttpServletFilter implements Filter {}
36+
@SuppressWarnings("initialization.fields.uninitialized")
37+
public class HttpServletFilter extends OcHttpServletFilter implements Filter {
38+
39+
@Value("${opencensus.spring.trace.propagation:TRACE_PROPAGATION_TRACE_CONTEXT}")
40+
private Trace.Propagation propagation;
41+
42+
@Value("${opencensus.spring.trace.publicEndpoint:false}")
43+
private Boolean publicEndpoint;
44+
45+
@Override
46+
public void init(FilterConfig filterConfig) throws ServletException {
47+
ServletContext context = filterConfig.getServletContext();
48+
if (propagation != null && propagation == Propagation.TRACE_PROPAGATION_B3) {
49+
context.setAttribute(OC_TRACE_PROPAGATOR, Tracing.getPropagationComponent().getB3Format());
50+
}
51+
if (publicEndpoint) {
52+
context.setInitParameter(OC_PUBLIC_ENDPOINT, publicEndpoint.toString());
53+
}
54+
super.init(filterConfig);
55+
}
56+
}

contrib/spring/src/main/java/io/opencensus/contrib/spring/instrument/web/client/TracingAsyncClientHttpRequestInterceptor.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.opencensus.contrib.http.HttpRequestContext;
2424
import io.opencensus.trace.Tracer;
2525
import io.opencensus.trace.Tracing;
26+
import io.opencensus.trace.propagation.TextFormat;
2627
import io.opencensus.trace.propagation.TextFormat.Setter;
2728
import java.io.IOException;
2829
import java.net.MalformedURLException;
@@ -57,22 +58,36 @@ public void put(HttpRequest carrier, String key, String value) {
5758
/**
5859
* Create an instance of {@code TracingAsyncClientHttpRequestInterceptor}.
5960
*
61+
* @param extractor {@link HttpExtractor} to extract request and response specific attributes. If
62+
* it is null then default extractor is used.
63+
* @param propagator {@link TextFormat} to propagate trace context to remote peer. If it is null
64+
* then default propagator (TraceContextFormat) is used.
6065
* @return {@code TracingAsyncClientHttpRequestInterceptor}
6166
* @since 0.23.0
6267
*/
63-
public static TracingAsyncClientHttpRequestInterceptor create() {
64-
return new TracingAsyncClientHttpRequestInterceptor();
68+
public static TracingAsyncClientHttpRequestInterceptor create(
69+
@Nullable TextFormat propagator,
70+
@Nullable HttpExtractor<HttpRequest, ClientHttpResponse> extractor) {
71+
return new TracingAsyncClientHttpRequestInterceptor(propagator, extractor);
6572
}
6673

67-
TracingAsyncClientHttpRequestInterceptor() {
74+
TracingAsyncClientHttpRequestInterceptor(
75+
@Nullable TextFormat propagator,
76+
@Nullable HttpExtractor<HttpRequest, ClientHttpResponse> extractor) {
6877

6978
tracer = Tracing.getTracer();
79+
80+
if (propagator == null) {
81+
propagator = Tracing.getPropagationComponent().getTraceContextFormat();
82+
}
83+
84+
if (extractor == null) {
85+
extractor = (HttpExtractor<HttpRequest, ClientHttpResponse>) new HttpClientExtractor();
86+
}
87+
7088
handler =
7189
new HttpClientHandler<HttpRequest, ClientHttpResponse, HttpRequest>(
72-
Tracing.getTracer(),
73-
new HttpClientExtractor(),
74-
Tracing.getPropagationComponent().getTraceContextFormat(),
75-
setter);
90+
Tracing.getTracer(), extractor, propagator, setter);
7691
}
7792

7893
/**

0 commit comments

Comments
 (0)