gpt4 book ai didi

java - 在 Opentelemetry 中,无法获取父跨度

转载 作者:行者123 更新时间:2023-12-05 06:00:23 29 4
gpt4 key购买 nike

我是 OpenTelemetry 词的新手。我已经分别为我的服务创建了跨度,但是当我尝试使用上下文传播来组合两个不同服务的跨度时,我无法成功地做到这一点。我使用了以下代码:

 // at client side:
public static void sendContext(String resource) {

TextMapSetter<HttpURLConnection> setter =
new TextMapSetter<HttpURLConnection>() {
@Override
public void set(HttpURLConnection carrier, String key, String value) {
carrier.setRequestProperty(key, value);
}
};
HttpURLConnection transportLayer = null;
String urlString = "http://127.0.0.1:8080" + resource;
try {
URL url = new URL(urlString);
transportLayer = (HttpURLConnection) url.openConnection();
} catch (MalformedURLException ex) {
System.out.println(ex.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
GlobalOpenTelemetry.getPropagators()
.getTextMapPropagator()
.inject(Context.current(), transportLayer, setter);
}



// at server side:
public static Context getContext(HttpServletRequest request) {

TextMapGetter<HttpServletRequest> getter =
new TextMapGetter<HttpServletRequest>() {
@Override
public String get(HttpServletRequest carrier, String key) {
Enumeration<String> headerNames = carrier.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.println("headerNames.nextElement(): " + headerName);
if (headerName.equals(key)) {
String headerValue = request.getHeader(headerName);
System.out.println("headerValue): " + headerValue);
return headerValue;
}
}
}

return null;
}

@Override
public Iterable<String> keys(HttpServletRequest carrier) {
Set<String> set = new HashSet<String>();
Enumeration<String> headerNames = carrier.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
set.add(headerNames.nextElement());
}
}
return set;
}
};
Context extractedContext =
GlobalOpenTelemetry.getPropagators()
.getTextMapPropagator()
.extract(Context.current(), request, getter);

在服务器上,我无法获取父跨度。请对此提供帮助。

最佳答案

您可以引用 here 中的 OpenTelemetry 主要文档.它包含上下文传播部分,但我使用 HttpHeader 类型的 getter 作为 TextMapGetter,其功能与文档中显示的相同,而不是使用

Scope scope = extractedContext.makeCurrent()

作为创建子跨度的作用域,最好不使用作用域直接使用,

tracer.spanBuilder(spanName).setParent(extractedContext)

因为有时在当前线程上传播父跨度的自动方式无法正常工作。

关于java - 在 Opentelemetry 中,无法获取父跨度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67692618/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com