如何使用 opentracing 或 opentelemetry 在 vertx 的事件总线中实现跟踪?

How to implement tracing in eventbus in vertx using opentracing or opentelemetry?

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

    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() 方法基本上就是 bootstrap 期间发生的事情。您实际上在做的是仅在应用程序启动时创建一次跨度,然后立即关闭它。

你真正想做的是在每条路由中打开一个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);
    
});

这将在您的响应关闭时调用跨度结束,这可能就是您想要的。

需要说明的是,我目前没有带有 OpenTracing 的 运行 Vert.x 实例,所以这只是关于如何实施的一个想法。也许你需要做一些调整。