【问题标题】:in Opentelemetry, not able to get parent span在 Opentelemetry 中,无法获得父跨度
【发布时间】:2021-05-25 17:07:45
【问题描述】:

我是 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);

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

【问题讨论】:

    标签: java distributed-tracing open-telemetry


    【解决方案1】:

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

    Scope scope = extractedContext.makeCurrent()
    

    作为创建子span的作用域,最好不带作用域直接使用,

    tracer.spanBuilder(spanName).setParent(extractedContext)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2022-01-01
      • 2011-10-20
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2021-08-02
      • 2022-11-12
      相关资源
      最近更新 更多