问题描述
网页没有太多描述,如果可能的话,分享一些例子。
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 实例,所以这只是一个应该如何实现的想法。也许你需要做一些调整。