2

我想在我的微服务架构中实现跟踪。我使用 Apache Kafka 作为消息代理,我没有使用 Spring Framework。追踪对我来说是一个新概念。起初我想创建自己的实现,但现在我想使用现有的库。勇敢看起来像我想要使用的那个。我想知道是否有一些关于如何做到这一点的指南、示例或文档。Github 页面上的文档很少,我发现很难开始使用 Brave。或者也许有更好的库和适当的文档,更容易使用。我将关注 Apache HTrace,因为它看起来很有希望。一些入门指南会很好。

4

2 回答 2

2

有很多方法可以回答这个问题,但我会从“单向”的角度来回答。不过,简短的回答是,我认为您现在必须自己动手!

虽然 Kafka 可以以多种方式使用,但它可以用作单向单生产者单消费者消息的传输。此操作类似于普通的单向 RPC,您有一个请求,但没有响应。

在 Zipkin 中,RPC 跨度通常是请求-响应。例如,您会看到客户端发送到服务器的时间,以及返回客户端的方式。单向是你离开另一边的地方。跨度以“cs”(客户端发送)开始,以“sr”(服务器接收)结束。

将此映射到 Kafka,您将在生成消息时标记客户端已发送,并在消费者收到消息时标记服务器已接收。

Kafka 的诀窍是没有很好的地方来填充跟踪上下文。这是因为与许多消息传递系统不同,Kafka 消息中没有标头。如果没有跟踪上下文,您将不知道您正在完成哪个跟踪(或跨度)!

“hack”方法是将跟踪标识符填充为消息键。一种不那么老套的方法是协调一个可以将跟踪上下文嵌套到其中的主体包装器。

这是前者的一个例子:

https://gist.github.com/adriancole/76d94054b77e3be338bd75424ca8ba30

于 2017-01-13T07:02:26.663 回答
0

我也遇到了同样的问题。这是我的解决方案,如上所述的一种不那么老套的方法。

ServerSpan serverSpan = brave.serverSpanThreadBinder().getCurrentServerSpan();
TraceHeader traceHeader = convert(serverSpan);

//in kafka producer,user KafkaTemplete to send
String wrapMsg = "wrap traceHeader with originMsg ";
kafkaTemplate.send(topic, wrapMsg).get(10, TimeUnit.SECONDS);// use synchronization


//then in kafka consumer
 ConsumerRecords<String, String> records = consumer.poll(5000);
 // for loop 
 for (ConsumerRecord<String, String> record : records) {
     String topic = record.topic();
     int partition = record.partition();
     long offset = record.offset();
     String val = record.value();
     //parse val to json
     Object warpObj = JSON.parseObject(val);
     TraceHeader traceHeader = warpObj.getTraceHeader();
     //then you can do something like this
     MyRequest myRequest = new MyRequest(traceHeader, "/esb/consumer", "POST");

     brave.serverRequestInterceptor().handle(new HttpServerRequestAdapter(new MyHttpServerRequest(myRequest), new DefaultSpanNameProvider()));

    //then some httprequest within brave-apache-http-interceptors
    //http.post(url,content)
 }

你必须实现 MyHttpServerRequest 和 MyRequest。这很简单,你只需要返回一个 span 需要的东西,比如 uri、header、method。 这是一个粗糙而丑陋的代码示例,只是提供一个想法。

于 2017-03-15T09:36:01.557 回答