go - 使用 Jaeger 在分布式应用程序中跟踪 Kafka 总线
问题描述
我已经分发了由几个 Go 服务组成的应用程序。其中一些使用 Kafka 作为数据总线。opentracing
我能够使用Jaeger跟踪服务之间的调用。我在图表上绘制 Kafka 跨度时遇到问题,它们显示为间隙。
这是我能做的。初始跨度由 gRPC 中间件创建。制作方:
...
kafkaMsg := kafka.Message{Key: []byte(key), Value: msgBytes}
headers:=make(map[string]string)
if span := opentracing.SpanFromContext(ctx); span != nil {
opentracing.GlobalTracer().Inject(
span.Context(),
opentracing.TextMap,
opentracing.TextMapCarrier(headers))
}
for headerKey, headerValue:=range headers{
msg.Headers = append(msg.Headers, kafka.Header{
Key: headerKey,
Value: []byte(headerValue),
})
}
// Write message to Kafka
...
消费端:
...
// read headers from Kafka message
headers := make(map[string]string)
for _, header := range kafkaMessage.Headers{
headers[header.Key]=string(header.Value)
}
spanContext, _ := opentracing.GlobalTracer().Extract(opentracing.TextMap, opentracing.TextMapCarrier(headers))
span := opentracing.StartSpan(
"Consumer",
opentracing.FollowsFrom(spanContext))
defer span.Finish()
...
当消息在 Kafka 中时,我应该如何修改它以在图上绘制跨度?
解决方案
所以,回答我自己的问题。Jaeger 不支持跨系统跨度。每个子系统负责其在整个系统中的跨度。作为参考,请查看此答案https://github.com/opentracing/specification/issues/143
推荐阅读
- javascript - Observable 类型上不存在属性管道
- c - C中的数组问题
- r - R - 具有动态列名且无聚合的透视数据框
- reactjs - 父组件重新渲染 useEffect
- mysql - 运行freeradius的mysql需要哪些主要设置?
- r - 在 shinyWidgets::airMonthinputPicker() 中选择当前月份
- swift - 无法将类型“[String : String]”的值转换为预期的参数类型“HTTPHeaders?”
- rabbitmq - RabbitMQ 同时发布和消费同一个队列
- python - Python/Sqlite3 - 从 for 循环列表中的项目中选择语句
- reactjs - 反应表并转到第一页/最后一页