TLDR
引進Grafana Alloy及Faro Web SDK,增進 RUM 並實現真正的前端到後端完整 tracing。
介紹
本文中會針對我在COSCUP 2024上報告的"Grafana Alloy Best Practice: Achieving frontend RUM and E2E tracing"做完整闡述。會介紹Grafana Alloy是甚麼以及它的功能,也提到我是如何引進並設計架構應付可能的 巨大telemetry流量需求,並提到中間遇到的挑戰、對應的解決方式、成果及未來展望。在閱讀過程中可以搭配上面的投影片參考。
名詞介紹
Real User Monitoring (RUM)
RUM 的目的是從前端網頁使用者或瀏覽器上蒐集 metrics,用以監控前端網的表現,發現潛在的錯誤,也可以用來追蹤使用者的行為(session)。Web vitals是由Google提出的指標,用來衡量用戶在網頁上的體驗,後面介紹的Faro SDK會一併蒐集web vitals,與錯誤及session等RUM相關資訊收進Grafana Alloy中。
Distributed Tracing
用來描述一段請求在複雜且分散式系統中的完整流程,可以用來增進應用的可視性,除了可以知道請求在各個元件的消耗時間之外,也可以用來分析錯誤的發生原因。主流已經採用OpenTelemetry標準,它除了trace之外,也有針對log, metrics, profiling, core dump定義相關標準。
Grafana Alloy
Grafana Alloy是高效能,且有彈性的一種OpenTelemetry Collector。可以支援 metrics、log 以及 trace 等資料,也提供pipeline的方式,使用語法叫做alloy類似於Terraform HCL,用來描述這些資料該如何被處理,並且送進最終的目的端。在這篇文章中主要使用faro.receiver
元件接受來自Faro Web SDK的資料。
註:相較於原始opentelemetry collector使用YAML定義資料流,我覺得alloy使用上比較直覺,也確實如官網所描述的,比較方便debug。
Grafana Faro Web SDK
Grafana Faro是JS的library,可以引用在前端的應用中,用來蒐集前述的RUM及基本的metadata例如瀏覽器及OS名稱。也與opentelemetry-js整合,針對前端應用fetch
及XML
請求,會自動量測請求的trace。它也能將console log、error、event及performance resource timing一起送進Grafana Alloy的Faro receiver中。
現有架構
目前已經將 Grafana Alloy 及 Faro SDK 引進至我任職的公司,在引進時需要考慮現有的架構,並思考如何整合。下面針對現有架構作介紹。
技術堆疊
在基本的infra上,底層是由OpenStack建立的私有雲架構,上層提供了Kubernetes、Load Balancer、Object Storage、Redis及MySQL等服務,這這些 infra 主要由日本及韓國負責維運。。
在這架構上,台灣的SRE在Kubernetes上部署了Traefik或Contour Ingress Controller,再上層的服務包含Tempo, Loki, ArgoCD, Grafana。
應用團隊監控架構
應用團隊的服務也是部署在k8s上,前面的流量經過Load Balancer進來之後進到Traefik部署的那些節點上,Traefik聆聽Ingress或是IngressRoute設定的規則將流量送進服務內。
這些應用服務會產生log, metrics及trace。metrics 的抓取規則主要由 PodMonitor 或 ServiceMonitor 定義,收進cluster上的Agent mode的Prometheus(Statefulset部署)上,會進一步透過remote write機制送進其他團隊管理的Prometheus存放。
log主要會將stdout及stderr寫到節點上的log file上存放,我們使用promtail(Daemonset部署)將這些log做前處理(加入敏感資料mask及k8s attributes等)之後,會直接送進SRE管理的Loki裡。
trace會先拋到cluster上的otel collector(Deployment部署)上,一樣會先做些前處理(memory限制,限制每一個span的attributes數量等),因為數量比較大我們選擇先拋到Kafka topic上,之後會在SRE cluster進行處理。
SRE監控架構
同樣在SRE cluster會部署Traefik負責接受監控的流量,上面如技術堆疊中提到的部署ArgoCD、Grafana、Tempo、Loki等服務。Grafana的資料來源主要是其他團隊管理的Prometheus,本地的Tempo及Loki,滿足metrics、log及trace的視覺化及告警需求。
在metrics部分,我們僅是使用Prometheus remote read功能讀取其他團隊的遠端Prometheus;在logs部分,透過Loki push API打進來的logs都會被Loki cluster消化,並存放到兼容S3 API的Object Storage中;SRE cluster上會另外部署一套otel collector,負責consume來自Kafka topic的trace,之後送進Tempo cluster進一步消化,也存在Object Storage中,