合成監控(synthetic monitoring)是以排程主動發出請求、模擬使用者使用服務的監控方式:探測程式每隔一段時間對服務的網址或一段操作流程(登入、查詢、結帳)發請求,記錄成功與否、回應時間與回應內容。請求是人為製造的,所以沒有真實使用者的時段也量得到;它量到的是探測程式走的那一條路徑,探測端放在哪裡決定了量得到哪些故障。它與 Probe 同樣是主動發請求的探測,差別在由誰使用結果:平台用 probe 決定要不要送流量、要不要重啟,合成監控用來回答使用者看到什麼。

概念位置

探測端的位置決定它與服務共用哪些依賴。從服務同一台主機、同一個內部網路發出的探測(服務網路內的探測),請求不經過公開的 DNS、公開入口與 TLS 憑證,量得到服務程序卡住與內部路由錯誤,量不到使用者在網際網路上遇到的故障;服務所在的主機停掉時,它跟著停。從服務的 Failure Domain(失效域) 以外、在使用者連線出發的網路發出的探測,請求解析公開網域、經過 HTTPS 與公開入口,量得到 DNS、憑證與入口的故障。「外部探測」在不同資料裡可以指這兩種位置:服務網路內的探測,「外部」是相對於服務的程序;失效域以外的探測,「外部」是相對於服務的失效域。分辨的依據是探測請求經不經過公開的 DNS、入口與憑證。

真實使用者監測(RUM,real user monitoring)的資料從使用者端蒐集:在使用者的瀏覽器或 App 裡記錄實際請求的結果與耗時,與合成監控由探測端主動發請求相反。RUM 量的是真實使用者的分布(各地區、各種裝置、各家網路業者),沒有使用者的時段沒有資料;合成監控量的是固定的幾條路徑,任何時段都有資料。兩者回答的問題不同,常一起用。

可觀察訊號與例子

合成監控的輸出是每一次探測的結果:成功或失敗、各階段的耗時(DNS 解析、TCP 連線、TLS 握手、等待回應)、狀態碼與回應內容是否符合預期。Prometheus 的 blackbox_exporter 是自架的做法,它對一個目標發一次請求並輸出 probe_success、probe_http_status_code、probe_ssl_earliest_cert_expiry(最早到期的那一張憑證的到期時間)這類指標;Gatus、Uptime Kuma 是附帶儀表板的自架工具;UptimeRobot、Pingdom、Catchpoint 這類服務從業者在各地的探測點發請求。判斷成功只看狀態碼時,入口回一個錯誤頁也可能是 200,比對回應內容裡一段固定字串、或打一個只有服務正常時才回得出內容的端點,判斷才準。

判讀方式

看到一個合成監控的結果時,先查兩件事:探測端在哪裡、它走的是哪一條路徑。探測端與服務在同一台主機或同一個內部網路時,它的「全部正常」只代表服務程序回應正常,不代表使用者連得到。探測打的是會記錄點擊或計費的路徑時,探測請求會灌進服務的統計,要以來源或 User-Agent 排除,或改打不記錄的端點。多個地點同時失敗才通知可以排除單一探測點自己網路的問題,代價是只有某個地區連不進來時不會通知。合成監控在整個監控分層裡的位置見 4.0 服務端監控的分層,探測端放在失效域以外的理由與做法見 4.28 單台主機的監控盲區與失效域以外的觀察者 與 4.10 Client-side / Synthetic / RUM 的〈Synthetic Monitoring〉。