分布式鏈路追蹤入門篇-基礎原理與快速應用

為什么需要鏈路追蹤?

我們程序員在日常工作中,最常做事情之一就是修bug了。如果程序只是運行在單機上,我們最常用的方式就是在程序上打日志,然后程序運行的過程中將日志輸出到文件上,然后我們根據日志去推斷程序是哪一步發生了問題。但是如果我們的程序是部署在分布式架構的各個服務上,我們再用這種方法去查看一個又一個日志文件,這就顯得非常的低效了。所以這時候如果有一個可以幫助我們根據時間脈絡將所有的信息都匯集起來并以可視化的方式直觀展示給我們看,我們的bugfix是不是就變得事半功倍了呢?

一、什么是鏈路追蹤?

鏈路追蹤(Distributed Tracing)是一種用于監測和診斷分布式應用程序中請求路徑的技術。在分布式系統中,單個請求可能會涉及多個服務和組件。鏈路追蹤通過記錄和分析請求在這些服務之間的傳遞路徑和執行情況,幫助開發人員和運維團隊理解系統的運行狀況、性能和問題。

二、鏈路追蹤是怎么實現的?

1.鏈路追蹤關鍵概念介紹

  • Span(片段): 在鏈路追蹤中,Span 是描述單個操作或事件的基本單元。一個請求被分解成一個或多個 Span,每個 Span 表示一個操作的開始和結束。例如,一個數據庫查詢、一個 HTTP 請求、一個函數調用等都可以作為一個 Span。
  • Context(上下文): 在鏈路追蹤中,上下文是指跨越不同服務的信息傳遞。每個 Span 都關聯一個上下文,允許跟蹤系統將相關的 Span 連接起來,以顯示請求的完整路徑。
  • Trace ID(追蹤標識)Trace ID 是整個請求路徑的唯一標識符。它用于將整個請求的所有 Span 關聯到同一個 Trace 中。當一個請求進入系統時,生成一個唯一的 Trace ID,并在整個請求過程中一直保持不變,以確保所有的 Span 都能夠關聯到同一個 Trace 中
  • Span ID(Span 標識): Span ID 是用于標識單個操作或事件的唯一標識符。每個 Span 都有自己的 Span ID,它用于在 Trace 中標識不同的操作或事件。

2.span是怎么基于context進行關聯的?

由上面的概念我們大概可以想象到,一條追蹤鏈路其實是由多個span組成的,而span之間是基于每一個span的context進行關聯 (即根據context里的同一個trace id進行關聯)

在這里插入圖片描述

三、OpenTelemetry、Jaeger這些和鏈路追蹤有什么關系?

  • OpenTelemetry 是一個用于跟蹤和監控分布式系統的開放式標準和工具集。它提供了一套標準的API 和工具,用于生成、導出和聚合跟蹤數據,并將這些數據發送到各種后端,如 Jaeger、Zipkin、Prometheus 等。
  • Jaeger這些系統為鏈路追蹤提供了一種可視化和分析分布式系統的能力,通過記錄請求的執行路徑和操作(span),在一個直觀的用戶界面中展示整個系統中的請求傳播路徑和性能數據。

四、怎么快速使用OpenTelemetry、Jaeger實現一個鏈路追蹤的demo

  • 步驟1:需要安裝Jaeger,并運行Jaeger。Jaeger官方入門文檔
    為了快速演示,我們可以使用官方推薦的測試方式用docker快速啟動:
    docker run --rm --name jaeger \-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \-p 6831:6831/udp \-p 6832:6832/udp \-p 5778:5778 \-p 16686:16686 \-p 4317:4317 \-p 4318:4318 \-p 14250:14250 \-p 14268:14268 \-p 14269:14269 \-p 9411:9411 \jaegertracing/all-in-one:1.51
    
    然后,打開http://localhost:16686就可以訪問 Jaeger UI了。
  • 步驟2:運行下面代碼,具體代碼請拉取我github上的demo
package mainimport ("context""fmt""log""net/http""go.opentelemetry.io/otel"`go.opentelemetry.io/otel/attribute`"go.opentelemetry.io/otel/exporters/trace/jaeger"`go.opentelemetry.io/otel/sdk/resource`sdktrace "go.opentelemetry.io/otel/sdk/trace"`go.opentelemetry.io/otel/semconv`svc `otel/demo1/svc`
)// 初始化 OpenTelemetry
func initTracer() *sdktrace.TracerProvider {exporter, err := jaeger.NewRawExporter(jaeger.WithAgentEndpoint(func(options *jaeger.AgentEndpointOptions) {options.Host = "localhost"options.Port = "6831"}),)if err != nil {log.Fatalf("Error creating Jaeger exporter: %v", err)}tp := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter),sdktrace.WithSampler(sdktrace.AlwaysSample()),sdktrace.WithResource(resource.NewWithAttributes(semconv.ServiceNameKey.String("demo_service"), // 服務名)),)otel.SetTracerProvider(tp)return tp
}func main() {tp := initTracer()defer func() {if cerr := tp.Shutdown(context.Background()); cerr != nil {log.Fatalf("Error shutting down tracer provider: %v", cerr)}}()//啟動http服務器http.HandleFunc("/demo", handleRequest)go func() {if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatalf("Error starting Service A server: %v", err)}}()//模擬請求SimulateRequest()
}func handleRequest(w http.ResponseWriter, req *http.Request) {tracer := otel.Tracer("root")//開始創建root spanctx, span := tracer.Start(req.Context(), "span root")defer span.End()//可以在span上記錄一些信息,例如日志、請求參數、sql語句等span.SetAttributes(attribute.String("some root service info", "This is the root service"),)//訪問服務Asvc.CallServiceA(ctx)//訪問服務Bsvc.CallServiceB(ctx)w.WriteHeader(http.StatusOK)fmt.Fprintf(w, "Response from Service Root")
}func SimulateRequest()  {req, err := http.NewRequest("GET", "http://localhost:8080/demo", nil)if err != nil {log.Fatalf("Creating request fail: %v", err)}resp, err := http.DefaultClient.Do(req)if err != nil {log.Fatalf("Request failed: %v", err)}defer resp.Body.Close()fmt.Println("Response received from Root Service")
}

運行后打開http://localhost:16686,選擇對應的service查找trace可以看到
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

五、總結

  1. 鏈路追蹤是依靠于一個隨機生成的trace_id,一條鏈路對應唯一一個trace_id。
  2. Span 是描述單個操作或事件的基本單元。一個請求被分解成一個或多個 Span。即一條鏈路是由多個span組成的。
  3. 在鏈路追蹤中,context(上下文)是指跨越不同服務的信息傳遞。每個 Span 都關聯一個上下文。
  4. OpenTelemetry 是一個用于跟蹤和監控分布式系統的開放式標準和工具集。提供了一套標準的API 和工具,用于生成、導出和聚合跟蹤數據,并將這些數據發送到各種后端。
  5. Jaeger、Zipkin、Prometheus等這些可以接收OpenTelemetry發送過來的數據,可以提供可視化的展示和分析數據的能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Comsol Multiphysics 6.2 for Mac建模仿真軟件

COMSOL Multiphysics是一款多物理場仿真軟件,旨在幫助工程師、科學家和研究人員解決各種復雜的工程和科學問題。該軟件使用有限元分析方法,可以模擬和分析多個物理場的相互作用,包括結構力學、熱傳導、電磁場、流體力學和化學反應等。 COMSOL…

一些好用的前端小插件(轉自知乎)

一些好用的前端小插件(2) 1. cropper.js Cropper.js 2.0 是一系列用于圖像裁剪的 Web 組件。 官網地址:https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款瀏覽器端的 Markdown 編輯器,支持所見即所得、…

2024年度投資策略:AI大模型和半導體國產化加速

今天分享的是AI系列深度研究報告:《2024年度投資策略:AI大模型和半導體國產化加速》。 (報告出品方:東方證券) 報告共計:48頁 前言: 行情回顧與未來展望 電子板塊漲幅轉正,信心逐漸回歸。截至…

人人都會Blazor —— 3.3 參數

參數最常見的使用,目的是使組件可以接收動態數據。 聲明參數 參數使用 [Parameter] 特性的公共 C# 屬性進行定義。 在下面的示例中,內置引用類型 (System.String) 和用戶定義的引用類型 (PanelBody) 作為組件參數進行傳遞。 PanelBody.cs: public class PanelBody {publ…

SQL注入漏洞發現和利用,以及SQL注入的防護

一、背景 SQL注入漏洞是一種常見的軟件安全問題,它發生在應用程序的數據庫層中。其核心原理是將用戶輸入的數據當做代碼來執行,違反了“數據與代碼分離”的原則。具體來說,攻擊者通過構造惡意的SQL查詢語句,使得應用程序在執行SQ…

Android NFC手機上實現卡模擬

1, 問:能否在AndroidNFC手機上實現卡模擬? 答:在技術上可行,但是,對一般開發人員來講,目前看來僅僅是技術上可行。 2, 問:具體如何實現呢? 答&#xff1…

git的使用記錄

GitHub是公有的遠程倉庫,Gitlab是私有的遠程倉庫。 git add file git commit -m "add file" git mv filea fileb git log 顯示提交記錄 git log --oneline 一行的簡略信息顯示 git log --oneline --decorate 顯示當前指針 git reset --ha…

矩陣知識補充

正交矩陣 定義: 正交矩陣是一種滿足 A T A E A^{T}AE ATAE的方陣 正交矩陣具有以下幾個重要性質: A的逆等于A的轉置,即 A ? 1 A T A^{-1}A^{T} A?1AT**A的行列式的絕對值等于1,即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

通用功能——git 攻略

摘要 本文主要介紹git常用命令的使用方法,同時介紹一些常見問題的處理方法,持續更新中… git命令通用選項 大多數git命令都適用的選項列表如下: -v, --verbose show hash and subject, give twice for upstream branch -q, --quie…

Vim 一下日志文件,Java 進程沒了?

一次端口告警,發現 java 進程被異常殺掉,而根因竟然是因為在問題機器上 vim 查看了 nginx 日志。下面我將從時間維度詳細回顧這次排查,希望讀者在遇到相似問題時有些許啟發。 時間線 15:19 收到端口異常 odin 告警。 狀態:P1故障 名稱:應用端…

黑馬點評筆記 redis實現優惠卷秒殺

文章目錄 難題全局唯一IDRedis實現全局唯一Id 超賣問題問題解決方案樂觀鎖問題 一人一單 難題 要解決優惠卷秒殺的問題我們要考慮到三個個問題,全局唯一ID,超賣問題,一人一單。 全局唯一ID 用戶搶購時,就會生成訂單并保存到同一…

【git】pip install git+https://github.com/xxx/xxx替換成本地下載編譯安裝解決網絡超時問題

目錄 🌑🌑 背景 🌒 🌒作用 🌔🌔 問題 🌔🌔解決方案 🌙方法一 🌙方法二 🌝🌝我的解決方案 整理不易,歡迎一鍵三連…

7-12 統計投票情況(集合)

7-12 統計投票情況(集合) 分數 10 作者 python課程組 單位 福州大學至誠學院 利用集合分析活動投票情況。 第一小隊有五名隊員,序號是1,2,3,4,5;第二小隊也有五名隊員,序號6,7,8,9,10。 輸入一個由得票隊員編號組成的…

分布式篇---第三篇

系列文章目錄 文章目錄 系列文章目錄前言一、什么是補償事務?二、消息隊列是怎么實現的?三、那你說說Sagas事務模型前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站,這篇文章男女通用,看懂了就去分享給你的碼吧。…

qgis添加postgis數據

左側瀏覽器-PostGIS-右鍵-新建連接 展開-雙擊即可呈現 可以點擊編輯按鈕對矢量數據編輯后是直接入庫的,因此謹慎使用。

【DQN】基于pytorch的強化學習算法Demo

目錄 簡介代碼 簡介 DQN(Deep Q-Network)是一種基于深度神經網絡的強化學習算法,于2013年由DeepMind提出。它的目標是解決具有離散動作空間的強化學習問題,并在多個任務中取得了令人矚目的表現。 DQN的核心思想是使用深度神經網…

企業數字化轉型的作用是什么?_光點科技

在當今快速變化的商業環境中,數字化轉型已成為企業發展的重要策略。企業數字化轉型指的是利用數字技術改造傳統業務模式和管理方式,以提升效率、增強競爭力和創造新的增長機會。 提升運營效率:數字化轉型通過引入自動化工具和智能系統&#x…

指數退避重試

指數退避重試(Exponential Backoff and Retry)是一種網絡通信中常用的錯誤處理和重試策略。它通常用于處理臨時性的故障,例如網絡延遲、服務器過載或臨時性的錯誤,以提高系統的可靠性和穩定性。 基本思想是,當發生一個…

NX二次開發UF_CSYS_ask_wcs 函數介紹

文章作者:里海 來源網站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_wcs Defined in: uf_csys.h int UF_CSYS_ask_wcs(tag_t * wcs_id ) overview 概述 Gets the object identifier of the coordinate system to which the work coordin…

JMeter壓測常見面試問題

1、JMeter可以模擬哪些類型的負載? JMeter可以模擬各種類型的負載,包括但不限于Web應用程序、API、數據庫、FTP、SMTP、JMS、SOAP / RESTful Web服務等。這使得JMeter成為一個功能強大且靈活的壓力測試工具。 2、如何配置JMeter來進行分布式壓力測試&a…