【问题标题】:How parentId can be same when using spring cloud sleuth and brave?使用spring cloud sleuth和brave时,parentId如何相同?
【发布时间】:2021-09-27 16:02:24
【问题描述】:

我有三个微服务,通过 Kafka 进行通信。我正在使用 Brave 的 @Tracer。跟踪 id 是一致生成的,但是微服务 2 和 3 中的 parentId 不同。我们可以在整个微服务中生成一致的 parentId 吗?

谢谢。

【问题讨论】:

    标签: spring-cloud-sleuth brave


    【解决方案1】:

    您使用的是什么版本的 Sleuth?如果是 3.x,请使用 Sleuth 的 Tracer 而不是 Brave 的。

    由于 Spans 表示操作,spanId 对于每个 Span 都会有所不同,parentId 实际上意味着前一个(父)Span 的 Id,所以如果 parentId 是完全正常的对于两个不同的 Span 来说是不一样的(如果它们不共享同一个父级)。

    请参阅文档:https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/#getting-started-terminology

    这里 Span 的 parentIds 如下:

    • 跨度 A:空
    • 跨度 B:A
    • 跨度 C:B
    • 跨度 D:C
    • 跨度 E:D
    • 跨度 F:C
    • 跨度 G:F

    【讨论】:

    • 我正在使用 spring-cloud-starter-sleuth:3.0.3。我已经从 Brave's Tracer 更改为 Sleuth's Tracer,但是 parentID 仍然不同。我的场景:微服务 (MS)1 是生产者向 topic1 发送消息。 MS2 接收消息并发送到 topic2。 MS3 接收消息。这里,MS2 的 parentID 应该是 MS1 的 spanID,MS3 的 parentID 应该是 MS2 的 spanID。 TraceID 相同。 spanID 和 parentID 都不同,因此我无法按顺序跟踪消息。
    • 如果您有中间跨度(例如:Sleuth 自动为 Kafka 创建跨度)并且您正在创建自己的跨度,则可能是这种情况。您在 Zipkin 中看到了什么,这种观点有意义吗? (顺便说一句,并非所有用例都受 Sleuth 支持,例如:不支持通过阻塞队列使用异步消费者)。
    • 我还没有集成 Zipkin。我在所有微服务中简单引入了sleuth jar,它开始注销appname、traceID、spanID。然后在消费者微服务(MS2 和 MS3)中,我现在使用 Sleuth 的 Tracer,@Autowired。为了捕获 traceId、spanId 和 parentId,我使用 tracer.currentSpan().context().traceId()、tracer.currentSpan().context().spanId() 和 tracer.currentSpan().context().parentId () 分别。 TraceID 在所有微服务中都是唯一的。我想知道是否需要额外配置 parentID 以在微服务之间进行关联。谢谢。
    • parentId 是相关的,但如果您在跨度期间不发出日志事件,则不会记录该 spanID(+ 其parentId)。例如:spanA -> spanB -> spanC,如果您在 spanB 期间不发出日志事件,您将看到您遇到的行为。我建议在本地使用 Zipkin 进行检查:github.com/jonatan-ivanov/local-services/blob/main/zipkin/…
    • 我会试一试的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-05-24
    • 2020-05-28
    • 2021-09-06
    • 2021-09-03
    • 2022-12-20
    • 2016-12-29
    相关资源
    最近更新 更多