Почему мое Java-расширение OpenTelemetry не работаетJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему мое Java-расширение OpenTelemetry не работает

Сообщение Anonymous »

Я создал расширение для добавления комментариев в запрос sql. Для этого я создал класс MySQLAddCommentInstrumentation.java для внесения изменений в запрос в классе Statement.java.
Также есть один класс MySQLAddCommentInstrumentationModule.java, который добавляет этот инструментарий (MySQLAddCommentInstrumentation) в его список.
Когда я создаю это расширение и запускаю свое приложение, я не вижу комментарий в запросе под журналом zipkin db.statement.
Класс инструментирования — MySQLAddCommentInstrumentation.java
Путь — example/extension/src/main/java/com/example/javaagent/mysqlinstrumentation/MySQLAddCommentInstrumentation.java
package com.example.javaagent.mysqlinstrumentation;

import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;

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 net.bytebuddy.matcher.ElementMatchers;

public class MySQLAddCommentInstrumentation implements TypeInstrumentation {

@Override
public ElementMatcher typeMatcher() {
System.out.println("Inside MYSQL- 1.1");
return implementsInterface(named("java.sql.Statement"));
}

public void transform(TypeTransformer transformer) {
System.out.println("Inside MYSQL- 1.2");

transformer.applyAdviceToMethod(
namedOneOf("executeQuery")
.and(ElementMatchers.takesArgument(0, String.class))
.and(ElementMatchers.isPublic()),
MySQLAddCommentInstrumentation.class.getName() + "$StatementAddCommentAdvice");

System.out.println("Inside MYSQL- 1.3");
}

@SuppressWarnings("unused")
public static class StatementAddCommentAdvice {

@Advice.OnMethodEnter(suppress = Throwable.class)
public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String sql) {
System.out.println("Inside MYSQL- 1.4");

sql = sql + " -- some comment";

System.out.println("Inside MYSQL- 1.5");
}
}

InstrumentationModule - MySQLAddCommentInstrumentationModule.java
Путь - example/extension/src/main/java/com/example/javaagent/mysqlinstrumentation/MySQLAddCommentInstrumentationModule.java
package com.example.javaagent.mysqlinstrumentation;

import static java.util.Collections.singletonList;

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.matcher.AgentElementMatchers;
import java.util.List;
import net.bytebuddy.matcher.ElementMatcher;

@AutoService(InstrumentationModule.class)
public final class MySQLAddCommentInstrumentationModule extends InstrumentationModule {
public MySQLAddCommentInstrumentationModule() {
super("jdbc");
}

@Override
public int order() {
return 1;
}

@Override
public ElementMatcher.Junction classLoaderMatcher() {
return AgentElementMatchers.hasClassesNamed("java.sql.Statement");
}

@Override
public List typeInstrumentations() {
return singletonList(new MySQLAddCommentInstrumentation());
}
}


Код, в котором ожидается запуск этого инструментария:
try {
Connection con = DriverManager.getConnection(url, uname, password);
Statement statement = con.createStatement();
System.out.println(query);
ResultSet result = statement.executeQuery(query);
System.out.println(query);

} catch (SQLException e) {
e.printStackTrace();
}

Я запустил сборку ./gradlew внутри примеров/расширения и использовал этот jar-файл расширения для запуска своего приложения
java -javaagent:/Users/vaibhavpaharia/Downloads/opentelemetry-javaagent.jar \
-Dotel.javaagent.extensions=/Users/vaibhavpaharia/ok/opentelemetry-java-instrumentation/examples/extension/build/libs/opentelemetry-java-instrumentation-extension-demo-1.0-all.jar \
-Dotel.service.name=simpleapplication \
-Dotel.traces.exporter=zipkin \
-Dserver.port=8080 \
-jar /Users/vaibhavpaharia/Downloads/simpleproject/target/simpleproject-0.0.1-SNAPSHOT.jar

После запуска приложения с агентом и расширением я вижу, что другие расширения, присутствующие в папке примера, работают нормально.
Кроме того, я попытался изменить метод заказа в MySQLAddCommentInstrumentationModule. java и вернул оттуда 0, в этом случае Inside MYSQL- 1.1, Inside MYSQL- 1.2 и Inside MYSQL- 1.3 были напечатаны, так что кажется новое расширение распознается при запуске приложения. Он никогда не печатает Inside MYSQL- 1.4 и Inside MYSQL- 1.5. Также следы перестают поступать на zipkin.
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[otel.javaagent 2023-01-05 14:50:31:010 +0530] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 1.20.2
Inside MYSQL- 1.1
Inside MYSQL- 1.2
Inside MYSQL- 1.3
[otel.javaagent 2023-01-05 14:50:34:068 +0530] [main] INFO io.opentelemetry.javaagent.shaded.instrumentation.jmx.engine.JmxMetricInsight - Empty JMX configuration, no metrics will be collected for InstrumentationScope io.opentelemetry.jmx

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.1)

2023-01-05T14:50:35.687+05:30 INFO 85143 --- [ main] c.e.s.SimpleprojectApplication : Starting SimpleprojectApplication v0.0.1-SNAPSHOT using Java 18.0.2 with PID 85143 (/Users/vaibhavpaharia/Downloads/simpleproject/target/simpleproject-0.0.1-SNAPSHOT.jar started by vaibhavpaharia in /Users/vaibhavpaharia)
2023-01-05T14:50:35.700+05:30 INFO 85143 --- [ main] c.e.s.SimpleprojectApplication : No active profile set, falling back to 1 default profile: "default"
2023-01-05T14:50:37.451+05:30 INFO 85143 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-01-05T14:50:37.531+05:30 INFO 85143 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-01-05T14:50:37.531+05:30 INFO 85143 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.4]
2023-01-05T14:50:37.643+05:30 INFO 85143 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-01-05T14:50:37.645+05:30 INFO 85143 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1859 ms
2023-01-05T14:50:38.254+05:30 INFO 85143 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-01-05T14:50:38.266+05:30 INFO 85143 --- [ main] c.e.s.SimpleprojectApplication : Started SimpleprojectApplication in 3.409 seconds (process running for 7.566)


Подробнее здесь: https://stackoverflow.com/questions/750 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»