跳至主要内容

Grafana faro

官方文檔: https://grafana.com/oss/faro/
官方範例: https://github.com/grafana/faro-web-sdk


什麼是 前端可觀測性?

簡單來說是指針對前端應用程序進行全面監控和分析的能力,確保有良好的 performance 和用戶體驗
最重要的目的在於從效能的角度 改善使用者體驗

可觀測性技術是通過 紀錄即時日誌記錄(Logs)、指標監控(Metrics)、分布式追踪(Traces) 等工具和技術,為企業提供全面、精確和實時的系統觀測能力, 從而幫助企業深入了解系統的運行狀況、行為模式和性能指標。

可觀測性技術不僅僅是簡單地監控系統狀態,還可以提供對系統內部進行深度洞察的能力, 有助於快速發現問題、定位故障,並採取相應措施進行故障修復和性能優化。


為什麼需要 前端可觀測性

最初由 Steve Souders,一位在網站性能優化領域的先驅和專家提出:
提出了一個觀點「Performance Golden Rule」, 是一個在網站性能優化領域常被提及的概念,

80-90% of the end-user response time is spent on the frontend
用戶感知到的 80-90% 響應時間是在前端發生的。

在這理論的 Response Time / Concurrnet Users 矩陣圖中,可以得出當同時使用人數越低或後端服務負載不高時,前端的處理時間在影響效能的比重就越大。
可以看出前端效能優化的重要性完全不小於後端,進而點出 Grafana Faro 在效能指標、量測與可觀測性的重要之處。


humans are impatient

任何造成延遲的原因都可能導致 application 失去潛在客戶
RD 需要知道

  • 當系統的效能變慢,是哪一個 function 在作怪,錯誤在哪一個階段壞掉?
  • 請求時間變長,這些問題是在前端發生還是後端發生的? 以上都是可觀測性都是要解決的問題, 因為真實體感時間是 USER 從前端按下按鈕開始

當前數位時代中,為用戶提供高效能且流暢的體驗對任何線上服務至關重要。
這正是實際用戶監測(Real User Monitoring,簡稱 RUM)在前端開發和生產環境中成為不可或缺工具的原因。


What is Real User Monitoring (RUM)?

Real User Monitoring (RUM) 是一種前端性能監控技術,可記錄使用者與網站或 Web 應用程式的互動,並提供對最終使用者體驗問題的可見性。

RUM 會在網站的頁面上插入一個小的 JavaScript 程式碼,當使用者訪問該網站時自動觸發該程式碼,用來報告頁面載入數據和其他性能指標。
這些數據基於實際的使用者在網站上的互動,使您能夠快速識別和優化需要立即關注的網站區域,以改善最終用戶體驗。


Grafana Faro

Grafana Faro 是 Grafana Labs 開發的一個開源前端可觀測性平台。

它提供了一套工具庫,可以僅僅使用兩三行代碼輕鬆嵌入到 Web 應用服務中(跟 React 高度整合), 可以收集和分析用戶行為、效能指標及其他可觀測性數據(包括 Web Vitals 效能指標、Console Log、Exception、Events、Traces。)

  • 追蹤用戶的具體行為,如點擊和滾動
  • 監控頁面加載時間和服務器響應時間等關鍵效能指標
  • 瀏覽器錯誤日誌、API 請求狀態,以及用戶設備信息等

使用情境

在某些大型活動期間訪問該商店,此時流量可能會擴大成 100 倍。
後端 API 可以使用 OpenTelemetry 來監控 API。
前端的部分則可以使用 Grafana Faro 來監控前端的效能指標、日誌、異常、事件和追踪。


介紹

Web 應用程序通過 Grafana Faro Web SDK 收集各種數據,這些數據被發送到 Grafana Agent 進行處理,
然後分別存儲到 Logs 和 Tempo,最終在 Grafana 中進行可視化和分析。

  • Web Application:

    這是指 Web 應用程序本身,通過 Grafana Faro Web SDK 收集日誌、異常、測量、事件和追踪信息。

  • Grafana Agent:

    • 收集到的數據隨後會被 Grafana Agent 接收。
    • 接收來自 Web SDK 的數據(包括日誌、異常、測量、事件和追踪),並將這些數據進一步處理和轉發,送到不同的儲存系統中。
  • 最終數據會被匯聚到 Grafana Dashboard 上(Logs, Tempo, and Grafana)

    Logs:存儲並處理日誌、異常、事件和測量數據。
    Tempo:專門處理 Trace 數據。
    Grafana:一個視覺化和分析平台,用於展示來自 Logs 和 Tempo 的數據。


傳統的可觀測性三大支柱

  • 日誌(Logs): 記錄應用程序運行過程中的各種事件和操作,用於追蹤錯誤和調試問題。

  • 度量(Metrics): 收集關鍵性能指標(如頁面加載時間、資源加載時間)以監控應用程序的健康狀態和性能。

  • 分佈式追踪(Distributed Tracing): 跟踪單個請求在應用程序中的路徑,幫助識別性能瓶頸和延遲來源。


實現 Observability 的目的

實現可觀測性的目的

核心:不僅收集數據,更要解答關鍵業務問題,來提高系統透明度和理解度

具體目標:
a. 服務範圍:識別請求經過的服務及其交互
b. 服務行為:了解每個服務在處理請求時的具體操作
c. 性能瓶頸:定位系統性能緩慢的原因
d. 錯誤定位:確定請求失敗的具體位置
e. 關鍵路徑分析:識別請求的關鍵路徑元素
f. 異常檢測:比較當前執行狀態與正常系統行為的差異
g. 時間分析:找出處理時間延長的原因


實作

官方範例程式碼: https://github.com/grafana/faro-web-sdk/tree/main/demo

import { getWebInstrumentations, initializeFaro } from '@grafana/faro-react';

const faro = initializeFaro({
url: 'http://localhost:${env.faro.portAppReceiver}/collect',
apiKey: 'secret',
instrumentations: [
...getWebInstrumentations({
captureConsole: true,
}),
],
trackWebVitalsAttribution: true, // 啟用偵測 web vitals
app: {
name: 'frontend',
version: '1.0.0',
},
});


Faro Web SDK request payload example

  • Faro Web SDK 會透過 HTTP 請求將其傳送到 Grafana Agent,這裡的數據被分類為日誌、異常、事件、測量值和追蹤。
    Request payload 範例

  • 接著,Grafana Agent 將數據分別傳送到 Loki 和 Tempo。

  • 對 Tempo 而言,追蹤數據是通過 OpenTelemetry 協議(OTLP)發送的,
    而日誌、異常、事件和測量值則保存在 Loki 中,並附加了額外的 Metadata。

  • 當數據保存在 Loki 或 Tempo 時,可以使用 Grafana 簡單地查詢數據並在 Dashboard 上查看,或使用 Explore 頁面。


Console Instrumentation

收集 各式各樣的 console logs
Logs 對於排查錯誤至關重要,因為它們提供了應用程式中發生的情況的上下文和詳細資訊。

// 手動送 logs
faro.api.pushLog([`This is a console ${method} message`], {
level: method,
});

文檔參考:

  1. https://github.com/grafana/faro-web-sdk/blob/main/demo/docs/instrumentations/logs.md
  2. https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/instrument/console-instrumentation/

Errors Instrumentation

會去訂閱瀏覽器 window.onerror 的和 onunhandledrejection 事件以收集錯誤,提取堆疊跟蹤(如果可用),並透過 faro.api.pushError() 將它們回報給 Grafana Faro Web SDK API。

追蹤錯誤目的:

  1. 分析應用程式中發生的異常(crashes, incorrect behavior)
  2. 監視應用程式是否按預期工作
const throwError = () => {
throw new Error('Buggy function');
};

try {
throwError();
} catch (err) {
// 自動回報錯誤
throw err;

// 手動回報錯誤
faro.api.pushError(err);
}

操作文檔: https://github.com/grafana/faro-web-sdk/blob/main/demo/docs/instrumentations/errors.md


Web Vitals Instrumentation

  • 網站體驗核心指標(Core Web Vitals)是 Google 於 2020 年推出的指標,用來量測訪客在頁面的瀏覽體驗狀況,主要用於量測瀏覽器中網站的實際性能,以便改善用戶體驗
  • 在 http request payload 裡的 measurement 物件都會包含 metrics 和 context

範例參考: 參數介紹

[
// LCP
{
"type": "web-vitals",
"values": {
"lcp": 855.5,
"delta": 855.5,
"element_render_delay": 352.9000000001397,
"time_to_first_byte": 502.5999999998603
},
"timestamp": "2024-07-24T09:52:24.414Z",
"context": {
"id": "v4-1721814739927-5410717528120",
"rating": "good",
"navigation_type": "reload",
"navigation_entry_id": "8Aj6d2cA57"
}
},
// CLS
{
"type": "web-vitals",
"values": {
"cls": 0,
"delta": 0
},
"timestamp": "2024-07-24T09:52:24.415Z",
"context": {
"id": "v4-1721814739969-5391931898292",
"rating": "good",
"navigation_type": "reload",
"navigation_entry_id": "8Aj6d2cA57"
}
}
]

手動送 meaurement

faro.api.pushMeasurement({
type: 'cart-transaction',
values: {
delay: 122,
duration: 4000,
},
});

操作文檔: https://github.com/grafana/faro-web-sdk/blob/main/demo/docs/instrumentations/measurements.md


Trace Instrumentation

能夠收集使用者每次跟前端服務互動時產生的詳細流程追蹤資料

實際畫面:

操作文檔: https://github.com/grafana/faro-web-sdk/blob/main/demo/docs/instrumentations/traces.md


Grafana Faro 與 Sentry 的比較

優點:

  1. 開源免費 : Faro 完全開源且免費,而 Sentry 雖有開源版本,但完整功能需付費。
  2. Grafana 整合 : Faro 與 Grafana 生態系統的整合更為緊密,適合已使用 Grafana 的團隊
  3. 效能監控 : Faro 在前端效能監控方面提供更全面的解決方案。
  4. 客製化彈性 : Faro 提供更多客製化選項,可以更好地適應特定需求。

缺點:

  1. 成熟度 : 相較於 Sentry,Faro 是較新的專案,可能在穩定性和功能完整性上稍顯不足。
  2. 社群支援 : Sentry 擁有更大的使用者群體和更活躍的社群支援。
  3. 多平台支援 : Sentry 支援更多的程式語言和平台,而 Faro 主要聚焦於前端監控。
  4. 學習曲線 : 對於已經熟悉 Sentry 的團隊來說,轉換到 Faro 可能需要一定的學習成本。
  5. 整合生態系統 : Sentry 與更多第三方工具和服務有現成的整合方案。

總結

選擇 Grafana Faro 還是 Sentry 取決於您的具體需求、現有技術和預算考量。
如果已經在使用 Grafana 並且主要關注前端監控,Faro 可能是更好的選擇。
如果需要更全面的錯誤追蹤解決方案和更廣泛的平台支援,Sentry 可能更適合。


參考:

  1. https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/
  2. https://github.com/grafana/faro-web-sdk
  3. https://ithelp.ithome.com.tw/articles/10341509
  4. https://ithelp.ithome.com.tw/articles/10341219
  5. https://grafana.com/blog/2022/11/02/introducing-grafana-faro-oss-application-observability/
  6. https://blog.kevinyang.net/2023/07/16/faro-web-sdk-study/
  7. https://www.solarwinds.com/resources/it-glossary/real-user-monitoring
  8. https://hackmd.io/@DevOpsDay/2024/%2F%40DevOpsDay%2FHJnJmfuLA
  9. https://grafana.com/blog/2023/09/07/how-to-use-the-grafana-faro-web-sdk-with-grafana-cloud-frontend-observability-to-gain-additional-app-insights/