基于OpenTelemetry的分布式鏈路追蹤Trace?實現(PHP篇)

目錄

  • 引言
  • 一、OpenTelemetry是一套可觀測性標準協議
  • 二、分布式追蹤(?Trace?)是OpenTelemetry的核心功能之一
  • 三、OpenTelemetry的架構原理
  • 四、OpenTelemetry的分布式追蹤(?Trace?)實踐
    • 1、準備PHP環境
    • 2、下載SDK
    • 3、編寫實例代碼
    • 4、run起來
    • 5、otlp協議上報到存儲介質平臺

引言

在這里插入圖片描述

與前篇談到的MCP協議類似,OpenTelemetry也是一套標準協議。每一套協議的誕生一定是為了解決已存在的某難題的,就好比得先有四通八達的馬路和滿街的汽車,交通規則的誕生才有意義,如果只是三三兩兩的車流,似乎交通規則就沒那么大的價值。

OpenTelemetry 的前身是 OpenTracing 和 OpenCensus 兩個項目。OpenTracing 主要關注分布式追蹤,而 OpenCensus 則側重于指標和跨語言的統計信息收集。 2019年,這兩個社區決定合作并融合各自的特性,形成了新的開源項目——OpenTelemetry。這一舉措旨在提供一個全面的解決方案,能夠同時處理追蹤、指標和其他形式的遙測數據,并且支持多種編程語言和框架。OpenTelemetry 在之后的時間里不斷完善和擴展其功能,并于2020年正式發布了首個穩定版本。

OpenTelemetry 的誕生是為了應對現代軟件系統架構中日益增長的監控和追蹤需求,特別是分布式系統和云原生環境的復雜性。它的出現是為了解決多個監控工具之間的互操作性問題,以及提供一種統一的方式來收集、處理和分析遙測數據,從而幫助開發和運維團隊更有效地理解和優化他們的服務。

一、OpenTelemetry是一套可觀測性標準協議

OpenTelemetry是一套由CNCF主導的云原生可觀測性標準協議,全稱:OpenTelemetry Protocol,簡稱OTLP,旨在提供一種統一的方式來收集、處理和分析 分布式追蹤(trace)、日志(logging)和度量(metrics) 數據。

OpenTelemetry定義了可觀測性的幾個方面的標準:trace、logs、metrics、resources。

  • 追蹤(Tracing)
    提供了分布式追蹤的功能,可以跟蹤請求在分布式系統中的完整路徑,幫助識別性能瓶頸和故障點。

  • 指標(Metrics)
    收集系統的各種性能指標,如請求速率、錯誤率、資源使用情況等,用于監控系統的健康狀況和性能。

  • 日志(Logs)
    雖然 OpenTelemetry 主要關注追蹤和指標,但它也支持與日志系統的集成,以便于將日志數據與其他類型的遙測數據關聯起來。

二、分布式追蹤(?Trace?)是OpenTelemetry的核心功能之一

OpenTelemetry與trace的關系主要體現在OpenTelemetry是用于分布式追蹤的標準和工具集,而trace是分布式追蹤的基本單位。?

分布式追蹤(?Trace?)是OpenTelemetry的核心功能之一,用于監控和分析微服務架構中的請求傳播路徑和性能問題?。?Trace?在分布式系統中扮演著關鍵角色。它記錄了一個請求在多個服務之間傳播的完整路徑,幫助開發者理解請求在系統中的行為和性能表現。一個trace由多個span組成,每個span代表請求中的一個操作或工作單元,記錄了操作的具體信息,如開始和結束時間、操作類型、結果狀態等?。通過這些信息,開發者可以重構事務的完整旅程,定位和解決性能問題和故障?。

可觀測性一個很重要的領域 Trace 有兩個業界標桿:一個是OpenTracing,另一個OpenCensus。
OpenTracing其實是一個規范,jaeger就是基于opentracing實現的開源工具;
OpenCensus則是由google開源的度量工具;
簡單來說,這兩者在可觀測性領域功能高度重合,因此,在CNCF主導下進行了合并形成opentelemetry項目,OpenTracing跟penCensus共同推進opentelemetry,兩者的官網也赫赫表達基本不再維護。同時OpenTelemetry也致力于trace、logging、metrics間的關聯性。

三、OpenTelemetry的架構原理

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
我們重點先來看數據收集管道。

Data Collection Pipeline(數據收集管道)包含:

  • Collector:OpenTelemetry Collector是一個開源的組件,用于接收、處理和導出遙測數據。它可以部署在各個服務節點上,也可以作為一個集中式的處理層。
  • Receiver:接收來自不同來源的遙測數據。
  • Processor:處理和轉換數據,例如過濾、聚合等。
  • Exporter:將處理后的數據導出到各種后端系統,如Jaeger、Prometheus、Zipkin等。

可不要小看這些概念,在寫代碼的時候處理問題可有用了。從上面的圖可以看出數據整個流向的過程,當數據經過Collector采集器之后,就可以Exporter到各種存儲介質上了。細心的小伙伴們發現了,OpenTelemetry并未直接實現Exporter之后的數據存儲,而是交給遵循了OpenTelemetry協議的Jaeger、Prometheus、Zipkin等存儲平臺。通俗理解就是只要數據格式是遵循OpenTelemetry的上報,都可以進行數據標準化等處理,并被上報到任意遵循了OpenTelemetry協議的存儲介質平臺上進行下一步的遙測觀察和統計。
OpenTelemetry內心OS:“我只是個協議而已,存儲就交給別人來做吧,要實現存儲這得是另外的價錢~~”。

四、OpenTelemetry的分布式追蹤(?Trace?)實踐

我們知道OpenTelemetry有幾個方面的標準:分布式追蹤(trace)、日志(logging)和度量(metrics)。這就意味著他可以用來做很多不僅僅是分布式追蹤(trace)之外的事,比如K8s的監控,服務的監控等等。我們這里之所以當獨講分布式追蹤(trace),主要是因為其不僅是OpenTelemetry的核心功能,在監控和分析微服務架構中的請求傳播路徑和性能問題?上目前也是普遍流行的解決方案。

那么我們如何基于OpenTelemetry實現鏈路追蹤呢?

我們先來看OpenTelemetry官網的介紹。
在這里插入圖片描述

光說不練假把式。于是我們以PHP為例來一步一步詳細操作下來簡單demo實踐一下。其他語言同理。

1、準備PHP環境

它說PHP版本要求至少7.4+,而如果希望0代碼非入侵式的接入PHP版本至少要8.0+。

OpenTelemetry部分是支持無縫接入的,也就是非入侵式的服務監控和分布式追蹤,當然如果你需要個性化地“埋點”自己的服務調用鏈路情況,那就可以自己手動用代碼實現了(代碼侵入式)。
在這里插入圖片描述
由于小馬的本地已經安裝了PHP相關環境,特意檢查了下版本號符合條件,環境準備完畢。
在這里插入圖片描述

2、下載SDK

參考官網案例,我們進入代碼目錄下,運行composer命令安裝SDK依賴,composer.json文件需要安裝的依賴包配置參考如下。
但這里需要注意,市面上開源SDK實現可能會有很多,不管你依賴于哪個SDK,只要遵循OpenTelemetry協議即可。

{"name": "vendor/m.server3","description": "description","minimum-stability": "stable","license": "proprietary","authors": [{"name": "小馬過河R","email": "email@example.com"}],"require": {"slim/slim": "^4","slim/psr7":"^1","nyholm/psr7": "^1","open-telemetry/opentelemetry": "*","open-telemetry/api": "*","open-telemetry/sdk": "*","symfony/http-client": "^5.4","guzzlehttp/promises": "^2.2","php-http/message-factory": "^1.1","php-http/httplug": "^2.4"},"config": {"allow-plugins": {"php-http/discovery": true}}
}

3、編寫實例代碼

進入代碼目錄下,創建index.php文件。
為了驗證,我們先將TRACES輸出到console查看。

putenv('OTEL_SERVICE_NAME=demo1');
putenv('OTEL_PHP_AUTOLOAD_ENABLED=true');
putenv('OTEL_TRACES_EXPORTER=console');//console  otlp
putenv('OTEL_METRICS_EXPORTER=none');
putenv('OTEL_LOGS_EXPORTER=console');
#putenv('OTEL_EXPORTER_OTLP_PROTOCOL=grpc');
#putenv('OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318');//http:4318,grpc:4317
#putenv('OTEL_EXPORTER_OTLP_HEADERS=');
#putenv('OTEL_PROPAGATORS=b3,baggage,tracecontext');use OpenTelemetry\API\Globals;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;require_once __DIR__ . '/vendor/autoload.php';$tracer = Globals::tracerProvider()->getTracer('demo-tracer-name');$app = AppFactory::create();$app->get('/rolldice', function (Request $request, Response $response) use ($tracer) {$span = $tracer->spanBuilder('manual-span')->startSpan();try {$span->setAttribute('user_id', 12345);$result = random_int(1, 6);$response->getBody()->write(strval($result));$span->addEvent('rolled dice', ['result' => $result])->end();return $response;} catch (Exception $e) {$span->setStatus($e->getCode(), $e->getMessage());$span->end();$response->getBody()->write('exception');return $response;}});$app->run();

4、run起來

我們在代碼目錄下執行php -S localhost:8080命令,讓程序監聽8080端口。
在這里插入圖片描述
回到瀏覽器訪問路由http://localhost:8080/rolldice。我們看到了響應返回。

在這里插入圖片描述

而console如約打出了日志信息。

在這里插入圖片描述
好了,我們的demo實現完畢了,看起來超級簡單,對吧。

5、otlp協議上報到存儲介質平臺

我們剛剛為了方便演示,把日志輸出在console,但是實際生產場景中肯定不是這樣的,那如果我要上報到諸如Jaeger、Prometheus、Zipkin等的后端系統或存儲平臺,要如何處理?很簡單,修改配置即可。詳細的可以參看官方的配置介紹文檔。小馬這里主要拎幾個重要的配置項來介紹。

//something todo...
putenv('OTEL_TRACES_EXPORTER=otlp');//改成otlp
#putenv('OTEL_EXPORTER_OTLP_PROTOCOL=grpc');//默認http
putenv('OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318');//填寫ENDPOINT上報地址,http:4318,grpc:4317
putenv('OTEL_EXPORTER_OTLP_HEADERS=');//如果有些平臺是要求傳鑒權token,可以通過HEADERS透傳//something todo...

好了,這就改完了,重新run起來。

在平臺你將看到如下類似效果(由于信息敏感小馬就不貼自己實驗的截圖啦),日志信息將比console展示更完整和豐富。

在這里插入圖片描述

當然,至于TRACES相關的知識點以及如何合理規劃設置span不是本文重點,小馬這里就不再贅述啦。
在這里插入圖片描述

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

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

相關文章

探索智能體的記憶:類型、策略和應用

AI Agent 中的記憶:類型、策略和應用 記憶實現是使智能體能夠保持上下文、從過去的交互中學習并做出明智決策的關鍵組成部分。與人類記憶非常相似,智能體記憶允許 AI 系統隨時間存儲、檢索和利用信息,從而為用戶創造更連貫和個性化的體驗。 …

leetcode 2395. Find Subarrays With Equal Sum

題目描述 代碼&#xff1a; class Solution { public:bool findSubarrays(vector<int>& nums) {int len nums.size();if(len <2)return false;unordered_set<int> table;int sum 0;for(int i 1;i < len;i){sum nums[i-1]nums[i];if(table.contains(…

Kubernetes(k8s)學習筆記(七)--KubeSphere 最小化安裝

前情提要 可視化操作面板對于開發、運維絕對是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可視化操作來管理Kubernetes。 可視化面板有多種&#xff1a; 1.Kubernetes官方提供的默認面板&#xff1a;dashboard&#xff0c;用處不大&#xff0c;放棄&#xff1b…

MCP連接Agent:AI時代的TCP/IP

介紹 2023年&#xff0c;生成式AI爆發。2024年&#xff0c;智能體&#xff08;Agent&#xff09;接棒成為AI新焦點。2025年&#xff0c;智能體似乎已經要開始爆發了。目前的智能體更像一個“單機App”&#xff1a;彼此不了解、無法通信&#xff0c;更不能協作。類似互聯網早期…

交換機工作原理(MAC地址表、VLAN)

目錄 一、交換機的基本工作原理 數據幀的轉發 MAC地址表的作用 交換機的轉發方式 二、VLAN&#xff08;虛擬局域網&#xff09; VLAN的定義 VLAN的作用 VLAN的實現方式 VLAN的幀標記 VLAN的通信 三、交換機與VLAN的結合 四、交換機與VLAN的實際應用場景 交換機是局…

eFish-SBC-RK3576工控板外部RTC測試操作指南

備注&#xff1a; 1&#xff09;測試時一定要接電池&#xff0c;否則外部RTC斷電后無法工作導致測試失敗&#xff1b; 2&#xff09;如果連接了網絡&#xff0c;系統會自動同步NTP時鐘&#xff0c;所以需要關閉自動同步時鐘。 關閉自動同步NTP時鐘方法&#xff1a; 先查看是…

淘寶按圖搜索商品(拍立淘)Java 爬蟲實戰指南

在電商領域&#xff0c;按圖搜索商品功能為用戶提供了更直觀、便捷的購物體驗。淘寶的拍立淘功能更是憑借其強大的圖像識別技術&#xff0c;成為許多開發者和商家關注的焦點。本文將詳細介紹如何利用 Java 爬蟲技術實現淘寶按圖搜索商品功能&#xff0c;包括注冊賬號、上傳圖片…

【Redis】List類型

文章目錄 List的特點介紹lpush&#xff0c;lpushx&#xff0c;rpush&#xff0c;rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小結list的內部編碼List的應用場景 List的特點介紹 列表相當于一個數…

QT:qt5調用打開exe程序并獲取調用按鈕控件實例2025.5.7

為實現在 VS2015 的 Qt 開發環境下打開外部 exe&#xff0c;列出其界面按鈕控件的序號與文本名&#xff0c;然后點擊包含特定文本的按鈕控件。以下是更新后的代碼&#xff1a; #include <QCoreApplication> #include <QProcess> #include <QDebug> #include…

基于Jenkins的DevOps工程實踐之Jenkins共享庫

文章目錄 前言Jenkins共享庫結構1、共享庫演示2、知識點補充3、實踐使用共享庫格式化輸出日志4、groovy基礎語法4.1、 什么是 Groovy&#xff1f;4.2、groovy特點4.3、運行方法4.4、標識符4.5、基本數據類型4.5.1、string類型4.5.2、list類型 4.6、函數使用4.7、正則表達式 5、…

【Qt4】Qt4中實現PDF預覽

方案一&#xff1a; 在Qt4中預覽PDF文件&#xff0c;你可以使用多種方法&#xff0c;但最常見和簡單的方法之一是使用第三方庫。Qt本身并沒有內置直接支持PDF預覽的功能&#xff0c;但你可以通過集成如Poppler、MuPDF等庫來實現這一功能。下面我將展示如何使用Poppler庫在Qt4中…

php artisan resetPass 執行密碼重置失敗的原因?php artisan resetPass是什么 如何使用?-優雅草卓伊凡

php artisan resetPass 執行密碼重置失敗的原因&#xff1f;php artisan resetPass是什么 如何使用&#xff1f;-優雅草卓伊凡 可能的原因 命令不存在&#xff1a;如果你沒有正確定義這個命令&#xff0c;Laravel 會報錯而不是提示”重置密碼失敗”用戶不存在&#xff1a;’a…

ai說什么是注解,并以angular ts為例

在編程中&#xff0c;注解&#xff08;Annotation&#xff09; 是一種特殊的語法結構&#xff0c;用于為代碼添加元數據&#xff08;metadata&#xff09;&#xff0c;從而在不修改代碼邏輯的情況下&#xff0c;提供額外的信息或指示編譯器、框架、工具如何處理這些代碼。注解通…

【MySQL】-- 聯合查詢

文章目錄 1. 簡介1.1 為什么要使用聯合查詢1.2 多表聯合查詢時MySQL內部是如何進行計算的 2. 內連接2.1 語法2.2 示例 3. 外連接3.1 語法3.2 示例 4. 自連接4.1 應用場景4.2 示例4.3 表連接練習 5. 子查詢5.1 語法5.2 單行子查詢5.3 多行子查詢5.4 多列子查詢5.5 在from 子句中…

【多線程】六、基于阻塞隊列的生產者消費者模型

文章目錄 Ⅰ. 生產者消費者模型的概念Ⅱ. 生產者消費者模型的優點Ⅲ. 基于阻塞隊列的生產者消費者模型MakefileBlock_queue.hpptask.hpptest.cpp Ⅳ. 如何理解提高了效率??? Ⅰ. 生產者消費者模型的概念 ? 生產者消費者模型是一種常見的并發模式&#xff0c;用于解決生產者…

【Vue】全局事件總線 TodoList 事件總線

目錄 一、 實現所有組件看到x事件 二、 實現$on $off 以及 $emit 總結不易~ 本章節對我有很大的收獲&#xff0c; 希望對你也是&#xff01;&#xff01;&#xff01; 本節素材已上傳至Gitee&#xff1a;yihaohhh/我愛Vue - Gitee.com 全局事件總線圖&#xff1a; 本節素材…

Python編程virtualenv庫的簡介和使用方法

Python編程virtualenv庫的簡介和使用方法 virtualenv和conda的區別是什么

MySQL的行級鎖鎖的到底是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【MySQL的行級鎖鎖的到底是什么?】面試題。希望對大家有幫助&#xff1b; MySQL的行級鎖鎖的到底是什么? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 MySQL的行級鎖是數據庫管理系統&#xff08;DBMS&#xff09;的一…

【C++游戲引擎開發】第33篇:物理引擎(Bullet)—射線檢測

一、射線檢測核心理論體系 1.1 射線檢測的數學基礎 1.1.1 參數化射線方程 射線在三維空間中的數學表達采用參數方程: r ( t ) = o + t d ^ ( t ∈ [

【操作系統】線程崩潰機制詳解

在分布式系統與多線程編程的世界里&#xff0c;一個看似簡單的問題卻暗藏玄機&#xff1a;當某條線程突然崩潰&#xff0c;其所屬進程會隨之消亡嗎&#xff1f;這個問題背后隱藏著操作系統與編程語言的精妙設計&#xff0c;本文將從底層原理到工程實踐層層剖析。 一、線程崩潰…