欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenTelemetry初識及調(diào)用鏈Trace詳解

 更新時間:2022年12月20日 11:47:38   作者:騎牛上青山  
這篇文章主要為為大家介紹了OpenTelemetry初識及調(diào)用鏈Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

OpenTelemetry作為一個分布式追蹤的項目,他支持非常多的語言,如Java,Golang,Python等,鑒于筆者的主力語言為Java,并且后續(xù)需要介紹OpenTelemetry的Java Agent實現(xiàn),所以后續(xù)文章中的相關(guān)知識點都以Java或者Java Sdk的方式為主。

初識OpenTelemetry

在微服務(wù)廣泛發(fā)展和使用的當(dāng)下,對于整個微服務(wù)體系的使用情況的觀察以及服務(wù)依賴調(diào)用情況都不再像以往那么清晰明了。而這正是OpenTelemetry能夠為我們提供的能力。

OpenTelemetry源自O(shè)penSencuc和OpenTracing的合并,它的目標(biāo)是集成Trace,Metrics,Logging能力來提供可觀測性。過去的分布式追蹤往往是各做各的,沒有固定的標(biāo)準(zhǔn),各個分布式追蹤方案各顯神通,使用不同的協(xié)議,不同的標(biāo)準(zhǔn)。但是OpenTelemetry不同,它提供了一系列的標(biāo)準(zhǔn),并且他的可插拔式的架構(gòu)為將來的協(xié)議和數(shù)據(jù)結(jié)構(gòu)擴(kuò)展提供了便利的方式。

調(diào)用鏈Trace

分布式調(diào)用鏈,俗稱調(diào)用鏈,用來記錄請求的路徑整體路徑。下圖是一個典型的的請求以及其RPC調(diào)用的鏈路:

從圖中我們可以很清晰的了解到剛才的請求是怎么一個流轉(zhuǎn)過程,經(jīng)過了什么組件和服務(wù),接口。這就是調(diào)用鏈的作用之一,讓我們的請求鏈路更加透明清晰。

Span

Span在調(diào)用鏈中是一個基礎(chǔ)的單元,一個調(diào)用鏈?zhǔn)怯珊芏嗟腟pan組成的。在一個Span中會包含如下信息:

  • 名稱
  • 父Span的ID,root節(jié)點的父Span為空
  • 開始與結(jié)束時間戳
  • Span Context
  • Attributes
  • Span事件
  • Span Links
  • Span狀態(tài)
  • Span Kind

以下是一個典型的Span結(jié)構(gòu):

{
  "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 Context可以理解為上下文,是Span中包含的不可變的對象。在Span Context中包含了:

  • traceId:調(diào)用鏈ID
  • spanId:Span的ID
  • traceFlag:二進(jìn)制形式的調(diào)用鏈標(biāo)志位,一般用于表示調(diào)用鏈?zhǔn)欠癫蓸樱╥sSampled)
  • traceState:承載調(diào)用鏈信息的K-V結(jié)構(gòu)列表

Attributes

Attributes是一個用來攜帶信息的K-V結(jié)構(gòu)。

在java sdk中可以通過:

Span.current().setAttribute("My Attributes", "attr");

來自定義你想要設(shè)置的Attributes。當(dāng)然在OpenTelemetry中默認(rèn)內(nèi)置的那些Instrumentation都會有定義一些指定標(biāo)準(zhǔn)化的的Attributes,詳情可以參照Semantic Attributes

Span事件

Span事件(Events)是一種事件機制,可以將事件觸發(fā)與具體的Span進(jìn)行綁定,然后在調(diào)用鏈頁面展示出來。如下事例:

Span.current().addEvent("My Event");

Span Links

Span Links是一種能夠?qū)⒄{(diào)用鏈關(guān)聯(lián)起來的技術(shù),通過配置關(guān)聯(lián)的Span,可以在頁面中展現(xiàn)關(guān)聯(lián)的調(diào)用鏈信息。不過請注意Span Links必須要在Span創(chuàng)建時才能添加,不像Events和Attributes一樣能在Span創(chuàng)建之后添加。例子如下:

Tracer tracer = GlobalOpenTelemetry.getTracer("1111");
Span span = tracer.spanBuilder("start")
        .addLink(SpanContext.create("ee868088dfd10adbaa459c9aa353b112", "53b11b6c55010604",
                TraceFlags.getDefault(), TraceState.getDefault())).startSpan();
span.end();

Span狀態(tài)

Span狀態(tài)(Status)是定義好的Span的狀態(tài),有如下幾種:

  • Unset
  • Ok
  • Error

Span Kind

Span Kind是指Span類型,有如下幾種:

  • Server
  • Client
  • Producer
  • Consumer
  • Internal

顧名思義Server/Client指的是服務(wù)端/客戶端,Producer/Consumer指的是生產(chǎn)者/消費者,顯然這個一般適用于消息隊列,Internal是內(nèi)部組件產(chǎn)生的Span

Trace構(gòu)建的原理

簡單來說的話Trace是由眾多的Span組成的,而Span則是由眾多的Instrumentation庫組成的,這些庫由開源作者構(gòu)建,用于支持不同的組件,如http請求,kafka,redis等等。依托于這些Instrumentation,調(diào)用鏈可以生成對應(yīng)的Span。

生成Span自然不是難題,問題在于是如何將這些Span串聯(lián)起來的。在Trace中有一個唯一的標(biāo)識TraceID,而且在Span中也有一個SpanId和ParentSpanId,借助這些信息,在Span將所有數(shù)據(jù)推送到服務(wù)端后,服務(wù)端就能根據(jù)這些信息進(jìn)行重組,然后在界面上進(jìn)行展示。

但是又存在一個問題,TraceId以及ParentSpanId是如何在Span間進(jìn)行傳遞的呢?

這里就涉及到了Trace的底層原理了。在這里以Java Sdk來舉例。在Sdk中會定義一個Context類用于建立一個內(nèi)存中的線程隔離的存儲機制來存儲上游傳遞的數(shù)據(jù)。一般來說上游往下游傳遞數(shù)據(jù)每個插件都是不同的形式。例如如果是http請求,那就借助Header,如果是Kafka,也是借助于Kafka自帶的prop來進(jìn)行數(shù)據(jù)傳遞。之后在下游獲取到數(shù)據(jù)后利用Context將其存放入內(nèi)存中,這個過程被稱為extract,在數(shù)據(jù)要再往下傳遞時,需要將內(nèi)存中數(shù)據(jù)取出,在解析成Header或是其他的形式,這個被稱為inject。調(diào)用鏈信息正是以此來傳遞的。

Trace就是依靠traceparent來進(jìn)行傳遞的,traceparent不僅包含了traceId,還包含了一些isSample等等的基礎(chǔ)信息。

Metrics

Metrics是一種度量標(biāo)準(zhǔn),用于展現(xiàn)應(yīng)用的CPU,內(nèi)存等等指標(biāo)級的度量信息。

OpenTelemetry定義了三種metrics儀器:

  • counter: 累加值,這類指標(biāo)不會減少,只會不斷的累加上去
  • measure: 一段時間的數(shù)據(jù)聚合值,表示的是一段時間內(nèi)的數(shù)據(jù)累加值
  • observer: 抓取當(dāng)前時間的一系列特定值

實際上OpenTelemetry提供了許多基礎(chǔ)的指標(biāo)計算方式,例如: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);

上述代碼是一個簡單的創(chuàng)建指標(biāo)的的例子,這里創(chuàng)建了一個固定值為100的名為my_metrics的指標(biāo),由于是counter,所以最終指標(biāo)名為my_metrics_total

Logs

日志也是OpenTelemetry的一大功能之一,不過截止到本文發(fā)布前,Logs功能還未GA,因此存在變數(shù),后續(xù)我們在聊到Agent相關(guān)內(nèi)容時會再簡單聊聊這部分內(nèi)容,在這里就先一筆帶過。

Baggage

Baggage用于在Span間傳遞數(shù)據(jù)。

設(shè)想一個場景,你希望在鏈路的當(dāng)前的Span中將某些數(shù)據(jù)傳遞下去,使用attributes顯示然是不行的,因此需要一些手段將其傳遞下去,Baggage就是為此而設(shè)計的。

其實Baggage的原理基本和調(diào)用鏈的traceId的傳遞基本相似,不同之處是它定義了一個名為baggage的key,而這個key中包含的值是以K-V形式組織的,因此你可以傳遞自己想要的值下去。

在早期Baggage底層維護(hù)了一個Map來存儲這些數(shù)據(jù),后來在某個版本后改成了用數(shù)組的形式,每兩個數(shù)組位置分別存儲一對K-V,并且做了一些特殊的處理來實現(xiàn)刪除等操作,有興趣的可以去看看源碼。

總結(jié)

在本文中我們簡單的介紹了OpenTelemetry的一些使用和實現(xiàn)的原理,在后續(xù)的文章中會更多的介紹整個OpenTelemetry的體系,請期待后續(xù)!

參考文檔:

[1] opentelemetry.io/docs

以上就是OpenTelemetry初識及調(diào)用鏈Trace詳解的詳細(xì)內(nèi)容,更多關(guān)于OpenTelemetry Trace調(diào)用鏈的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 新建springboot項目時,entityManagerFactory報錯的解決

    新建springboot項目時,entityManagerFactory報錯的解決

    這篇文章主要介紹了新建springboot項目時,entityManagerFactory報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 教你怎么用SpringBoot整合Swagger作為API

    教你怎么用SpringBoot整合Swagger作為API

    這篇文章主要介紹了教你怎么用SpringBoot整合Swagger作為API,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java內(nèi)存模型知識詳解

    Java內(nèi)存模型知識詳解

    這篇文章主要介紹了Java內(nèi)存模型知識詳解,文中通過對內(nèi)存訪問時的交互關(guān)系圖解介紹的十分詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 深入理解Java中包的定義與使用

    深入理解Java中包的定義與使用

    在開發(fā)過程中,會定義很多類,為了避免相同類名稱出現(xiàn)而發(fā)生覆蓋的情況,把所有java程序保存在各自的目錄里面,而該目錄就是包。包的本質(zhì)實際上就是一個文件夾。本文將給大家詳細(xì)的介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值
    2021-09-09
  • java web在高并發(fā)和分布式下實現(xiàn)訂單號生成唯一的解決方案

    java web在高并發(fā)和分布式下實現(xiàn)訂單號生成唯一的解決方案

    這篇文章主要介紹了java web在高并發(fā)和分布式下實現(xiàn)訂單號生成唯一的解決方案,需要的朋友可以參考下
    2017-11-11
  • 全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin選型對比

    全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin選型對比

    這篇文章主要為大家介紹了全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin實現(xiàn)的選型對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • SpringBoot應(yīng)用的打包和發(fā)布實現(xiàn)

    SpringBoot應(yīng)用的打包和發(fā)布實現(xiàn)

    本文主要介紹了SpringBoot應(yīng)用的打包和發(fā)布實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java登錄功能實現(xiàn)token生成與驗證

    Java登錄功能實現(xiàn)token生成與驗證

    這篇文章介紹了Java登錄功能實現(xiàn)token生成與驗證,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 關(guān)于使用MyBatis簡化JDBC開發(fā)和解決SQL語句警告的問題

    關(guān)于使用MyBatis簡化JDBC開發(fā)和解決SQL語句警告的問題

    這篇文章主要介紹了關(guān)于使用MyBatis簡化JDBC開發(fā)和解決SQL語句警告的問題,如果idea和數(shù)據(jù)庫沒有建立鏈接,idea不識別表的信息,就會出現(xiàn)SQL語句的警告,需要的朋友可以參考下
    2023-05-05
  • Java中ArrayList與順序表的定義與實現(xiàn)方法

    Java中ArrayList與順序表的定義與實現(xiàn)方法

    ArrayList是一個實現(xiàn)List接口的類,底層是動態(tài)類型順序表,本質(zhì)也就是數(shù)組,動態(tài)主要體現(xiàn)在它的擴(kuò)容機制,下面這篇文章主要給大家介紹了關(guān)于Java中ArrayList與順序表的定義與實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評論