【问题标题】:128 bit Sleuth Trace ID on PCFPCF 上的 128 位 Sleuth Trace ID
【发布时间】:2019-04-28 18:07:12
【问题描述】:

我正在尝试使用 128 位 Sleuth 生成的 TraceId 作为请求访问我的控制器的唯一标识符。我知道默认的 traceId 是 64,要更改它,我必须将以下内容添加到 application.properties:

spring.sleuth.trace-id128=true

这适用于我的本地,但是当我将它部署到 PCF 时,跟踪 ID 是 64 位。我创建了一个示例项目,它只有一个简单的控制器来演示这一点。

@RestController
public class Controller {
    private Logger logger = LoggerFactory.getLogger(Controller.class);
    @Autowired
    private Tracer tracer;
    @GetMapping("/")
    public void test(){
        logger.info("LOGGED +["+tracer.currentSpan().context().traceIdString()+"]");
    }
}

在我的本地,它会打印:

com.example.demo.Controller: LOGGED + [5bfcb33c9d564481479f2c212ec08143]

在 PCF 中,它会打印:

om.example.demo.Controller : LOGGED + [97a1168857dc7088]

PCF 是否会覆盖此配置?

更新

在我的请求中包含“X-B3-TraceId”和“X-B3-SpanId”,traceId 现在是 128 位,但与请求标头中传递的字符串不同。

Details from log

【问题讨论】:

    标签: spring cloud-foundry spring-cloud-sleuth


    【解决方案1】:

    有可能 PCF,更具体地说是 Gorouter,正在创建跟踪 id,并将其传播到您的应用程序中,而不是创建新的 128 位跟踪 id,而是重用现有的 64 位跟踪 id。

    PCF 支持 Zipkin Tracing,默认情况下已启用,因此在大多数环境中都处于启用状态。

    https://docs.pivotal.io/pivotalcf/2-3/adminguide/zipkin_tracing.html

    根据文档,Gorouter 将检查传入请求中是否存在 Zipkin 标头,如果不存在则创建它们。

    如果请求中不存在 X-B3-TraceId 和 X-B3-SpanId HTTP 标头,Gorouter 会为这些标头生成值并将标头插入到转发给应用程序的请求中。

    如果请求中存在 X-B3-TraceId 和 X-B3-SpanId HTTP 标头,Gorouter 会不加修改地转发它们。

    https://docs.pivotal.io/pivotalcf/2-3/concepts/http-routing.html#zipkin-headers

    您可以在此处看到它正在创建一个 64 位跟踪 ID。

    https://github.com/cloudfoundry/gorouter/blob/master/handlers/zipkin.go#L49-L57

    您可以通过发送带有 X-B3-TraceIdX-B3-SpanId 标头的请求来确认。在这种情况下,Gorouter 应该原封不动地转发它们。

    例如:curl -v -H 'X-B3-TraceId: 5bfcb33c9d564481479f2c212ec08143' -H X-B3-SpanId: 5bfcb33c9d564481479f2c212ec08143' https://your-cool-app.com/test

    【讨论】:

    • 感谢您的回复。我尝试了您提到的内容,似乎当我在请求标头中包含 128 位跟踪和跨度 ID 时,我的应用程序中的跟踪和跨度 ID 确实变为 128 位,但它与我在请求中指定的不同。事实上,无论我指出的值如何,传播的 traceId 和 spanId 始终是“5c05f313f7d726cd1509f63585df7a7c”
    • 我不确定为什么会这样。你如何监控这个?如果您正在设置这些标头,它们只是被 Gorouter 传递,因此不会修改它们。如果您查看cf logs,应该有一个由Gorouter 生成的[RTR] 日志条目。它将具有标头值,您可以尝试运行它以确认它至少获得了您指定的标头值吗?从那里,也许尝试在您的应用程序中记录进入请求的标头。您可以尝试分解更改值的位置。
    • 嗨@Daniel,再次感谢您的回复。我已经从 PCF 应用程序管理器监控了日志,并在更新的问题中包含了一个链接,以获取日志的屏幕截图。我对 traceId 总是采用特定值的评论的错误,这是不正确的。但是,我观察到的是,在 128 位 traceId 中,前 3 个十六进制并没有改变。它始终是 5c0。好像和时间​​戳有关?
    • 我不确定。您正在登录的跟踪 ID LOGGED +[..] 由 Sleuth 生成。我不知道它用于创建跟踪/跨度 ID 的确切方法。如果您想了解更多信息,您需要查看代码或发布不同的问题。
    • 如果我没记错的话,它应该与传递给 TraceContext 的 traceId 相同。好确定!谢谢你的帮助丹尼尔!
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 2018-11-08
    • 2011-09-03
    • 1970-01-01
    • 2021-10-30
    • 2011-07-14
    • 2017-09-28
    相关资源
    最近更新 更多