如何使用 opentracing 或 opentelemetry 在 vertx 中的 eventbus 中实现跟踪?

问题描述

网页没有太多描述,如果可能的话,分享一些例子。

    public class MainVerticle extends AbstractVerticle {
        
        Tracer tracer=GlobalTracer.getTracer();
        @Override
        public void start() {
            vertx.deployVerticle(new MainVerticle());
            Router router =Router.router(vertx);
            router.get("/home").handler(this::message);
            router.get("/home/:name").handler(this::messagectm);
            Tracer tracer = getTracer();
            vertx.createHttpServer(new HttpServerOptions().setTracingPolicy(TracingPolicy.ALWAYS)).requestHandler(router).listen(8080);
            Span span = tracer.buildSpan("my-operation")
          .withTag("example","test")
          .start();
          OpenTracingUtil.setSpan(span);
          DeliveryOptions options = new DeliveryOptions().setTracingPolicy(TracingPolicy.ALWAYS);
            vertx.eventBus().send("addr","test",options);
            span.finish();
        }

这是我尝试过但没有按预期工作的示例实现

解决方法

start() 方法基本上是在引导期间发生的事情。您实际上所做的是仅在应用程序启动时创建一次跨度,然后立即关闭它。

你真正想做的是在每条路由中打开一个span,类似这样:

router.get("/home").handler((ctx) -> {
    Span span = tracer.buildSpan("my-operation")
      .withTag("example","test")
      .start();
    this.message(ctx);
    span.finish();
});

现在,由于 Vert.x 异步性质,上面的代码很容易理解,但并不完全正确。除非您的 message() 方法实际上是阻塞的。

更正确的方法是:

router.get("/home").handler((ctx) -> {
    Span span = tracer.buildSpan("my-operation")
      .withTag("example","test")
      .start();
    ctx.response().endHandler((h)->{span.finish();})
    this.message(ctx);
    
});

这将在您的响应关闭时调用 end of span,这可能是您想要的。

需要明确的是,我目前没有一个正在运行的带有 OpenTracing 的 Vert.x 实例,所以这只是一个应该如何实现的想法。也许你需要做一些调整。