本文介紹如何使用開源鏈路追蹤客戶端進行異常埋點,并在可觀測鏈路 OpenTelemetry 版中進行異常分析。
前提條件
您已通過開源客戶端接入可觀測鏈路 OpenTelemetry 版,具體操作,請參見接入指南。
設置Span的異常信息
OpenTelemetry異常規范
此規范適用于通過OpenTelemetry協議上報方式。
根據OpenTelemetry協議的異常規范,Span的異常信息存儲在event屬性中,當event的attributes中包含exception.type
字段時,可觀測鏈路 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自動埋點方式時,探針或框架會自動捕捉異常信息,并上報至服務端,可觀測鏈路 OpenTelemetry 版將識別OpenTelemetry Span中的異常信息并展示在異常分析頁面。
OpenTracing異常規范
此規范適用于通過Jaeger、Skywalking和Zipkin協議上報方式。
根據OpenTracing協議的異常規范,Span的異常信息存儲在log屬性中,當log屬性的tags中包含event
字段為"error"
且包含error.kind
字段時,可觀測鏈路 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提供了大量無侵入式探針接入,通常探針埋點均會記錄異常信息上報至服務端,可觀測鏈路 OpenTelemetry 版將識別SkyWalking Span中的異常信息并展示在異常分析頁面。
通過可觀測鏈路 OpenTelemetry 版進行異常分析
在端側埋點設置Span的異常信息后,可觀測鏈路 OpenTelemetry 版將生成異常信息的統計數據,您可以前往可觀測鏈路 OpenTelemetry 版控制臺的異常分析頁面查看,詳細信息可參見異常分析。