Skip to content

Commit 541ba93

Browse files
committed
don't use wrapper types in public api
1 parent 896a15b commit 541ba93

File tree

2 files changed

+93
-14
lines changed

2 files changed

+93
-14
lines changed

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@
66
package io.opentelemetry.instrumentation.api.internal;
77

88
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.api.common.AttributesBuilder;
910
import io.opentelemetry.api.trace.SpanKind;
1011
import io.opentelemetry.context.Context;
1112
import io.opentelemetry.context.propagation.TextMapGetter;
1213
import io.opentelemetry.context.propagation.TextMapSetter;
14+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1315
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1416
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1517
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
18+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
19+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
1620
import java.time.Instant;
21+
import java.util.function.Function;
22+
import java.util.function.UnaryOperator;
1723
import javax.annotation.Nullable;
1824

1925
/**
@@ -85,5 +91,72 @@ InstrumenterBuilder<REQUEST, RESPONSE> propagateOperationListenersToOnEnd(
8591
return builder;
8692
}
8793

94+
public static <REQUESTFROM, RESPONSEFROM, REQUESTTO, RESPONSETO>
95+
UnaryOperator<SpanStatusExtractor<REQUESTTO, RESPONSETO>> convertSpanStatusExtractor(
96+
UnaryOperator<SpanStatusExtractor<REQUESTFROM, RESPONSEFROM>> extractor,
97+
Function<REQUESTFROM, REQUESTTO> requestConverter,
98+
Function<RESPONSEFROM, RESPONSETO> responseConverter,
99+
Function<REQUESTTO, REQUESTFROM> requestReverseConverter,
100+
Function<RESPONSETO, RESPONSEFROM> responseReverseConverter) {
101+
return inputExtractor -> {
102+
SpanStatusExtractor<REQUESTFROM, RESPONSEFROM> outputExtractor =
103+
extractor.apply(
104+
(spanStatusBuilder, requestFrom, responseFrom, error) ->
105+
inputExtractor.extract(
106+
spanStatusBuilder,
107+
requestConverter.apply(requestFrom),
108+
responseFrom == null ? null : responseConverter.apply(responseFrom),
109+
error));
110+
return (spanStatusBuilder, requestTo, responseTo, error) ->
111+
outputExtractor.extract(
112+
spanStatusBuilder,
113+
requestReverseConverter.apply(requestTo),
114+
responseTo == null ? null : responseReverseConverter.apply(responseTo),
115+
error);
116+
};
117+
}
118+
119+
public static <REQUESTFROM, REQUESTTO>
120+
UnaryOperator<SpanNameExtractor<REQUESTTO>> convertSpanNameExtractor(
121+
UnaryOperator<SpanNameExtractor<REQUESTFROM>> extractor,
122+
Function<REQUESTFROM, REQUESTTO> requestConverter,
123+
Function<REQUESTTO, REQUESTFROM> requestReverseConverter) {
124+
return inputExtractor -> {
125+
SpanNameExtractor<REQUESTFROM> outputExtractor =
126+
extractor.apply(
127+
requestFrom -> inputExtractor.extract(requestConverter.apply(requestFrom)));
128+
return requestTo -> outputExtractor.extract(requestReverseConverter.apply(requestTo));
129+
};
130+
}
131+
132+
public static <REQUESTFROM, RESPONSEFROM, REQUESTTO, RESPONSETO>
133+
AttributesExtractor<REQUESTTO, RESPONSETO> convertAttributesExtractor(
134+
AttributesExtractor<REQUESTFROM, RESPONSEFROM> extractor,
135+
Function<REQUESTTO, REQUESTFROM> requestConverter,
136+
Function<RESPONSETO, RESPONSEFROM> responseConverter) {
137+
return new AttributesExtractor<REQUESTTO, RESPONSETO>() {
138+
@Override
139+
public void onStart(
140+
AttributesBuilder attributes, Context parentContext, REQUESTTO requestTo) {
141+
extractor.onStart(attributes, parentContext, requestConverter.apply(requestTo));
142+
}
143+
144+
@Override
145+
public void onEnd(
146+
AttributesBuilder attributes,
147+
Context context,
148+
REQUESTTO requestTo,
149+
@Nullable RESPONSETO responseTo,
150+
@Nullable Throwable error) {
151+
extractor.onEnd(
152+
attributes,
153+
context,
154+
requestConverter.apply(requestTo),
155+
responseConverter.apply(responseTo),
156+
error);
157+
}
158+
};
159+
}
160+
88161
private InstrumenterUtil() {}
89162
}

instrumentation/servlet/servlet-3.0/library/src/main/java/io/opentelemetry/instrumentation/servlet/v3_0/ServletTelemetryBuilder.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
package io.opentelemetry.instrumentation.servlet.v3_0;
77

8+
import static io.opentelemetry.instrumentation.api.internal.InstrumenterUtil.convertAttributesExtractor;
9+
import static io.opentelemetry.instrumentation.api.internal.InstrumenterUtil.convertSpanNameExtractor;
10+
import static io.opentelemetry.instrumentation.api.internal.InstrumenterUtil.convertSpanStatusExtractor;
11+
812
import com.google.errorprone.annotations.CanIgnoreReturnValue;
913
import io.opentelemetry.api.OpenTelemetry;
1014
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
@@ -56,12 +60,14 @@ public final class ServletTelemetryBuilder {
5660
/** Sets the status extractor for server spans. */
5761
@CanIgnoreReturnValue
5862
public ServletTelemetryBuilder setStatusExtractor(
59-
UnaryOperator<
60-
SpanStatusExtractor<
61-
ServletRequestContext<HttpServletRequest>,
62-
ServletResponseContext<HttpServletResponse>>>
63-
statusExtractor) {
64-
builder.setStatusExtractor(statusExtractor);
63+
UnaryOperator<SpanStatusExtractor<HttpServletRequest, HttpServletResponse>> statusExtractor) {
64+
builder.setStatusExtractor(
65+
convertSpanStatusExtractor(
66+
statusExtractor,
67+
ServletRequestContext::new,
68+
ServletResponseContext::new,
69+
ServletRequestContext::request,
70+
ServletResponseContext::response));
6571
return this;
6672
}
6773

@@ -71,11 +77,10 @@ public ServletTelemetryBuilder setStatusExtractor(
7177
*/
7278
@CanIgnoreReturnValue
7379
public ServletTelemetryBuilder addAttributesExtractor(
74-
AttributesExtractor<
75-
ServletRequestContext<HttpServletRequest>,
76-
ServletResponseContext<HttpServletResponse>>
77-
attributesExtractor) {
78-
builder.addAttributesExtractor(attributesExtractor);
80+
AttributesExtractor<HttpServletRequest, HttpServletResponse> attributesExtractor) {
81+
builder.addAttributesExtractor(
82+
convertAttributesExtractor(
83+
attributesExtractor, ServletRequestContext::request, ServletResponseContext::response));
7984
return this;
8085
}
8186

@@ -135,9 +140,10 @@ public ServletTelemetryBuilder setKnownMethods(Collection<String> knownMethods)
135140
/** Sets custom server {@link SpanNameExtractor} via transform function. */
136141
@CanIgnoreReturnValue
137142
public ServletTelemetryBuilder setSpanNameExtractor(
138-
UnaryOperator<SpanNameExtractor<ServletRequestContext<HttpServletRequest>>>
139-
serverSpanNameExtractor) {
140-
builder.setSpanNameExtractor(serverSpanNameExtractor);
143+
UnaryOperator<SpanNameExtractor<HttpServletRequest>> serverSpanNameExtractor) {
144+
builder.setSpanNameExtractor(
145+
convertSpanNameExtractor(
146+
serverSpanNameExtractor, ServletRequestContext::new, ServletRequestContext::request));
141147
return this;
142148
}
143149

0 commit comments

Comments
 (0)