kafka调用链跟踪的核心原理是通过kafka的header消息头,将发送者producer和消费者consumer关联起来。
在没有服务网格的环境,通过opentracing-api将跟踪信息串联,发送给jaeger UI界面。使用io.opentracing.Tracer.inject(SpanContext spanContext, Format<C> format, C carrier)将标准的调用链信息SpanContext 注入到producer的header(carrier)头中,再从consumer的header头中提取
可以使用重写kafka客户端Producer,Consumer或者分别给kafka客户端Prodcuer,Consumer增加拦截器来实现
效果:
https://github.com/jeqo/post-kafka-opentracing
producer | consumer | |
---|---|---|
ProducerRecord(topic=greetings-topic, partition=null, headers=RecordHeaders(headers=[], isReadOnly=false), key=jeqo1, value=Hijeqo1, timestamp=null)
| ProducerRecord(topic=greetings-topic, partition=null, headers=RecordHeaders(headers=[RecordHeader(key=uber-trace-id, value=[99, 57, 49, 57, 57, 54, 102, 56, 48, 98, 97, 57, 56, 54, 55, 99, 58, 100, 98, 102, 99, 99, 48, 50, 50, 54, 97, 53, 51, 48, 51, 49, 98, 58, 100, 51, 99, 57, 102, 99, 57, 99, 48, 48, 50, 100, 98, 51, 50, 52, 58, 49])], isReadOnly=false), key=jeqo1, value=Hijeqo1, timestamp=null)
| ConsumerRecord(topic=greetings-topic, partition=0, offset=43, CreateTime=1558420361614, serializedkeysize=5, serializedvaluesize=8, headers=RecordHeaders(headers=[RecordHeader(key=uber-trace-id, value=[99, 57, 49, 57, 57, 54, 102, 56, 48, 98, 97, 57, 56, 54, 55, 99, 58, 100, 98, 102, 99, 99, 48, 50, 50, 54, 97, 53, 51, 48, 51, 49, 98, 58, 100, 51, 99, 57, 102, 99, 57, 99, 48, 48, 50, 100, 98, 51, 50, 52, 58, 49])], isReadOnly=false), key=jeqo1, value=Hijeqo1)
|