如何在 Spring Sleuth / Brave 中编写自定义跟踪发件人

How to write custom trace sender in Spring Sleuth / Brave

我公司有定制的分布式跟踪解决方案。 我已经为它准备好了 Java client/proxy 库,它能够将 traces/spans 发送到服务器。

但是我想将它与 Spring Boot Sleuth / Brave 集成, 所以要从 Brave 实现某种桥接,Brave 会使用我的 client/proxy 库来发送 traces/spans.

如何在 Brave 中仅自定义发送者部分?

另一种方法是从头开始实施所有 Sleuth api 接口(Tracer、Span、TraceContext 等),这是一项艰巨的任务。

我想使用 Brave 实现,只是为了注入某种 bridge/adapter,它将使用我的自定义 client/proxy。

我不建议实现所有 Sleuth 接口,那样的话你正在编写一个 Tracing 库(你正在重写 Brave)。

您可以实现 zipkin2.reporter.Sender 接口并从中创建一个 @Bean,示例如下:

public class SoutSender extends Sender {
    @Override
    public Encoding encoding() {
        return JSON;
    }

    @Override
    public int messageMaxBytes() {
        return 500 * 1024; //500 KiB
    }

    @Override
    public int messageSizeInBytes(List<byte[]> encodedSpans) {
        return encodedSpans.stream()
                .mapToInt(encodedSpan -> encodedSpan.length)
                .sum();
    }

    @Override
    public Call<Void> sendSpans(List<byte[]> encodedSpans) {
        encodedSpans.stream()
                .map(String::new)
                .forEach(System.out::println);

        return Call.create(null);
    }
}

您还需要创建一个 Reporter<zipkin2.Span> bean,但是为此,您不需要实现任何东西:

@Bean
Reporter<Span> soutReporter(SoutSender soutSender) {
    return AsyncReporter.create(soutSender);
}

@Bean
Sender soutSender(SoutSender sender) {
    return new SoutSender();
}

这将注册一个额外的报告者,如果你只想保留你的而不想报告给zipkin和你自己的系统,你需要给bean命名因此,请参阅文档:https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/project-features.html#overriding-the-auto-configuration-of-zipkin