2016-08-03 3 views
1

Je voudrais implémenter le traçage dans mon architecture de microservices. J'utilise Apache Kafka comme courtier de messages et je n'utilise pas Spring Framework. Le traçage est un nouveau concept pour moi. Au début, je voulais créer ma propre implémentation, mais maintenant je voudrais utiliser des bibliothèques existantes. Brave ressemble à celui que je veux utiliser. J'aimerais savoir s'il existe des guides, des exemples ou des documents sur la façon de procéder. La documentation sur la page Github est minimale, et j'ai du mal à commencer à utiliser Brave. Ou peut-être il ya une meilleure bibliothèque avec une documentation appropriée, qui est plus facile à utiliser. Je vais regarder Apache HTrace parce que ça a l'air prometteur. Certains guides de démarrage seront agréables.Zipkin, utilisation de bibliothèques existantes pour gérer le traçage dans les microservices connectés à Apache Kafka

+0

Très bien, j'ai eu ma réponse. Adrian Cole a ajouté cela à [GitHub] (https://github.com/openzipkin/brave/pull/212/files) – jpiechowka

+0

wait comment cela répond-il à votre question ...? – EndingWithAli

Répondre

1

Il y a un tas de façons d'y répondre, mais je vais y répondre du point de vue «unidirectionnel». La réponse courte cependant, est que je pense que vous devez rouler le vôtre dès maintenant!

Bien que Kafka puisse être utilisé de plusieurs façons, il peut être utilisé comme un moyen de transport pour les messages mono-directionnels mono-consommateurs. Cette action est similaire à la procédure RPC unidirectionnelle normale, dans laquelle vous avez une demande mais pas de réponse.

Dans Zipkin, une plage RPC est généralement une requête-réponse. Par exemple, vous voyez le moment de l'envoi du client au serveur, ainsi que le retour au client. L'one-way est où vous laissez de l'autre côté. L'intervalle commence par un "cs" (envoi client) et se termine par un "sr" (serveur reçu). Si vous mappez ceci à Kafka, vous marqueriez le client envoyé lorsque vous produisez le message et le serveur reçu lorsque le consommateur le reçoit.

L'astuce pour Kafka est qu'il n'y a pas de bon endroit pour remplir le contexte de trace. C'est parce que contrairement à beaucoup de systèmes de messagerie, il n'y a pas d'en-tête dans un message Kafka. Sans contexte de trace, vous ne savez pas quelle trace (ou l'envergure d'ailleurs) vous complétez!

L'approche "hack" consiste à remplir les identificateurs de trace en tant que clé de message. Une manière moins hacky serait de coordonner une enveloppe corporelle dans laquelle vous pouvez imbriquer le contexte de trace.

Voici un exemple de l'ancien:

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

0

je rencontre le même problème too.Here est ma solution, d'une manière moins aki comme ci-dessus dit.

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) 
} 

vous devez implémente MyHttpServerRequest et MyRequest.It est facile, vous revenez juste quelque chose d'un besoin d'envergure, tels que uri, en-tête, méthode. Ceci est un exemple de code rugueux et moche, juste offrir une idée.