#spring #opentracing #jaeger
#spring #opentracing #jaeger
Вопрос:
Я хотел бы настроить Jaeger в моем приложении Spring. Почему-то я не могу найти правильный способ сделать это. Почти вся документация, связанная с Spring-Jaeger, предназначена для Spring Boot, где большинство свойств настраиваются автоматически. Вот мой подход. Зависимость Maven:
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>1.0.3</version>
</dependency>
Spring config для Jaeger:
@Configuration
public class JagerConfiguration {
@Bean
public io.opentracing.Tracer jaegerTracer() {
Map<String, String> tags = new HashMap<>();
tags.put(Constants.TRACER_HOSTNAME_TAG_KEY, "localhost");
CompositeReporter reporter = new CompositeReporter(new LoggingReporter(), remoteReporter());
return new Builder("myTestSpringApp")
.withSampler(new ConstSampler(true))
.withMetricsFactory(new InMemoryMetricsFactory())
.withReporter(remoteReporter())
.withTags(tags)
.build();
}
@Bean
public RemoteReporter remoteReporter() {
return new RemoteReporter.Builder().withSender(new UdpSender("localhost", 6831, 0)).build();
}
}
Jaeger запущен локально в docker на порту 6831.
docker run -d -p6831:6831/udp -p16686:16686 jaegertracing/all-in-one:latest
Как только мое приложение запускается, я заметил, что приложение значительно замедляется, я предполагаю, что это из-за метрик, которые в значительной степени регистрируются в консоли LoggingReporter.
Однако мое весеннее приложение не отображается в пользовательском интерфейсе Jaeger. Вначале я хотел бы отслеживать мои конечные точки REST. Может кто-нибудь указать мне правильное направление, почему мое приложение отсутствует в пользовательском интерфейсе и как правильно настроить Jaeger? Возможно, существует ли пример проекта с Spring Jaeger, который не полагается на устаревший Jaeger?
Комментарии:
1. Вы видите, что промежутки регистрируются через ваше средство ведения журнала? Возможно, вы захотите проверить это сообщение в блоге, чтобы помочь в устранении неполадок: medium.com/jaegertracing /…
Ответ №1:
Если кто-нибудь еще хотел бы настроить Jaeger в spring project, вот что я сделал:
Добавление зависимостей в pom:
<properties>
<opentracing.spring.web.version>0.3.4</opentracing.spring.web.version>
<opentracing.jdbc.version>0.0.12</opentracing.jdbc.version>
<opentracing.spring.configuration.starter.version>0.1.0</opentracing.spring.configuration.starter.version>
<opentracing.spring.jaeger.starter.version>0.2.2</opentracing.spring.jaeger.starter.version>
</properties>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-web-starter</artifactId>
<version>${opentracing.spring.web.version}</version>
</dependency>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-jdbc</artifactId>
<version>${opentracing.jdbc.version}</version>
</dependency>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-tracer-configuration-starter</artifactId>
<version>${opentracing.spring.configuration.starter.version}</version>
</dependency>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-starter</artifactId>
<version>${opentracing.spring.jaeger.starter.version}</version>
</dependency>
Настройте вас web.xml зарегистрировать новый фильтр трассировки tracingFilter для перехвата REST API:
<filter>
<filter-name>tracingFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>tracingFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
Зарегистрируйте трассировку jaeger в spring mvc:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="io.opentracing.contrib.spring.web.interceptor.TracingHandlerInterceptor">
<constructor-arg ref="jaegerTracer" />
</bean>
</mvc:interceptor>
</mvc:interceptors>
Настройте компонент tracingFilter, который мы описали в web.xml:
import io.opentracing.Tracer;
import io.opentracing.contrib.web.servlet.filter.TracingFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JaegerFilterConfiguration {
@Bean
public TracingFilter tracingFilter(Tracer tracer) {
return new TracingFilter(tracer);
}
}
Наконец, определите конфигурацию пружины jaeger tracer:
import io.jaegertracing.internal.JaegerTracer;
import io.jaegertracing.internal.metrics.NoopMetricsFactory;
import io.jaegertracing.internal.reporters.RemoteReporter;
import io.jaegertracing.internal.reporters.RemoteReporter.Builder;
import io.jaegertracing.internal.samplers.ProbabilisticSampler;
import io.jaegertracing.thrift.internal.senders.UdpSender;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.event.ContextRefreshedEvent;
@Configuration
public class JaegerConfiguration implements ApplicationListener<ContextRefreshedEvent> {
private static final int JAEGER_PORT = 6831;
private static final String JAEGER_HOST = "localhost";
private static final String JAEGER_SERVICE_NAME = "my-awesome-jaeger";
private static final double SAMPLING_RATE = 0.5;
@Autowired
private Tracer tracer;
@Bean
@Primary
public Tracer jaegerTracer(RemoteReporter remoteReporter) {
return new JaegerTracer.Builder(JAEGER_SERVICE_NAME)
.withReporter(remoteReporter)
.withMetricsFactory(new NoopMetricsFactory()).withSampler(new ProbabilisticSampler(SAMPLING_RATE))
.build();
}
@Bean
public RemoteReporter remoteReporter() {
return new Builder().withSender(new UdpSender(JAEGER_HOST, JAEGER_PORT, 0)).build();
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (!GlobalTracer.isRegistered()) {
GlobalTracer.register(tracer);
}
}
}
Комментарии:
1. Есть ли какой-либо пример приложения, в котором подробно показана эта реализация?
2. вы можете использовать пример проекта из Opentracing: github.com/opentracing-contrib/java-spring-jaeger
Ответ №2:
У меня работают следующие зависимости gradle,
implementation "io.opentracing.contrib:opentracing-spring-cloud-starter:0.1.13"
implementation "io.jaegertracing:jaeger-client:0.31.0"
Следующая конфигурация компонента трассировщика,
@Bean
public io.opentracing.Tracer initTracer() {
Configuration.SamplerConfiguration samplerConfig = new Configuration.SamplerConfiguration().withType("const").withParam(1);
return Configuration.fromEnv("sprint-service").withSampler(samplerConfig).getTracer();
}
И тогда промежутки могут быть записаны как
Span sprintSpan = tracer.buildSpan("my-span-name").withTag("player", player).start();
// some business functionality
sprintSpan.finish();
Вот рабочий пример, на который вы можете сослаться https://github.com/krushnatkhawale/jaeger-with-spring-boot-web-app
Комментарии:
1. вопрос был явно о приложении spring, а не о загрузке spring. Спасибо за информацию, хотя
2. Не думаю, что это будет иметь большое значение в приложениях spring. Приведенный пример относится к приложению spring boot, но приведенная выше конфигурация должна работать и для приложений vanila spring.