Skip to content

Commit 03a86cb

Browse files
authored
Support just released Javalin 7 (#16261)
1 parent 58768ab commit 03a86cb

16 files changed

Lines changed: 413 additions & 200 deletions

File tree

.fossa.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,6 @@ targets:
178178
- type: gradle
179179
path: ./
180180
target: ':instrumentation:java-util-logging:javaagent'
181-
- type: gradle
182-
path: ./
183-
target: ':instrumentation:javalin-5.0:javaagent'
184181
- type: gradle
185182
path: ./
186183
target: ':instrumentation:jaxrs-client:jaxrs-client-1.1-testing'
@@ -541,6 +538,12 @@ targets:
541538
- type: gradle
542539
path: ./
543540
target: ':instrumentation:internal:internal-url-class-loader:javaagent'
541+
- type: gradle
542+
path: ./
543+
target: ':instrumentation:javalin:javalin-5.0:javaagent'
544+
- type: gradle
545+
path: ./
546+
target: ':instrumentation:javalin:javalin-7.0:javaagent'
544547
- type: gradle
545548
path: ./
546549
target: ':instrumentation:jaxrs:jaxrs-1.0:javaagent'

instrumentation/javalin-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinTest.java

Lines changed: 0 additions & 163 deletions
This file was deleted.

instrumentation/javalin-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/TestJavalinJavaApplication.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

instrumentation/javalin-5.0/javaagent/build.gradle.kts renamed to instrumentation/javalin/javalin-5.0/javaagent/build.gradle.kts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ otelJava {
2020
dependencies {
2121
library("io.javalin:javalin:5.0.0")
2222

23+
testImplementation(project(":instrumentation:javalin:testing"))
24+
2325
testInstrumentation(project(":instrumentation:jetty:jetty-11.0:javaagent"))
26+
// Ensure no cross interference
27+
testInstrumentation(project(":instrumentation:javalin:javalin-7.0:javaagent"))
2428

25-
// TODO see https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/16261
26-
latestDepTestLibrary("io.javalin:javalin:6.+") // documented limitation
29+
latestDepTestLibrary("io.javalin:javalin:6.+") // see javalin-7.0 module
2730
}

instrumentation/javalin-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinInstrumentation.java renamed to instrumentation/javalin/javalin-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinInstrumentation.java

File renamed without changes.

instrumentation/javalin-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinInstrumentationModule.java renamed to instrumentation/javalin/javalin-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinInstrumentationModule.java

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

88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
99
import static java.util.Collections.singletonList;
10+
import static net.bytebuddy.matcher.ElementMatchers.not;
1011

1112
import com.google.auto.service.AutoService;
1213
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
@@ -29,6 +30,8 @@ public List<TypeInstrumentation> typeInstrumentations() {
2930

3031
@Override
3132
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
32-
return hasClassesNamed("io.javalin.http.Handler");
33+
// io.javalin.config.JavalinState was introduced in Javalin 7
34+
return hasClassesNamed("io.javalin.http.Handler")
35+
.and(not(hasClassesNamed("io.javalin.config.JavalinState")));
3336
}
3437
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.javalin.v5_0;
7+
8+
import io.javalin.Javalin;
9+
import io.opentelemetry.instrumentation.javalin.AbstractJavalinTest;
10+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
11+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
12+
import org.junit.jupiter.api.extension.RegisterExtension;
13+
14+
class JavalinTest extends AbstractJavalinTest {
15+
16+
@RegisterExtension
17+
private static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
18+
19+
@Override
20+
protected InstrumentationExtension testing() {
21+
return testing;
22+
}
23+
24+
@Override
25+
protected Javalin setupJavalin(int port) {
26+
Javalin app = Javalin.create().start(port);
27+
app.get(
28+
"/param/{id}",
29+
ctx -> {
30+
String paramId = ctx.pathParam("id");
31+
ctx.result(paramId);
32+
});
33+
app.get(
34+
"/error",
35+
ctx -> {
36+
throw new RuntimeException("boom");
37+
});
38+
app.get("/async", ctx -> ctx.async(() -> ctx.result("ok")));
39+
return app;
40+
}
41+
42+
@Override
43+
protected String getJettyInstrumentation() {
44+
return "io.opentelemetry.jetty-11.0";
45+
}
46+
}
File renamed without changes.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
plugins {
2+
id("otel.javaagent-instrumentation")
3+
}
4+
5+
muzzle {
6+
pass {
7+
group.set("io.javalin")
8+
module.set("javalin")
9+
versions.set("[7.0.0,)")
10+
assertInverse.set(true)
11+
}
12+
}
13+
14+
// javalin 7 requires java 17
15+
otelJava {
16+
minJavaVersionSupported.set(JavaVersion.VERSION_17)
17+
}
18+
19+
dependencies {
20+
library("io.javalin:javalin:7.0.0")
21+
22+
testImplementation(project(":instrumentation:javalin:testing"))
23+
24+
testInstrumentation(project(":instrumentation:jetty:jetty-12.0:javaagent"))
25+
// Ensure no cross interference
26+
testInstrumentation(project(":instrumentation:javalin:javalin-5.0:javaagent"))
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.javalin.v7_0;
7+
8+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasSuperType;
9+
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
10+
import static net.bytebuddy.matcher.ElementMatchers.named;
11+
import static net.bytebuddy.matcher.ElementMatchers.not;
12+
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
13+
14+
import io.javalin.http.Context;
15+
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
16+
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource;
17+
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
18+
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
19+
import net.bytebuddy.asm.Advice;
20+
import net.bytebuddy.description.type.TypeDescription;
21+
import net.bytebuddy.matcher.ElementMatcher;
22+
23+
public class JavalinInstrumentation implements TypeInstrumentation {
24+
25+
@Override
26+
public ElementMatcher<TypeDescription> typeMatcher() {
27+
return hasSuperType(named("io.javalin.http.Handler")).and(not(isInterface()));
28+
}
29+
30+
@Override
31+
public void transform(TypeTransformer transformer) {
32+
transformer.applyAdviceToMethod(
33+
named("handle").and(takesArgument(0, named("io.javalin.http.Context"))),
34+
this.getClass().getName() + "$HandlerAdapterAdvice");
35+
}
36+
37+
@SuppressWarnings("unused")
38+
public static class HandlerAdapterAdvice {
39+
40+
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
41+
public static void onAfterExecute(@Advice.Argument(0) Context ctx, @Advice.Thrown Throwable t) {
42+
HttpServerRoute.update(
43+
io.opentelemetry.context.Context.current(),
44+
HttpServerRouteSource.CONTROLLER,
45+
ctx.endpoint().path);
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)