0

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

    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();
        }

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

4

1 回答 1

0

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

您真正想要做的是在每条路线中打开一个跨度,类似于以下内容:

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 实例,所以这只是一个应该如何实现的想法。也许你必须做一些调整。

于 2021-04-13T19:47:49.120 回答