当前位置: 首页 > 知识库问答 >
问题:

spring sleuth行李传播不工作

马魁
2023-03-14

我第一次使用侦探需要一些帮助。我目前正在使用sleuth 2.2.3。释放我的要求是我想传播两个字段product id和product type,这样我就可以从其他微服务中读取这两个值,因为我正在使用baggage传播。

1. In one of the microservice in rest API my code is something like this,
BaggageField PRODUCT_ID = BaggageField.create("x-df-product-id");
PRODUCT_ID.updateValue(productId); // I have value of productId that value I want to propogate

BaggageField PRODUCT_TYPE = BaggageField.create("x-df-product-type");
PRODUCT_TYPE.updateValue(productType); // I have value of productType that value I want to propogate

Tracing.newBuilder().propagationFactory(
            BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)
            .add(SingleBaggageField.remote(PRODUCT_ID))
            .add(SingleBaggageField.remote(PRODUCT_TYPE))
            .build());

In another microservice, I am reading the values like this:

String baggageProductId=BaggageField.getAllValues().entrySet().stream.filter(e ->"PRODUCT_ID".equalIgnoreCase(e.getKey())).map(Map.Entry::getValue).findFirst().orElse(null);

String baggageProducType=BaggageField.getAllValues().entrySet().stream.filter(e ->"PRODUCT_TYPE".equalIgnoreCase(e.getKey())).map(Map.Entry::getValue).findFirst().orElse(null);

in application.yml these are the entries:
sleuth:
 baggage:
   remoteFields:
    -x-df-product-id
    -x-df-product-type

but I am getting both values baggageProductId and baggageProducType as null.

I am not using span anywhere is that a problem? not sure how can I read these values. can you please help me?

共有2个答案

郦楷
2023-03-14

您必须在应用程序中进行配置。属性

spring.sleuth.propagation-keys[0]= x-df-product-id
spring.sleuth.propagation.tag.whitelisted-keys[0]=x-df-product-id
spring.sleuth.log.slf4j.whitelisted-mdc-keys[0]= x-df-product-id

此源代码org.springframework.cloud.sleuth.autoconfig.TraceBaggageConfigsion

公良骁
2023-03-14

更新:我像这样更新了我的代码,它工作正常,但是...需要一些帮助。

  1. 申请。yml改为

侦探:行李:行李钥匙:

-x-df-product-id

-x-df-product-type

日志slf4。列入白名单的mdc密钥:

-x-df-product-id

-x-df-product-type

2.在Microservice-1中,我有以下代码

BaggageField baggageFieldProductId=BaggageField。getByName(“x-df-product-id”);baggageProductId=baggageFieldProductId。getValue();

BaggageField baggageFieldProductType=BaggageField。getByName(“x-df-product-type”);baggageProductType=baggageFieldProductType。getValue();

我在每个微服务的每个application.yml文件中插入了相同的条目。之后,我能够在微服务1、微服务2、微服务3中检索这些值,但在微服务4中获得空值。不知道为什么?代码检索的逻辑在任何地方都是一样的。

唯一的区别是我的microservices 1,2,3 spring启动版本是2.2.8,microservices 4 spring启动版本是2.3.6。

需要帮助。真的不知道为什么我会得到空值。非常感谢。

 类似资料:
  • 我们目前正在使用侦探2.2.3. RELEASE,我们看不到在超文本传输协议标头中传递的字段userId没有传播。下面是我们的代码。 我们怀疑YML文件中的某些问题。我们尝试了以下所有选项,但均无效。 在回退中: %X{行李用户ID:-} 我们在超文本传输协议头中传递userId。

  • 我有一个过滤器(OncePerRequestFilter),它基本上拦截传入的请求并记录traceId、spanId等。它运行良好,这个过滤器位于一个公共模块中,该模块包含在其他项目中,以避免在我的所有微服务中包含spring sleuth依赖项,这就是我将它创建为库的原因,因为对库的任何更改对所有模块都是公共的。现在,我必须添加一个新的传播密钥,它需要通过http头(如trace和spanId)

  • 我理解,随着Spring Cloud Sleuth 3.x.x的出现,您需要指定要传播到远程组件的行李头的名称,如下所示: 对于自定义标题,我认为这很好。我想知道如果行李需要转移,B3/Zipkin会是什么样子。 我记得有一次讨论B3没有指定baggage,但也有一种“约定”,即前缀为“baggage”的字段被转发。 问题1:这是正确的吗,现在仍然是这样,还是在Sleuth 3.x.x中删除了?

  • 我试图建立一个应用程序,它有一个角前端和一个Maven/Spring Boot后端,并建立了我的第一个REST控制器。我的问题是,当我从Angular IDE向后端发送GET HTTP请求时,它会返回一个错误,说明: 我的角代码只是试图使用GET方法(即。httpclient.GET('http://localhost:8080/api/getdata')将数据打印到浏览器控制台,但错误阻止了它的

  • 请提示我如何让侦察行李在联调系统中工作。它在测试通过模拟HTTP请求时按预期工作,但在测试直接调用服务时不工作。我的应用程序是(Spring Boot 2.5.4,Spring Cloud 2020.0.3): 应用yml: 测试:

  • 这是我的问题: 我正在Java EE/Spring/Hibernate应用程序上运行批处理。此批处理调用方法1。该方法调用方法2,该方法可以引发用户异常(扩展RuntimeException的类)。下面是它的样子: 在继续执行时捕获异常,但在事务关闭时,method1结束时抛出回滚异常。 这是堆栈跟踪: 当method2不抛出这个异常时,它工作得很好。 我尝试过的: 设置在 尝试并抓住 但这并没有