如何使用 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 实例,所以这只是关于如何实施的一个想法。也许你需要做一些调整。
网页没有给出太多相同的描述,如果可能的话分享一些例子。
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 实例,所以这只是关于如何实施的一个想法。也许你需要做一些调整。