本文介紹如何使用開源鏈路追蹤用戶端進行異常埋點,並在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控制台的異常分析頁面查看,詳細資料可參見異常分析。