前端監控示例圖,來自 Real User Monitoring for improving frontend performance | Atatus Browserhtml
按照常見的部署架構能夠將監控分爲如下幾類:前端
每一層的監控的側重點都有所差別,本篇文章把範圍限定在「前端應用監控(不含node,node實際上能夠歸爲‘後端服務監控’)」。node
前端應用程序監視是一個相對較新的術語,用於描述開發人員,工程師和產品全部者用來跟蹤,維護和修復Web應用程序,本機應用程序和網站的工具。前端應用程序監視與更典型的應用程序性能監視工具(或APM)不一樣,由於它們專一於最終用戶看到的內容,而不是託管應用程序或網站的服務器能夠檢索的事件。 from Front-End Application Monitoringgit
監控的通常過程與各環節的技術選型github
若是你不能衡量它,那麼你就不能管理它。If you can't measure it, you can't manage it. ——德魯克數據庫
前端通常是用戶使用的第一道坎,任何前端的問題均可能致使業務的不可開展,進而影響公司收入、客戶滿意度等等。產品須要瞭解用戶體驗、開發人員須要瞭解服務的性能情況和可用性情況。小程序
關鍵特徵:離散事件後端
日誌是有必定格式的離散事件信息集合,用於記錄事件發生的原始記錄、重現應用內部的狀態轉化。例如:接口請求日誌(DNS解析事件、響應時間、成功與否等)、主動上報的用戶行爲日誌。api
日誌是監控的基礎,若是沒有日誌也不存在監控。典型的日誌解決方案是ELK Stack。阿里雲上對應產品SLS。瀏覽器
關鍵特徵:數據可聚合
度量,也常被稱做指標,是一段時間內組成單一邏輯尺度、計數器或者柱狀圖的原子,度量的典型特徵就是由可聚合的數據組成。例如:能夠將傳入的HTTP請求的數量建模爲一個計數器,經過簡單的加法就能夠彙總其更新。
關鍵特徵:請求圈選
「追蹤(Tracing)」是監控的一個重要組成部分,在現在的分佈式微服務體系結構中變得愈來愈重要。全鏈路的應用監控中,「追蹤」用於請求圈選並展現用戶使用服務的整個過程的堆棧信息。現在一個服務基本是微服務的形式進行調用、部署則是分佈式的,「追蹤」的實現須要經過traceId才能將全鏈路的日誌串起來。例如:
從示例能夠看到,經過requestId能夠將一個請求的全部調用鏈路串起來,方便問題排查。
開源的Tracing系統表明有zipkin,openTracing,jaeger。
ELK提供了日誌記錄和彙總功能,將其緊緊地放置在可聚合的事件空間中,可是彷佛在其餘域中不斷積累了更多功能,將其推向了中心。
應用實時監控服務 (Application Real-Time Monitoring Service, 簡稱ARMS) 是一款應用性能管理產品,包含前端監控,應用監控和Prometheus監控三大子產品,涵蓋了瀏覽器,小程序,APP,分佈式應用和容器環境等性能管理,能幫助你實現全棧式的性能監控和端到端的全鏈路追蹤診斷, 讓應用運維從未如此輕鬆高效。 from 應用實時監控服務ARMS - 阿里雲
Sentry is an open-source application monitoring platform that helps you identify issues in real-time. from Sentry Documentation - Docs
Sentry 是一個實時事件日誌記錄和聚集的平臺。其專一於錯誤監控以及提取一切過後處理所需信息而不依賴於麻煩的用戶反饋。
CAT(Central Application Tracking)是一個實時和接近全量的監控系統,它側重於對Java應用的監控,基本接入了美團點評上海側全部核心應用。目前在中間件(MVC、RPC、數據庫、緩存等)框架中獲得普遍應用,爲美團點評各業務線提供系統的性能指標、健康情況、監控告警等。自2014年開源。 from dianping/cat: CAT
通常狀況下,咱們須要根據SLA對不一樣的告警進行分級,同時不一樣優先級的告警須要制定不一樣的響應預案。
通常公司會制定4種等級的告警:
就時間而言,P0的SLA是分鐘級別、P1的SLA是小時、P2的SLA是天、P3的SLA則沒有時間限制。
響應預案也是很關鍵的,提早制定好預案能夠更加快速的響應告警。
示例:根據eventId調出全鏈路日誌,來自: Why and How to Test Logging
通常狀況下,traceId是由後端本身生成的前端並不用關心這個traceId,只有在請求異常的狀況下後端會返回這個traceId給前端作排查之用。在分佈式架構中,這個traceId一般是由一個統一的服務頒發的,以保證全局餓的統一性。
因爲前端日誌中缺少traceId,此時前端後端的監控是割裂的。通常狀況下,前端的js錯誤也不須要traceId,經過查看請求參數(設備號UUID、用戶ID)就能夠定位到發生問題的用戶及其設備。
有些場景下,須要打通前端後端的日誌。這時候只能前端使用uuid工具生成一個traceId並經過請求header傳給後端,後端會使用traceId來標記整個服務調用鏈路。這個方案有個缺點:不能保證traceId的全局惟一性。
通常咱們在接入一個監控平臺的時候,首先要考慮到上報數據是全量的仍是部分採樣的,由於數據量大小影響數據的準確度。
若是是像淘寶那樣前端頁面訪問量每個月超過百億(根據淘寶月活用戶估計)的,若是全量上報數據可能對數據存儲會產生很是大的壓力。這時,採用「部分採樣上報」是不錯的選擇,數據量夠大的狀況下,樣本也能反應總體。
相似二八定律,20%的核心指標須要咱們花80%的時間關注。
結合大盤看數據,大盤穩則小比例的問題影響不大。好比:出現某個市範圍的「運營商DNS劫持」問題,這個市的數據一會兒掉到正常水位下面,可是大盤仍是沒有啥問題的。這時候,影響面是比較小的。
問題的發生會影響業務的開展,所以,告警的及時性很是重要。大多數的平臺的告警都會有所延遲,若是延遲超過20分鐘,就可能嚴重影響業務(好比:外賣服務的午高峯)
不少前端服務會採用hash路由,要注意的一點是:通常頁面pv不會根據hash路由進行區分,多個路由的數據上報要手動進行標記區分。
可視化面板讓監控變得更加直觀,也下降的用戶上手難度。相似Grafana的監控面板是很重要的。
實際上,前端對告警策略配置能力要求不高。下面幾個策略能力基本知足全部的須要: