Skip to content

Commit 4530a63

Browse files
committed
address comments
1 parent d0dc3f9 commit 4530a63

File tree

14 files changed

+102
-100
lines changed

14 files changed

+102
-100
lines changed
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,20 @@
55

66
package io.opentelemetry.javaagent.instrumentation.httpserver;
77

8-
import static java.util.Arrays.asList;
9-
108
import com.google.auto.service.AutoService;
119
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1210
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
11+
import java.util.Collections;
1312
import java.util.List;
1413

1514
@AutoService(InstrumentationModule.class)
16-
public class JdkHttpServerInstrumentationModule extends InstrumentationModule {
17-
public JdkHttpServerInstrumentationModule() {
15+
public class JavaHttpServerInstrumentationModule extends InstrumentationModule {
16+
public JavaHttpServerInstrumentationModule() {
1817
super("java-http-server");
1918
}
2019

2120
@Override
2221
public List<TypeInstrumentation> typeInstrumentations() {
23-
return asList(new JdkServerContextInstrumentation());
22+
return Collections.singletonList(new JavaServerContextInstrumentation());
2423
}
2524
}
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,38 @@
55

66
package io.opentelemetry.javaagent.instrumentation.httpserver;
77

8+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass;
89
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
910
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1011
import static net.bytebuddy.matcher.ElementMatchers.named;
1112

1213
import com.sun.net.httpserver.HttpContext;
13-
import com.sun.net.httpserver.HttpServer;
1414
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1515
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1616
import net.bytebuddy.asm.Advice;
1717
import net.bytebuddy.description.type.TypeDescription;
1818
import net.bytebuddy.matcher.ElementMatcher;
1919

20-
public class JdkServerContextInstrumentation implements TypeInstrumentation {
20+
public class JavaServerContextInstrumentation implements TypeInstrumentation {
2121

2222
@Override
2323
public ElementMatcher<TypeDescription> typeMatcher() {
24-
return named(HttpServer.class.getName());
24+
return extendsClass(named("com.sun.net.httpserver.HttpServer"));
2525
}
2626

2727
@Override
2828
public void transform(TypeTransformer transformer) {
2929
transformer.applyAdviceToMethod(
3030
isMethod().and(isPublic()).and(named("createContext")),
31-
this.getClass().getName() + "$BuildAdvice");
31+
JavaServerContextInstrumentation.class.getName() + "$BuildAdvice");
3232
}
3333

34+
@SuppressWarnings("unused")
3435
public static class BuildAdvice {
3536

3637
@Advice.OnMethodExit
3738
public static void onExit(@Advice.Return HttpContext ctx) {
38-
ctx.getFilters().addAll(JdkSingletons.SERVER_DECORATOR);
39+
ctx.getFilters().addAll(JavaSingletons.FILTERS);
3940
}
4041
}
4142
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.httpserver;
7+
8+
import com.sun.net.httpserver.Filter;
9+
import io.opentelemetry.api.GlobalOpenTelemetry;
10+
import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig;
11+
import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetry;
12+
import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetryBuilder;
13+
import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderUtil;
14+
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
15+
import java.util.Arrays;
16+
import java.util.List;
17+
18+
// Holds singleton references to decorators to match against during suppression.
19+
// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903
20+
public final class JavaSingletons {
21+
22+
public static final List<Filter> FILTERS;
23+
24+
static {
25+
CommonConfig config = AgentCommonConfig.get();
26+
27+
JavaServerTelemetryBuilder serverBuilder =
28+
JavaServerTelemetry.builder(GlobalOpenTelemetry.get());
29+
JavaInstrumenterBuilderUtil.getServerBuilderExtractor().apply(serverBuilder).configure(config);
30+
JavaServerTelemetry serverTelemetry = serverBuilder.build();
31+
32+
FILTERS = Arrays.asList(serverTelemetry.otelFilter(), new ResponseCustomizingFilter());
33+
}
34+
35+
private JavaSingletons() {}
36+
}

instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java

-35
This file was deleted.

instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class JdkHttpServerTest extends AbstractJdkHttpServerTest {
1919
@Override
2020
protected void configure(HttpServerTestOptions options) {
2121
super.configure(options);
22-
options.setTestHttpPipelining(false);
22+
// library instrumentation does not create a span at all
23+
options.disableTestNonStandardHttpMethod();
2324
}
2425
}

instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetry.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,26 @@
1010
import io.opentelemetry.api.OpenTelemetry;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1212

13-
/** Entrypoint for instrumenting Armeria services. */
14-
public final class JdkServerTelemetry {
13+
/** Entrypoint for instrumenting the jdk.httpserver services. */
14+
public final class JavaServerTelemetry {
1515

16-
/** Returns a new {@link JdkServerTelemetry} configured with the given {@link OpenTelemetry}. */
17-
public static JdkServerTelemetry create(OpenTelemetry openTelemetry) {
16+
/** Returns a new {@link JavaServerTelemetry} configured with the given {@link OpenTelemetry}. */
17+
public static JavaServerTelemetry create(OpenTelemetry openTelemetry) {
1818
return builder(openTelemetry).build();
1919
}
2020

21-
public static JdkServerTelemetryBuilder builder(OpenTelemetry openTelemetry) {
22-
return new JdkServerTelemetryBuilder(openTelemetry);
21+
public static JavaServerTelemetryBuilder builder(OpenTelemetry openTelemetry) {
22+
return new JavaServerTelemetryBuilder(openTelemetry);
2323
}
2424

2525
private final Instrumenter<HttpExchange, HttpExchange> instrumenter;
2626

27-
JdkServerTelemetry(Instrumenter<HttpExchange, HttpExchange> instrumenter) {
27+
JavaServerTelemetry(Instrumenter<HttpExchange, HttpExchange> instrumenter) {
2828
this.instrumenter = instrumenter;
2929
}
3030

3131
/** Returns a new {@link Filter} for telemetry usage */
3232
public Filter otelFilter() {
33-
return new OpenTelemetryService(instrumenter);
33+
return new OpenTelemetryFilter(instrumenter);
3434
}
3535
}
+14-14
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,26 @@
1313
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1414
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
1515
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
16-
import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderFactory;
17-
import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderUtil;
16+
import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderFactory;
17+
import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderUtil;
1818
import java.util.Collection;
1919
import java.util.function.Function;
2020

21-
public final class JdkServerTelemetryBuilder {
21+
public final class JavaServerTelemetryBuilder {
2222

2323
private final DefaultHttpServerInstrumenterBuilder<HttpExchange, HttpExchange> builder;
2424

2525
static {
26-
JdkInstrumenterBuilderUtil.setServerBuilderExtractor(builder -> builder.builder);
26+
JavaInstrumenterBuilderUtil.setServerBuilderExtractor(builder -> builder.builder);
2727
}
2828

29-
JdkServerTelemetryBuilder(OpenTelemetry openTelemetry) {
30-
builder = JdkInstrumenterBuilderFactory.getServerBuilder(openTelemetry);
29+
JavaServerTelemetryBuilder(OpenTelemetry openTelemetry) {
30+
builder = JavaInstrumenterBuilderFactory.getServerBuilder(openTelemetry);
3131
}
3232

3333
/** Sets the status extractor for server spans. */
3434
@CanIgnoreReturnValue
35-
public JdkServerTelemetryBuilder setStatusExtractor(
35+
public JavaServerTelemetryBuilder setStatusExtractor(
3636
Function<
3737
SpanStatusExtractor<? super HttpExchange, ? super HttpExchange>,
3838
? extends SpanStatusExtractor<? super HttpExchange, ? super HttpExchange>>
@@ -46,7 +46,7 @@ public JdkServerTelemetryBuilder setStatusExtractor(
4646
* The {@link AttributesExtractor} will be executed after all default extractors.
4747
*/
4848
@CanIgnoreReturnValue
49-
public JdkServerTelemetryBuilder addAttributesExtractor(
49+
public JavaServerTelemetryBuilder addAttributesExtractor(
5050
AttributesExtractor<HttpExchange, HttpExchange> attributesExtractor) {
5151
builder.addAttributesExtractor(attributesExtractor);
5252
return this;
@@ -58,7 +58,7 @@ public JdkServerTelemetryBuilder addAttributesExtractor(
5858
* @param requestHeaders A list of HTTP header names.
5959
*/
6060
@CanIgnoreReturnValue
61-
public JdkServerTelemetryBuilder setCapturedRequestHeaders(Collection<String> requestHeaders) {
61+
public JavaServerTelemetryBuilder setCapturedRequestHeaders(Collection<String> requestHeaders) {
6262
builder.setCapturedRequestHeaders(requestHeaders);
6363
return this;
6464
}
@@ -69,7 +69,7 @@ public JdkServerTelemetryBuilder setCapturedRequestHeaders(Collection<String> re
6969
* @param responseHeaders A list of HTTP header names.
7070
*/
7171
@CanIgnoreReturnValue
72-
public JdkServerTelemetryBuilder setCapturedResponseHeaders(Collection<String> responseHeaders) {
72+
public JavaServerTelemetryBuilder setCapturedResponseHeaders(Collection<String> responseHeaders) {
7373
builder.setCapturedResponseHeaders(responseHeaders);
7474
return this;
7575
}
@@ -88,14 +88,14 @@ public JdkServerTelemetryBuilder setCapturedResponseHeaders(Collection<String> r
8888
* @see HttpServerAttributesExtractorBuilder#setKnownMethods(Collection)
8989
*/
9090
@CanIgnoreReturnValue
91-
public JdkServerTelemetryBuilder setKnownMethods(Collection<String> knownMethods) {
91+
public JavaServerTelemetryBuilder setKnownMethods(Collection<String> knownMethods) {
9292
builder.setKnownMethods(knownMethods);
9393
return this;
9494
}
9595

9696
/** Sets custom server {@link SpanNameExtractor} via transform function. */
9797
@CanIgnoreReturnValue
98-
public JdkServerTelemetryBuilder setSpanNameExtractor(
98+
public JavaServerTelemetryBuilder setSpanNameExtractor(
9999
Function<
100100
SpanNameExtractor<? super HttpExchange>,
101101
? extends SpanNameExtractor<? super HttpExchange>>
@@ -104,7 +104,7 @@ public JdkServerTelemetryBuilder setSpanNameExtractor(
104104
return this;
105105
}
106106

107-
public JdkServerTelemetry build() {
108-
return new JdkServerTelemetry(builder.build());
107+
public JavaServerTelemetry build() {
108+
return new JavaServerTelemetry(builder.build());
109109
}
110110
}
+7-4
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
import java.io.IOException;
1414

1515
/** Decorates an {@link HttpServer} to trace inbound {@link HttpExchange}s. */
16-
final class OpenTelemetryService extends Filter {
16+
final class OpenTelemetryFilter extends Filter {
1717

1818
private final Instrumenter<HttpExchange, HttpExchange> instrumenter;
1919

20-
OpenTelemetryService(Instrumenter<HttpExchange, HttpExchange> instrumenter) {
20+
OpenTelemetryFilter(Instrumenter<HttpExchange, HttpExchange> instrumenter) {
2121

2222
this.instrumenter = instrumenter;
2323
}
@@ -30,13 +30,16 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException {
3030
chain.doFilter(exchange);
3131
return;
3232
}
33-
33+
Throwable error = null;
3434
Context context = instrumenter.start(parentContext, exchange);
3535

3636
try (Scope ignored = context.makeCurrent()) {
3737
chain.doFilter(exchange);
38+
} catch (Throwable t) {
39+
error = t;
40+
throw t;
3841
} finally {
39-
instrumenter.end(context, exchange, exchange, null);
42+
instrumenter.end(context, exchange, exchange, error);
4043
}
4144
}
4245

Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
import com.sun.net.httpserver.HttpExchange;
99
import com.sun.net.httpserver.HttpsExchange;
10+
import io.opentelemetry.instrumentation.api.internal.HttpProtocolUtil;
1011
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter;
1112
import java.net.InetSocketAddress;
1213
import java.util.Collections;
1314
import java.util.List;
1415
import javax.annotation.Nullable;
1516

16-
enum JdkHttpServerAttributesGetter
17+
enum JavaHttpServerAttributesGetter
1718
implements HttpServerAttributesGetter<HttpExchange, HttpExchange> {
1819
INSTANCE;
1920

@@ -29,17 +30,13 @@ public String getUrlScheme(HttpExchange exchange) {
2930

3031
@Override
3132
public String getUrlPath(HttpExchange exchange) {
32-
String fullPath = exchange.getRequestURI().toString();
33-
int separatorPos = fullPath.indexOf('?');
34-
return separatorPos == -1 ? fullPath : fullPath.substring(0, separatorPos);
33+
return exchange.getRequestURI().getPath();
3534
}
3635

3736
@Nullable
3837
@Override
3938
public String getUrlQuery(HttpExchange exchange) {
40-
String fullPath = exchange.getRequestURI().toString();
41-
int separatorPos = fullPath.indexOf('?');
42-
return separatorPos == -1 ? null : fullPath.substring(separatorPos + 1);
39+
return exchange.getRequestURI().getQuery();
4340
}
4441

4542
@Override
@@ -71,13 +68,13 @@ public String getHttpRoute(HttpExchange exchange) {
7168

7269
@Override
7370
public String getNetworkProtocolName(HttpExchange exchange, @Nullable HttpExchange res) {
74-
return exchange instanceof HttpsExchange ? "https" : "http";
71+
return HttpProtocolUtil.getProtocol(exchange.getProtocol());
7572
}
7673

7774
@Override
7875
public String getNetworkProtocolVersion(HttpExchange exchange, @Nullable HttpExchange res) {
7976

80-
return "1.1";
77+
return HttpProtocolUtil.getVersion(exchange.getProtocol());
8178
}
8279

8380
@Override
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
1414
* any time.
1515
*/
16-
public final class JdkInstrumenterBuilderFactory {
17-
private JdkInstrumenterBuilderFactory() {}
16+
public final class JavaInstrumenterBuilderFactory {
17+
private JavaInstrumenterBuilderFactory() {}
1818

1919
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-server";
2020

@@ -23,7 +23,7 @@ public static DefaultHttpServerInstrumenterBuilder<HttpExchange, HttpExchange> g
2323
return DefaultHttpServerInstrumenterBuilder.create(
2424
INSTRUMENTATION_NAME,
2525
openTelemetry,
26-
JdkHttpServerAttributesGetter.INSTANCE,
26+
JavaHttpServerAttributesGetter.INSTANCE,
2727
ExchangeContextGetter.INSTANCE);
2828
}
2929
}

0 commit comments

Comments
 (0)