Spring Cloud Sleuth 集成

集成

可运行和可调用

如果你在RunnableCallable中包含你的逻辑,就可以将这些类包装在他们的Sleuth代表中。

Runnable的示例:

Runnable runnable = new Runnable() {
	@Override
	public void run() {
		// do some work
	}

	@Override
	public String toString() {
		return "spanNameFromToStringMethod";
	}
};
// Manual `TraceRunnable` creation with explicit "calculateTax" Span name
Runnable traceRunnable = new TraceRunnable(tracer, spanNamer, runnable, "calculateTax");
// Wrapping `Runnable` with `Tracer`. The Span name will be taken either from the
// `@SpanName` annotation or from `toString` method
Runnable traceRunnableFromTracer = tracer.wrap(runnable);

Callable的示例:

Callable<String> callable = new Callable<String>() {
	@Override
	public String call() throws Exception {
		return someLogic();
	}

	@Override
	public String toString() {
		return "spanNameFromToStringMethod";
	}
};
// Manual `TraceCallable` creation with explicit "calculateTax" Span name
Callable<String> traceCallable = new TraceCallable<>(tracer, spanNamer, callable, "calculateTax");
// Wrapping `Callable` with `Tracer`. The Span name will be taken either from the
// `@SpanName` annotation or from `toString` method
Callable<String> traceCallableFromTracer = tracer.wrap(callable);

这样,您将确保为每次执行创建并关闭新的Span。

Hystrix

自定义并发策略

我们正在注册HystrixConcurrencyStrategy将所有Callable实例包装到他们的Sleuth代表 - TraceCallable中的定制。该策略是启动或继续跨越,这取决于调用Hystrix命令之前跟踪是否已经进行的事实。要禁用自定义Hystrix并发策略,将spring.sleuth.hystrix.strategy.enabled设置为false

手动命令设置

假设您有以下HystrixCommand

HystrixCommand<String> hystrixCommand = new HystrixCommand<String>(setter) {
	@Override
	protected String run() throws Exception {
		return someLogic();
	}
};

为了传递跟踪信息,您必须在HystrixCommandHystrixCommand的Sleuth版本中包装相同的逻辑:

TraceCommand<String> traceCommand = new TraceCommand<String>(tracer, traceKeys, setter) {
	@Override
	public String doRun() throws Exception {
		return someLogic();
	}
};

RxJava

我们正在注册RxJavaSchedulersHook
将所有Action0实例包装到他们的Sleuth代表 - TraceAction中的定制。钩子起动或继续一个跨度取决于跟踪在Action被安排之前是否已经进行的事实。要禁用自定义RxJavaSchedulersHook,将spring.sleuth.rxjava.schedulers.hook.enabled设置为false

您可以定义线程名称的正则表达式列表,您不希望创建一个Span。只需在spring.sleuth.rxjava.schedulers.ignoredthreads属性中提供逗号分隔的正则表达式列表。

HTTP集成

可以通过提供值等于falsespring.sleuth.web.enabled属性来禁用此部分的功能。

HTTP过滤器

通过TraceFilter所有采样的进入请求导致创建Span。Span的名称是http: +发送请求的路径。例如,如果请求已发送到/foo/bar,则该名称将为http:/foo/bar。您可以通过spring.sleuth.web.skipPattern属性配置要跳过的URI。如果您在类路径上有ManagementServerProperties,则其值contextPath将附加到提供的跳过模式。

HandlerInterceptor

由于我们希望跨度名称是精确的,我们使用的TraceHandlerInterceptor包装现有的HandlerInterceptor,或直接添加到现有的HandlerInterceptors列表中。TraceHandlerInterceptor向给定的HttpServletRequest添加了一个特殊请求属性。如果TraceFilter没有看到此属性集,它将创建一个“后备”跨度,这是在服务器端创建的一个额外的跨度,以便在UI中正确显示跟踪。看到最有可能意味着有一个缺失的仪器。在这种情况下,请在Spring Cloud Sleuth中提出问题。

异步Servlet支持

如果您的控制器返回CallableWebAsyncTask Spring Cloud,Sleuth将继续现有的跨度,而不是创建一个新的跨度。

HTTP客户端集成

同步休息模板

我们注入一个RestTemplate拦截器,确保所有跟踪信息都传递给请求。每次呼叫都会创建一个新的Span。收到回应后关闭。为了阻止将spring.sleuth.web.client.enabled设置为false的同步RestTemplate功能。

重要 你必须注册RestTemplate作为一个bean,以便拦截器被注入。如果您使用new关键字创建RestTemplate实例,那么该工具将不工作。

异步休息模板

重要 一个AsyncRestTemplate bean的跟踪版本是为您开箱即用的。如果你有自己的bean,你必须用TraceAsyncRestTemplate表示来包装它。最好的解决方案是只定制ClientHttpRequestFactory和/或AsyncClientHttpRequestFactory

定制仪器设置为在发送和接收请求时创建和关闭跨度。您可以通过注册您的bean来自定义ClientHttpRequestFactoryAsyncClientHttpRequestFactory。记住使用跟踪兼容的实现(例如,不要忘记在TraceAsyncListenableTaskExecutor中包装ThreadPoolTaskScheduler)。自定义请求工厂示例:

@EnableAutoConfiguration
@Configuration
public static class TestConfiguration {

	@Bean
	ClientHttpRequestFactory mySyncClientFactory() {
		return new MySyncClientHttpRequestFactory();
	}

	@Bean
	AsyncClientHttpRequestFactory myAsyncClientFactory() {
		return new MyAsyncClientHttpRequestFactory();
	}
}

AsyncRestTemplate功能集spring.sleuth.web.async.client.enabled阻止为false。禁用TraceAsyncClientHttpRequestFactoryWrapper设置spring.sleuth.web.async.client.factory.enabled设置为false。如果您不想将所有spring.sleuth.web.async.client.template.enabled falseAsyncRestClient创建为false

Feign

默认情况下,Spring Cloud Sleuth通过TraceFeignClientAutoConfiguration提供与feign的集成。您可以通过将spring.sleuth.feign.enabled设置为false来完全禁用它。如果这样做,那么不会发生Feign相关的仪器。

Feign仪器的一部分是通过FeignBeanPostProcessor完成的。您可以通过提供spring.sleuth.feign.processor.enabled等于false来禁用它。如果你这样设置,那么Spring Cloud Sleuth不会调整你的任何自定义Feign组件。然而,所有默认的工具仍然存在。

异步通信

@Async注释方法

在Spring Cloud Sleuth中,我们正在调用异步相关组件,以便跟踪信息在线程之间传递。您可以通过将spring.sleuth.async.enabled的值设置为false来禁用此行为。

如果您使用@Async注释方法,那么我们将自动创建一个具有以下特征的新的Span:

  • Span名称将是注释方法名称

  • Span将被该方法的类名称和方法名称标记

@Scheduled注释方法

在Spring Cloud Sleuth中,我们正在调试计划的方法执行,以便跟踪信息在线程之间传递。您可以通过将spring.sleuth.scheduled.enabled的值设置为false来禁用此行为。

如果您使用@Scheduled注释方法,那么我们将自动创建一个具有以下特征的新的Span:

  • Span名称将是注释方法名称

  • Span将被该方法的类名称和方法名称标记

如果要跳过某些@Scheduled注释类的Span创建,您可以使用与@Scheduled注释类的完全限定名称匹配的正则表达式来设置spring.sleuth.scheduled.skipPattern

提示 如果您一起使用spring-cloud-sleuth-streamspring-cloud-netflix-hystrix-stream,将为每个Hystrix指标创建Span并发送到Zipkin。这可能是恼人的。您可以设置spring.sleuth.scheduled.skipPattern=org.springframework.cloud.netflix.hystrix.stream.HystrixStreamTask

Executor,ExecutorService和ScheduledExecutorService

我们提供LazyTraceExecutorTraceableExecutorServiceTraceableScheduledExecutorService。每次提交,调用或调度新任务时,这些实现都将创建Spans。

在这里,您可以看到使用CompletableFuture使用TraceableExecutorService传递跟踪信息的示例:

CompletableFuture<Long> completableFuture = CompletableFuture.supplyAsync(() -> {
	// perform some logic
	return 1_000_000L;
}, new TraceableExecutorService(executorService,
		// 'calculateTax' explicitly names the span - this param is optional
		tracer, traceKeys, spanNamer, "calculateTax"));

消息

Spring Cloud Sleuth与Spring Integration集成。它创建spans发布和订阅事件。要禁用Spring Integration检测,请将??spring.sleuth.integration.enabled设置为false。

您可以提供spring.sleuth.integration.patterns模式,以明确提供要包括的用于跟踪的通道的名称。默认情况下,所有通道都包含在内。

重要 当使用Executor构建Spring Integration IntegrationFlow时,请记住使用Executor 的未跟踪版本。用TraceableExecutorService装饰Spring Integration执行者频道将导致spans被关闭。

Zuul

我们正在注册Zuul过滤器来传播跟踪信息(请求标头丰富了跟踪数据)。要禁用Zuul支持,请将spring.sleuth.zuul.enabled属性设置为false

欢迎关注作者的公众号《Java编程生活》,每日记载Java程序猿工作中遇到的问题
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_26648623/article/details/83310598