如何使用 Spring Cloud Sleuth 向每个 span 添加信息
Posted
技术标签:
【中文标题】如何使用 Spring Cloud Sleuth 向每个 span 添加信息【英文标题】:How to add information to every span with Spring Cloud Sleuth 【发布时间】:2017-12-15 07:24:16 【问题描述】:我目前正在尝试了解如何以可扩展的方式自定义 Spring Cloud Sleuth 以将信息添加到每个 Span。
到目前为止我所尝试的:
使用我自己的GenericFilterBean
和HandlerInterceptorAdapter
实现,在构造函数中给它们一个Tracer
,并在每次调用它们时用tracer.addTag("key", "value")
编写标签
我查看了新行李信息的概念 - 但是我将其解释为对于整个跟踪来说它是全局的 - 由于跟踪在不同的服务/机器上有多个请求,因此不符合我的目的添加有关服务/机器级别的信息。
到目前为止,当我检查通过spring-cloud-stream-binder-kafka
写入我的 kafka 主题的 JSON 时,过滤器和拦截器中的标签已为某些 Span 设置,但不是全部设置。
所以我的问题是:确实存在哪些类型的请求/操作来创建跨度,以及将某些东西注入这些跨度的适当方法是什么。由于我想将此实现部署到多个微服务,因此我不想注释每个方法或做类似的工作密集型,因此不可扩展的方法。
【问题讨论】:
【参考方案1】:这样的地方很多……但实际上,我们可以从另一个角度来解决这个问题。有一个地方可以挂上 - 当跨度关闭时。 https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanReporter.java - 您可以创建自己的 SpanReporter
实现,在委托给例如 Zipkin span 报告器之前将添加一个标签。更简单的方法是只注册SpanAdjuster
bean,它会在报告之前调整跨度。这样你就可以只在一个地方添加标签。
【讨论】:
SpanAdjuster
听起来很完美。但是,当我尝试在@Configuration 类中注册一个实现SpanAdjuster
的类时,它与我的过滤器和拦截器一起出现循环依赖关系,因为跟踪器我必须注入过滤器和注入器的构造函数。我尝试错误的方式吗?有没有推荐的方法来解决这个问题?
我猜你需要展示一些代码。你能把它上传到某个地方吗?
但是任何地方都需要跟踪器,并且它是在另一种配置中构建的。你没有循环依赖。您也可以检查 span 是否可导出,如果是这种情况,只需在 span 上直接设置标签。那么就不需要像这样注入示踪剂了。
这里是代码:codeshare.io/2p6Jx4 - 首先是配置类,然后是我的三种拦截请求(过滤器、拦截器、SpanAdjuster),最后是控制台输出有关错误的部分我收到的消息。
好的,现在我明白了...在您注入了BeanFactory
的地方,您不应该也注入Tracer
。像这样检索tracer
- github.com/spring-cloud/spring-cloud-sleuth/blob/master/… 并重试。以上是关于如何使用 Spring Cloud Sleuth 向每个 span 添加信息的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 Spring MVC 项目中使用 Spring Cloud Sleuth?
如何使用 Spring Cloud Sleuth 向每个 span 添加信息
如何解决 Spring-cloud-sleuth-zipkin (Edgware.SR5) 中的 RabbitMQ 服务器连接错误