Skip to content

Commit 7016e87

Browse files
committed
Capture code attributes in Ratpack instrumentation
1 parent 03b8ad5 commit 7016e87

File tree

5 files changed

+57
-14
lines changed

5 files changed

+57
-14
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.ratpack;
7+
8+
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesGetter;
9+
import javax.annotation.Nullable;
10+
import ratpack.handling.Handler;
11+
12+
public class RatpackCodeAttributesGetter implements CodeAttributesGetter<Handler> {
13+
14+
@Nullable
15+
@Override
16+
public Class<?> getCodeClass(Handler handler) {
17+
return handler.getClass();
18+
}
19+
20+
@Nullable
21+
@Override
22+
public String getMethodName(Handler handler) {
23+
return "handle";
24+
}
25+
}

instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackSingletons.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,34 @@
88
import io.opentelemetry.api.GlobalOpenTelemetry;
99
import io.opentelemetry.api.trace.Span;
1010
import io.opentelemetry.api.trace.StatusCode;
11+
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
12+
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor;
1113
import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor;
1214
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1315
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
1416
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource;
1517
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
1618
import ratpack.handling.Context;
19+
import ratpack.handling.Handler;
1720

1821
public final class RatpackSingletons {
1922

20-
private static final Instrumenter<String, Void> INSTRUMENTER =
21-
Instrumenter.<String, Void>builder(
22-
GlobalOpenTelemetry.get(), "io.opentelemetry.ratpack-1.4", s -> s)
23-
.setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled())
24-
.buildInstrumenter();
23+
private static final Instrumenter<Handler, Void> INSTRUMENTER;
2524

26-
public static Instrumenter<String, Void> instrumenter() {
25+
static {
26+
RatpackCodeAttributesGetter codeAttributesGetter = new RatpackCodeAttributesGetter();
27+
28+
INSTRUMENTER =
29+
Instrumenter.<Handler, Void>builder(
30+
GlobalOpenTelemetry.get(),
31+
"io.opentelemetry.ratpack-1.4",
32+
CodeSpanNameExtractor.create(codeAttributesGetter))
33+
.addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter))
34+
.setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled())
35+
.buildInstrumenter();
36+
}
37+
38+
public static Instrumenter<Handler, Void> instrumenter() {
2739
return INSTRUMENTER;
2840
}
2941

instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingHandler.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
public final class TracingHandler implements Handler {
2020

21-
private static final String INITIAL_SPAN_NAME = "ratpack.handler";
22-
2321
public static final Handler INSTANCE = new TracingHandler();
2422

2523
@Override
@@ -34,15 +32,15 @@ public void handle(Context ctx) {
3432
serverContext != null ? serverContext.context() : Java8BytecodeBridge.currentContext();
3533
io.opentelemetry.context.Context callbackContext;
3634

37-
if (instrumenter().shouldStart(parentOtelContext, INITIAL_SPAN_NAME)) {
35+
if (instrumenter().shouldStart(parentOtelContext, INSTANCE)) {
3836
io.opentelemetry.context.Context otelContext =
39-
instrumenter().start(parentOtelContext, INITIAL_SPAN_NAME);
37+
instrumenter().start(parentOtelContext, INSTANCE);
4038
ctx.getExecution().add(otelContext);
4139
ctx.getResponse()
4240
.beforeSend(
4341
response -> {
4442
updateSpanNames(otelContext, ctx);
45-
instrumenter().end(otelContext, INITIAL_SPAN_NAME, null, null);
43+
instrumenter().end(otelContext, INSTANCE, null, null);
4644
});
4745
callbackContext = otelContext;
4846
} else {

instrumentation/ratpack/ratpack-1.4/testing/src/main/java/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.instrumentation.ratpack.server;
77

8+
import static io.opentelemetry.instrumentation.testing.junit.code.SemconvCodeStabilityUtil.codeFunctionAssertions;
89
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS;
910
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR;
1011
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION;
@@ -315,7 +316,11 @@ protected SpanDataAssert assertHandlerSpan(
315316
} else {
316317
spanName = endpoint.getPath();
317318
}
318-
span.hasName(spanName).hasKind(SpanKind.INTERNAL);
319+
span.hasName(spanName)
320+
.hasKind(SpanKind.INTERNAL)
321+
.hasAttributesSatisfyingExactly(
322+
codeFunctionAssertions(
323+
"io.opentelemetry.javaagent.instrumentation.ratpack.TracingHandler", "handle"));
319324
if (endpoint == EXCEPTION) {
320325
span.hasStatus(StatusData.error())
321326
.hasException(new IllegalStateException(EXCEPTION.getBody()));

instrumentation/ratpack/ratpack-1.4/testing/src/main/java/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackRoutesTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.instrumentation.ratpack.server;
77

8+
import static io.opentelemetry.instrumentation.testing.junit.code.SemconvCodeStabilityUtil.codeFunctionAssertions;
89
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
910
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
1011
import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS;
@@ -22,7 +23,6 @@
2223
import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL;
2324
import static org.assertj.core.api.Assertions.assertThat;
2425

25-
import io.opentelemetry.api.common.Attributes;
2626
import io.opentelemetry.api.trace.SpanKind;
2727
import io.opentelemetry.instrumentation.test.utils.PortUtils;
2828
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
@@ -162,7 +162,10 @@ void bindingsForPath(String path, String route) {
162162
span.hasName("/" + route)
163163
.hasKind(SpanKind.INTERNAL)
164164
.hasParent(trace.getSpan(0))
165-
.hasAttributes(Attributes.empty()));
165+
.hasAttributesSatisfyingExactly(
166+
codeFunctionAssertions(
167+
"io.opentelemetry.javaagent.instrumentation.ratpack.TracingHandler",
168+
"handle")));
166169
}
167170

168171
trace.hasSpansSatisfyingExactly(assertions);

0 commit comments

Comments
 (0)