一、OpenTracing簡介
OpenTracing是一個由雲原生計算基金會(CNCF)維護的跨語言的追蹤標準。它提供了一套標準跟蹤規範,使得跨多個組件、多個進程、多個主機的分散式系統的調用關係可視化。
通過OpenTracing可以將分散式系統中每一個操作的耗時、請求的參數、響應結果、錯誤信息等都進行精細化的記錄和監控,從而可以更加快速、準確地定位和解決分散式系統中的問題。
OpenTracing的核心API非常簡單,只提供了幾個基本的追蹤介面。除此之外,它可以支持許多各種語言和框架的插件,如Java、Go、Python、Ruby等。在使用上,OpenTracing通常需要搭配一些特定的Instrumentation或是框架 Support來使用。
二、OpenTracing API
OpenTracing定義了大量的介面方法,其中最基本的有以下幾個:
1. startSpan:創建一個Span對象實例
2. inject:把當前Span實例寫入到carrier對象中,如HTTP headers、RPC envelopes等
3. extract:根據提供的carrier對象,重新生成一個Span實例
4. setActiveSpan:在一個線程或請求上下文中設置活動的Span實例
5. getActiveSpan:獲取當前活動的Span實例
6. close:結束某一個Span實例的追蹤
以下是Java代碼的樣例:
// 定義一個追蹤器 Tracer tracer = ... // 假設tracer支持createChildTracer方法 Span childSpan = tracer.createChildTracer("child-operation") .start(); try (Scope childScope = tracer.withSpan(childSpan)) { // 業務邏輯 doSomeWork(); childSpan.setTag("message", "hello, world!"); childSpan.finish(); } catch (RuntimeException ex) { childSpan.setTag("error", true); childSpan.log(Collections.singletonMap("event", "error")); throw ex; }
上述代碼中,以tracer.createChildTracer(“child-operation”).start()的方式來創建一個子追蹤器,Scope則可以讓Span的上下文在執行作用域內保持一致。業務邏輯執行完成後,通過childSpan.setTag(“message”, “hello, world!”)來為跟蹤器添加自定義的標籤。最後一定不要忘記調用childSpan.finish()來關閉追蹤。
三、OpenTracing實用案例
在分散式系統中,我們經常會遇到調用鏈過長、錯誤難以定位、請求性能低下等問題。使用OpenTracing可以越過進程、主機甚至數據中心的邊界對系統進行完整性的分析和監控。
以下是一個將Spring with OpenTracing的集成例子:
@Bean public Tracer tracer(Sampler sampler) { TracingConfiguration tracingConfig = TracingConfiguration.builder() .withSampler(sampler) .withReporter(reporter) .build(); return OpenTracingConfiguration.create(tracingConfig); } @Bean public SpanAccessor getSpanAccessor(Tracer tracer) { return new SpanAccessor(tracer); } @Controller @RequestMapping("/greeting") public class GreetingController { private final GreetingService greetingService; private final SpanAccessor spanAccessor; public GreetingController(GreetingService greetingService, SpanAccessor spanAccessor) { this.greetingService = greetingService; this.spanAccessor = spanAccessor; } @GetMapping("/hello") public ResponseEntity hello(@RequestParam(value = "name") String name) { Span greetingSpan = spanAccessor.getSpan(); greetingSpan.setBaggageItem("user", name); greetingService.greet(); return ResponseEntity.ok("hello, " + name); } }
上述代碼中,創建了一個tracer的Bean,然後定義了控制器GreetingController,在hello介面返回前通過SpanAccessor獲取span實例,並為其設置了baggage信息和在greeting method中使用了Trace等AOP的註解以啟動跟蹤。
四、OpenTracing性能考量
OpenTracing在分散式追蹤中有著很廣泛的應用,也是商業化的APM工具常用的一個開源標準之一。但是由於實時的數據採集和傳輸不可避免,
會對系統性能造成一定的影響,因此我們在使用時需要注意以下幾點:
1. 選擇採樣率:在不損失過多數據完整性的前提下,我們可以對數據進行截留或是丟棄。一般情況下需要根據業務負載、數據容量等來設置合適的採樣率,避免數據壓力過多。
2. 數據發送優化:傳統的同步的追蹤方式會增加額外的I/O延遲,因此可以選擇非同步發送或者採用並行的數據傳輸技術來優化。同時,可以通過壓縮數據、合併請求等方式來減少數據傳輸次數。
3. 避免過度記錄:OpenTracing記錄的所有信息都會佔用額外的資源,因此不應該記錄過多的信息。在記錄時應該優先選擇關鍵的信息,如請求參數、響應結果、處理時間等。
五、總結
本文介紹了OpenTracing的定義和基本API,包括Span、Scope、Tracer等API的使用。同時,我們還介紹了OpenTracing在分散式追蹤中的實用案例,以及在性能考慮時需要注意的地方。
通過OpenTracing,我們可以輕鬆地找到和追蹤請求的調用鏈、性能瓶頸以及錯誤根源。最終可以提高關鍵業務應用的可靠性和性能,提升用戶體驗。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/280513.html