iT邦幫忙

2024 iThome 鐵人賽

DAY 27
2

https://ithelp.ithome.com.tw/upload/images/20241011/20152073CSsCijKmXZ.png

前言

既然我們知道 Grafana Faro 收集資料的邏輯,以及他收集資料的格式,我們通過了 Grafana Faro 的這段,當資料進入 Grafana Alloy 傳遞轉換後,存到 Loki 和 Tempo 中,這段過程不需要經過前端的操作,因此最後一個步驟就是將資料視覺化呈現。雖然 Grafana Cloud 上的前端可觀測性平台有流量的限制,但他為我們提供了一個最佳實踐,需要了解一下平台上可以呈現什麼資訊,在往後自行搭建 Scenes App 時可以有非常了然的對照。

💡NOTICE:
這邊必須事先聲明,由於 Grafana Faro 和其可觀測性平台都尚在成長的階段,因此不論是調用方法或頁面呈現的資訊可能隨時在變化,因此本篇文章主要是考慮究竟我們收集的資料可以呈現什麼資訊和畫面,之後不論是要新增其他功能或是刪減都可以依據需求修改,當然我們也期待平台提供更豐富的介面。

Dashboard 主要頁面

從側邊欄的【Frontend】選項進入後,選擇當初設定的監控專案,第一個頁面就是關於這個應用程式的總覽資訊。其實前端的可觀測性資訊可以分為幾個主要的觀測項目:

  1. 錯誤資訊:除了統計發生錯誤的次數,也顯示關於該錯誤的 Error message、各種 metadata,以及 StackTrack 資訊。如果需要詳細的原始檔案資訊,需要在應用程式 build 時安裝 Source Map plugin。
  2. Web Vitals:網頁效能的監控指標,目前顯示的資料有 TTFB、FCP、LCP、CLS、FID 及 INP,並依據 trackWebVitalsAttribution 屬性的設置來決定是否顯示更詳細的 attribute 資訊。
  3. Session:針對每個 session 分析 metadata、使用者體驗、使用者歷程(Loki 中的 exception、logs、measurment、event)、Trace 紀錄皆呈現。
  4. 各頁面路徑資訊:除了上述的三種資訊,還會呈現關於這個路徑的所有 log 資訊。

接下來,會根據各個頁面所呈現的資料做更深入的介紹,並稍微了解資訊副加的功能,以及剖析一下資料是如何從 Loki 中取得和轉換。

Overview

頁面的資料都是由 Loki 取得,所有看得到的 Panel 不論大小或資料重複性都會以獨立 query 請求,這讓我們在重現這些視覺化時有更大的靈活性。接著我們將依據圖中的各要點一步步認識:

  1. 這是一個放在全局的 AdHocFiltersVariable 元件,選項會是從 Loki query 取得所有資料中的所有 key 值,可以自行篩選後縮小更精確的範圍。

  2. 第二個區塊中的資訊包含頁面載入的次數、Errors、TTFB、FCP 等 Web Vitals 指標,每個 stat 都會獨立請求,query 類型為 Instant 才能取得一個時間點的指標值。

    Page Loads

    在平台中載入的次數是以一次新的 TTFB 紀錄做計算,而 Web Vitals 指標會依據測量的值與閾值做顏色的變化達到更明確的視覺化指標提醒。

  3. Page Loads & Errors:一個包含頁面載入和錯誤次數的 time series,分別會對兩個類型(kind)做統計,一個是 measurement 一個是 exception。

  4. Page Performance 是一個大型綜合 Table,總共七個指標並分別以 Page ID 做 query 請求(類型為 Range),可以針對目前時間範圍內有頁面載入紀錄的 Page ID,做指標數據的第 75 百分位數呈現。

  5. 標籤 5、6、7 是以收集資料的第 75 百分位數來呈現所有的 Web Vitals 指標,並分為 Page Loads、CLS、互動指標三個分類呈現。與 Page Performance 不同的是以整個應用程式 app 標籤進行分組查詢。

https://ithelp.ithome.com.tw/upload/images/20241011/20152073HlrZTPQAYK.png

Errors

Errors 頁面專為錯誤分析設計,提供了多種視覺化與統計工具,幫助開發者迅速了解應用程式中的錯誤情況。這裡包含了與頁面載入進行分析的 Page Loads & Errors Panel(點1),以及依據不同標籤呈現錯誤統計的表格:

  1. Top Errors(點2):列出所有錯誤的 exception,並根據錯誤發生的次數進行排序,顯示最常見的錯誤。
  2. Top Errors by Page ID(點3):根據 page id 標籤進行查詢並排序,分析各頁面上的錯誤情況。
  3. Error Count by Browser(點4):根據瀏覽器及其版本進行分類,統計各個瀏覽器環境下的錯誤數量。

這些查詢和篩選條件可以根據需求靈活調整。例如,在 React 應用程式中,因為 SPA 的特性不會在路徑切換時重新載入頁面(TTFB 的計算方式有差異),所以 page id 可能不如 view name 更實用,開發者可以根據需要改用其他標籤進行篩選和呈現。

https://ithelp.ithome.com.tw/upload/images/20241011/20152073wiLZwqWYix.png

單一 Error

僅顯示錯誤的統計數量,往往無法幫助開發人員快速排查和除錯。因此,在 Top Errors 列表中,每個錯誤都可以點擊查看詳細資訊。這些詳細資訊包括:

  • Stacktrace(點1):呈現錯誤發生時的程式碼路徑與位置,幫助開發者迅速定位錯誤源頭。
  • Error message(點2):顯示具體的錯誤訊息,幫助開發者快速了解問題的描述。

此外,錯誤詳情頁還會顯示與錯誤相關的所有 metadata,例如錯誤發生的環境、應用資訊、瀏覽器及 OS 系統、session id 等,讓開發者更全面地了解錯誤發生的情境。開發者也可以根據這些 metadatakey 值進行篩選統計,以便進行更精確的錯誤分析。

https://ithelp.ithome.com.tw/upload/images/20241011/20152073hP98jvftXs.png

Sessions

https://ithelp.ithome.com.tw/upload/images/20241011/2015207329kxlfqneD.png

Sessions 頁面想要呈現的是一個 session 的歷程,這也是可以了解一個使用者的行為以及追蹤他的請求過程。雖然一個 session 不完全代表一個使用者,可能中途換人或頁面重整關閉等等不可預期的因素,但這也是使用者行為分析所要取捨的,某些情況下我們可以依據 Session Lifecycle 做追蹤推斷。接下來我們來了解 Session 是用什麼方法讓我們更貼近使用者的思維:

  1. Sessions Overview 的邏輯是將所有含有 session_startsession_extend 的 log 取出,並且以 page_id 進行分組。因此可以看到點 1 的圖中不同頁面會以不同顏色呈現,不但可以了解同個時間內進入某個頁面的數量以及時間分佈。

    https://ithelp.ithome.com.tw/upload/images/20241011/20152073lZJS4LcKaz.png

  2. Sessions 是資料豐富的表格,會依據每個 Session ID 呈現錯誤次數、Page ID (從哪個頁面起始)、瀏覽器資訊、OS資訊以及非常重要的 Session Lifecycle,並以時間戳做排序,每個 row 會有展開區塊可以顯示該 sesion 的其他資訊 (點 6)。而 Session Lifecycle (點 5)會依據資料回傳的 event_namesession_startsession_extend 顯示不同的標籤,如果是 session_start 會呈現綠色的 Start,session_extend 會以藍色的 Extend 並附上他的 previousSession ID,而若 event_name 不是這兩者會以 Mid-session 做顯示。

    💡TIP

    session_start:若在初始化階段未在網頁儲存中找到任何 session

    session_resume:若在初始化階段在網頁儲存中找到有效的 session

    session_extend:若 Faro 因其中一個 session 超時而自動建立新 session

    https://ithelp.ithome.com.tw/upload/images/20241011/20152073Ucg1QzvrZq.png

單一 Session

https://ithelp.ithome.com.tw/upload/images/20241011/20152073FF15Lcq5Nq.png

在 Sessions Table 中可以點選每個 Session ID 查看其更細節的內容,除了基本的 metadata、Web Vitals 的所有指標,還有這個 Session 的所有歷程,包括事件、log、measurement、exception,主要呈現的是 Grafana Loki 中可以傳達的資訊。這個表格傳達的資訊非常多,並且把這些資訊分門別類作時間排序,每一個 row 也可以展開顯示更詳細的資訊,包括透過 faro.performance.navigation 取得頁面載入的完整歷程。比較有趣的是 type 呈現的方式,會依據 kind ( event、log、measurement、exception )做分類,可以參考一下的整理:

  • event:會依據 event_name 顯示 Type,例如:session_resume、route_change、Sending request 等,如果是 faro.performance.navigation 則顯示 Page Load。
    • 如果 event_name 是 faro.tracing.fetch 或 faro.tracing.xml-http-request,代表進行 HTTP 請求,所以會以 HTTP 顯示。
  • log:會依據 log 的類別 level 顯示,例如:log、warn、error 等等。
  • measurement:代表 Web Vitals 或是自訂義 measurement,在資料中不會有 key-value 的形式提供分辨,只會有 value_ttfbttfb 類型的 key 讓我們可以做處理。
  • exception:表示有任何意外產生,通常是 Error 發生時會出現,可以依據 type: "Error" 進行判斷。

Page Load

Page Load 的詳細內容中可以看到整個請求載入的完整歷程,在 Faro 中如果使用 PerformanceInstrumentation 可以得到的資訊,圖中會將載入的階段以不同顏色比例及數值呈現,內容分為 Summary 和 Network + Render 區塊,Summary 是將 Navigation Duration、Page Load Time、TTFB、Nextwork 及 Render 的時間分佈視覺化。還會將 Network 與 Render 兩個 Scope 獨立出來分析,並算出各自在 Scope 以及整個時間線所佔的時間比例。

https://ithelp.ithome.com.tw/upload/images/20241011/20152073cWCsU5HGcU.png

Traces

要完成端到端的可觀測性,Trace 是非常重要的一環,從 Traces 頁籤中可以了解這個 Session ID 所含帶的所有 Trace 紀錄,並且點擊指定的 Trace ID 會出現一個 Trace 圖表,這裡的資料就會由 Grafana Tempo 專門處理 Trace 的後端取得,並依據 Span 排序顯示每一階段的詳細資訊。這個圖表要代表著將可觀測性的服務鍊中,最後一條線串接起來。

  • Panel 中的 Query 可以分為 Search 和 TraceQL 的查詢,預設是 TraceQL,並會帶有頁面當下的 session id 作為搜尋的條件。
  • 搜尋結果會依據 Table 呈現,列出該條件下所有的 Trace ID,而此處的 Trace Name 和 Duration 皆由 Tempo 所返回。
  • 點擊 Trace ID 後會彈出右方的分隔視窗,並以 Trace 圖表呈現更詳細的追蹤流程。

https://ithelp.ithome.com.tw/upload/images/20241011/20152073GswD6eyAge.png

筆者語錄
以上是目前 Grafana Cloud 平台上所提供的 Dashboard 功能,而開源的部分也有提供一個簡易版的 Dashboard,但其中呈現的資訊就沒有這麼完整。其實在平台上也會發現各個 Panel 的資料呈現,尤其是 Table 的部分都會頻繁的迭代,我想這個 Dashboard 也是不斷接收使用者以及競品的資訊加以更新。相對的使用者在平台上的使用只能依靠 Grafana 的更新,所以下一部分,我們將把主權握在手上,自己掌握希望得到的資訊及畫面。


上一篇
靠 Grafana 吃飯的第二十六天 - Grafana Faro 的 React 親和力
下一篇
靠 Grafana 吃飯的第二十八天 - 克隆 Grafana Cloud 前端可觀測性平台 - 基礎篇
系列文
論前端工程師如何靠 Grafana 吃飯:從 Grafana App 到前端可觀測性30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言