Автоматическое инструментирование Java OpenTelemetry для пользовательской библиотеки не работаетJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Автоматическое инструментирование Java OpenTelemetry для пользовательской библиотеки не работает

Сообщение Anonymous »

Я пытаюсь создать автоматическое инструментирование для пользовательской библиотеки (MyLibrary) с помощью инструментария Java OpenTelemetry. Моя цель — сгенерировать трассировки для метода метод1() в MyLibrary, который не принимает параметров и записывает в файл.
Я создал агент Java и следующие классы для инструментирования:< /p>
MyLibraryInstrumentationModule

Код: Выделить всё

@AutoService(InstrumentationModule.class)
public class MyLibraryInstrumentationModule extends InstrumentationModule {

public MyLibraryInstrumentationModule() {
super("my-library");
}

@Override
public List typeInstrumentations() {
return Collections.singletonList(new MyLibraryInstrumentation());
}
}
MyLibrarySingletons

Код: Выделить всё

public class MyLibrarySingletons {

private static final String INSTRUMENTATION_NAME = "io.opentelemetry.mylibrary";
private static final Instrumenter INSTRUMENTER;

static {
SpanNameExtractor spanNameExtractor = String::toString;

InstrumenterBuilder builder =
Instrumenter.builder(
GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanNameExtractor);
//            .addAttributesExtractor();

INSTRUMENTER = builder.buildInstrumenter();
}

public static Instrumenter instrumenter() {
return INSTRUMENTER;
}

private MyLibrarySingletons() {}
}
MyLibraryInstrumentation

Код: Выделить всё

public class MyLibraryInstrumentation implements TypeInstrumentation {
@Override
public ElementMatcher typeMatcher() {
return named("method1");
}

@Override
public void transform(TypeTransformer transformer) {
transformer.applyAdviceToMethod(
isPublic().and(named("method1")).and(takesNoArguments()),
this.getClass().getName() + "$MethodAdvice");
}

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

@Advice.OnMethodEnter(suppress = Throwable.class)
public static void methodEnter(
@Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) {

Context parentContext = currentContext();

instrumenter().start(parentContext, "this is request from start");
}

@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void methodExit(
@Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) {

if (scope == null) {
return;
}

scope.close();

instrumenter()
.end(
context,
"This is request end of the method1",
"This is response for end of method1",
null);
}
}
}
Проблема:
  • Я создал JAR-файл Java-агента с помощью приведенного выше кода.< /li>
    Затем я запустил приложение с помощью -javaagent:path/to/opentelemetry-javaagent.jar.
    Приложение работает нормально, но для метода 1() в моей MyLibrary не создается никаких следов .
Шаги отладки, которые я пробовал:
  • Проверил этот метод1() в MyLibrary вызывается.
  • Подтверждено, что агент Java загружается правильно, добавив другие инструменты, которые работают должным образом.
  • Проверено, что InstrumentationModule настроен правильно. зарегистрирован в META-INF/services/io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule.
Вопросы:
  • Почему инструментарий метода Method1() не работает?
  • Возможна ли проблема с логикой typeMatcher или преобразования в MyLibraryInstrumentation?
  • Как я могу отладить процесс инструментирования, чтобы определить, что идет не так?


Подробнее здесь: https://stackoverflow.com/questions/793 ... ot-working
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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