zipkin,使用现有库处理与ApacheKafka连接的微服务中的跟踪

fnatzsnv  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(411)

我想在我的微服务架构中实现跟踪。我使用apachekafka作为消息代理,而不是spring框架。追踪对我来说是个新概念。起初我想创建自己的实现,但现在我想使用现有的库。勇敢的人看起来像一个我想使用。我想知道是否有一些指南,例子或文件如何做到这一点。github页面上的文档很少,我发现很难开始使用brave。或者也许有更好的图书馆,有适当的文件,这是更容易使用。我将关注apachehtrace,因为它看起来很有前途。一些入门指南会很好。

sg2wtvxw

sg2wtvxw1#

有很多方法可以回答这个问题,但我将从“单向”的Angular 来回答。不过,简单的回答是,我认为你现在必须自己动手!
虽然Kafka可以用在许多方面,但它可以作为单向单生产者单消费者信息的传输。此操作类似于普通的单向rpc,在这里您有一个请求,但没有响应。
在zipkin中,rpc跨度通常是请求-响应。例如,您可以看到客户机发送到服务器的时间,以及返回客户机的方式。单程是你忽略另一边的地方。span以“cs”(client send)开始,以“sr”(server received)结束。
将此Map到kafka,您将在生成消息时标记client sent,在消费者收到消息时标记server received。
Kafka的诀窍在于,没有一个好地方可以填充跟踪上下文。这是因为与许多消息传递系统不同,kafka消息中没有标头。如果没有跟踪上下文,就不知道要完成哪个跟踪(或跨度)!
“hack”方法是将跟踪标识符填充为消息键。一种不那么黑客的方法是协调一个body Package 器,您可以将跟踪上下文嵌套到其中。
这是前者的一个例子:
https://gist.github.com/adriancole/76d94054b77e3be338bd75424ca8ba30

yk9xbfzb

yk9xbfzb2#

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

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。这是一个粗糙难看的代码示例,请给出一个想法。

相关问题