Agentic Reliability Engineering

第十章
可觀測性強化與事前情報

本章為最終書稿的第八章。請注意,GitHub 儲存庫將於稍後正式啟用。
若您願意實際參與本草稿的審閱與意見回饋,請與編輯聯繫:jleonard@oreilly.com

第二部裡的幾章,已經在同一套架構上建構了三個工作流程。事故應變,處理失敗出現「之後」的事;交付,處理變更上線「之前」的事;混沌工程,在脆弱度顯現之前,產出關於它的證據。剩下的工作流程,是在時間層面把它們串連起來的那一個:這個工作流程運作在系統裡早已存在的訊號上,向時間前方看,目標是預見失敗,而不是對它做出反應。本章要安裝這個工作流程,作為第二部的收尾。

一開始就值得點名的架構轉變很小。我們已經花了四章的篇幅,建構讀取訊號並據以行動的代理。本章要安裝的紀律,是讀取「同一批訊號」,但在它們軌跡上「更早」的位置就據以行動——在 SLO 被打破之前,在呼叫觸發之前,在團隊注意到任何不對勁之前。訊號沒有改變,架構沒有改變,改變的是代理往前看得多遠,以及當他們在十二分鐘之外看見令人擔憂的東西時,被授權做什麼。第二部的四個工作流程,是同一套架構,指向四個不同的時間位置:變更前(交付)、失敗後(事故)、失敗前(本章),以及持續發現(混沌)。這套架構,是那個複利累積的不變量;工作流程,是它服務的營運議題。

本章要安裝的概念數量不多,卻後果深遠。「情境豐富層」(Context Enrichment Layer,CEL),正式登場,作為坐落在訊號平面與推理平面之間的架構原語。「容量代理」(Capacity Agent),在第五章客串登場之後,贏得自己完整的角色。「預測性可靠性訊號」(Predictive Reliability Signal,PRS),是本章的頭號產物,是本章其餘機制被設計來產出並據以行動的結構化斷言。三塊新拼圖,全都服務於同一個轉變:從「可觀測性即回報」,轉向「可觀測性即決策基質」。讀完本章,第二部就會完整。

8.1 從原始訊號到情境覺知

第 5.1 節介紹了「情境覺知」,作為觀測代理與拓撲代理在事故期間產出的組裝物件:一個包含訊號、其基準線、其拓撲情境、其變更情境、其擁有權中繼資料的結構化產物,全都附帶信心區間。同一套機制在這裡運作,實質內容不需要重新推導。在事前脈絡下改變的,是組裝發生的「時機」。在事故期間,情境覺知是反應式建構的,在幾秒鐘之內、從一個訊號突破其顯著性門檻的那一刻開始。在事前,情境覺知被「持續」維護,隨著證據累積而刷新,由同一批代理以滾動的方式產出同一個結構化物件,無論是否有任何東西正在惡化。第五章裡曾是一次「回應」的產物,在第十章變成了一條「基準線」。

值得安裝的框架,是情境覺知,正是那種在多個工作流程之間贏得自己價值的架構原語之一。為事故應變而建構一次,如今不需要額外的工程投資,就能為事前偵測服務。拓撲代理的圖,是同一張圖;觀測代理的訊號契約,是同一批契約;發布代理的變更事件,是同一批事件。事前情報,就是當你向時間前方、而不是在危機的那一刻讀取這些產物時所發生的事。這正是這套架構的連貫性最直接回報前期投資的地方之一——一支為事故應變建構了情境覺知的團隊,只需要花讀取既有基質的新代理的邊際成本,就能獲得事前偵測。

運作節奏也改變了。事故時的情境覺知,必須在幾秒鐘內組裝完成,因為等待的代價是以使用者影響支付的。事前的情境覺知,以訊號本身更新的速率持續組裝,這個速率通常比人類注意力週期慢、卻比事故時的回應週期快。這套架構能負擔得起在事前維護更豐富的情境,因為沒有東西正在燃燒——運算的成本,是在穩定狀態下支付的,對照著以自己步調更新的訊號,而由此產生的情境,在推理平面需要它的那一刻立即可用。事前情境覺知與事故時情境覺知之間的關係是共生的:當一個訊號真的突破門檻時,事故時的機制讀取的,正是這個持續性的事前物件,而這正是為什麼在 L3 成熟度及以上,事故應變能在幾秒鐘、而不是幾分鐘內收斂的部分原因。

8.2 事前控制與智慧護欄

一旦情境覺知持續存在,介入就不再需要等待失敗發生。這是本章第一個重大的架構轉變,值得被精確地命名。「事前控制」(pre-incident control),是這套架構在一次失敗浮現之前、根據累積的訊號證據暗示失敗可能發生而採取的介入。事前控制不是警報——警報要求人類代表系統採取行動。事前控制,是這套架構自己、在自己的授權範圍內、針對值得介入卻不需要升級的訊號採取的行動。它們是「一位經驗豐富的工程師在下午兩點收緊速率限制,因為他對下午兩點半會是什麼樣子有預感」這件事的架構等價物,只不過這套架構的預感,是結構化的、有證據支撐的、可重現的。

大多數團隊早已具備底層機制。自動擴容、速率限制、斷路、服務隔離、流量塑形:這些都是每一套現代基礎架構裡熟悉的 SRE 原語。在代理式事前控制裡改變的,不是機制本身,而是機制被觸發的方式、被治理的方式,以及與其他控制協調的方式。傳統的自動擴容對 CPU 做出反應;代理式自動擴容對「預測的 SLO 風險」做出反應。傳統的速率限制對「流量」做出反應;代理式速率限制對「結合了下游關鍵性的上游訊號模式」做出反應。傳統的斷路對「錯誤門檻」做出反應;代理式斷路對「即使表面指標看起來依然健康、底層依賴正在惡化的證據」做出反應。原語是一樣的,改變的,是何時與如何觸發它們的決策。

值得點名的架構形狀,是「事前控制平面」(Pre-Incident Control Plane)。它不是第 4.2 節那四個平面之外的一個新平面,而是治理平面的一種特定運作模式,作用在推理平面的輸入之上,而推理平面本身,運作的是持續性的情境覺知,而不是事故觸發的情境。事前控制平面持續評估一小組輸入:目前的 SLO 健康度及其軌跡、對目前訊號品質的信心、與預測 SLO 違約的接近程度、近期的變更活動、依賴飽和度、爆炸半徑估計。從這些輸入,它產出三種輸出之一:不採取行動(系統運作在邊界之內,不需要介入)、有邊界的行動(這套架構在自己的授權範圍內採取一次可逆的介入,並記錄理由),或升級(情況超出了這套架構的信心或授權邊界,人類被呼叫、附帶情境)。大多數時候,輸出是「不採取行動」。有價值的案例,是那些「有邊界的行動」——介入在落差變成一次呼叫之前,就先把它填補起來。

把這件事對照本章要跟隨的標準事前情境具體化:第五到七章的支付服務,只是我們現在是在星期二下午 14:18 觀察它。觀測代理的延遲訊號目前是正常的(p99 在 215 毫秒,遠低於 300 毫秒的目標)。但情境覺知物件同時攜帶了軌跡資訊:共享資料庫上的連線池飽和度,在過去 35 分鐘裡一直悄悄向上爬升——還不足以觸發警報,但這個趨勢是單調的。發布代理回報,47 分鐘前有一次設定推送,調整了一個下游服務的重試行為,推理平面已把它標記為候選原因。拓撲代理確認,這個連線池餵給三個第一級服務。事前控制平面評估:軌跡令人擔憂,信心中等(0.71),如果目前的趨勢持續,預測的 SLO 違約大約還有 12 分鐘。它採取的有邊界行動,是把非關鍵重試流量的速率限制收緊 30%,範圍限定在受影響的服務上,設定 15 分鐘的時限,若趨勢穩定則自動逆轉。容量代理(在 8.4+8.5 節介紹)被呼叫,預先部署額外的容量,以防趨勢持續。沒有任何使用者可見的事情發生,沒有呼叫觸發,沒有事故被宣告。這套架構正在對十二分鐘前依然遠低於正常邊界的訊號採取行動,而它之所以這麼做,是因為 8.1 節那套持續性的情境覺知機制,正在把團隊政策認為可以據以行動的證據,餵給事前控制平面。

附註 事前控制,是唯一一種不要求人類採取行動的「警報」。傳統警報是訊息:系統告訴人類正在發生什麼,並要求回應。事前控制是介入:系統根據自己所見採取行動,記錄自己做了什麼、為什麼,並以稽核、而不是請求的形式告知人類。待命工程師醒來後讀的是稽核軌跡,而不是要去做決定。正是這個營運上的差異,讓「預見」變得可以擴展:人類無法即時評估每一次「十二分鐘之外」的預測,而這套架構也不需要他們這麼做。

值得安裝的紀律,是事前控制永遠是「有邊界的」。每一次介入,都以第 4.5 節同一套行動契約格式,宣告自己的範圍、時長、逆轉路徑,以及成功標準。這套架構不能在不重新對照政策評估的情況下延長這次介入。這次介入,在它的成功標準被滿足、或它的時限到期時——以先到者為準——自動逆轉。這與第 5.6 節的自主事故執行、第 7.6 節的有邊界混沌,是同一套架構模式,只是套用在一個不同的時間脈絡上。這次介入的爆炸半徑很小,時長很短,可逆性是強制性的。一個無法被安全逆轉的事前控制,是一個本來就不該被採取的事前控制;無論推理平面的信心有多高,這套架構都拒絕授權它。

值得點名的經濟學,是一次「假陽性」事前控制的成本,被它自己的範圍所限縮,而一次「錯過的事前機會」的成本,則被使用者影響所限縮。正是這種不對稱,讓這門紀律變得可行。一次結果證明不需要的預防性速率限制,代價是幾分鐘稍微被節流的非關鍵流量;一次被錯過的事前機會,代價是這次事故本身的全部代價。大多數團隊在運行這套架構一季之後發現,假陽性率遠在自己的容忍範圍之內,因為行動的有邊界性質讓成本保持可控,而對實際事前情況的捕獲率,正是能夠正當化這份投資的指標。這份經濟學,讓這套架構傾向於對中等信心的預測採取行動,因為下行風險小,上行則是避免了一次事故。這正是第 4.9 節的成熟度模型把事前行動穩固地放在 L3 及以上的營運依據:基質必須先到位,經濟學才能成立,但一旦成立,這套架構就有結構性的理由,偏好介入勝過遲疑。

8.3 從訊號到情境

事前控制,只有在這套架構擁有足夠資訊、能對「預測的風險」而不只是「目前狀態」進行推理時,才有效。這正是「訊號」與「情境」之間的差異變得在營運上舉足輕重的地方,也是「情境豐富層」(Context Enrichment Layer,CEL)正式登場的地方。CEL,是坐落在訊號平面與推理平面之間的架構原語,把原始訊號轉化成推理平面需要用來對「未來」、而不只是「當下」做出決策的豐富、結構化情境。第十一章會把 CEL 當成推理控制平面裡承重的元件之一來對待;本節,把這個概念安裝在它的營運所在地。

這個概念性的轉變是微妙卻重要的。「訊號」,是關於系統的事實:這項指標目前是這個值、這行日誌是在這個時間發出的、這條追蹤顯示這個延遲。「情境」,是關於系統「與情境本身」的事實:這項指標目前是這個值,「而且它已經連續 35 分鐘單調上升、對照的基準線本身昨天才變動過」;這行日誌,是過去一小時裡同類型的第七則,「來自一個依賴剛剛被打過修補程式的服務」;這條追蹤顯示這個延遲,「而它符合學習代理上一季標記過的一個已知脆弱度模式的特徵」。差別在於,情境攜帶著推理平面需要用來向時間前方投射的時間性、拓撲性,與歷史性結構。單靠訊號,只能告訴你現在什麼是真的;情境,能告訴你什麼正在改變、朝什麼方向、對照什麼基準線、有什麼佐證、在什麼鄰域裡。CEL,正是從訊號產出情境的那一層。

CEL 的架構形狀有三項職責。「豐富化」:每一個進入 CEL 的訊號,都會被加上自己的基準線(對這項服務在一天中的這個時段而言,這個訊號的「正常」長什麼樣子)、自己的軌跡(這個訊號的變化速率是多少)、自己的拓撲情境(什麼東西依賴這個發送訊號的元件),以及自己的變更情境(這個鄰域最近部署或修改了什麼)。「關聯」:分別到來、卻與同一個情況相關的訊號會被聚類,讓推理平面讀到的是一幅連貫的圖像,而不是彼此不相連的事件。「投射」:在底層訊號支持的情況下,CEL 會發送短期投射(這個訊號在五分鐘後、十分鐘後、十五分鐘後,可能會是什麼值,附帶什麼信心區間)。推理平面消費的是豐富化、關聯、投射過的情境,它不直接消費原始訊號。這種關注點的分離,讓推理平面能專注於決策,而不是訊號前處理。

CEL 也是這套架構最重要的特質之一存在的地方:「溯源」(grounding)。CEL 發送的每一份情境,都能被追溯回產出它的底層訊號。當推理平面產生一個假設時,貢獻的情境元素會被附掛上去,從那裡,原始的訊號是可以被追溯到的。一支審查一次事前控制介入的團隊,能從那個行動一路走回為它辯護的原始訊號。第九章會把「溯源率」(Grounding Rate,GR)發展成一項正式的 SLO;現階段,重要的是 CEL 對可追溯性的結構性承諾,正是讓本章其餘機制能站得住腳的關鍵。一次沒有溯源的事前介入,是一次事後沒有人能為它辯護的介入,這套架構的稽核立場,無法容忍它。

CEL 不是團隊必須建構的一套新系統,而是一層由前幾章早已安裝的原語組合而成的層:觀測代理的訊號契約(第二章)、拓撲代理的依賴圖(第 2.4 節)、發布代理的變更事件串流(第六章),以及學習代理的相似性資料庫(第 5.8 節)。CEL,是把這些組合成一個推理平面能夠消費的單一豐富情境物件的架構原語。一支已經建構了第二部基質的團隊,早已完成 CEL 大部分的工程工作,剩下的工作,是把既有原語轉化成一條連貫情境產出管線的編排。

圖 10-1 情境豐富層:三項職責(豐富化、關聯、投射),坐落在訊號平面與推理平面之間。溯源鏈,從推理一路回溯到原始訊號。

第十一章之所以會回到 CEL,是因為它成了第 11.1 節所稱「推理控制平面」承重的元件:這一層決定推理平面看見什麼情境、依什麼順序、附帶什麼權重。事前情報,是 CEL 第一次以自己營運角色登場的工作流程;更深入的架構處理,存在於第三部裡。對第十章而言,重要的是 CEL 存在、它持續產出豐富化的情境,以及本章其餘機制(PRS、事前控制平面、容量代理的投射)都從它那裡讀取資料。

附註 訊號,是關於系統的事實;情境,是關於系統與情境本身的事實。這個區別不是學術上的講究,正是它,讓推理平面能夠向時間前方投射,而不只是描述當下。一支只依靠訊號運作的團隊,能快速反應;一支依靠情境運作的團隊,能提早介入。CEL,正是讓第二種模式在營運上變得可行的架構原語。

8.4 + 8.5 事前行動:擴容、隔離、遷移

當 CEL 呈現出推理平面辨識為事前風險模式的情境時,事前控制平面有三個行動家族可用。「擴容」,透過在預測的違約之前增加容量,來守住 SLO。「隔離」,透過在惡化變得使用者可見之前,降低一個正在惡化元件上的負載,來守住 SLO。「遷移」,透過把工作移出一個條件正在惡化的環境,來守住 SLO。這三個家族不是彼此的替代方案,而是針對不同形狀事前風險的不同工具,而容量代理(本節完整登場),正是推理平面裡在它們之間協調的角色。

容量代理第一次以客串身分出現在第五章(第 5.10 節的 L5 情境,這套架構透過預先部署容量,在金絲雀階段就抓住了一個失效模式)。在這裡,它贏得自己完整的角色。容量代理,持續維護一個橫跨多個維度的系統容量包絡模型:運算、連線池容量、佇列餘裕、網路頻寬、依賴吞吐量。它讀取 CEL 豐富化的情境,投射這個包絡最可能在哪裡被突破,並在預測突破機率與突破時間跨越政策門檻時,向治理平面提議容量行動。就像推理平面裡的其他代理一樣,它不會單方面行動,它提議,治理平面授權,執行平面在有邊界的範圍內運行這個行動。

這三個行動家族有各自不同的營運形狀。「擴容」:代理式自動擴容,不是使用率驅動的,而是由預測的 SLO 風險驅動的。容量代理盯著連線池飽和度、佇列深度、延遲分布,以及依賴餘裕。當預測的 SLO 違約機率跨越一個門檻時,這個代理提議一次擴容,但只有在擴容真的有幫助的情況下才會提議。值得點名的紀律是克制:這個代理必須能夠在擴容會放大問題時拒絕擴容。如果延遲上升是由下游資料庫飽和造成的,增加更多應用程式副本會提高連線壓力,加速失敗。容量代理必須偵測到這種情況,並提議一個不同的介入(節流非關鍵流量、隔離選用性功能),而不是伸手去拿最明顯的那個槓桿。「隔離」:分級的,不是二元的。第一步是負載塑形(減少來自非關鍵呼叫者的流量、節流盡力而為路徑)。如果風險持續上升,這個代理會升級到依賴隔離(把一個惡化的依賴從請求路徑中切斷,強制走備援行為)。這個升級永遠是可逆的,永遠受團隊政策限制。「遷移」:使用者影響發生之前的最後手段,用於代理判斷風險是環境性的、而不是邏輯性的(服務本身健康,但它的環境正在惡化)的情況。容量代理從來不會發明新的部署位置,它從團隊早已核准的模式裡選擇,每個模式的政策都宣告了在什麼條件下、能把多少流量轉移到哪個替代環境。

範例 標準事前情境在 14:30,也就是事前控制平面第一次提高戒備等級的十二分鐘之後。容量代理的評估:

pre_incident_state:
  timestamp: 14:30:00
  incident_status: not_declared
  user_visible_impact: none
  slo_state: nominal (latency p99 = 247ms, target 300ms)
capacity_agent_projection:
  projected_slo_breach:
    service: payment_service
    breach_metric: latency_p99
    breach_in: 8min 22sec
    breach_probability: 0.78
    time_horizon: 15min
  root_cause_hypothesis:
    cause: shared_db_pool_saturation
    contributing_factors:
      - retry_config_change (47min ago)
      - inventory_service_traffic +18%
      - pool_utilization rising 1.4%/min for 38min
    confidence: 0.71
proposed_actions:
  primary:
    action: pre_emptive_scale
    target: payment_service
    scope: +2 replicas in eu-west
    duration: 30min (auto-reverse if pool utilization stabilises)
    expected_effect: reduces per-replica connection pressure by 22%
    governance: autonomous (above 0.70 confidence threshold)
  secondary: # queued if primary insufficient
    action: rate_limit_non_critical
    target: payment_service
    scope: 30% throttle on retry_priority_low traffic class
    duration: 15min (auto-reverse on signal recovery)
    governance: autonomous
  tertiary: # queued if breach probability rises above 0.85
    action: isolate_optional_features
    target: payment_service
    scope: disable recommendation_lookup on slow path
    duration: until_signal_recovery
    governance: requires_human_approval
outcome_at_14:38:
  primary_action_executed_at: 14:30:15
  pool_utilization: plateaus by 14:33
  p99_latency: rises briefly to 268ms then recovers to 220ms by 14:38
  secondary_action: not needed; auto-cancelled at 14:38
  human_paging_required: false
  audit_trail: complete

容量代理在 12 分鐘之外就看見了這次違約,提議了一組依可逆性與粗暴程度排序的三項分級行動,而只有主要行動被觸發了。這套架構在沒有任何人失去一夜好眠的情況下完成了介入,稽核軌跡則記錄了這份理由,供團隊下一次待命輪值交接時審查。

值得點名的架構特質,是事前行動是分級的。容量代理很少只觸發一個介入,它會把一連串逐步升級的行動排隊,每一個都對應到風險等級與信心區間的不同組合,而這套架構只會觸發情況實際需要的那些。如果主要行動穩定了這個訊號,次要與第三順位行動會在運行之前就被取消。如果主要行動不夠,次要行動就會觸發,這套架構會重新評估是否要繼續往下走這個序列。這與第 5.5 節的候選行動集是同一種模式,只是套用在一個「等待成本」被「預測突破時間」限縮、而不是被「持續中的使用者影響」限縮的時間脈絡上。分級,讓這套架構既能積極(它比人類更早介入),又能克制(它不會在最簡單的行動就足夠時過度介入)。

圖 10-2 沒有變成事故的二十分鐘。橫跨事前窗口的訊號、推理與行動。14:30 的介入比人類會升級的時機更早,也比事故時的回應所需要的規模更小。

評估的節奏,把事前分級與事故時分級區分開來。在事故應變裡,這套架構只有幾秒鐘來評估每一步,才需要下一次介入,等待的代價是持續以使用者影響支付的。在事前行動裡,這套架構在分級步驟之間有幾分鐘的時間,因為使用者影響還沒有開始,等待的代價只有在預測的違約真的成形時才會被支付。這意味著這套架構能負擔得起在升級到下一步之前,先等待、觀察每一次介入的效果,這會為學習代理產出更準確的校準資料,並降低過度介入的比率。這個較慢的節奏,本身就是「事前」相對於「事故時」回應的一項架構優勢:這套架構能以更審慎的方式運作,這會轉化為隨時間校準得更好的決策。

8.6 AI 草擬的根因分析作為一項可靠性控制

當儘管有事前機制、某件事還是出錯時,這套架構依然會產出一份結構化的事故紀錄,而撰寫這份紀錄的紀律,在代理式系統裡發生了實質性的改變。傳統的根因分析是一份文件:一個人類撰寫散文、附上圖表、分發這份產物,團隊在下週的一場會議上讀它。代理式的根因分析,是同樣的內容,卻有著根本不同的營運形狀。它們是系統本身能夠查詢的結構化產物,機器可讀,附掛在學習代理的相似性資料庫上,並在未來的情況與過去相似時被推理平面諮詢。這個重新框架很重要,因為它決定了這份根因分析,是會貢獻於複利累積的可靠性,還是依然只是一份被歸檔、被遺忘的紙本產物。

這個結構性的轉變,是一份 AI 草擬的根因分析,不是事故學習的「輸出」,而是封閉學習迴圈(第 5.8 節)眾多輸入之一。學習代理早已擷取了這起事故的結構化資料:被評估的候選行動、被選中的行動、結果、信心對照觀察的校準。根因分析的工作,是把人類可讀的敘事層,加到那份結構化紀錄上,以一種人類與推理平面都能在稍後諮詢的形式。這份敘事,是從結構化資料產生的,由團隊審查,並作為一份有版本控管的產物,與結構化紀錄一起儲存。當未來的一個情況觸發對學習代理案例庫的相似性搜尋時,相關的根因分析,會作為推理平面能夠讀取的情境浮現出來,而不是待命工程師必須去 wiki 上找的文件。

架構上的後果,是根因分析本身變得可查詢。推理平面諮詢一份根因分析時,不是在讀散文來總結它,而是在讀結構化欄位(領先假設、被選中的行動、結果、貢獻因素),並把它們當成目前推理裡的證據來使用。人類可讀的敘事,依然附掛在上面供審查、稽核,以及團隊依然會舉行的事後檢討會議使用,但根因分析的營運消費者,是這套架構本身。這正是我們說一份根因分析是「一項控制」、而不是「一份文件」的意思。一份文件坐在 wiki 裡,等著有人來讀它;一項控制持續運行,為目前的決策貢獻證據,而它的價值,是以它多常實質改變這套架構所做的事來量測的。

這套架構最在乎的結構化欄位有四項。「事故特徵」:標準化的模式(什麼改變了、什麼惡化了、什麼連鎖擴散了),被正規化,讓相似性搜尋能可靠地找到相關的事故。「因果鏈」:從初始觸發到使用者影響的結構化序列,每一步都附掛著自己的證據。「行動帳本」:這套架構在事故期間採取的每一次介入,附帶它的範圍、它的效果、它的逆轉狀態,以及它被授權時的信心。「教訓」:這起事故正當化的、對這套架構模型的具體更新,表達為對某個 CRS 權重、某個護欄門檻、某個 PRS 校準,或某個假設挖掘優先順序的一項建議變更。學習代理把這份教訓吸收進相關的模型裡,下一次類似的模式出現時,這套架構的回應,就會受到過去這起事故所提供的教訓的引導。

附註 一份系統無法查詢的根因分析,是一份文件;一份系統能夠查詢的根因分析,是一項控制。差別不在文字本身,而在文字底下的結構,以及這套架構能否在未來的推理裡把那個結構化的部分當成證據使用。一支只寫優秀散文式根因分析、並存放在 wiki 裡的團隊,產出了一批人類可讀的組織記憶,卻是零機器可讀的組織記憶。複利曲線運行在第二種上,不是第一種。

值得點名的紀律,是「AI 草擬」的部分不是頭條。學習代理的結構化擷取,才是承重的產物;AI 草擬的敘事,是讓這項產物在不損害其機器可讀性的情況下,變得對人類可親近的那一層文字。過度沉迷於「AI 草擬的敘事」本身、把它當成目的的誘惑,與第五章對儀表板點名的同一種誘惑:這項產物看起來令人印象深刻,但它的營運價值,取決於它是否貢獻於這套架構其餘部分。一份敘事讀起來很好、結構化欄位卻稀疏或錯誤的根因分析,即使滿足了事後檢討的聽眾,也是一份未能發揮自己營運角色的根因分析。

值得留意的時間性特質,是「根因分析作為控制」,在事前脈絡下最明顯地活了起來。當 PRS 對一個與過去事故相似的模式觸發時,這套架構會伸手進入學習代理的相似性資料庫,檢索相關的根因分析,並把它們的結構化欄位當成推理平面正在運作的情境的一部分讀取。PRS 的貢獻訊號欄位,攜帶著對「讓目前模式變得可辨識」的過去根因分析的引用。事前控制平面的政策決定,可以把過去的結果引用為自己理由的一部分。過去的事故,變成了目前的證據,而系統的回應,受到它過去所學到的教訓的引導。這正是閉合第二部複利曲線論點的迴圈:每一起事故,都產出未來事前偵測會消費的結構化證據,而這套架構的預見能力,會隨著案例庫的成長而變得更銳利。

8.7 預測性可靠性訊號:在失敗之前預測風險

我們來到本章的頭號產物。「預測性可靠性訊號」(Predictive Reliability Signal,PRS),是推理平面在辨識出系統正在朝著「歷史上與 SLO 違約相關聯」的條件漂移時,所產出的結構化輸出。PRS 不是氣象學意義上的預測,不是一次帶著機率的失敗預報。它是一項結構化的斷言:根據目前的情境豐富層狀態、學習代理的相似性資料庫,以及容量代理的投射模型,這套系統已經跨入了一個「在一段定義好的視野內,失敗機率超過政策可據以行動門檻」的狀態。PRS,正是事前控制平面讀取來決定是否行動的東西,也正是本章機制被設計來產出的產物。

值得放慢腳步的概念性轉變,是 PRS 不是一個警報。警報是由門檻突破觸發的事件:一項指標超過了它的線,一個事件觸發了,一個人類被呼叫了。PRS 是一份持續性的結構化評估,每隔幾秒鐘刷新一次,以一份帶著信心的主張形式呈現:系統的這個區域,因為這些訊號,帶著這份信心,對照這份歷史參照,在這個時間視野內,具備升高的違約風險。PRS 餵進政策;政策決定是否行動、升級,或觀察。PRS 之於事前可靠性,正如候選行動集之於事故應變:都是其餘機制據以運作的結構化產物。

一個 PRS 有五個欄位。「風險區域」:哪些服務或元件處於升高的風險中。「風險類型」:代理預測的是哪種失敗(飽和、依賴惡化、變更引發的迴歸、環境漂移)。「信心」:推理平面對這份預測的相信程度有多強,由學習代理對類似預測過去的準確度校準。「視野」:預測的違約還有多遠(幾秒、幾分鐘,對於燃燒緩慢的模式偶爾是幾十分鐘)。「貢獻訊號」:這份預測所依據的結構化證據,能透過 CEL 的溯源鏈追溯回底層遙測資料。這五個欄位合在一起,讓事前控制平面能對照政策評估每一個 PRS:一個高信心、短視野、嚴重風險類型的 PRS,可能觸發自主行動;一個中等信心、長視野的 PRS,可能只觸發提高戒備、不採取介入;一個低信心、訊號彼此矛盾的 PRS,可能只觸發增加取樣與觀察。

一個 PRS 的生命週期,有四個值得命名的階段。「浮現」:推理平面辨識出目前的 CEL 情境,符合學習代理相似性資料庫與升高風險相關聯的一個模式,並發出一個帶著低到中等信心、較寬視野區間的初始 PRS。「強化」:隨著更多訊號佐證這個模式,PRS 的信心上升,視野估計收窄。事前控制平面在每次刷新時,都會對照政策重新評估這個 PRS,而這套架構的回應層級,可能隨著信心跨越門檻而改變。「行動」:當 PRS 跨越政策可據以行動的門檻時,事前控制平面呼叫合適的代理(通常是容量代理)提議介入。PRS 在介入期間依然保持活躍,推理平面持續監控這次介入是否正在降低預測的風險。「解決」:一個 PRS 以三種方式之一被解決。介入成功,軌跡穩定,信心下降,PRS 變成不活躍。介入失敗,軌跡持續,情況升級為事故應變(第五章)。這個訊號模式是一次假陽性,預測的違約沒有成形,PRS 被解決,學習代理則記錄一次校準失誤,這個模型會用它來精煉未來的預測。

範例 一個在標準情境的 14:25 觸發的 PRS,比預測的 SLO 違約早八分鐘:

prs_id: PRS-2026-05-14-14:25:03-001
status: ACTIVE
risk_region: payment_service ∪ shared_db_pool consumers
risk_type: connection_pool_saturation_with_retry_amplification
confidence: 0.78
horizon:
  earliest_breach: 7min 42sec
  latest_breach: 14min 18sec
  median_estimate: 10min 30sec
severity:
  affected_user_proportion_at_breach: 0.18
  affected_business_journeys: [checkout, payment_settle]
  estimated_revenue_at_risk_per_hour_gbp: 14000
contributing_signals: # traceable via CEL grounding
  - signal: db_pool_utilization
    value: 0.74 (rising)
    trajectory: +1.4%/min for last 38min
    baseline_for_this_time_of_day: 0.52
  - signal: retry_rate_inventory_service
    value: 0.082
    trajectory: +0.003/min for last 22min
    baseline_for_this_time_of_day: 0.045
  - signal: recent_change
    change_id: cfg-retry-policy-9921
    timestamp: 47min ago
    affected_path: inventory_service retry behaviour
    causal_likelihood: 0.62
  - signal: similar_past_pattern
    similarity_score: 0.71
    reference_rcas: [RCA-2026-03-12, RCA-2026-04-28]
    both_resulted_in: latency_p99_breach within 15min of similar pattern onset
policy_evaluation:
  autonomous_action_threshold: 0.70 (confidence) AND <12min (horizon)
  this_prs_eligibility: autonomous_action
  recommended_action_class: capacity_intervention
  recommended_first_action: pre_emptive_scale (delegated to Capacity Agent)

PRS,是一份事前控制平面讀取的結構化斷言。政策的評估,決定了接下來會發生什麼。容量代理提議自己的候選行動集(8.4+8.5 節的範例)。本章其餘部分展開的這個循環,此刻在概念上已經完整了。

兩項值得點名的營運特質。第一,PRS 是即時的:只要它任何一項貢獻訊號更新,它就會重新計算。同一個風險區域,可能在 14:25 產出一個信心 0.78 的 PRS,在 14:27 產出另一個信心 0.82 的 PRS,在 14:29 產出另一個信心 0.91 的 PRS,然後,在容量代理 14:30 的介入生效之後,產出一個信心 0.34 的 14:33 PRS(軌跡已經穩定,這份預測已經減弱,PRS 此刻不再活躍)。這套架構追蹤 PRS 完整的歷史;學習代理吸收這條軌跡,並用它來校準未來的預測。第二,PRS 攜帶著自己的溯源鏈。這套架構發出的每一個 PRS,都能透過 CEL 追溯回底層的訊號,再從訊號追溯回逐時刻的遙測資料。當一支團隊在隔天早上審查一次由 PRS 驅動的介入時,他們能從這次介入一路走回觸發它的 PRS,從 PRS 走回貢獻的訊號,從訊號走回原始資料。稽核軌跡從構造上就是完整的,不需要調查就能重建。

圖 10-3 預測性可靠性訊號:結構與生命週期。五個欄位,四個階段,一路回溯到原始遙測資料的完整溯源鏈。

8.8 自動化預防:把預見轉化為安全的行動

PRS 是一個訊號,把它轉化成行動,正是本節要處理的工作。好消息是,大部分的機制早已從前面幾章到位了。第 5.5 節的候選行動集框架,給了推理平面提議行動的結構化形狀;第 4.5 節的行動契約格式,給了每個行動它的範圍、可逆性,與成功標準;第 5.6 節治理平面的授權層級,規範了什麼可以自主執行、什麼必須升級。在事前脈絡下改變的,是「賭注的算法」:這個行動是在任何使用者受到影響之前、根據預測而不是觀察到的失敗被採取的,而犯錯的成本,其分布方式與事故期間不同。

值得點名的兩種失效模式,與事故應變的不同。第一是「過度介入」:這套架構對一個結果證明是假陽性的 PRS 採取了事前行動,而這次介入本身造成了一個問題——一次觸發冷啟動連鎖反應的預防性擴容、一次節流了合法流量的速率限制、一次無法收斂的遷移。這些每一個都比「不採取行動」還糟,因為即使預測的失敗從未成形,這次介入的成本依然是以使用者影響支付的。第二是「介入不足」:這套架構觀察到了 PRS,卻因為信心中等或視野較長而決定不採取行動,而預測的失敗還是發生了。這裡的成本,與這套架構完全沒有事前能力時支付的方式相同,卻多了一層額外的侮辱:系統早就看見它要來了,卻選擇不行動。這兩種失效模式,都是校準問題。學習代理的工作,是隨時間讓這兩種成本保持平衡;第 3.6 節的校準誤差 SLO,正是標記這個平衡何時偏移的金絲雀指標。

把「安全的事前行動」與「賭一把預測」區分開來的紀律,是「可逆性」。每一次事前介入,都必須能在有邊界的時間內自動逆轉,而逆轉本身不會造成使用者影響。一次增加容量的預防性擴容,會在預測的風險消退之後,透過移除容量來逆轉;一次節流非關鍵流量的速率限制,會透過移除節流來逆轉;一次停用選用性功能的隔離,會透過重新啟用它來逆轉。行動契約格式要求,逆轉路徑要在這個行動被提議的當下就被宣告,而這套架構會強制執行這次逆轉,無論有沒有人記得。這正是對抗「我忘了撤銷那個臨時修復」這種糾纏著人工作業的失效模式的架構性防禦。容量代理不會忘記,這套架構的稽核軌跡記錄了這個行動與它排定的逆轉,而這次逆轉會在條件滿足時觸發。

警告 沒有逆轉路徑的預防性行動,就是在賭這個預測。如果預測是對的,這個行動有幫助;如果預測是錯的,這個行動會變成一個需要有人手動撤銷的問題。手動撤銷,正是代理式可靠性原本要消除的那種苦役,而一個留下手動撤銷這條尾巴的事前控制,是一個沒有發揮自己價值的控制。可逆性不是可有可無的選項,它是讓事前行動安全到足以擴展的架構特質。

另一項值得點名的特質是「比例性」(proportionality)。8.4+8.5 節容量代理的分級行動序列,正是比例性的架構形式:最小的充分介入先觸發,這套架構只有在較小的介入證明不足時才升級。這與第 5.6 節分級的事故應變、第 7.6 節分級的混沌,是同一套模式。比例性,讓事前行動既能積極(它比人類更早介入),又能謙遜(它不會因為中等訊號,就讓這套架構承諾採取大型介入)。這套架構只有在較小的介入證明不足、且 PRS 的信心相應上升時,才掙得採取更大介入的權利。這個分級本身,就是一種蒐集證據的形式:序列裡的每一步,都產出關於「底層假設是否正確」的訊號,這套架構隨著證據到來,更新自己的信心。

人類在此的角色,與在交付和事故應變裡是同一種形狀:大多數時候站在迴圈之上,只有政策路由給他們的案例才處於迴圈之中。迴圈之上的工作,是設計事前政策:哪些 PRS 形狀值得哪些行動類別,自主行動的信心與視野門檻是什麼,哪些介入無論信心多高都保持人類核准。迴圈之中的工作,是罕見的案例——一個 PRS 呈現出一個結構上新奇的模式,或提議的介入會超過這套架構的自主權限,或多個代理對正確回應意見不一。迴圈之上監看的工作,是穩定狀態下對事前結果的監控:這套架構的 PRS 在過去一個月是否被證明正確,這些介入是否以模型預測的方式降低了預測的風險,校準誤差是否朝政策預期的方向趨勢化。這種從「事故時的人類注意力」轉向「事前政策注意力」的轉變,是這套架構所產出、營運上最為重要的轉變之一。過去凌晨四點因為一次支付服務延遲事故而被呼叫的那個人,如今是在隔月上午十一點的一場規劃會議上,審查 PRS 的校準趨勢。這份工作絲毫不比過去不重要,只是形狀不同,而且它能夠擴展。

8.9 協調預防性行動:控制編排

隨著代理生態系成長,一個新的風險面出現了,是第二部前面幾章只是點到為止的東西。容量代理提議一次擴容,測試代理標記了一個與變更控管狀態相關的驗證疑慮,混沌代理回報同一個區域裡正在進行一次實驗,發布代理回報一次正在飛行中的部署。這四個代理個別來看都是正確的,全部都運作在同一套物理系統上。沒有協調,它們可能產出彼此衝突的介入:容量代理正在擴容,同時混沌代理正在注入受控延遲,合起來的效果,不是任何一方原本想要的。一個沒有被編排的代理生態系,是多個代理在平行地彼此不同意,而這個生態系愈長愈大,這種不同意就愈常自己產出突發性失效。

本節預告的「SRE 協調器」(SRE Orchestrator),第 14.2 節會把它正式展開,作為解決這些衝突的架構元件。協調器不是另一個推理代理,而是在行動可能互動的代理之間進行調解的政策強制執行層。當兩個代理提議彼此衝突的行動時,協調器依照宣告「在什麼條件下哪個代理的權限優先」的政策,評估這些提案。當兩個代理提議彼此可以無衝突組合的行動時,協調器讓兩者都通過。當情況新奇到政策沒有涵蓋時,協調器會升級給人類,而不是讓任何單一代理單方面打破僵局。協調器,正是讓代理生態系能夠擴展、而不會變成一個比它原本要解決的外部可靠性問題還糟的內部協調問題的關鍵。

特別針對事前脈絡而言,協調器最常見的決策涉及三種模式。「預防 vs. 交付」:當一次部署正在飛行中、而一個 PRS 觸發時,協調器決定事前行動應該暫停、修改,或與這次部署並行繼續。「預防 vs. 混沌」:當一次混沌實驗正在進行、而同一個區域裡一個 PRS 觸發時,協調器決定這次實驗應該中止(生產環境訊號現在比實驗性訊號更重要)還是繼續(這次實驗正是原因,中止它會解決這個 PRS)。「預防 vs. 預防」:當兩個彼此會互動的事前行動被提議時,協調器決定哪一個觸發、哪一個排隊、哪一個被駁回。這一切在概念上都不複雜,全部都是一個運作在 L4 及以上的代理生態系在結構上所必需的。

在第 14.2 節正式處理之前,值得點名的特質,是協調器的權限「源自政策」,不是源自它自己的推理。協調器不決定哪個代理的提案更好,它套用團隊撰寫的政策,那份政策宣告了「在什麼條件下哪個代理的提案優先」。當政策沒有涵蓋目前的情況時,協調器不會即興發揮,它會升級給人類。這是保護這套架構裡每一個其他元件的同一套權限紀律:代理提議,政策決定,治理平面強制執行,人類處理政策沒有預見到的情況。協調器,正是讓這套紀律能夠跨越一整個代理生態系擴展、而不只是單一代理行動的架構元件。

附註 一個沒有被編排的代理生態系,是多個代理在平行地彼此不同意。每個代理各自局部正確,系統整體卻不連貫。架構上的答案是 SRE 協調器(第 14.2 節),但這門紀律從這裡開始:代理必須向一層能看見所有其他提案的層提議行動,這套架構必須能夠拒絕彼此衝突的組合,無論任何單一代理的信心有多高。L3 到 L4 的成熟度轉換,仰賴這項特質到位;沒有它,就無法達到 L5。

在進入 8.10 之前,值得點名的架構特質,是協調器的存在,正是讓事前情報能夠擴展的關鍵。當推理平面裡只有一兩個代理時,協調可以直接由治理平面處理;當有五、六個代理(第二部目前的陣容)時,協調問題就變成了結構性的,一個專屬的編排元件也就變得必要。第十四章會在營運細節上展開 SRE 協調器。現階段,值得點名的是:這套架構從「推理平面只有一個代理」,成長到「推理平面擁有這批反覆出現的代理陣容」,需要一個前幾章不需要的協調原語。事前情報,正是這個需求第一次變得具體的地方。

8.10 可觀測性作為決策基質

第十章為第二部收尾。讀者此刻已經看見同一套架構指向四個不同的工作流程:事故應變(第五章)、交付(第六章)、混沌工程(第七章),以及事前情報(本章)。每一個工作流程都有自己的營運形狀、自己反覆出現的議題、自己典型的失效模式。沒有一個需要一套不同的架構——第四章那同一套四個平面、同一批反覆出現的代理、同一套 DRAL 迴圈、同一套五大旗艦 SLO。架構是不變量,工作流程是在地的套用。

本章完成的這次重新框架,是「可觀測性不再是一項支援功能」。過去,可觀測性是那個及時告訴人類「出事了」、讓人類能夠反應的東西。橫跨第二部,可觀測性被重塑成了不同的東西:一個這套架構的推理持續運作於其上的決策基質,產出系統狀態的結構化評估,餵給團隊所關心的各個工作流程裡的有邊界自主行動。儀表板依然存在,該觸發的呼叫依然會觸發。改變的是,儀表板與呼叫不再是可觀測性訊號的主要消費者,代理才是。這套架構讀取可觀測性的方式,就像一位資深工程師讀取它的方式:不是把它當成警報的來源,而是把它當成正在進行的決策的情境來源。差別在於,這套架構是持續地、以機器的速度、橫跨整套系統、一天二十四小時地讀取它。團隊的資深工程師做不到這一點,他們原本也從來不該做到這一點。

第三章的複利曲線,橫跨第二部全部四個工作流程存在,而第十章,正是這份複利變得最明顯可見的地方。每一起事故,都產出這套架構能夠查詢的根因分析;每一次交付,都產出 CRS 吸收的校準資料;每一次混沌實驗,都產出混沌代理挖掘模型據以變得更銳利的脆弱度證據;每一個觸發的 PRS(無論正確與否),都產出學習代理用來收緊未來預測的校準資料。這四個工作流程彼此餵養:支付服務裡的一起事故,產出一份存放在學習代理資料庫裡的根因分析;六週後,一個對類似模式觸發的 PRS,讀取那份根因分析,比沒有它的情況下更早行動。一次混沌實驗,呈現出共享連線池裡的一個脆弱度;八週後,一次交付的 CRS,把那個脆弱度讀取為歷史波動性,把這次變更透過一個更保守的模式路由過去。這一切都不是魔法,而是「同一批結構化產物,流過同一套架構,橫跨不同工作流程」的營運後果。

在第二部收尾之前,這套架構有一項值得明確點名的特質。這套架構「偏好」早期的小行動,勝過晚期的大行動。我們在第二部裡展開的每一個工作流程,都在結構上表達了這個偏好。交付的 CRS 分帶,把例行變更路由過例行模式,只有在分數真正正當化升級時才升級。混沌的有邊界實驗,以小增量、而不是戲劇性的演練,產出證據。事故應變的授權層級,偏好低爆炸半徑的自主行動,勝過高爆炸半徑、需要人類核准的行動。事前情報的分級行動序列,先觸發最小的充分介入。這個偏好不是風格上的,而是一項價值的架構性表達:自主性,靠的是「經常在小事上做對」,而不是「偶爾在大事上做對」,來贏得自己的位置。複利曲線,運行在這個偏好之上。一支架構預設採取大型介入的團隊,無法累積學習代理需要用來校準的那種證據;一支架構預設採取小型介入的團隊,則會累積出一個龐大的有邊界結果基礎,供這套架構學習。

本書其餘部分要做的轉變,是往推理平面「內部」看。到目前為止,本書一直把推理平面當成一個結構化的黑盒子:它消費情境,產出候選行動與 PRS,這套架構其餘部分則運作在它的輸出之上。第三部,要打開這個盒子裡發生的事:決策圖(第九章)、多假設推理(第九章)、正式定義的校準誤差(第九章)、推理模式與取捨建模(第十章)、自主性之下的治理與決策預算(第十一章)、模擬作為信任的基質(第十二章)。四章,展示這些代理實際上如何思考,以及這套架構必須做什麼,才能在自主性擴張的同時,讓這份思考保持值得信賴。第二部展示了代理在「行動」,第三部要展示代理在「推理」。架構是同一套,我們在看的東西改變了。