全部產品
Search
文件中心

Managed Service for OpenTelemetry:通過開源鏈路追蹤用戶端擷取異常資訊

更新時間:Jul 06, 2024

本文介紹如何使用開源鏈路追蹤用戶端進行異常埋點,並在Managed Service for OpenTelemetry中進行異常分析。

前提條件

您已通過開源用戶端接入Managed Service for OpenTelemetry,具體操作,請參見接入指南

設定Span的異常資訊

OpenTelemetry異常規範

此規範適用於通過OpenTelemetry協議上報方式。

根據OpenTelemetry協議的異常規範,Span的異常資訊儲存在event屬性中,當event的attributes中包含exception.type欄位時,Managed Service for OpenTelemetry將認為該Span發生了異常並會展示在異常分析頁面;如果能夠擷取到異常堆棧,可以添加至attributes的exception.stacktrace欄位中,那麼異常分析頁面即可查看對應的異常堆棧。

通過OpenTelemetry SDK,您無需手動在event的attributes中添加exception.type欄位與exception.stacktrace欄位,SDK提供了相關方法記錄異常,下面以Java SDK為例展示如何為Span記錄異常:

Span span = myTracer.startSpan("spanName");
try {
  // 執行業務代碼
} catch (Throwable e) {
  span.recordException(e);
  throw e;
} finally {
  span.end();
}
說明

當使用OpenTelemetry自動埋點方式時,探針或架構會自動貼齊異常資訊,並上報至服務端,Managed Service for OpenTelemetry將識別OpenTelemetry Span中的異常資訊並展示在異常分析頁面。

OpenTracing異常規範

此規範適用於通過Jaeger、Skywalking和Zipkin協議上報方式。

根據OpenTracing協議的異常規範,Span的異常資訊儲存在log屬性中,當log屬性的tags中包含event欄位為"error"且包含error.kind欄位時,Managed Service for OpenTelemetry將認為該Span發生了異常並會展示在異常分析頁面;如果能夠擷取到異常堆棧,可以添加至tags的stack欄位中,那麼異常分析頁面可以查看對應的異常堆棧。

  • OpenTracing SDK異常埋點

    以Java OpenTracing SDK為例,下面展示如何為Span記錄異常:

    public static void test() {
      Tracer tracer = GlobalTracer.get();
      Span span = tracer.buildSpan("spanName").start();
    
      try (Scope scope = tracer.activateSpan(span)) {
        // ... 執行業務代碼
      } catch (Exception e) {
          onException(e, span);
      } finally {
          span.finish();
      }
    }
    
    public static void onException(Throwable throwable, Span span) {
      if (span != null) {
        Tags.ERROR.set(span, Boolean.TRUE);
        if (throwable != null) {
          span.log(errorLogs(throwable));
        }
      }
    }
    
    private static Map<String, Object>  errorLogs(Throwable throwable) {
      Map<String, Object> errorLogs = new HashMap<>();
      errorLogs.put("event", Tags.ERROR.getKey());
      errorLogs.put("error.object", throwable);
      errorLogs.put("error.kind", throwable.getClass().getName());
      String message = throwable.getCause() != null ? throwable.getCause().getMessage() : throwable.getMessage();
      if (message != null) {
          errorLogs.put("message", message);
      }
      StringWriter sw = new StringWriter();
      throwable.printStackTrace(new PrintWriter(sw));
      errorLogs.put("stack", sw.toString());
      return errorLogs;
    }
  • Skywalking異常埋點

    Skywalking提供了大量無侵入式探針接入,通常探針埋點均會記錄異常資訊上報至服務端,Managed Service for OpenTelemetry將識別SkyWalking Span中的異常資訊並展示在異常分析頁面。

通過Managed Service for OpenTelemetry進行異常分析

在端側埋點設定Span的異常資訊後,Managed Service for OpenTelemetry將產生異常資訊的統計資料,您可以前往Managed Service for OpenTelemetry控制台的異常分析頁面查看,詳細資料可參見異常分析