From 828294795b5b9f2d1b3c80cef8dc4f094b904cc4 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Thu, 18 Sep 2025 15:27:03 +0800 Subject: [PATCH 01/30] =?UTF-8?q?feat:=20support=20parse=20oceanbase?= =?UTF-8?q?=E3=80=81lindorm=E3=80=81polardb=E3=80=81opentracing=20connecti?= =?UTF-8?q?on=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia3b5f6b74b40763c4df7fa0185223575a2c1b068 --- .../internal/JdbcConnectionUrlParser.java | 97 +++++++++++++- .../internal/JdbcConnectionUrlParserTest.java | 124 ++++++++++++++++++ 2 files changed, 220 insertions(+), 1 deletion(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index 87d075e84bd2..aa05845d8662 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -911,6 +911,80 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { } return GENERIC_URL_LIKE.doParse(clickhouseUrl, builder); } + }, + /** + * jdbc:oceanbase://host:port/dbname + * jdbc:oceanbase:oracle://host:port/dbname + */ + OCEANBASE("oceanbase") { + @Override + DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { + int protoLoc = jdbcUrl.indexOf("://"); + int typeEndLoc = jdbcUrl.indexOf(':'); + if (protoLoc > typeEndLoc) { + String subtype = jdbcUrl.substring(typeEndLoc + 1, protoLoc); + builder.subtype(subtype); + if (subtype.equals(DbSystemValues.ORACLE)) { + builder.system(DbSystemValues.ORACLE); + } + return MODIFIED_URL_LIKE.doParse(jdbcUrl, builder); + } else { + return GENERIC_URL_LIKE.doParse(jdbcUrl, builder); + } + + } + }, + /** + * Driver + * configuration doc + * jdbc:lindorm:table:url=http//server_name:30060/test + * jdbc:lindorm:tsdb:url=http://server_name:8242/test + * jabc:lindorm:search:url=http://server_name:30070/test + * + */ + LINDORM("lindorm") { + private static final String DEFAULT_HOST = "localhost"; + private static final int DEFAULT_PORT = 30060; + + @Override + DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { + String lindormUrl = jdbcUrl.substring("lindorm:".length()); + DbInfo dbInfo = builder.build(); + if (dbInfo.getHost() == null) { + builder.host(DEFAULT_HOST); + } + if (dbInfo.getPort() == null) { + builder.port(DEFAULT_PORT); + } + + int urlIndex = lindormUrl.indexOf(":url="); + if (urlIndex < 0) { + return builder; + } + builder.subtype(lindormUrl.substring(0, urlIndex)); + String realUrl = lindormUrl.substring(urlIndex + 5); + return GENERIC_URL_LIKE.doParse(realUrl, builder); + } + }, + /** + * jdbc:polardb://server_name:1901/dbname + */ + POLARDB("polardb") { + private static final int DEFAULT_PORT = 1521; + private static final String DEFAULT_HOST = "localhost"; + + @Override + DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { + DbInfo dbInfo = builder.build(); + if (dbInfo.getHost() == null) { + builder.host(DEFAULT_HOST); + } + if (dbInfo.getPort() == null) { + builder.port(DEFAULT_PORT); + } + return GENERIC_URL_LIKE.doParse(jdbcUrl, builder); + } }; private static final Logger logger = Logger.getLogger(JdbcConnectionUrlParser.class.getName()); @@ -943,8 +1017,13 @@ public static DbInfo parse(String connectionUrl, Properties props) { connectionUrl = connectionUrl.toLowerCase(Locale.ROOT); String jdbcUrl; - if (connectionUrl.startsWith("jdbc:")) { + if (connectionUrl.startsWith("jdbc:tracing:")) { + //see https://github.com/opentracing-contrib/java-jdbc + jdbcUrl = connectionUrl.substring("jdbc:tracing:".length()); + } else if (connectionUrl.startsWith("jdbc:")) { jdbcUrl = connectionUrl.substring("jdbc:".length()); + } else if (connectionUrl.startsWith("jdbc-secretsmanager:tracing:")) { + jdbcUrl = connectionUrl.substring("jdbc-secretsmanager:tracing:".length()); } else if (connectionUrl.startsWith("jdbc-secretsmanager:")) { jdbcUrl = connectionUrl.substring("jdbc-secretsmanager:".length()); } else { @@ -1067,6 +1146,12 @@ private static void populateStandardProperties(DbInfo.Builder builder, Map } } + public static void main(String[] args) { + DbInfo dbInfo = JdbcConnectionUrlParser.parse( + "jdbc:tracing:mysql://rm-bp17j28j2y7pm-proxy-lindorm-pub.aliyuncs.com", new Properties()); + System.out.println(dbInfo); + } + // see // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md private static String toDbSystem(String type) { @@ -1100,6 +1185,12 @@ private static String toDbSystem(String type) { return DbSystemValues.HANADB; case "clickhouse": // ClickHouse return DbSystemValues.CLICKHOUSE; + case "oceanbase": // Oceanbase + return DbSystemValues.OCEANBASE; + case "polardb": // polarDB + return DbSystemValues.POLARDB; + case "lindorm": // lindorm + return DbSystemValues.LINDORM; default: return DbSystemValues.OTHER_SQL; // Unknown DBMS } @@ -1120,6 +1211,10 @@ private static final class DbSystemValues { static final String MARIADB = "mariadb"; static final String H2 = "h2"; static final String CLICKHOUSE = "clickhouse"; + static final String OCEANBASE = "oceanbase"; + static final String POLARDB = "polardb"; + static final String LINDORM = "lindorm"; + private DbSystemValues() {} } diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java index 165a91d2d3c0..691e99b95809 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java @@ -1300,6 +1300,130 @@ void testSecretsManagerParsing(ParseTestArgument argument) { testVerifySystemSubtypeParsingOfUrl(argument); } + private static Stream openTracingArguments() { + return args( + // https://github.com/opentracing-contrib/java-jdbc + arg("jdbc:tracing:mysql://example.com:50000") + .setShortUrl("mysql://example.com:50000") + .setSystem("mysql") + .setHost("example.com") + .setPort(50000) + .build(), + arg("jdbc:tracing:postgresql://example.com:50000/dbname") + .setShortUrl("postgresql://example.com:50000") + .setSystem("postgresql") + .setHost("example.com") + .setPort(50000) + .setDb("dbname") + .build(), + arg("jdbc:tracing:oracle:thin:@example.com:50000/ORCL") + .setShortUrl("oracle:thin://example.com:50000") + .setSystem("oracle") + .setSubtype("thin") + .setHost("example.com") + .setPort(50000) + .setName("orcl") + .build(), + arg("jdbc:tracing:sqlserver://example.com:50000") + .setShortUrl("sqlserver://example.com:50000") + .setSystem("mssql") + .setHost("example.com") + .setPort(50000) + .build()); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("openTracingArguments") + void testOpenTracingParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + + private static Stream oceanbaseArguments() { + return args( + // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + arg("jdbc:oceanbase://host:3306/test") + .setShortUrl("oceanbase://host:3306") + .setSystem("oceanbase") + .setHost("host") + .setPort(3306) + .setDb("test") + .build(), + arg("jdbc:oceanbase:oracle://host:1521") + .setShortUrl("oceanbase:oracle://host:1521") + .setSystem("oracle") + .setSubtype("oracle") + .setHost("host") + .setPort(1521) + .build() + ); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("oceanbaseArguments") + void testOceasbaseParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + + private static Stream lindormArguments() { + return args( + // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + arg("jdbc:lindorm:table:url=http://host:30060/test") + .setShortUrl("lindorm:table://host:30060") + .setSystem("lindorm") + .setSubtype("table") + .setHost("host") + .setDb("test") + .setPort(30060) + .build(), + arg("jdbc:lindorm:tsdb:url=http://host:8242/test") + .setShortUrl("lindorm:tsdb://host:8242") + .setSystem("lindorm") + .setSubtype("tsdb") + .setHost("host") + .setDb("test") + .setPort(8242) + .setDb("test") + .build(), + arg("jdbc:lindorm:search:url=http://host:30070/test") + .setShortUrl("lindorm:search://host:30070") + .setSystem("lindorm") + .setSubtype("search") + .setHost("host") + .setDb("test") + .setPort(30070) + .build() + ); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("lindormArguments") + void testLindormManagerParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + + private static Stream polardbArguments() { + return args( + arg("jdbc:polardb://example.com:1901") + .setShortUrl("polardb://example.com:1901") + .setSystem("polardb") + .setHost("example.com") + .setPort(1901) + .build(), + arg("jdbc:polardb://example.com") + .setShortUrl("polardb://example.com:1521") + .setSystem("polardb") + .setHost("example.com") + .setPort(1521) + .build() + ); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("polardbArguments") + void testPolardbParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + private static void testVerifySystemSubtypeParsingOfUrl(ParseTestArgument argument) { DbInfo info = parse(argument.url, argument.properties); DbInfo expected = argument.dbInfo; From 4251ef4d86b08b2176b6c21a767bf1f5d20e088e Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Thu, 25 Sep 2025 15:58:31 +0800 Subject: [PATCH 02/30] delete test main method --- .../jdbc/internal/JdbcConnectionUrlParser.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index aa05845d8662..d18199dacd9b 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -1146,12 +1146,6 @@ private static void populateStandardProperties(DbInfo.Builder builder, Map } } - public static void main(String[] args) { - DbInfo dbInfo = JdbcConnectionUrlParser.parse( - "jdbc:tracing:mysql://rm-bp17j28j2y7pm-proxy-lindorm-pub.aliyuncs.com", new Properties()); - System.out.println(dbInfo); - } - // see // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md private static String toDbSystem(String type) { From 8d79717fba032c1480d6a5acd79b667b87d93b00 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Thu, 25 Sep 2025 08:07:53 +0000 Subject: [PATCH 03/30] ./gradlew spotlessApply --- .../jdbc/internal/JdbcConnectionUrlParser.java | 17 ++++------------- .../internal/JdbcConnectionUrlParserTest.java | 9 +++------ 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index d18199dacd9b..fa873bb58d82 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -912,10 +912,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { return GENERIC_URL_LIKE.doParse(clickhouseUrl, builder); } }, - /** - * jdbc:oceanbase://host:port/dbname - * jdbc:oceanbase:oracle://host:port/dbname - */ + /** jdbc:oceanbase://host:port/dbname jdbc:oceanbase:oracle://host:port/dbname */ OCEANBASE("oceanbase") { @Override DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { @@ -931,17 +928,14 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { } else { return GENERIC_URL_LIKE.doParse(jdbcUrl, builder); } - } }, /** * Driver - * configuration doc - * jdbc:lindorm:table:url=http//server_name:30060/test + * configuration doc jdbc:lindorm:table:url=http//server_name:30060/test * jdbc:lindorm:tsdb:url=http://server_name:8242/test * jabc:lindorm:search:url=http://server_name:30070/test - * */ LINDORM("lindorm") { private static final String DEFAULT_HOST = "localhost"; @@ -967,9 +961,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { return GENERIC_URL_LIKE.doParse(realUrl, builder); } }, - /** - * jdbc:polardb://server_name:1901/dbname - */ + /** jdbc:polardb://server_name:1901/dbname */ POLARDB("polardb") { private static final int DEFAULT_PORT = 1521; private static final String DEFAULT_HOST = "localhost"; @@ -1018,7 +1010,7 @@ public static DbInfo parse(String connectionUrl, Properties props) { String jdbcUrl; if (connectionUrl.startsWith("jdbc:tracing:")) { - //see https://github.com/opentracing-contrib/java-jdbc + // see https://github.com/opentracing-contrib/java-jdbc jdbcUrl = connectionUrl.substring("jdbc:tracing:".length()); } else if (connectionUrl.startsWith("jdbc:")) { jdbcUrl = connectionUrl.substring("jdbc:".length()); @@ -1209,7 +1201,6 @@ private static final class DbSystemValues { static final String POLARDB = "polardb"; static final String LINDORM = "lindorm"; - private DbSystemValues() {} } } diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java index 691e99b95809..b132ce645711 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java @@ -1354,8 +1354,7 @@ private static Stream oceanbaseArguments() { .setSubtype("oracle") .setHost("host") .setPort(1521) - .build() - ); + .build()); } @ParameterizedTest(name = "{index}: {0}") @@ -1391,8 +1390,7 @@ private static Stream lindormArguments() { .setHost("host") .setDb("test") .setPort(30070) - .build() - ); + .build()); } @ParameterizedTest(name = "{index}: {0}") @@ -1414,8 +1412,7 @@ private static Stream polardbArguments() { .setSystem("polardb") .setHost("example.com") .setPort(1521) - .build() - ); + .build()); } @ParameterizedTest(name = "{index}: {0}") From a4a325fa2ac682c0257ac585b3f8ddfe3a2618a6 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Sun, 28 Sep 2025 20:27:09 +0800 Subject: [PATCH 04/30] =?UTF-8?q?fix=EF=BC=9Afix=20some=20code=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I39d2ce579c60d5afa2e792f3296eef5d0b495443 --- .../jdbc/internal/JdbcConnectionUrlParser.java | 6 +++--- .../jdbc/internal/JdbcConnectionUrlParserTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index d18199dacd9b..7c9e7fe944c8 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -936,7 +936,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { }, /** * Driver + * href="https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints">Driver * configuration doc * jdbc:lindorm:table:url=http//server_name:30060/test * jdbc:lindorm:tsdb:url=http://server_name:8242/test @@ -1181,9 +1181,9 @@ private static String toDbSystem(String type) { return DbSystemValues.CLICKHOUSE; case "oceanbase": // Oceanbase return DbSystemValues.OCEANBASE; - case "polardb": // polarDB + case "polardb": // PolarDB return DbSystemValues.POLARDB; - case "lindorm": // lindorm + case "lindorm": // Lindorm return DbSystemValues.LINDORM; default: return DbSystemValues.OTHER_SQL; // Unknown DBMS diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java index 691e99b95809..84aed242d6cc 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java @@ -1340,7 +1340,7 @@ void testOpenTracingParsing(ParseTestArgument argument) { private static Stream oceanbaseArguments() { return args( - // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + // https://en.oceanbase.com/ arg("jdbc:oceanbase://host:3306/test") .setShortUrl("oceanbase://host:3306") .setSystem("oceanbase") @@ -1366,7 +1366,7 @@ void testOceasbaseParsing(ParseTestArgument argument) { private static Stream lindormArguments() { return args( - // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + // https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints arg("jdbc:lindorm:table:url=http://host:30060/test") .setShortUrl("lindorm:table://host:30060") .setSystem("lindorm") From e5d0f3c847f91a60166806e58d7801bfb6c499a2 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Thu, 9 Oct 2025 16:22:06 +0800 Subject: [PATCH 05/30] Optimized the comments for OceanBase url parser --- .../jdbc/internal/JdbcConnectionUrlParser.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index f7c3772c19f8..52b5fec73b48 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -912,7 +912,13 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { return GENERIC_URL_LIKE.doParse(clickhouseUrl, builder); } }, - /** jdbc:oceanbase://host:port/dbname jdbc:oceanbase:oracle://host:port/dbname */ + /** + * Sample urls: + *
    + *
  • jdbc:oceanbase://host:port/dbname + *
  • jdbc:oceanbase:oracle://host:port/dbname + *
+ */ OCEANBASE("oceanbase") { @Override DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { From ae6a4675b332da77337e69528168c39ece3edc28 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Thu, 9 Oct 2025 08:29:08 +0000 Subject: [PATCH 06/30] ./gradlew spotlessApply --- .../instrumentation/jdbc/internal/JdbcConnectionUrlParser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index 52b5fec73b48..a2301637a944 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -914,6 +914,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { }, /** * Sample urls: + * *
    *
  • jdbc:oceanbase://host:port/dbname *
  • jdbc:oceanbase:oracle://host:port/dbname From 660f26b2611f6d43185cf2dd3ffd55044bf6e4d4 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Thu, 9 Oct 2025 17:20:23 +0800 Subject: [PATCH 07/30] delete url parameter Change-Id: Ic7a1bdab51668642fb2c3e4b775ce30f4e1a841c --- .../instrumentation/jdbc/internal/JdbcConnectionUrlParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index 52b5fec73b48..210d72053b8c 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -938,7 +938,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { }, /** * Driver + * href="https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints">Driver * configuration doc jdbc:lindorm:table:url=http//server_name:30060/test * jdbc:lindorm:tsdb:url=http://server_name:8242/test * jabc:lindorm:search:url=http://server_name:30070/test From 73286f8bbc2d51fd50c50859bd463a94a72f4018 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Thu, 9 Oct 2025 09:47:03 +0000 Subject: [PATCH 08/30] ./gradlew spotlessApply --- .../instrumentation/jdbc/internal/JdbcConnectionUrlParser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index a672f161880b..662f39391be3 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -938,8 +938,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { } }, /** - * Driver + * Driver * configuration doc jdbc:lindorm:table:url=http//server_name:30060/test * jdbc:lindorm:tsdb:url=http://server_name:8242/test * jabc:lindorm:search:url=http://server_name:30070/test From 92a0e4c9e5aa45bb6d6fdf16994bef9e72417f90 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 9 Oct 2025 16:43:39 +0300 Subject: [PATCH 09/30] review --- .../jdbc/internal/JdbcConnectionUrlParser.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index 662f39391be3..3db94c6d6d08 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -939,9 +939,15 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { }, /** * Driver - * configuration doc jdbc:lindorm:table:url=http//server_name:30060/test - * jdbc:lindorm:tsdb:url=http://server_name:8242/test - * jabc:lindorm:search:url=http://server_name:30070/test + * configuration doc + * + *

    Sample urls: + * + *

      + *
    • jdbc:lindorm:table:url=http//server_name:30060/test + *
    • jdbc:lindorm:tsdb:url=http://server_name:8242/test + *
    • jabc:lindorm:search:url=http://server_name:30070/test + *
    */ LINDORM("lindorm") { private static final String DEFAULT_HOST = "localhost"; @@ -967,7 +973,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { return GENERIC_URL_LIKE.doParse(realUrl, builder); } }, - /** jdbc:polardb://server_name:1901/dbname */ + /** Sample url: jdbc:polardb://server_name:1901/dbname */ POLARDB("polardb") { private static final int DEFAULT_PORT = 1521; private static final String DEFAULT_HOST = "localhost"; From 3bd593a7cfec19d72c1d63cfa4bbf1c8b1792554 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Tue, 4 Nov 2025 21:17:16 +0800 Subject: [PATCH 10/30] =?UTF-8?q?feat=EF=BC=9Asupport=20JFinal=20framework?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ie9d2a16071e77ce12f386227faaff4a4927512be --- .../jfinal-3.6/javaagent/build.gradle.kts | 29 +++++ .../jfinal/ActionHandlerInstrumentation.java | 88 +++++++++++++++ .../jfinal/ActionMappingInstrumentation.java | 42 ++++++++ .../jfinal/JFinalInstrumentationModule.java | 27 +++++ .../jfinal/JFinalSingletons.java | 59 ++++++++++ .../instrumentation/jfinal/JFinalTest.java | 102 ++++++++++++++++++ .../instrumentation/jfinal/TestConfig.java | 39 +++++++ .../jfinal/TestController.java | 96 +++++++++++++++++ settings.gradle.kts | 1 + 9 files changed, 483 insertions(+) create mode 100644 instrumentation/jfinal-3.6/javaagent/build.gradle.kts create mode 100644 instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java create mode 100644 instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java create mode 100644 instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java create mode 100644 instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java create mode 100644 instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java create mode 100644 instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java create mode 100644 instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java diff --git a/instrumentation/jfinal-3.6/javaagent/build.gradle.kts b/instrumentation/jfinal-3.6/javaagent/build.gradle.kts new file mode 100644 index 000000000000..9453927f7b72 --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("com.jfinal") + module.set("jfinal") + versions.set("[3.6,)") + } +} + +otelJava { + // jfinal doesn't work with Java 9+ + maxJavaVersionForTests.set(JavaVersion.VERSION_1_8) +} + +dependencies { + library("com.jfinal:jfinal:3.6") + testLibrary("com.jfinal:jetty-server:2019.3") + testLibrary("com.jfinal:jfinal:3.6") + testInstrumentation(project(":instrumentation:jetty:jetty-8.0:javaagent")) + testInstrumentation(project(":instrumentation:jetty:jetty-11.0:javaagent")) + testInstrumentation(project(":instrumentation:jetty:jetty-common:javaagent")) +} + +tasks.withType().configureEach { + jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") +} diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java new file mode 100644 index 000000000000..92bb733efe1c --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java @@ -0,0 +1,88 @@ +package io.opentelemetry.javaagent.instrumentation.jfinal; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + + +import javax.annotation.Nullable; + +import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static io.opentelemetry.javaagent.instrumentation.jfinal.JFinalSingletons.instrumenter; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class ActionHandlerInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderOptimization() { + return hasClassesNamed("com.jfinal.core.ActionHandler"); + } + + @Override + public ElementMatcher typeMatcher() { + return named("com.jfinal.core.ActionHandler"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + named("handle").and(takesArguments(4) + .and(takesArgument(0, String.class)) + .and(takesArgument(1, named("javax.servlet.http.HttpServletRequest"))) + .and(takesArgument(2, named("javax.servlet.http.HttpServletResponse"))) + .and(takesArgument(3, boolean[].class))), + this.getClass().getName() + "$HandleAdvice"); + } + + @SuppressWarnings("unused") + public static class HandleAdvice { + + public static class AdviceScope { + private final Context context; + private final Scope scope; + + public AdviceScope(Context context, Scope scope) { + this.context = context; + this.scope = scope; + } + + @Nullable + public static AdviceScope start(Context parentContext) { + if (!instrumenter().shouldStart(parentContext, null)) { + return null; + } + + Context context = instrumenter().start(parentContext, null); + return new AdviceScope(context, context.makeCurrent()); + } + + public void end( + @Nullable Throwable throwable) { + scope.close(); + instrumenter().end(context, null, null, throwable); + } + } + + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static HandleAdvice.AdviceScope onEnter() { + return HandleAdvice.AdviceScope.start(currentContext()); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void stopTraceOnResponse( + @Advice.Thrown Throwable throwable, + @Advice.Enter @Nullable AdviceScope actionScope) { + if (actionScope == null) { + return; + } + actionScope.end(throwable); + } + } +} diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java new file mode 100644 index 000000000000..9c71d2f26959 --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java @@ -0,0 +1,42 @@ +package io.opentelemetry.javaagent.instrumentation.jfinal; + + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import com.jfinal.core.Action; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + + +public class ActionMappingInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderOptimization() { + return hasClassesNamed("com.jfinal.core.ActionMapping"); + } + + @Override + public ElementMatcher typeMatcher() { + return named("com.jfinal.core.ActionMapping"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + named("getAction"), + this.getClass().getName() + "$GetActionAdvice"); + } + + @SuppressWarnings("unused") + public static class GetActionAdvice { + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void existGetAction( + @Advice.Return(readOnly = false) Action action) { + JFinalSingletons.updateSpan(action); + } + } +} diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java new file mode 100644 index 000000000000..a53ec1504997 --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java @@ -0,0 +1,27 @@ +package io.opentelemetry.javaagent.instrumentation.jfinal; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.Arrays; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class JFinalInstrumentationModule extends InstrumentationModule { + public JFinalInstrumentationModule() { + super("jfinal"); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return hasClassesNamed("com.jfinal.core.ActionMapping"); + } + + @Override + public List typeInstrumentations() { + return Arrays.asList(new ActionMappingInstrumentation(), new ActionHandlerInstrumentation()); + } +} diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java new file mode 100644 index 000000000000..bb6640fb56e9 --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java @@ -0,0 +1,59 @@ +package io.opentelemetry.javaagent.instrumentation.jfinal; + +import com.jfinal.core.Action; +import com.jfinal.render.JsonRender; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; +import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.logging.Level; +import java.util.logging.Logger; + +public final class JFinalSingletons { + + private static final Logger logger = Logger.getLogger(JFinalSingletons.class.getName()); + + private static final String SPAN_NAME = "jfinal.handle"; + private static final Instrumenter INSTRUMENTER = + Instrumenter.builder( + GlobalOpenTelemetry.get(), "io.opentelemetry.jfinal-3.6", s -> SPAN_NAME) + .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .buildInstrumenter(); + + static { + //see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465 + excludeOtAttrs(); + } + + public static Instrumenter instrumenter() { + return INSTRUMENTER; + } + + public static void updateSpan(Action action) { + if (action == null) { + return; + } + String route = action.getActionKey(); + if (route == null) { + return; + } + Context context = Context.current(); + HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, route); + } + + private static void excludeOtAttrs() { + try { + JsonRender.addExcludedAttrs( + "io.opentelemetry.javaagent.instrumentation.servlet.ServletHelper.AsyncListenerResponse", + "io.opentelemetry.javaagent.instrumentation.servlet.ServletHelper.Context", + "trace_id", + "span_id"); + } catch (Throwable t) { + logger.log(Level.INFO, "exclude failed", t); + } + } + + private JFinalSingletons() {} +} diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java new file mode 100644 index 000000000000..0e7ff3924aa9 --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java @@ -0,0 +1,102 @@ +package io.opentelemetry.javaagent.instrumentation.jfinal; + +import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.NOT_FOUND; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static org.assertj.core.api.Assertions.assertThat; + +import com.jfinal.core.JFinalFilter; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.api.internal.HttpConstants; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; +import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; +import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import java.util.EnumSet; +import javax.servlet.DispatcherType; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class JFinalTest extends AbstractHttpServerTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); + + @Override + protected void configure(HttpServerTestOptions options) { + // In the redirection scenario, the current test case fails to pass. + // Modifying the logic of AbstractHttpServerTest to address this would + // entail significant risk; therefore, we will temporarily skip validation + // for this scenario. + // + // actual span relationship: expecting span relationship + // GET /redirect GET /redirect + // |---jfinal.handle |---jfinal.handle + // |---controller |---controller + // |---Response.sendRedirect |---Response.sendRedirect + // + options.setTestRedirect(false); + options.setHasHandlerSpan(unused -> true); + options.setExpectedHttpRoute( + (endpoint, method) -> { + if (endpoint == ServerEndpoint.PATH_PARAM) { + return "/path/123/param"; + } + if (HttpConstants._OTHER.equals(method)) { + return endpoint.getPath(); + } + if (NOT_FOUND.equals(endpoint)) { + return "/*"; + } + return expectedHttpRoute(endpoint, method); + }); + } + + @Override + protected Server setupServer() throws Exception { + Server server = new Server(port); + + ServletContextHandler context = new ServletContextHandler( + ServletContextHandler.SESSIONS); + context.setContextPath("/"); + ServletHandler handler = new ServletHandler(); + + FilterHolder fh = handler.addFilterWithMapping( + JFinalFilter.class.getName(), "/*", EnumSet.of(DispatcherType.REQUEST)); + fh.setInitParameter("configClass", TestConfig.class.getName()); + + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + context.insertHandler(handler); + server.setHandler(context); + server.start(); + return server; + } + + @Override + protected void stopServer(Server server) throws Exception { + server.stop(); + } + + @Override + protected SpanDataAssert assertResponseSpan( + SpanDataAssert span, String method, ServerEndpoint endpoint) { + if (endpoint == REDIRECT) { + span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); + } + span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + return span; + } + + @Override + public SpanDataAssert assertHandlerSpan( + SpanDataAssert span, String method, ServerEndpoint endpoint) { + span.hasName("jfinal.handle").hasKind(INTERNAL); + return span; + } +} diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java new file mode 100644 index 000000000000..850f0d49038e --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java @@ -0,0 +1,39 @@ +package io.opentelemetry.javaagent.instrumentation.jfinal; + +import com.jfinal.config.Constants; +import com.jfinal.config.Handlers; +import com.jfinal.config.Interceptors; +import com.jfinal.config.JFinalConfig; +import com.jfinal.config.Plugins; +import com.jfinal.config.Routes; +import com.jfinal.template.Engine; + +public class TestConfig extends JFinalConfig { + // 配置常量值 + @Override + public void configConstant(Constants me) { + me.setDevMode(true); + } + + // 配置路由 + @Override + public void configRoute(Routes me) { + me.add("/", TestController.class); + } + + @Override + public void configEngine(Engine me) { + } + + @Override + public void configPlugin(Plugins me) { + } + + @Override + public void configInterceptor(Interceptors me) { + } + + @Override + public void configHandler(Handlers me) { + } +} diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java new file mode 100644 index 000000000000..ad833afae4a0 --- /dev/null +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java @@ -0,0 +1,96 @@ +package io.opentelemetry.javaagent.instrumentation.jfinal; + +import com.jfinal.core.ActionKey; +import com.jfinal.core.Controller; +import com.jfinal.render.TextRender; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; +import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; + +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; + +public class TestController extends Controller { + + public void success() { + GlobalTraceUtil.runWithSpan("controller", () -> renderText(ServerEndpoint.SUCCESS.getBody())); + } + + public void redirect() { + GlobalTraceUtil.runWithSpan("controller", () -> redirect(ServerEndpoint.REDIRECT.getBody())); + } + + @ActionKey("error-status") + public void error() throws Exception { + GlobalTraceUtil.runWithSpan("controller", + () -> renderError(500, new TextRender(ServerEndpoint.ERROR.getBody()))); + } + + public void exception() throws Throwable { + try { + GlobalTraceUtil.runWithSpan("controller", () -> { +// renderError(500, new TextRender(ServerEndpoint.EXCEPTION.getBody())); + throw new IllegalStateException(EXCEPTION.getBody()); + }); + } catch (Throwable t) { + Span.current().recordException(t); + throw t; + } + } + + public void captureHeaders() { + GlobalTraceUtil.runWithSpan("controller", () -> { + String header = getHeader("X-Test-Request"); + getResponse().setHeader("X-Test-Response", header); + renderText(ServerEndpoint.CAPTURE_HEADERS.getBody()); + }); + } + + public void captureParameters() { + GlobalTraceUtil.runWithSpan("controller", () -> { + renderText(ServerEndpoint.CAPTURE_PARAMETERS.getBody()); + }); + } + + public void query() { + + GlobalTraceUtil.runWithSpan("controller", () -> { + renderText(ServerEndpoint.QUERY_PARAM.getBody()); + }); + } + + @ActionKey("path/123/param") + public void pathVar() { + GlobalTraceUtil.runWithSpan("controller", () -> { + renderText(ServerEndpoint.PATH_PARAM.getBody()); + }); + + } + + + public void authRequired() { + GlobalTraceUtil.runWithSpan("controller", () -> { + renderText(ServerEndpoint.AUTH_REQUIRED.getBody()); + }); + } + + public void login() { + GlobalTraceUtil.runWithSpan("controller", () -> { + redirect(ServerEndpoint.LOGIN.getBody()); + }); + } + + @ActionKey("basicsecured/endpoint(") + public void basicsecured_endpoint() { + renderText(ServerEndpoint.AUTH_ERROR.getBody()); + } + + public void child() { + GlobalTraceUtil.runWithSpan("controller", () -> { + ServerEndpoint.INDEXED_CHILD.collectSpanAttributes(name -> { + return getPara(name); + }); + renderText(ServerEndpoint.INDEXED_CHILD.getBody()); + }); + } + +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 3b6bf858fb56..414ccc9ddb36 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -646,6 +646,7 @@ include(":instrumentation:xxl-job:xxl-job-2.3.0:javaagent") include(":instrumentation:xxl-job:xxl-job-common:javaagent") include(":instrumentation:xxl-job:xxl-job-common:testing") include(":instrumentation:zio:zio-2.0:javaagent") +include("instrumentation:jfinal-3.6:javaagent") // benchmark include(":benchmark-overhead-jmh") From 7ab2d87e510243115efb94ae4db9abe3ba65649c Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Tue, 4 Nov 2025 13:29:35 +0000 Subject: [PATCH 11/30] ./gradlew spotlessApply --- .../jfinal/ActionHandlerInstrumentation.java | 42 +++++---- .../jfinal/ActionMappingInstrumentation.java | 13 +-- .../jfinal/JFinalInstrumentationModule.java | 5 + .../jfinal/JFinalSingletons.java | 7 +- .../instrumentation/jfinal/JFinalTest.java | 13 ++- .../instrumentation/jfinal/TestConfig.java | 19 ++-- .../jfinal/TestController.java | 93 +++++++++++-------- 7 files changed, 115 insertions(+), 77 deletions(-) diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java index 92bb733efe1c..50e79ba862d9 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java @@ -1,23 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.jfinal; +import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static io.opentelemetry.javaagent.instrumentation.jfinal.JFinalSingletons.instrumenter; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import javax.annotation.Nullable; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; - -import javax.annotation.Nullable; - -import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; -import static io.opentelemetry.javaagent.instrumentation.jfinal.JFinalSingletons.instrumenter; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - public class ActionHandlerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderOptimization() { @@ -32,11 +35,13 @@ public ElementMatcher typeMatcher() { @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( - named("handle").and(takesArguments(4) - .and(takesArgument(0, String.class)) - .and(takesArgument(1, named("javax.servlet.http.HttpServletRequest"))) - .and(takesArgument(2, named("javax.servlet.http.HttpServletResponse"))) - .and(takesArgument(3, boolean[].class))), + named("handle") + .and( + takesArguments(4) + .and(takesArgument(0, String.class)) + .and(takesArgument(1, named("javax.servlet.http.HttpServletRequest"))) + .and(takesArgument(2, named("javax.servlet.http.HttpServletResponse"))) + .and(takesArgument(3, boolean[].class))), this.getClass().getName() + "$HandleAdvice"); } @@ -62,14 +67,12 @@ public static AdviceScope start(Context parentContext) { return new AdviceScope(context, context.makeCurrent()); } - public void end( - @Nullable Throwable throwable) { + public void end(@Nullable Throwable throwable) { scope.close(); instrumenter().end(context, null, null, throwable); } } - @Advice.OnMethodEnter(suppress = Throwable.class) public static HandleAdvice.AdviceScope onEnter() { return HandleAdvice.AdviceScope.start(currentContext()); @@ -77,8 +80,7 @@ public static HandleAdvice.AdviceScope onEnter() { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopTraceOnResponse( - @Advice.Thrown Throwable throwable, - @Advice.Enter @Nullable AdviceScope actionScope) { + @Advice.Thrown Throwable throwable, @Advice.Enter @Nullable AdviceScope actionScope) { if (actionScope == null) { return; } diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java index 9c71d2f26959..a7c0c5331c17 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java @@ -1,5 +1,9 @@ -package io.opentelemetry.javaagent.instrumentation.jfinal; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ +package io.opentelemetry.javaagent.instrumentation.jfinal; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -11,7 +15,6 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; - public class ActionMappingInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderOptimization() { @@ -26,16 +29,14 @@ public ElementMatcher typeMatcher() { @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( - named("getAction"), - this.getClass().getName() + "$GetActionAdvice"); + named("getAction"), this.getClass().getName() + "$GetActionAdvice"); } @SuppressWarnings("unused") public static class GetActionAdvice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void existGetAction( - @Advice.Return(readOnly = false) Action action) { + public static void existGetAction(@Advice.Return(readOnly = false) Action action) { JFinalSingletons.updateSpan(action); } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java index a53ec1504997..227f8c579681 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.jfinal; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java index bb6640fb56e9..7fde4c860e50 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.jfinal; import com.jfinal.core.Action; @@ -23,7 +28,7 @@ public final class JFinalSingletons { .buildInstrumenter(); static { - //see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465 + // see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465 excludeOtAttrs(); } diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java index 0e7ff3924aa9..61afa120deb7 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.jfinal; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; @@ -62,13 +67,13 @@ protected void configure(HttpServerTestOptions options) { protected Server setupServer() throws Exception { Server server = new Server(port); - ServletContextHandler context = new ServletContextHandler( - ServletContextHandler.SESSIONS); + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); ServletHandler handler = new ServletHandler(); - FilterHolder fh = handler.addFilterWithMapping( - JFinalFilter.class.getName(), "/*", EnumSet.of(DispatcherType.REQUEST)); + FilterHolder fh = + handler.addFilterWithMapping( + JFinalFilter.class.getName(), "/*", EnumSet.of(DispatcherType.REQUEST)); fh.setInitParameter("configClass", TestConfig.class.getName()); context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java index 850f0d49038e..491d64472b31 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.jfinal; import com.jfinal.config.Constants; @@ -8,7 +13,7 @@ import com.jfinal.config.Routes; import com.jfinal.template.Engine; -public class TestConfig extends JFinalConfig { +public class TestConfig extends JFinalConfig { // 配置常量值 @Override public void configConstant(Constants me) { @@ -22,18 +27,14 @@ public void configRoute(Routes me) { } @Override - public void configEngine(Engine me) { - } + public void configEngine(Engine me) {} @Override - public void configPlugin(Plugins me) { - } + public void configPlugin(Plugins me) {} @Override - public void configInterceptor(Interceptors me) { - } + public void configInterceptor(Interceptors me) {} @Override - public void configHandler(Handlers me) { - } + public void configHandler(Handlers me) {} } diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java index ad833afae4a0..325b1bebcb50 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java @@ -1,5 +1,12 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.jfinal; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; + import com.jfinal.core.ActionKey; import com.jfinal.core.Controller; import com.jfinal.render.TextRender; @@ -7,8 +14,6 @@ import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; - public class TestController extends Controller { public void success() { @@ -21,16 +26,18 @@ public void redirect() { @ActionKey("error-status") public void error() throws Exception { - GlobalTraceUtil.runWithSpan("controller", - () -> renderError(500, new TextRender(ServerEndpoint.ERROR.getBody()))); + GlobalTraceUtil.runWithSpan( + "controller", () -> renderError(500, new TextRender(ServerEndpoint.ERROR.getBody()))); } public void exception() throws Throwable { try { - GlobalTraceUtil.runWithSpan("controller", () -> { -// renderError(500, new TextRender(ServerEndpoint.EXCEPTION.getBody())); - throw new IllegalStateException(EXCEPTION.getBody()); - }); + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + // renderError(500, new TextRender(ServerEndpoint.EXCEPTION.getBody())); + throw new IllegalStateException(EXCEPTION.getBody()); + }); } catch (Throwable t) { Span.current().recordException(t); throw t; @@ -38,45 +45,55 @@ public void exception() throws Throwable { } public void captureHeaders() { - GlobalTraceUtil.runWithSpan("controller", () -> { - String header = getHeader("X-Test-Request"); - getResponse().setHeader("X-Test-Response", header); - renderText(ServerEndpoint.CAPTURE_HEADERS.getBody()); - }); + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + String header = getHeader("X-Test-Request"); + getResponse().setHeader("X-Test-Response", header); + renderText(ServerEndpoint.CAPTURE_HEADERS.getBody()); + }); } public void captureParameters() { - GlobalTraceUtil.runWithSpan("controller", () -> { - renderText(ServerEndpoint.CAPTURE_PARAMETERS.getBody()); - }); + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + renderText(ServerEndpoint.CAPTURE_PARAMETERS.getBody()); + }); } public void query() { - GlobalTraceUtil.runWithSpan("controller", () -> { - renderText(ServerEndpoint.QUERY_PARAM.getBody()); - }); + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + renderText(ServerEndpoint.QUERY_PARAM.getBody()); + }); } @ActionKey("path/123/param") public void pathVar() { - GlobalTraceUtil.runWithSpan("controller", () -> { - renderText(ServerEndpoint.PATH_PARAM.getBody()); - }); - + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + renderText(ServerEndpoint.PATH_PARAM.getBody()); + }); } - public void authRequired() { - GlobalTraceUtil.runWithSpan("controller", () -> { - renderText(ServerEndpoint.AUTH_REQUIRED.getBody()); - }); + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + renderText(ServerEndpoint.AUTH_REQUIRED.getBody()); + }); } public void login() { - GlobalTraceUtil.runWithSpan("controller", () -> { - redirect(ServerEndpoint.LOGIN.getBody()); - }); + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + redirect(ServerEndpoint.LOGIN.getBody()); + }); } @ActionKey("basicsecured/endpoint(") @@ -85,12 +102,14 @@ public void basicsecured_endpoint() { } public void child() { - GlobalTraceUtil.runWithSpan("controller", () -> { - ServerEndpoint.INDEXED_CHILD.collectSpanAttributes(name -> { - return getPara(name); - }); - renderText(ServerEndpoint.INDEXED_CHILD.getBody()); - }); + GlobalTraceUtil.runWithSpan( + "controller", + () -> { + ServerEndpoint.INDEXED_CHILD.collectSpanAttributes( + name -> { + return getPara(name); + }); + renderText(ServerEndpoint.INDEXED_CHILD.getBody()); + }); } - } From de238a40ea11985482e9d1eca99f736c4d637f2b Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 5 Nov 2025 17:36:19 +0800 Subject: [PATCH 12/30] =?UTF-8?q?fix=EF=BC=9Afix=20failing=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I61c0953cd1de4856ca7f143d0af20755399b9095 --- .fossa.yml | 3 +++ settings.gradle.kts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.fossa.yml b/.fossa.yml index 5b1f524cc4f9..c6f069896035 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -181,6 +181,9 @@ targets: - type: gradle path: ./ target: ':instrumentation:jdbc:library' + - type: gradle + path: ./ + target: ':instrumentation:jfinal-3.6:javaagent' - type: gradle path: ./ target: ':instrumentation:jmx-metrics:javaagent' diff --git a/settings.gradle.kts b/settings.gradle.kts index 414ccc9ddb36..342a02c82a33 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -646,7 +646,7 @@ include(":instrumentation:xxl-job:xxl-job-2.3.0:javaagent") include(":instrumentation:xxl-job:xxl-job-common:javaagent") include(":instrumentation:xxl-job:xxl-job-common:testing") include(":instrumentation:zio:zio-2.0:javaagent") -include("instrumentation:jfinal-3.6:javaagent") +include(":instrumentation:jfinal-3.6:javaagent") // benchmark include(":benchmark-overhead-jmh") From 63b2d8fe68327b66bc613faea4b88704dc478ebc Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 5 Nov 2025 19:07:54 +0800 Subject: [PATCH 13/30] =?UTF-8?q?refactor=EF=BC=9Aupdate=20package=20name?= =?UTF-8?q?=20&=20remove=20useless=20dependency=20and=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jfinal-3.6/javaagent/build.gradle.kts | 2 +- .../{ => v3_6}/ActionHandlerInstrumentation.java | 15 +++++++-------- .../{ => v3_6}/ActionMappingInstrumentation.java | 4 ++-- .../{ => v3_6}/JFinalInstrumentationModule.java | 4 ++-- .../jfinal/{ => v3_6}/JFinalSingletons.java | 2 +- .../instrumentation/jfinal/TestController.java | 1 - settings.gradle.kts | 3 ++- 7 files changed, 15 insertions(+), 16 deletions(-) rename instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/{ => v3_6}/ActionHandlerInstrumentation.java (87%) rename instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/{ => v3_6}/ActionMappingInstrumentation.java (89%) rename instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/{ => v3_6}/JFinalInstrumentationModule.java (90%) rename instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/{ => v3_6}/JFinalSingletons.java (96%) diff --git a/instrumentation/jfinal-3.6/javaagent/build.gradle.kts b/instrumentation/jfinal-3.6/javaagent/build.gradle.kts index 9453927f7b72..481bb0fac80a 100644 --- a/instrumentation/jfinal-3.6/javaagent/build.gradle.kts +++ b/instrumentation/jfinal-3.6/javaagent/build.gradle.kts @@ -7,6 +7,7 @@ muzzle { group.set("com.jfinal") module.set("jfinal") versions.set("[3.6,)") + assertInverse.set(true) } } @@ -18,7 +19,6 @@ otelJava { dependencies { library("com.jfinal:jfinal:3.6") testLibrary("com.jfinal:jetty-server:2019.3") - testLibrary("com.jfinal:jfinal:3.6") testInstrumentation(project(":instrumentation:jetty:jetty-8.0:javaagent")) testInstrumentation(project(":instrumentation:jetty:jetty-11.0:javaagent")) testInstrumentation(project(":instrumentation:jetty:jetty-common:javaagent")) diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java similarity index 87% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java rename to instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java index 50e79ba862d9..ee4626828050 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionHandlerInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; -import static io.opentelemetry.javaagent.instrumentation.jfinal.JFinalSingletons.instrumenter; +import static io.opentelemetry.javaagent.instrumentation.jfinal.v3_6.JFinalSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -74,17 +74,16 @@ public void end(@Nullable Throwable throwable) { } @Advice.OnMethodEnter(suppress = Throwable.class) - public static HandleAdvice.AdviceScope onEnter() { - return HandleAdvice.AdviceScope.start(currentContext()); + public static AdviceScope onEnter() { + return AdviceScope.start(currentContext()); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopTraceOnResponse( - @Advice.Thrown Throwable throwable, @Advice.Enter @Nullable AdviceScope actionScope) { - if (actionScope == null) { - return; + @Advice.Thrown @Nullable Throwable throwable, @Advice.Enter @Nullable AdviceScope actionScope) { + if (actionScope != null) { + actionScope.end(throwable); } - actionScope.end(throwable); } } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java similarity index 89% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java rename to instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java index a7c0c5331c17..4677c99f2107 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/ActionMappingInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -36,7 +36,7 @@ public void transform(TypeTransformer transformer) { public static class GetActionAdvice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void existGetAction(@Advice.Return(readOnly = false) Action action) { + public static void exitGetAction(@Advice.Return(readOnly = false) Action action) { JFinalSingletons.updateSpan(action); } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java similarity index 90% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java rename to instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java index 227f8c579681..bfd882545516 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; @@ -17,7 +17,7 @@ @AutoService(InstrumentationModule.class) public class JFinalInstrumentationModule extends InstrumentationModule { public JFinalInstrumentationModule() { - super("jfinal"); + super("jfinal", "jfinal-3.6"); } @Override diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java similarity index 96% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java rename to instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java index 7fde4c860e50..9fe1f9d2d6ad 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalSingletons.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; import com.jfinal.core.Action; import com.jfinal.render.JsonRender; diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java index 325b1bebcb50..6bba8f7e5b6a 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java @@ -35,7 +35,6 @@ public void exception() throws Throwable { GlobalTraceUtil.runWithSpan( "controller", () -> { - // renderError(500, new TextRender(ServerEndpoint.EXCEPTION.getBody())); throw new IllegalStateException(EXCEPTION.getBody()); }); } catch (Throwable t) { diff --git a/settings.gradle.kts b/settings.gradle.kts index 8429d581bc5b..74876300b45d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -383,6 +383,7 @@ include(":instrumentation:jetty-httpclient:jetty-httpclient-9.2:testing") include(":instrumentation:jetty-httpclient:jetty-httpclient-12.0:javaagent") include(":instrumentation:jetty-httpclient:jetty-httpclient-12.0:library") include(":instrumentation:jetty-httpclient:jetty-httpclient-12.0:testing") +include(":instrumentation:jfinal-3.6:javaagent") include(":instrumentation:jms:jms-1.1:javaagent") include(":instrumentation:jms:jms-3.0:javaagent") include(":instrumentation:jms:jms-common:bootstrap") @@ -691,7 +692,7 @@ include(":instrumentation:xxl-job:xxl-job-2.3.0:javaagent") include(":instrumentation:xxl-job:xxl-job-common:javaagent") include(":instrumentation:xxl-job:xxl-job-common:testing") include(":instrumentation:zio:zio-2.0:javaagent") -include(":instrumentation:jfinal-3.6:javaagent") + // benchmark include(":benchmark-overhead-jmh") From 85cc3952ae5e022bbb607b1ff7ae9890206c96fe Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Wed, 5 Nov 2025 11:13:32 +0000 Subject: [PATCH 14/30] ./gradlew spotlessApply --- .../jfinal/v3_6/ActionHandlerInstrumentation.java | 3 ++- settings.gradle.kts | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java index ee4626828050..e1cb4bb25a80 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java @@ -80,7 +80,8 @@ public static AdviceScope onEnter() { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopTraceOnResponse( - @Advice.Thrown @Nullable Throwable throwable, @Advice.Enter @Nullable AdviceScope actionScope) { + @Advice.Thrown @Nullable Throwable throwable, + @Advice.Enter @Nullable AdviceScope actionScope) { if (actionScope != null) { actionScope.end(throwable); } diff --git a/settings.gradle.kts b/settings.gradle.kts index 74876300b45d..b2eda65f57df 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -693,7 +693,6 @@ include(":instrumentation:xxl-job:xxl-job-common:javaagent") include(":instrumentation:xxl-job:xxl-job-common:testing") include(":instrumentation:zio:zio-2.0:javaagent") - // benchmark include(":benchmark-overhead-jmh") include(":benchmark-jfr-analyzer") From 5f55199f1541eaa603e7c492038aa4d59f160e1c Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 5 Nov 2025 19:35:23 +0800 Subject: [PATCH 15/30] =?UTF-8?q?refactor=EF=BC=9Adelete=20useless=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I1c1b28366523e7c7a57665d0c312dc40480b9ef7 --- .../jfinal/v3_6/ActionMappingInstrumentation.java | 2 +- .../javaagent/instrumentation/jfinal/TestConfig.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java index 4677c99f2107..493350bc3dbb 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java @@ -36,7 +36,7 @@ public void transform(TypeTransformer transformer) { public static class GetActionAdvice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void exitGetAction(@Advice.Return(readOnly = false) Action action) { + public static void exitGetAction(@Advice.Return Action action) { JFinalSingletons.updateSpan(action); } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java index 491d64472b31..71817a28e62b 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java @@ -14,13 +14,11 @@ import com.jfinal.template.Engine; public class TestConfig extends JFinalConfig { - // 配置常量值 @Override public void configConstant(Constants me) { me.setDevMode(true); } - // 配置路由 @Override public void configRoute(Routes me) { me.add("/", TestController.class); From 3602e5ba6245bf0af27078efd2f147a10ef0ce15 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 12 Nov 2025 11:29:27 +0800 Subject: [PATCH 16/30] refactor: improve JFinal instrumentation implementation - Remove unused code in ActionHandlerInstrumentation and ActionMappingInstrumentation - Refactor JFinalSingletons to improve code organization - Update JFinalInstrumentationModule configuration - Enhance test coverage in JFinalTest - Update TestController implementation - Add JFinal support to documentation --- docs/supported-libraries.md | 1 + .../v3_6/ActionHandlerInstrumentation.java | 5 ---- .../v3_6/ActionMappingInstrumentation.java | 5 ---- .../v3_6/JFinalInstrumentationModule.java | 4 ++-- .../jfinal/v3_6/JFinalSingletons.java | 19 ++++++++++----- .../instrumentation/jfinal/JFinalTest.java | 19 +++++++++++++-- .../jfinal/TestController.java | 23 ++++++++++--------- 7 files changed, 45 insertions(+), 31 deletions(-) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index 48406ce915a7..0906ad41ae27 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -96,6 +96,7 @@ These are the supported libraries and frameworks: | [JBoss Log Manager](https://github.com/jboss-logging/jboss-logmanager) | 1.1+ | N/A | none | | [JDBC](https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html) | Java 8+ | [opentelemetry-jdbc](../instrumentation/jdbc/library) | [Database Client Spans], [Database Client Metrics] [6] | | [Jedis](https://github.com/xetorthio/jedis) | 1.4+ | N/A | [Database Client Spans], [Database Client Metrics] [6] | +| [JFinal](https://github.com/jfinal/jfinal) | 3.6+ | N/A | Provides `http.route` [2], Controller Spans [3] | | [JMS](https://javaee.github.io/javaee-spec/javadocs/javax/jms/package-summary.html) | 1.1+ | N/A | [Messaging Spans] | | [Jodd Http](https://http.jodd.org/) | 4.2+ | N/A | [HTTP Client Spans], [HTTP Client Metrics] | | [JSP](https://javaee.github.io/javaee-spec/javadocs/javax/servlet/jsp/package-summary.html) | 2.3.x only | N/A | Controller Spans [3] | diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java index e1cb4bb25a80..9f48d0fcf571 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java @@ -6,7 +6,6 @@ package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.instrumentation.jfinal.v3_6.JFinalSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -22,10 +21,6 @@ import net.bytebuddy.matcher.ElementMatcher; public class ActionHandlerInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher classLoaderOptimization() { - return hasClassesNamed("com.jfinal.core.ActionHandler"); - } @Override public ElementMatcher typeMatcher() { diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java index 493350bc3dbb..298ab4011048 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static net.bytebuddy.matcher.ElementMatchers.named; import com.jfinal.core.Action; @@ -16,10 +15,6 @@ import net.bytebuddy.matcher.ElementMatcher; public class ActionMappingInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher classLoaderOptimization() { - return hasClassesNamed("com.jfinal.core.ActionMapping"); - } @Override public ElementMatcher typeMatcher() { diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java index bfd882545516..f8e50deb3ea6 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java @@ -6,11 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static java.util.Arrays.asList; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import java.util.Arrays; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -27,6 +27,6 @@ public ElementMatcher.Junction classLoaderMatcher() { @Override public List typeInstrumentations() { - return Arrays.asList(new ActionMappingInstrumentation(), new ActionHandlerInstrumentation()); + return asList(new ActionMappingInstrumentation(), new ActionHandlerInstrumentation()); } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java index 9fe1f9d2d6ad..2bb410c7a885 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java @@ -6,13 +6,17 @@ package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; import com.jfinal.core.Action; +import com.jfinal.core.Controller; import com.jfinal.render.JsonRender; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; + +import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; @@ -28,7 +32,7 @@ public final class JFinalSingletons { .buildInstrumenter(); static { - // see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465 + // see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465#issuecomment-2137294837 excludeOtAttrs(); } @@ -41,17 +45,20 @@ public static void updateSpan(Action action) { return; } String route = action.getActionKey(); - if (route == null) { - return; - } Context context = Context.current(); - HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, route); + if (route != null) { + HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, route); + } + Class clazz = action.getControllerClass(); + Method method = action.getMethod(); + if (clazz != null && method != null) { + Span.fromContext(context).updateName(clazz.getSimpleName() + '.' + method.getName()); + } } private static void excludeOtAttrs() { try { JsonRender.addExcludedAttrs( - "io.opentelemetry.javaagent.instrumentation.servlet.ServletHelper.AsyncListenerResponse", "io.opentelemetry.javaagent.instrumentation.servlet.ServletHelper.Context", "trace_id", "span_id"); diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java index 61afa120deb7..10dc826f9bc9 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java @@ -6,8 +6,12 @@ package io.opentelemetry.javaagent.instrumentation.jfinal; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.NOT_FOUND; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; + + import static org.assertj.core.api.Assertions.assertThat; import com.jfinal.core.JFinalFilter; @@ -50,7 +54,7 @@ protected void configure(HttpServerTestOptions options) { options.setHasHandlerSpan(unused -> true); options.setExpectedHttpRoute( (endpoint, method) -> { - if (endpoint == ServerEndpoint.PATH_PARAM) { + if (endpoint == PATH_PARAM) { return "/path/123/param"; } if (HttpConstants._OTHER.equals(method)) { @@ -101,7 +105,18 @@ protected SpanDataAssert assertResponseSpan( @Override public SpanDataAssert assertHandlerSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { - span.hasName("jfinal.handle").hasKind(INTERNAL); + span.hasName(getHandlerSpanName(endpoint)).hasKind(INTERNAL); return span; } + + private static String getHandlerSpanName(ServerEndpoint endpoint) { + if (PATH_PARAM.equals(endpoint)) { + return "TestController.pathParam"; + } else if (NOT_FOUND.equals(endpoint)) { + return "jfinal.handle"; + } else if (ERROR.equals(endpoint)) { + return "TestController.error"; + } + return "TestController." + endpoint.getPath().replace("/", ""); + } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java index 6bba8f7e5b6a..b51aab171bda 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.jfinal; +import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; import com.jfinal.core.ActionKey; @@ -17,22 +18,22 @@ public class TestController extends Controller { public void success() { - GlobalTraceUtil.runWithSpan("controller", () -> renderText(ServerEndpoint.SUCCESS.getBody())); + runWithSpan("controller", () -> renderText(ServerEndpoint.SUCCESS.getBody())); } public void redirect() { - GlobalTraceUtil.runWithSpan("controller", () -> redirect(ServerEndpoint.REDIRECT.getBody())); + runWithSpan("controller", () -> redirect(ServerEndpoint.REDIRECT.getBody())); } @ActionKey("error-status") public void error() throws Exception { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> renderError(500, new TextRender(ServerEndpoint.ERROR.getBody()))); } public void exception() throws Throwable { try { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { throw new IllegalStateException(EXCEPTION.getBody()); @@ -44,7 +45,7 @@ public void exception() throws Throwable { } public void captureHeaders() { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { String header = getHeader("X-Test-Request"); @@ -54,7 +55,7 @@ public void captureHeaders() { } public void captureParameters() { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { renderText(ServerEndpoint.CAPTURE_PARAMETERS.getBody()); @@ -63,7 +64,7 @@ public void captureParameters() { public void query() { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { renderText(ServerEndpoint.QUERY_PARAM.getBody()); @@ -72,7 +73,7 @@ public void query() { @ActionKey("path/123/param") public void pathVar() { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { renderText(ServerEndpoint.PATH_PARAM.getBody()); @@ -80,7 +81,7 @@ public void pathVar() { } public void authRequired() { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { renderText(ServerEndpoint.AUTH_REQUIRED.getBody()); @@ -88,7 +89,7 @@ public void authRequired() { } public void login() { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { redirect(ServerEndpoint.LOGIN.getBody()); @@ -101,7 +102,7 @@ public void basicsecured_endpoint() { } public void child() { - GlobalTraceUtil.runWithSpan( + runWithSpan( "controller", () -> { ServerEndpoint.INDEXED_CHILD.collectSpanAttributes( From 2e9cf762190b74eb6caacb7bd9a5a47ca99f4ed1 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Wed, 12 Nov 2025 03:36:48 +0000 Subject: [PATCH 17/30] ./gradlew spotlessApply --- .../instrumentation/jfinal/v3_6/JFinalSingletons.java | 6 +++--- .../javaagent/instrumentation/jfinal/JFinalTest.java | 6 ++---- .../javaagent/instrumentation/jfinal/TestController.java | 1 - 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java index 2bb410c7a885..c6e442b155a6 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java @@ -15,7 +15,6 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; - import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; @@ -32,7 +31,8 @@ public final class JFinalSingletons { .buildInstrumenter(); static { - // see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465#issuecomment-2137294837 + // see + // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465#issuecomment-2137294837 excludeOtAttrs(); } @@ -52,7 +52,7 @@ public static void updateSpan(Action action) { Class clazz = action.getControllerClass(); Method method = action.getMethod(); if (clazz != null && method != null) { - Span.fromContext(context).updateName(clazz.getSimpleName() + '.' + method.getName()); + Span.fromContext(context).updateName(clazz.getSimpleName() + '.' + method.getName()); } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java index 10dc826f9bc9..81f75ee2713a 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java @@ -6,12 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.jfinal; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.NOT_FOUND; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; - - import static org.assertj.core.api.Assertions.assertThat; import com.jfinal.core.JFinalFilter; diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java index b51aab171bda..c5dd61e05ac0 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java +++ b/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java @@ -12,7 +12,6 @@ import com.jfinal.core.Controller; import com.jfinal.render.TextRender; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; public class TestController extends Controller { From 85ce47f7b2c69bb30a31e89855ec1174cad3b75e Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 12 Nov 2025 11:41:54 +0800 Subject: [PATCH 18/30] refactor: optimize ActionHandlerInstrumentation implementation - Remove unused currentContext import - Change HandleAdvice class to private for better encapsulation - Refactor AdviceScope.start() to call Context.current() internally Change-Id: I69e0de219e8cc80bde3bedbd641a211b45ddd6f2 --- .../jfinal/v3_6/ActionHandlerInstrumentation.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java index 9f48d0fcf571..f60f77598de4 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java +++ b/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; -import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.jfinal.v3_6.JFinalSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -41,7 +40,7 @@ public void transform(TypeTransformer transformer) { } @SuppressWarnings("unused") - public static class HandleAdvice { + private static class HandleAdvice { public static class AdviceScope { private final Context context; @@ -53,7 +52,8 @@ public AdviceScope(Context context, Scope scope) { } @Nullable - public static AdviceScope start(Context parentContext) { + public static AdviceScope start() { + Context parentContext = Context.current(); if (!instrumenter().shouldStart(parentContext, null)) { return null; } @@ -70,7 +70,7 @@ public void end(@Nullable Throwable throwable) { @Advice.OnMethodEnter(suppress = Throwable.class) public static AdviceScope onEnter() { - return AdviceScope.start(currentContext()); + return AdviceScope.start(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) From 85162990fc85e9820e264fbcb60e45dba4b518df Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 12 Nov 2025 13:55:07 +0800 Subject: [PATCH 19/30] refactor: rename jfinal-3.6 to jfinal-3.2 and update package references - Changed minimum supported version from 3.6 to 3.2 to extend compatibility - Renamed instrumentation module from jfinal-3.6 to jfinal-3.2 - Updated all package names from v3_6 to v3_2 - Added classLoader matcher to distinguish between JFinal 3.2 and 3.6+ - Changed HandleAdvice class visibility from private to public - Updated documentation to reflect new version support Change-Id: If3a9bc00c0e0ee59328971f3e9cc0152d7defe67 --- docs/supported-libraries.md | 2 +- .../{jfinal-3.6 => jfinal-3.2}/javaagent/build.gradle.kts | 2 +- .../jfinal/v3_2}/ActionHandlerInstrumentation.java | 6 +++--- .../jfinal/v3_2}/ActionMappingInstrumentation.java | 2 +- .../jfinal/v3_2}/JFinalInstrumentationModule.java | 5 +++-- .../instrumentation/jfinal/v3_2}/JFinalSingletons.java | 2 +- .../javaagent/instrumentation/jfinal/JFinalTest.java | 0 .../javaagent/instrumentation/jfinal/TestConfig.java | 0 .../javaagent/instrumentation/jfinal/TestController.java | 0 settings.gradle.kts | 2 +- 10 files changed, 11 insertions(+), 10 deletions(-) rename instrumentation/{jfinal-3.6 => jfinal-3.2}/javaagent/build.gradle.kts (96%) rename instrumentation/{jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6 => jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2}/ActionHandlerInstrumentation.java (95%) rename instrumentation/{jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6 => jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2}/ActionMappingInstrumentation.java (94%) rename instrumentation/{jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6 => jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2}/JFinalInstrumentationModule.java (79%) rename instrumentation/{jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6 => jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2}/JFinalSingletons.java (97%) rename instrumentation/{jfinal-3.6 => jfinal-3.2}/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java (100%) rename instrumentation/{jfinal-3.6 => jfinal-3.2}/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java (100%) rename instrumentation/{jfinal-3.6 => jfinal-3.2}/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java (100%) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index 0906ad41ae27..0f6990a7a9a4 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -96,7 +96,7 @@ These are the supported libraries and frameworks: | [JBoss Log Manager](https://github.com/jboss-logging/jboss-logmanager) | 1.1+ | N/A | none | | [JDBC](https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html) | Java 8+ | [opentelemetry-jdbc](../instrumentation/jdbc/library) | [Database Client Spans], [Database Client Metrics] [6] | | [Jedis](https://github.com/xetorthio/jedis) | 1.4+ | N/A | [Database Client Spans], [Database Client Metrics] [6] | -| [JFinal](https://github.com/jfinal/jfinal) | 3.6+ | N/A | Provides `http.route` [2], Controller Spans [3] | +| [JFinal](https://github.com/jfinal/jfinal) | 3.2+ | N/A | Provides `http.route` [2], Controller Spans [3] | | [JMS](https://javaee.github.io/javaee-spec/javadocs/javax/jms/package-summary.html) | 1.1+ | N/A | [Messaging Spans] | | [Jodd Http](https://http.jodd.org/) | 4.2+ | N/A | [HTTP Client Spans], [HTTP Client Metrics] | | [JSP](https://javaee.github.io/javaee-spec/javadocs/javax/servlet/jsp/package-summary.html) | 2.3.x only | N/A | Controller Spans [3] | diff --git a/instrumentation/jfinal-3.6/javaagent/build.gradle.kts b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts similarity index 96% rename from instrumentation/jfinal-3.6/javaagent/build.gradle.kts rename to instrumentation/jfinal-3.2/javaagent/build.gradle.kts index 481bb0fac80a..dfde59ce9d92 100644 --- a/instrumentation/jfinal-3.6/javaagent/build.gradle.kts +++ b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts @@ -6,7 +6,7 @@ muzzle { pass { group.set("com.jfinal") module.set("jfinal") - versions.set("[3.6,)") + versions.set("[3.2,)") assertInverse.set(true) } } diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionHandlerInstrumentation.java similarity index 95% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java rename to instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionHandlerInstrumentation.java index f60f77598de4..3addf1fe06ee 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionHandlerInstrumentation.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionHandlerInstrumentation.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_2; -import static io.opentelemetry.javaagent.instrumentation.jfinal.v3_6.JFinalSingletons.instrumenter; +import static io.opentelemetry.javaagent.instrumentation.jfinal.v3_2.JFinalSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -40,7 +40,7 @@ public void transform(TypeTransformer transformer) { } @SuppressWarnings("unused") - private static class HandleAdvice { + public static class HandleAdvice { public static class AdviceScope { private final Context context; diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionMappingInstrumentation.java similarity index 94% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java rename to instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionMappingInstrumentation.java index 298ab4011048..2b149b0af0d8 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/ActionMappingInstrumentation.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionMappingInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_2; import static net.bytebuddy.matcher.ElementMatchers.named; diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java similarity index 79% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java rename to instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java index f8e50deb3ea6..bab441f94419 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java @@ -3,10 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_2; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Arrays.asList; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; @@ -22,7 +23,7 @@ public JFinalInstrumentationModule() { @Override public ElementMatcher.Junction classLoaderMatcher() { - return hasClassesNamed("com.jfinal.core.ActionMapping"); + return hasClassesNamed("com.jfinal.core.ActionMapping").and(not(hasClassesNamed("com.jfinal.core.TypeConverter"))); } @Override diff --git a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java similarity index 97% rename from instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java rename to instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java index c6e442b155a6..b4f709279bce 100644 --- a/instrumentation/jfinal-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_6/JFinalSingletons.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jfinal.v3_6; +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_2; import com.jfinal.core.Action; import com.jfinal.core.Controller; diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java similarity index 100% rename from instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java rename to instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java similarity index 100% rename from instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java rename to instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestConfig.java diff --git a/instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java similarity index 100% rename from instrumentation/jfinal-3.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java rename to instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/TestController.java diff --git a/settings.gradle.kts b/settings.gradle.kts index b2eda65f57df..f288eccdb169 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -383,7 +383,7 @@ include(":instrumentation:jetty-httpclient:jetty-httpclient-9.2:testing") include(":instrumentation:jetty-httpclient:jetty-httpclient-12.0:javaagent") include(":instrumentation:jetty-httpclient:jetty-httpclient-12.0:library") include(":instrumentation:jetty-httpclient:jetty-httpclient-12.0:testing") -include(":instrumentation:jfinal-3.6:javaagent") +include(":instrumentation:jfinal-3.2:javaagent") include(":instrumentation:jms:jms-1.1:javaagent") include(":instrumentation:jms:jms-3.0:javaagent") include(":instrumentation:jms:jms-common:bootstrap") From 98e6131b5693502b7bd63cf0fefb777f7356dfe1 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Wed, 12 Nov 2025 06:01:38 +0000 Subject: [PATCH 20/30] ./gradlew spotlessApply --- .../jfinal/v3_2/JFinalInstrumentationModule.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java index bab441f94419..2169a722a230 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java @@ -23,7 +23,8 @@ public JFinalInstrumentationModule() { @Override public ElementMatcher.Junction classLoaderMatcher() { - return hasClassesNamed("com.jfinal.core.ActionMapping").and(not(hasClassesNamed("com.jfinal.core.TypeConverter"))); + return hasClassesNamed("com.jfinal.core.ActionMapping") + .and(not(hasClassesNamed("com.jfinal.core.TypeConverter"))); } @Override From 59d8140c25087e30b5a46cc1bbec1ca7d5d7aebe Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 12 Nov 2025 14:19:28 +0800 Subject: [PATCH 21/30] refactor: update JFinal instrumentation configuration - Simplified classLoader matcher to only exclude JFinal 3.6+ (TypeConverter class) - Updated instrumenter name from jfinal-3.6 to jfinal-3.2 - Adjusted Java version constraint for tests to only apply when not testing latest deps - Updated comment to clarify JFinal 3.6 Java 9+ compatibility issue Change-Id: Ia4a73a9d5767e048c0dfe3897acd394cf641c6b6 --- instrumentation/jfinal-3.2/javaagent/build.gradle.kts | 8 ++++++-- .../jfinal/v3_2/JFinalInstrumentationModule.java | 5 ++--- .../instrumentation/jfinal/v3_2/JFinalSingletons.java | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/instrumentation/jfinal-3.2/javaagent/build.gradle.kts b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts index dfde59ce9d92..9ab4ac00b8f0 100644 --- a/instrumentation/jfinal-3.2/javaagent/build.gradle.kts +++ b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts @@ -11,9 +11,13 @@ muzzle { } } -otelJava { - // jfinal doesn't work with Java 9+ + + +if (!(findProperty("testLatestDeps") as Boolean)) { + otelJava { + //jfinal 3.6 doesn't work with Java 9+ maxJavaVersionForTests.set(JavaVersion.VERSION_1_8) + } } dependencies { diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java index 2169a722a230..b7273098d20e 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java @@ -18,13 +18,12 @@ @AutoService(InstrumentationModule.class) public class JFinalInstrumentationModule extends InstrumentationModule { public JFinalInstrumentationModule() { - super("jfinal", "jfinal-3.6"); + super("jfinal", "jfinal-3.2"); } @Override public ElementMatcher.Junction classLoaderMatcher() { - return hasClassesNamed("com.jfinal.core.ActionMapping") - .and(not(hasClassesNamed("com.jfinal.core.TypeConverter"))); + return not(hasClassesNamed("com.jfinal.core.TypeConverter")); } @Override diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java index b4f709279bce..83d7f1397b1a 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java @@ -26,7 +26,7 @@ public final class JFinalSingletons { private static final String SPAN_NAME = "jfinal.handle"; private static final Instrumenter INSTRUMENTER = Instrumenter.builder( - GlobalOpenTelemetry.get(), "io.opentelemetry.jfinal-3.6", s -> SPAN_NAME) + GlobalOpenTelemetry.get(), "io.opentelemetry.jfinal-3.2", s -> SPAN_NAME) .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) .buildInstrumenter(); From 9e6f362a17981bfaada9482bb46ab7b6487ff30c Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Wed, 12 Nov 2025 06:27:51 +0000 Subject: [PATCH 22/30] ./gradlew spotlessApply --- instrumentation/jfinal-3.2/javaagent/build.gradle.kts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/instrumentation/jfinal-3.2/javaagent/build.gradle.kts b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts index 9ab4ac00b8f0..7c0612b8aa64 100644 --- a/instrumentation/jfinal-3.2/javaagent/build.gradle.kts +++ b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts @@ -11,12 +11,10 @@ muzzle { } } - - if (!(findProperty("testLatestDeps") as Boolean)) { otelJava { - //jfinal 3.6 doesn't work with Java 9+ - maxJavaVersionForTests.set(JavaVersion.VERSION_1_8) + // jfinal 3.6 doesn't work with Java 9+ + maxJavaVersionForTests.set(JavaVersion.VERSION_1_8) } } From c233117ca2039a9f1a05aea5b59a73a13a820152 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Wed, 12 Nov 2025 15:40:56 +0800 Subject: [PATCH 23/30] chore: update FOSSA configuration for JFinal instrumentation Update JFinal target from jfinal-3.6 to jfinal-3.2 to align with the renamed instrumentation module. Change-Id: I1e8fa01c3564202330cf60b4375d720e729d00f6 --- .fossa.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.fossa.yml b/.fossa.yml index 8fc9a56d0990..66ac9a3a25ef 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -189,7 +189,7 @@ targets: target: ':instrumentation:jdbc:library' - type: gradle path: ./ - target: ':instrumentation:jfinal-3.6:javaagent' + target: ':instrumentation:jfinal-3.2:javaagent' - type: gradle path: ./ target: ':instrumentation:jmx-metrics:javaagent' From 47a29a7309e3ceeef1bbf08249875bc751b01e88 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Thu, 13 Nov 2025 15:42:57 +0800 Subject: [PATCH 24/30] docs: add comment explaining TypeConverter version check in JFinal instrumentation Add clarification that TypeConverter was moved from com.jfinal.core to com.jfinal.core.converter after version 3.2, explaining the classloader matcher logic. Change-Id: Id796d3e1798573a93c4fba0f30a5dd101fa73538 --- .../jfinal/v3_2/JFinalInstrumentationModule.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java index b7273098d20e..7b1e06356456 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java @@ -23,6 +23,8 @@ public JFinalInstrumentationModule() { @Override public ElementMatcher.Junction classLoaderMatcher() { + // In version 3.2, TypeConverter is moved from com.jfinal.core + // to com.jfinal.core.converter return not(hasClassesNamed("com.jfinal.core.TypeConverter")); } From 95f7b99d38c41ba755437c763431bd6a95225dac Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Nov 2025 10:00:34 +0200 Subject: [PATCH 25/30] enable redirect test --- .../instrumentation/jfinal/JFinalTest.java | 33 ++++++++----------- .../servlet/v3_0/jetty/JettyServlet3Test.java | 6 ++-- .../v3_0/jetty/JettyServletHandlerTest.java | 7 ++-- .../junit/http/AbstractHttpServerTest.java | 13 ++++++-- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java index 81f75ee2713a..db300c698876 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java +++ b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java @@ -22,6 +22,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.sdk.trace.data.SpanData; import java.util.EnumSet; import javax.servlet.DispatcherType; import org.eclipse.jetty.server.Server; @@ -37,19 +38,8 @@ public class JFinalTest extends AbstractHttpServerTest { @Override protected void configure(HttpServerTestOptions options) { - // In the redirection scenario, the current test case fails to pass. - // Modifying the logic of AbstractHttpServerTest to address this would - // entail significant risk; therefore, we will temporarily skip validation - // for this scenario. - // - // actual span relationship: expecting span relationship - // GET /redirect GET /redirect - // |---jfinal.handle |---jfinal.handle - // |---controller |---controller - // |---Response.sendRedirect |---Response.sendRedirect - // - options.setTestRedirect(false); options.setHasHandlerSpan(unused -> true); + options.setHasResponseSpan(endpoint -> endpoint == REDIRECT); options.setExpectedHttpRoute( (endpoint, method) -> { if (endpoint == PATH_PARAM) { @@ -92,19 +82,22 @@ protected void stopServer(Server server) throws Exception { @Override protected SpanDataAssert assertResponseSpan( - SpanDataAssert span, String method, ServerEndpoint endpoint) { - if (endpoint == REDIRECT) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); - } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); - return span; + SpanDataAssert span, + SpanData serverSpan, + SpanData controllerSpan, + SpanData handlerSpan, + String method, + ServerEndpoint endpoint) { + return span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")) + .hasParent(handlerSpan) + .hasKind(SpanKind.INTERNAL) + .hasAttributesSatisfying(Attributes::isEmpty); } @Override public SpanDataAssert assertHandlerSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { - span.hasName(getHandlerSpanName(endpoint)).hasKind(INTERNAL); - return span; + return span.hasName(getHandlerSpanName(endpoint)).hasKind(INTERNAL); } private static String getHandlerSpanName(ServerEndpoint endpoint) { diff --git a/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServlet3Test.java b/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServlet3Test.java index 26e292cc3a69..e0fd16890141 100644 --- a/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServlet3Test.java +++ b/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServlet3Test.java @@ -63,6 +63,7 @@ public boolean isAsyncTest() { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, + SpanData serverSpan, SpanData controllerSpan, SpanData handlerSpan, String method, @@ -70,10 +71,11 @@ protected SpanDataAssert assertResponseSpan( if (IS_BEFORE_94 && endpoint.equals(EXCEPTION)) { span.satisfies(it -> assertThat(it.getName()).matches(".*\\.sendError")) .hasKind(SpanKind.INTERNAL) - .hasParent(handlerSpan); + .hasParent(serverSpan); } - return super.assertResponseSpan(span, controllerSpan, handlerSpan, method, endpoint); + return super.assertResponseSpan( + span, serverSpan, controllerSpan, handlerSpan, method, endpoint); } @Override diff --git a/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java b/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java index 529793e48da2..720feef01309 100644 --- a/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java +++ b/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java @@ -59,18 +59,19 @@ public boolean hasResponseSpan(ServerEndpoint endpoint) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, + SpanData serverSpan, SpanData controllerSpan, SpanData handlerSpan, String method, ServerEndpoint endpoint) { - if (JettyServlet3Test.IS_BEFORE_94 && endpoint.equals(EXCEPTION)) { span.satisfies(it -> assertThat(it.getName()).matches(".*\\.sendError")) .hasKind(SpanKind.INTERNAL) - .hasParent(handlerSpan); + .hasParent(serverSpan); } - return super.assertResponseSpan(span, controllerSpan, handlerSpan, method, endpoint); + return super.assertResponseSpan( + span, serverSpan, controllerSpan, handlerSpan, method, endpoint); } @Override diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java index 1923d657d165..8dbc228eff05 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java @@ -722,10 +722,12 @@ protected void assertTheTraces( }); } + int handlerIndex = -1; if (endpoint != NOT_FOUND) { int parentIndex = 0; if (options.hasHandlerSpan.test(endpoint)) { - parentIndex = spanAssertions.size() - 1; + handlerIndex = spanAssertions.size() - 1; + parentIndex = handlerIndex; } int finalParentIndex = parentIndex; spanAssertions.add( @@ -741,10 +743,16 @@ protected void assertTheTraces( if (options.hasResponseSpan.test(endpoint)) { int parentIndex = spanAssertions.size() - 1; + int finalHandlerIndex = handlerIndex; spanAssertions.add( span -> assertResponseSpan( - span, trace.getSpan(parentIndex), trace.getSpan(0), method, endpoint)); + span, + trace.getSpan(0), + trace.getSpan(parentIndex), + finalHandlerIndex >= 0 ? trace.getSpan(finalHandlerIndex) : null, + method, + endpoint)); } if (options.hasErrorPageSpans.test(endpoint)) { @@ -788,6 +796,7 @@ protected SpanDataAssert assertHandlerSpan( @CanIgnoreReturnValue protected SpanDataAssert assertResponseSpan( SpanDataAssert span, + SpanData serverSpan, SpanData controllerSpan, SpanData handlerSpan, String method, From 64fb54599e56d652e7765508b609ebba6f06a938 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Nov 2025 10:02:12 +0200 Subject: [PATCH 26/30] remove try catch --- .../jfinal/v3_2/JFinalSingletons.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java index 83d7f1397b1a..822316f451dc 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java @@ -16,13 +16,9 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import java.lang.reflect.Method; -import java.util.logging.Level; -import java.util.logging.Logger; public final class JFinalSingletons { - private static final Logger logger = Logger.getLogger(JFinalSingletons.class.getName()); - private static final String SPAN_NAME = "jfinal.handle"; private static final Instrumenter INSTRUMENTER = Instrumenter.builder( @@ -57,14 +53,10 @@ public static void updateSpan(Action action) { } private static void excludeOtAttrs() { - try { - JsonRender.addExcludedAttrs( - "io.opentelemetry.javaagent.instrumentation.servlet.ServletHelper.Context", - "trace_id", - "span_id"); - } catch (Throwable t) { - logger.log(Level.INFO, "exclude failed", t); - } + JsonRender.addExcludedAttrs( + "io.opentelemetry.javaagent.instrumentation.servlet.ServletHelper.Context", + "trace_id", + "span_id"); } private JFinalSingletons() {} From 94def77370ef83c86f6566b430441fd7511ae019 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Nov 2025 10:04:08 +0200 Subject: [PATCH 27/30] test with 3.2 --- instrumentation/jfinal-3.2/javaagent/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/jfinal-3.2/javaagent/build.gradle.kts b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts index 7c0612b8aa64..5336ad06466d 100644 --- a/instrumentation/jfinal-3.2/javaagent/build.gradle.kts +++ b/instrumentation/jfinal-3.2/javaagent/build.gradle.kts @@ -13,13 +13,13 @@ muzzle { if (!(findProperty("testLatestDeps") as Boolean)) { otelJava { - // jfinal 3.6 doesn't work with Java 9+ + // jfinal 3.2 doesn't work with Java 9+ maxJavaVersionForTests.set(JavaVersion.VERSION_1_8) } } dependencies { - library("com.jfinal:jfinal:3.6") + library("com.jfinal:jfinal:3.2") testLibrary("com.jfinal:jetty-server:2019.3") testInstrumentation(project(":instrumentation:jetty:jetty-8.0:javaagent")) testInstrumentation(project(":instrumentation:jetty:jetty-11.0:javaagent")) From f4d8fc828ce9486bd9386cab9b23d6aab67ee15a Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Nov 2025 10:08:37 +0200 Subject: [PATCH 28/30] mark indy ready --- .../jfinal/v3_2/JFinalInstrumentationModule.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java index 7b1e06356456..4175af3885e3 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java @@ -12,11 +12,14 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) -public class JFinalInstrumentationModule extends InstrumentationModule { +public class JFinalInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { + public JFinalInstrumentationModule() { super("jfinal", "jfinal-3.2"); } @@ -28,6 +31,11 @@ public ElementMatcher.Junction classLoaderMatcher() { return not(hasClassesNamed("com.jfinal.core.TypeConverter")); } + @Override + public boolean isIndyReady() { + return true; + } + @Override public List typeInstrumentations() { return asList(new ActionMappingInstrumentation(), new ActionHandlerInstrumentation()); From d381462918bdab0d9cda4d46d1a96392fc2582d2 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Nov 2025 13:58:07 +0200 Subject: [PATCH 29/30] Record code attributes for the controller span --- .../v3_2/ActionHandlerInstrumentation.java | 85 ----------------- .../v3_2/ActionMappingInstrumentation.java | 2 +- .../v3_2/InvocationInstrumentation.java | 92 +++++++++++++++++++ .../v3_2/JFinalInstrumentationModule.java | 2 +- .../jfinal/v3_2/JFinalSingletons.java | 34 +++---- .../instrumentation/jfinal/JFinalTest.java | 36 +++++++- 6 files changed, 145 insertions(+), 106 deletions(-) delete mode 100644 instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionHandlerInstrumentation.java create mode 100644 instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/InvocationInstrumentation.java diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionHandlerInstrumentation.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionHandlerInstrumentation.java deleted file mode 100644 index 3addf1fe06ee..000000000000 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionHandlerInstrumentation.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.jfinal.v3_2; - -import static io.opentelemetry.javaagent.instrumentation.jfinal.v3_2.JFinalSingletons.instrumenter; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - -import io.opentelemetry.context.Context; -import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import javax.annotation.Nullable; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -public class ActionHandlerInstrumentation implements TypeInstrumentation { - - @Override - public ElementMatcher typeMatcher() { - return named("com.jfinal.core.ActionHandler"); - } - - @Override - public void transform(TypeTransformer transformer) { - transformer.applyAdviceToMethod( - named("handle") - .and( - takesArguments(4) - .and(takesArgument(0, String.class)) - .and(takesArgument(1, named("javax.servlet.http.HttpServletRequest"))) - .and(takesArgument(2, named("javax.servlet.http.HttpServletResponse"))) - .and(takesArgument(3, boolean[].class))), - this.getClass().getName() + "$HandleAdvice"); - } - - @SuppressWarnings("unused") - public static class HandleAdvice { - - public static class AdviceScope { - private final Context context; - private final Scope scope; - - public AdviceScope(Context context, Scope scope) { - this.context = context; - this.scope = scope; - } - - @Nullable - public static AdviceScope start() { - Context parentContext = Context.current(); - if (!instrumenter().shouldStart(parentContext, null)) { - return null; - } - - Context context = instrumenter().start(parentContext, null); - return new AdviceScope(context, context.makeCurrent()); - } - - public void end(@Nullable Throwable throwable) { - scope.close(); - instrumenter().end(context, null, null, throwable); - } - } - - @Advice.OnMethodEnter(suppress = Throwable.class) - public static AdviceScope onEnter() { - return AdviceScope.start(); - } - - @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void stopTraceOnResponse( - @Advice.Thrown @Nullable Throwable throwable, - @Advice.Enter @Nullable AdviceScope actionScope) { - if (actionScope != null) { - actionScope.end(throwable); - } - } - } -} diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionMappingInstrumentation.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionMappingInstrumentation.java index 2b149b0af0d8..a516a440c858 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionMappingInstrumentation.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/ActionMappingInstrumentation.java @@ -32,7 +32,7 @@ public static class GetActionAdvice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void exitGetAction(@Advice.Return Action action) { - JFinalSingletons.updateSpan(action); + JFinalSingletons.updateRoute(action); } } } diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/InvocationInstrumentation.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/InvocationInstrumentation.java new file mode 100644 index 000000000000..dd636fc5bfd8 --- /dev/null +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/InvocationInstrumentation.java @@ -0,0 +1,92 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jfinal.v3_2; + +import static io.opentelemetry.javaagent.instrumentation.jfinal.v3_2.JFinalSingletons.instrumenter; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesNoArguments; + +import com.jfinal.aop.Invocation; +import com.jfinal.core.Action; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod; +import io.opentelemetry.javaagent.bootstrap.CallDepth; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import javax.annotation.Nullable; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class InvocationInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("com.jfinal.aop.Invocation"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + named("invoke").and(takesNoArguments()), this.getClass().getName() + "$InvokeAdvice"); + } + + @SuppressWarnings("unused") + public static class InvokeAdvice { + + public static class AdviceScope { + private final CallDepth callDepth; + private final ClassAndMethod request; + private final Context context; + private final Scope scope; + + public AdviceScope( + CallDepth callDepth, ClassAndMethod request, Context context, Scope scope) { + this.callDepth = callDepth; + this.request = request; + this.context = context; + this.scope = scope; + } + + public static AdviceScope start(CallDepth callDepth, Action action) { + if (callDepth.getAndIncrement() > 0 || action == null) { + return new AdviceScope(callDepth, null, null, null); + } + + Context parentContext = Context.current(); + ClassAndMethod request = + ClassAndMethod.create(action.getControllerClass(), action.getMethodName()); + if (!instrumenter().shouldStart(parentContext, request)) { + return new AdviceScope(callDepth, null, null, null); + } + + Context context = instrumenter().start(parentContext, request); + return new AdviceScope(callDepth, request, context, context.makeCurrent()); + } + + public void end(@Nullable Throwable throwable) { + if (callDepth.decrementAndGet() > 0 || scope == null) { + return; + } + scope.close(); + instrumenter().end(context, request, null, throwable); + } + } + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static AdviceScope onEnter(@Advice.FieldValue("action") Action action) { + CallDepth callDepth = CallDepth.forClass(Invocation.class); + return AdviceScope.start(callDepth, action); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void stopTraceOnResponse( + @Advice.Thrown @Nullable Throwable throwable, @Advice.Enter AdviceScope actionScope) { + actionScope.end(throwable); + } + } +} diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java index 4175af3885e3..5375ffb40f30 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalInstrumentationModule.java @@ -38,6 +38,6 @@ public boolean isIndyReady() { @Override public List typeInstrumentations() { - return asList(new ActionMappingInstrumentation(), new ActionHandlerInstrumentation()); + return asList(new ActionMappingInstrumentation(), new InvocationInstrumentation()); } } diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java index 822316f451dc..cfcc9aaf6675 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java @@ -6,37 +6,44 @@ package io.opentelemetry.javaagent.instrumentation.jfinal.v3_2; import com.jfinal.core.Action; -import com.jfinal.core.Controller; import com.jfinal.render.JsonRender; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesGetter; +import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; -import java.lang.reflect.Method; public final class JFinalSingletons { - private static final String SPAN_NAME = "jfinal.handle"; - private static final Instrumenter INSTRUMENTER = - Instrumenter.builder( - GlobalOpenTelemetry.get(), "io.opentelemetry.jfinal-3.2", s -> SPAN_NAME) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) - .buildInstrumenter(); + private static final Instrumenter INSTRUMENTER; static { // see // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/11465#issuecomment-2137294837 excludeOtAttrs(); + + CodeAttributesGetter codedAttributesGetter = + ClassAndMethod.codeAttributesGetter(); + INSTRUMENTER = + Instrumenter.builder( + GlobalOpenTelemetry.get(), + "io.opentelemetry.jfinal-3.2", + CodeSpanNameExtractor.create(codedAttributesGetter)) + .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .addAttributesExtractor(CodeAttributesExtractor.create(codedAttributesGetter)) + .buildInstrumenter(); } - public static Instrumenter instrumenter() { + public static Instrumenter instrumenter() { return INSTRUMENTER; } - public static void updateSpan(Action action) { + public static void updateRoute(Action action) { if (action == null) { return; } @@ -45,11 +52,6 @@ public static void updateSpan(Action action) { if (route != null) { HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, route); } - Class clazz = action.getControllerClass(); - Method method = action.getMethod(); - if (clazz != null && method != null) { - Span.fromContext(context).updateName(clazz.getSimpleName() + '.' + method.getName()); - } } private static void excludeOtAttrs() { diff --git a/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java index db300c698876..2495362c8157 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java +++ b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java @@ -6,9 +6,13 @@ package io.opentelemetry.javaagent.instrumentation.jfinal; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.NOT_FOUND; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static org.assertj.core.api.Assertions.assertThat; @@ -17,13 +21,16 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.code.SemconvCodeStabilityUtil; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.data.StatusData; import java.util.EnumSet; +import java.util.Locale; import javax.servlet.DispatcherType; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; @@ -38,7 +45,7 @@ public class JFinalTest extends AbstractHttpServerTest { @Override protected void configure(HttpServerTestOptions options) { - options.setHasHandlerSpan(unused -> true); + options.setHasHandlerSpan(endpoint -> endpoint != NOT_FOUND); options.setHasResponseSpan(endpoint -> endpoint == REDIRECT); options.setExpectedHttpRoute( (endpoint, method) -> { @@ -89,7 +96,7 @@ protected SpanDataAssert assertResponseSpan( String method, ServerEndpoint endpoint) { return span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")) - .hasParent(handlerSpan) + .hasParent(serverSpan) .hasKind(SpanKind.INTERNAL) .hasAttributesSatisfying(Attributes::isEmpty); } @@ -97,7 +104,30 @@ protected SpanDataAssert assertResponseSpan( @Override public SpanDataAssert assertHandlerSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { - return span.hasName(getHandlerSpanName(endpoint)).hasKind(INTERNAL); + span.hasName(getHandlerSpanName(endpoint)) + .hasKind(INTERNAL) + .hasAttributesSatisfyingExactly( + SemconvCodeStabilityUtil.codeFunctionAssertions( + TestController.class, getHandlerMethod(endpoint))); + + if (endpoint == EXCEPTION) { + span.hasStatus(StatusData.error()); + span.hasException(new IllegalStateException(EXCEPTION.getBody())); + } + return span; + } + + private static String getHandlerMethod(ServerEndpoint endpoint) { + if (QUERY_PARAM.equals(endpoint)) { + return "query"; + } else if (PATH_PARAM.equals(endpoint)) { + return "path"; + } else if (CAPTURE_HEADERS.equals(endpoint)) { + return "captureHeaders"; + } else if (INDEXED_CHILD.equals(endpoint)) { + return "child"; + } + return endpoint.name().toLowerCase(Locale.ROOT); } private static String getHandlerSpanName(ServerEndpoint endpoint) { From d60533bd70fb014f945979467725f1edb337c080 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Nov 2025 15:37:31 +0200 Subject: [PATCH 30/30] Apply suggestions from code review --- .../javaagent/instrumentation/jfinal/JFinalTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java index 2495362c8157..73587e72a13b 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java +++ b/instrumentation/jfinal-3.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jfinal/JFinalTest.java @@ -38,7 +38,7 @@ import org.eclipse.jetty.servlet.ServletHandler; import org.junit.jupiter.api.extension.RegisterExtension; -public class JFinalTest extends AbstractHttpServerTest { +class JFinalTest extends AbstractHttpServerTest { @RegisterExtension static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent();