天天看點

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

作者:閃念基因

一、簡介

現代網際網路服務龐大且複雜,且存在開發人員疊代,能力參差不齊,文檔和代碼脫節等問題。對于長年維護一個項目,複雜bug快速修複解決、新人接手項目、項目整體監控等存在諸多困難,費時費力。本文為伫力于解決這些問題提供一些幫助。

本文關鍵詞:opentelemetry,granafa,loki,tempo/jaeger,APM(Application Performance Monitoring),RUM(Real User Monitoring)。

從一個bug出發

某文章編輯應用介紹

有一個文章編輯應用,前端是vue spa(單頁面應用),後端是php/laravel提供接口。

使用者登入後,點選進入某文章編輯頁面,頁面會異步調用讀取該文章的接口,文章接口傳回内容後加載到編輯頁面。使用者修改後可點選儲存,此時請求接口送出修改。或者點選取消,放棄此次修改。

使用者報告bug

某使用者在登入點選某文章編輯後,文章編輯框中的内容被加載出來後,然後自動被删。退出再進入文章編輯框都是空内容。

bug的一般解決步驟

  1. 複現bug。
  2. 分析代碼,将代碼和各種因素結合分析(如網絡、裝置硬體資源等),聯系代碼邏輯和因素存在的抽象關系,分析并推理出bug的原因。
  3. 修複代碼,以滿足在目标環境的正常運作。
  4. 上線。

此bug的原因

  1. 第一次使用者通路文章1,加載文章内容到編輯面闆,包含标題、時間、文章内容等資訊。其中article為文章model,article.title、article.content等和相關dom綁定。
  2. 使用者退出編輯頁面,進入文章2編輯頁面,頁面加載文章1緩存(導緻bug的主要現象),清空article.content(文章内容自動被删的現象),然後做文章2接口請求。
  3. 此時由于使用者網絡極慢,文章2接口一直無傳回,是以使用者看到的一直是文章1丢失content的頁面。

修複bug困難的地方

對于簡單能随時複現的bug,應該感到慶幸。但我們經常遇到如本次相同無法複現的bug。更困難的情況,假如我無法review前端代碼,隻憑借以往經驗分析推理實際環境,這個bug基本無法複現。

總之實際生産環境中非常複雜。

簡單舉例,有以下幾點:

  1. 使用者網絡環境問題(本地DNS故障,城區營運商節點故障,流量/wifi切換,網絡信号不好)。
  2. 使用者硬體裝置問題(如磁盤、記憶體滿了)。
  3. 使用者本地client版本不是正常版本,或本地有緩存,導緻沒有正确調用服務。
  4. 伺服器存在異常(DNS故障、LB故障)。
  5. 代碼中調用了第三方,第三方服務故障。

傳統解決方案

為了能解決以上問題,我們通過建立監控系統,添加日志等方式盡可能記錄使用者/伺服器任意時刻的情況,用于了解系統和事後調查解決問題。

于是有了騰訊/阿裡雲等運維監控,代碼關鍵部分添加業務日志,引入loki/cls/sls等日志系統。更好一點的情況是日志還有traceId/requestId/userId等作為定位。

傳統解決方案的缺陷

  1. 業務日志對于分析實際情況費時費力,無法一目了然。當出現問題時,需要進入日志面闆調取當時的日志,然後根據搜尋條件篩選日志,然後根據日志分析當時代碼運作鍊路,參數和傳回值是不是正常。
  2. 伺服器當時環境和日志無關聯。例如日志顯示調取第三方接口失敗時,那到底是當時伺服器DNS解析問題,還是目标伺服器服務故障。是應該讓運維調查修複DNS,還是應該聯系第三方。
  3. 日志格式不統一,覆寫率不夠。由于各個項目,各個開發人員有自己的習慣,日志格式差別巨大,讓解析日志有些困難。服務端和用戶端有各自的日志規範,覆寫率有自己的标準,導緻出問題時日志不夠,無法完整回溯出問題時當時的情況。

對于以上問題,引入本文主題:OpenTelemetry相關技術棧。

二、OpenTelemetry

簡介

OpenTelemetry是CNCF的項目,其統一了追蹤、名額和日志的規範,定義了它們之間的聯系。使用它以後,配合相應的面闆,可以用于快速定位BUG,為解決問題節省時間和精力。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以上是OpenTelemetry的架構。從圖中可知,可以在http client、應用代碼、資料庫用戶端、業務架構/包中添加opentelemetry api打點,可以是跟蹤點、名額點和日志點。打點實際被opentelemetry的sdk控制,sdk可以限制打點率,轉發到其他資料接收服務,以及配置管道做預處理。

OpenTelemetry簡要使用案例

OpenTelemetry本身隻是一套在代碼中打點的系統,作為舉例,一下是php使用OpenTelemetry的方法。

  1. 建立管理面闆服務,如granafa+loki/optl-collector+tempo/jaeker。
  2. laravel通過composer安裝OpenTelemetry的sdk包。
  3. 在中間件或者入口檔案index.php中注冊OpenTelemetry類,配置相關配置,如導出服務位址、采樣率等。
  4. 在需要打點的地方,如controller方法中,全局路由中添加打點,包括開始點和結束點。
  5. 運作項目,相關traces/logs/mertics将會在管理面闆顯示。

以下是granafa的loki日志主面闆。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以下是granafa的loki日志詳細面闆,點選藍色按鈕可以跳轉到trace面闆中。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以下左邊是loki日志面闆,右邊是trace面闆,grafana可以使用tempo插件或jaeger插件做trace面闆。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以下是trace面闆中trace和service graph圖。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以下是trace面闆中另一份service graph圖,可以看到可以根據opentelemetry打點資料得到service關系圖。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以下是granafa的prometheus面闆,可全局檢視所有接口服務品質,并可點選每個采集點進入trace面闆分析改trace。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以下是jaeger的trace主面闆。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

以下是jaeger的trace詳細面闆。

可觀測全鍊路多元追蹤技術——基于OpenTelemetry的技術棧

使用OpenTelemetry有哪些好處

  1. 可随時監控每個接口請求消耗時間(APM)。
  2. 可擴充功能,根據使用者名随時分析該使用者/全體使用者在應用使用的各個名額,使用時間、使用習慣等(RUM)。
  3. 可清楚檢視接口調用棧,内部各個服務消耗時間,和之間的層級關系。
  4. 可直覺了解各個微服務之間的聯系。
  5. 出現問題時,可根據traces+metrics+logs,完全複現當時使用者的情況(使用者本地metrics+用戶端RUM+後端接口APM+伺服器metrics+所有logs)。并行traces、metrics和logs互相有關聯,可互相跳轉檢視分析。

為什麼選用OpenTelemetry而不是其他方案

  1. Opentelemetry是CNCF下的開源項目,CNCF下的項目還有:k8s、containerd、etcd、coredns、fluentd、helm、jaeger、prometheus、cilium、cni、cri-o、grpc、k3s、falco等。
  2. 由于是CNCF下的項目,和k8s等相容問題一定有舒适的解決方案。
  3. Opentelemetry可以導出資料并接入到市面上大部分資料/日志服務商,如阿裡雲應用實時監控服務,騰訊雲前端監控,騰訊雲應用實時監控服務,DataDog,Sentry等。
  4. 配合Grafana+loki+tempo+prometheus+opentelemetry,可以建立一套完整的開源可觀測全鍊路多元追蹤服務。
  5. 消除無法複現bug這一情況,并不再隻能靠review相關代碼才能定位問題。實際上隻要探針覆寫夠,幾乎不需要再花時間進行找日志+找對應代碼+推測使用者環境+推測伺服器環境。
  6. 如果使用其他商業服務,存在收費和更換服務商問題。如果使用其他開源項目,不如就使用本項目,因為CNCF作為雲服務時代主要基金會,OpenTelemetry背景夠硬。

如何用這套方案調查解決本文開頭的bug

  1. 獲得使用者名和使用應用的時間,根據使用者名和時間查出相關日志。
  2. 點選該使用者在前端/後端文章編輯的相關日志(RUM、APM),進入目前使用者目前trace鍊。
  3. 會發現使用者加載編輯頁面UI花了1毫秒,調用接口花了20秒。或者發現使用者在編輯頁面待了10秒(RUM),但是接口還沒傳回(APM),使用者就回到文章清單。
  4. 通過trace或prometheus,檢視改接口當天整體情況,應該會發現隻有該使用者接口通路緩慢。由此即可确認是使用者網絡有問題。

三、各類人員能使用這套方案幹什麼

  • 産品:可以根據前端RUM,根據前端收集的名額,如使用者各子產品使用時間、操作流程、使用習慣等來分析産品,對産品進行優化。
  • 前端開發:前端可根據RUM進行前端性能監控,優化頁面性能。
  • 測試人員:可根據trace鍊基本定位bug責任方,可能頁面加載時間有問題,可能後端接口無法服務,傳回時間過長等。
  • 運維人員:可根據伺服器名額資料分析目前服務情況,如果整體服務變慢,可調查是否為伺服器環境問題。同時由于接口跟蹤可以攜帶伺服器環境名額資訊,有問題可以一目了然。
  • 開發人員:可以觀測整體服務情況。出問題時根據全鍊路跟蹤資訊,輕松定位bug位置和原因,快速解決bug。

四、其他相關文章

  1. OpenTelemetry 可觀測性的未來
  2. 到底什麼是 RUM?生産環境如何選擇靠譜的前端 RUM 監控系統
  3. 雲原生觀測性 - OpenTelemetry
  4. OpenTelemetry 規範閱讀
  5. grafana+loki+tempo+prometheus+opentelemetry docker-compose demo
  6. grafana+tempo相關demo
  7. opentelemetry+php+jaeger demo

作者:劉泉皓

出處:https://www.liuquanhao.com/posts/%E5%8F%AF%E8%A7%82%E6%B5%8B%E5%85%A8%E9%93%BE%E8%B7%AF%E5%A4%9A%E7%BB%B4%E8%BF%BD%E8%B8%AA%E6%8A%80%E6%9C%AF-%E5%9F%BA%E4%BA%8EOpenTelemetry%E7%9A%84%E6%8A%80%E6%9C%AF%E6%A0%88/

繼續閱讀