将自定义标头与 Sleuth X-B3* 标头一起传递的最佳方式

Posted

技术标签:

【中文标题】将自定义标头与 Sleuth X-B3* 标头一起传递的最佳方式【英文标题】:Best way to pass custom headers along with Sleuth X-B3* headers 【发布时间】:2018-08-15 02:00:41 【问题描述】:

根据 README here ,我使用以下配置将 x-vcap-request-idx-vcap-group-id 从一个应用程序传递到另一个应用程序。

@Bean
public Factory propagationFactory() 
    return brave.propagation.ExtraFieldPropagation.newFactory(brave.propagation.B3Propagation.FACTORY,
            "x-vcap-request-id", "x-vcap-group-id");


@Bean
public TracingFactoryBean tracing() 
    TracingFactoryBean tracingFactoryBean = new TracingFactoryBean();
    tracingFactoryBean.setPropagationFactory(propagationFactory());
    return tracingFactoryBean;

但是,此配置会破坏默认的侦探行为。使用此代码,Sleuth 不再将TraceIdSpanId 添加到日志中

在微服务之间传递自定义标头的最佳/推荐方式是什么?

【问题讨论】:

【参考方案1】:

如果您阅读docs on prefixed fields,您将看到以下部分

与之前版本的 Sleuth 的不同之处在于,使用 Brave,您 必须通过行李钥匙清单。有两个属性可以 实现这一点。使用 spring.sleuth.baggage-keys,您可以设置密钥 以 bag- 为前缀,用于 HTTP 调用,以 bag_ 为前缀,用于消息传递。 您还可以使用 spring.sleuth.propagation-keys 属性传递一个 被列入白名单的前缀键列表,没有任何前缀。

只需设置属性,一切就可以开箱即用。阅读项目文档总是好的。

【讨论】:

【参考方案2】:

我没有使用TracingFactoryBean,但在TracingBuilder 中添加Slf4jCurrentTraceContext 为我解决了这个问题。

return Tracing.newBuilder().propagationFactory(ExtraFieldPropagation.newFactory(B3Propagation.FACTORY, "request-id"))
        .currentTraceContext(Slf4jCurrentTraceContext.create())
        .build();

【讨论】:

以上是关于将自定义标头与 Sleuth X-B3* 标头一起传递的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

将自定义标头传递给 Select2 上的 Ajax 请求

将自定义标头添加到 AFNetworking,我做错了啥?

C# 将自定义标头设置为 httpclient 会导致错误,因为标头名称被误用

将自定义标头添加到“请求”

如何使用中继将自定义标头发送到graphql服务器?

如何将自定义 HTTP 标头注入 SuperAgent 发出的每个请求?