如何解决使用 OTEL Java 代理,如何在不使用 @WithSpan 的情况下创建新的 Context
opentelemetry-javaagent-all
代理(版本 0.17.0 和 1.0.1)一直是向我的 Java 应用程序添加跟踪信息的起点。自动检测效果很好。
我的某些应用程序无法自动检测。对于应用程序的这一部分,我首先在代码中有趣的地方添加了 @WithSpan
注释。
我现在已经达到了使用简单 @WithSpan
注释似乎可能达到的极限。但是,我的应用程序底层的框架允许我注册要在某些点调用的回调——例如我可以提供在客户端连接/断开连接时收到通知的处理程序。
我认为我需要的是在调用 Foo.onConnect()
时启动一个新的 Span,并将其设置为与每个请求对应的 Span
的父级。
public class Foo {
void onConnect() {
// called when a client connects to my app
// Here I want to create a Span that will be the parent of the Span created in
// Foo.processEachRequest().
}
@WithSpan
public void processEachRequest() {
// works,but since it is called for each request... each span is in a separate Trace
}
void ondisconnect() {
// called when the client disconnects from my app
// Here I can end the parent Span.
}
}
其他想法 - 没有奏效:
1 - 显而易见的解决方案是向底层框架添加 @WithSpan
注释。由于种种原因,这不会是一个切实可行的方法。
2 - 下一个选择可能是寻找一种方法来告诉 javaagent 我的底层框架中的方法。 (New Relic 代理可以做这样的事情。)无论如何,今天这似乎不是开放遥测代理的功能。
因此,我需要寻找一种使用回调来完成此操作的方法,如上所述。 有没有办法做到这一点?
解决方法
这应该可以通过手动检测您的代码来实现。您将使用 OpenTelemetry 的 Tracer
接口,如 OpenTelemetry Java docs 中所述。
这应该会给你一个大致的概念:
public class Foo {
private Span parentSpan; // you might need a Map/List/Stack here
void onConnect() {
Tracer tracer =
openTelemetry.getTracer("instrumentation-library-name","1.0.0");
Span span = tracer.spanBuilder("my span").startSpan();
this.parentSpan = span; // might need to store span per request/client/connection-id
}
public void processEachRequest() {
final Span parent = this.lookupParentSpan();
if (parent != null) {
try (Scope scope = span.makeCurrent()) {
yourLogic();
} catch (Throwable t) {
span.setStatus(StatusCode.ERROR,"error message");
throw t;
}
} else {
yourLogic();
}
}
void onDisconnect() {
final Span parent = this.lookupParentSpan();
if (parent != null) {
parent.end();
}
}
private Span lookupParentSpan() {
// you probably want to lookup the span by client or connection id from a (weak) map
return this.parentSpan;
}
}
注意:您必须保证跨度始终结束并且不会泄漏。确保正确确定您的范围并最终调用 Span#end()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。