<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
OpenTelemetry
作為一個分散式追蹤的專案,他支援非常多的語言,如Java,Golang,Python等,鑑於筆者的主力語言為Java,並且後續需要介紹OpenTelemetry的Java Agent實現,所以後續文章中的相關知識點都以Java或者Java Sdk的方式為主。
在微服務廣泛發展和使用的當下,對於整個微服務體系的使用情況的觀察以及服務依賴呼叫情況都不再像以往那麼清晰明瞭。而這正是OpenTelemetry能夠為我們提供的能力。
OpenTelemetry源自OpenSencuc和OpenTracing的合併,它的目標是整合Trace,Metrics,Logging能力來提供可觀測性。過去的分散式追蹤往往是各做各的,沒有固定的標準,各個分散式追蹤方案各顯神通,使用不同的協定,不同的標準。但是OpenTelemetry不同,它提供了一系列的標準,並且他的可插拔式的架構為將來的協定和資料結構擴充套件提供了便利的方式。
分散式呼叫鏈,俗稱呼叫鏈,用來記錄請求的路徑整體路徑。下圖是一個典型的的請求以及其RPC呼叫的鏈路:
從圖中我們可以很清晰的瞭解到剛才的請求是怎麼一個流轉過程,經過了什麼元件和服務,介面。這就是呼叫鏈的作用之一,讓我們的請求鏈路更加透明清晰。
Span在呼叫鏈中是一個基礎的單元,一個呼叫鏈是由很多的Span組成的。在一個Span中會包含如下資訊:
以下是一個典型的Span結構:
{ "trace_id": "7bba9f33312b3dbb8b2c2c62bb7abe2d", "parent_id": "", "span_id": "086e83747d0e381e", "name": "/v1/sys/health", "start_time": "2021-10-22 16:04:01.209458162 +0000 UTC", "end_time": "2021-10-22 16:04:01.209514132 +0000 UTC", "status_code": "STATUS_CODE_OK", "status_message": "", "attributes": { "net.transport": "IP.TCP", "net.peer.ip": "172.17.0.1", "net.peer.port": "51820", "net.host.ip": "10.177.2.152", "net.host.port": "26040", "http.method": "GET", "http.target": "/v1/sys/health", "http.server_name": "mortar-gateway", "http.route": "/v1/sys/health", "http.user_agent": "Consul Health Check", "http.scheme": "http", "http.host": "10.177.2.152:26040", "http.flavor": "1.1" }, "events": [ { "name": "", "message": "OK", "timestamp": "2021-10-22 16:04:01.209512872 +0000 UTC" } ] }
Span Context可以理解為上下文,是Span中包含的不可變的物件。在Span Context中包含了:
Attributes是一個用來攜帶資訊的K-V結構。
在java sdk中可以通過:
Span.current().setAttribute("My Attributes", "attr");
來自定義你想要設定的Attributes。當然在OpenTelemetry中預設內建的那些Instrumentation
都會有定義一些指定標準化的的Attributes,詳情可以參照Semantic Attributes
Span事件(Events)是一種事件機制,可以將事件觸發與具體的Span進行繫結,然後在呼叫鏈頁面展示出來。如下事例:
Span.current().addEvent("My Event");
Span Links是一種能夠將呼叫鏈關聯起來的技術,通過設定關聯的Span,可以在頁面中展現關聯的呼叫鏈資訊。不過請注意Span Links必須要在Span建立時才能新增,不像Events和Attributes一樣能在Span建立之後新增。例子如下:
Tracer tracer = GlobalOpenTelemetry.getTracer("1111"); Span span = tracer.spanBuilder("start") .addLink(SpanContext.create("ee868088dfd10adbaa459c9aa353b112", "53b11b6c55010604", TraceFlags.getDefault(), TraceState.getDefault())).startSpan(); span.end();
Span狀態(Status)是定義好的Span的狀態,有如下幾種:
Span Kind是指Span型別,有如下幾種:
顧名思義Server/Client指的是伺服器端/使用者端,Producer/Consumer指的是生產者/消費者,顯然這個一般適用於訊息佇列,Internal是內部元件產生的Span
簡單來說的話Trace是由眾多的Span組成的,而Span則是由眾多的Instrumentation庫組成的,這些庫由開源作者構建,用於支援不同的元件,如http請求,kafka,redis等等。依託於這些Instrumentation,呼叫鏈可以生成對應的Span。
生成Span自然不是難題,問題在於是如何將這些Span串聯起來的。在Trace中有一個唯一的標識TraceID,而且在Span中也有一個SpanId和ParentSpanId,藉助這些資訊,在Span將所有資料推播到伺服器端後,伺服器端就能根據這些資訊進行重組,然後在介面上進行展示。
但是又存在一個問題,TraceId以及ParentSpanId是如何在Span間進行傳遞的呢?
這裡就涉及到了Trace的底層原理了。在這裡以Java Sdk來舉例。在Sdk中會定義一個Context類用於建立一個記憶體中的執行緒隔離的儲存機制來儲存上游傳遞的資料。一般來說上游往下游傳遞資料每個外掛都是不同的形式。例如如果是http請求,那就藉助Header,如果是Kafka,也是藉助於Kafka自帶的prop來進行資料傳遞。之後在下游獲取到資料後利用Context將其存放入記憶體中,這個過程被稱為extract
,在資料要再往下傳遞時,需要將記憶體中資料取出,在解析成Header或是其他的形式,這個被稱為inject
。呼叫鏈資訊正是以此來傳遞的。
Trace就是依靠traceparent
來進行傳遞的,traceparent
不僅包含了traceId,還包含了一些isSample
等等的基礎資訊。
Metrics是一種度量標準,用於展現應用的CPU,記憶體等等指標級的度量資訊。
OpenTelemetry定義了三種metrics儀器:
實際上OpenTelemetry提供了許多基礎的指標計算方式,例如:LongCounter,LongUpDownCounter,DoubleHistogram,DoubleGauge等等。
Meter meter = GlobalOpenTelemetry.meterBuilder("my-meter-instrumentation") .setInstrumentationVersion("1.0.0") .build(); LongCounter counter = meter .counterBuilder("my_metrics") .setDescription("My Metrics") .setUnit("1") .build(); counter.add(100);
上述程式碼是一個簡單的建立指標的的例子,這裡建立了一個固定值為100的名為my_metrics
的指標,由於是counter,所以最終指標名為my_metrics_total
紀錄檔也是OpenTelemetry的一大功能之一,不過截止到本文釋出前,Logs功能還未GA,因此存在變數,後續我們在聊到Agent相關內容時會再簡單聊聊這部分內容,在這裡就先一筆帶過。
Baggage用於在Span間傳遞資料。
設想一個場景,你希望在鏈路的當前的Span中將某些資料傳遞下去,使用attributes顯示然是不行的,因此需要一些手段將其傳遞下去,Baggage就是為此而設計的。
其實Baggage的原理基本和呼叫鏈的traceId的傳遞基本相似,不同之處是它定義了一個名為baggage的key,而這個key中包含的值是以K-V形式組織的,因此你可以傳遞自己想要的值下去。
在早期Baggage底層維護了一個Map來儲存這些資料,後來在某個版本後改成了用陣列的形式,每兩個陣列位置分別儲存一對K-V,並且做了一些特殊的處理來實現刪除等操作,有興趣的可以去看看原始碼。
在本文中我們簡單的介紹了OpenTelemetry的一些使用和實現的原理,在後續的文章中會更多的介紹整個OpenTelemetry的體系,請期待後續!
參考檔案:
以上就是OpenTelemetry初識及呼叫鏈Trace詳解的詳細內容,更多關於OpenTelemetry Trace呼叫鏈的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45