我想在我的微服务架构中实现跟踪。我使用Apache Kafka作为消息代理,我没有使用Spring Framework。跟踪对我来说是一个新概念。起初我想创建自己的实现,但现在我想使用现有的库。勇敢的看起来就像我想要使用的那个。我想知道是否有一些关于如何做到这一点的指南,示例或文档。 Github页面上的文档很少,我发现很难开始使用Brave。或者也许有更好的库和适当的文档,更容易使用。我将关注Apache HTrace,因为它看起来很有前途。一些入门指南会很好。
答案 0 :(得分:2)
有很多方法可以回答这个问题,但我会从“单向”角度回答这个问题。简而言之,我认为你现在必须自己动手!
虽然Kafka可以以多种方式使用,但它可以用作单向单一生产者单个消费者消息的传输。此操作类似于正常的单向RPC,您有一个请求,但没有响应。
在Zipkin中,RPC跨度通常是请求 - 响应。例如,您可以看到客户端发送到服务器的时间,以及返回客户端的时间。单向是你离开另一边的地方。跨度以“cs”(客户端发送)开头,以“sr”结束(收到服务器)。
将此映射到Kafka,您将在生成消息时标记客户端,并在消费者收到消息时收到服务器。
Kafka的诀窍在于没有很好的地方来填充跟踪上下文。这是因为与许多消息传递系统不同,Kafka消息中没有标头。如果没有跟踪上下文,您不知道您正在完成哪条跟踪(或跨度)!
“hack”方法是将跟踪标识符填充为消息密钥。一种不太常见的方法是协调一个可以将跟踪上下文嵌套到的主体包装器。
以下是前者的一个例子:
https://gist.github.com/adriancole/76d94054b77e3be338bd75424ca8ba30
答案 1 :(得分: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.It很简单,你只需返回一个跨度需求的东西,比如uri,header,method。 这是一个粗略而丑陋的代码示例,只是提供一个想法。