fix(critic-h2-h4): proactive_inspector metric 改名 + probe_success fallback
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 2m7s
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 2m7s
H2 — metric semantic 切換污染 baseline: - cpu_usage_awoooi_api → cpu_usage_node_188 - memory_usage_awoooi_api → memory_usage_node_188 原 metric_name 對應 container working set,新 PromQL 改為 node-level ratio (cadvisor 停止後的替代)。語意完全不同但保留同名 → 既有 DynamicBaseline 模型用舊單位訓練的 σ 對新值失真,5 分鐘 inspector 週期會狂報假 anomaly。 改名後 baseline 從零學習,初期 sample 數不足會被 _has_enough_samples 守門 跳過告警,安全度過 30 個週期暖機期。 H4 — probe_success 全部不可達假觸發: - 1 - avg(probe_success) + 1 - avg(probe_success or on() vector(1)) 原 expr 在 Blackbox 全部 target 失聯時 avg 回空 vector → _fetch_current_value 若把空當 0 → 1-0=1 遠超 0.05 threshold → 5min 一次假告警。 fallback 視為全部成功(值=1,1-1=0),真實 probe down 由獨立的 BlackboxProbeFailure rule 偵測,責任分離。 部署後驗證: - baseline 表新增 metric_name='memory_usage_node_188' / 'cpu_usage_node_188' 的 row - 舊 metric_name='memory_usage_awoooi_api' / 'cpu_usage_awoooi_api' 的 row 30 天後可清理 - proactive_inspection_logs 30 個週期內看 _baseline_warmup_skipped 條目而非假 anomaly Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -46,32 +46,41 @@ K8S_NAMESPACE = "awoooi-prod"
|
||||
# - http_error_rate: Prometheus 實測確認 metric 名稱為 probe_success(非 blackbox_probe_success)
|
||||
# - cpu_usage_awoooi_api: cadvisor up=0(停止),改用 node-exporter node_cpu_seconds_total(node level)
|
||||
# - memory_usage_awoooi_api: cadvisor 停止,改用 node-exporter 記憶體使用率比例(0-1 scale)
|
||||
# 2026-04-26 critic-H2/H4 hotfix by Claude Opus 4.7:
|
||||
# - cpu/memory metric 改名 _node_188 — 語意從 container 變 node,避免污染既有 baseline
|
||||
# 舊 baseline (container working set) 的數值範圍跟新 (node ratio) 完全不同,
|
||||
# 保留同名會造成 baseline 學到的 σ 完全失真,5 分鐘內狂報假 anomaly。
|
||||
# - http_error_rate 加 `or vector(1)` fallback:probe_success 全部不可達時不誤觸發
|
||||
MONITORED_METRICS: list[dict[str, Any]] = [
|
||||
{
|
||||
"name": "http_error_rate",
|
||||
# probe_success:Blackbox Exporter 實際 metric 名稱(非 blackbox_probe_success)
|
||||
# 實測確認:curl 'http://192.168.0.188:9090/api/v1/query' --data-urlencode 'query=avg(probe_success)' → 0.944
|
||||
"promql": '1 - avg(probe_success)',
|
||||
# 2026-04-26 H4 hotfix: avg() 在所有 target 缺值時回空 vector,搭配 fallback `or vector(1)`
|
||||
# 防 _fetch_current_value 把空當 0 → 1-0=1 → 5min 一次假告警洪水
|
||||
# 語意:探測全失敗時 fallback=1(視為「全部成功」),避免假告警;真正 down 由 BlackboxProbeFailure 抓
|
||||
"promql": '1 - avg(probe_success or on() vector(1))',
|
||||
"threshold": 0.05, # > 5% probe 失敗 = 警戒
|
||||
"description": "HTTP Probe 失敗率(Blackbox Exporter)",
|
||||
},
|
||||
{
|
||||
"name": "cpu_usage_awoooi_api",
|
||||
# 2026-04-26 H2 hotfix: 改名 _node_188(原 _awoooi_api 語意是 container working set)
|
||||
"name": "cpu_usage_node_188",
|
||||
# cadvisor up=0(prod-docker-188 離線),改用 node-exporter node-level CPU
|
||||
# 實測確認:avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) → 有資料
|
||||
# threshold 0.85 = 85% CPU 使用率(node level,0-1 比例)
|
||||
"promql": 'avg(rate(node_cpu_seconds_total{mode!="idle"}[5m]))',
|
||||
"threshold": 0.85, # > 85% node CPU(所有 core 平均)
|
||||
"description": "Node CPU 使用率(node-exporter,cadvisor 停止時替代)",
|
||||
"description": "Node 188 CPU 使用率(node-exporter,cadvisor 停止時替代)",
|
||||
},
|
||||
{
|
||||
"name": "memory_usage_awoooi_api",
|
||||
# 2026-04-26 H2 hotfix: 改名 _node_188
|
||||
"name": "memory_usage_node_188",
|
||||
# cadvisor 停止,改用 node-exporter 節點記憶體使用率比例(0-1)
|
||||
# 實測確認:188 機器 62.76 GiB,當前 ~30% 使用率
|
||||
# threshold 0.85 = 85% node memory usage
|
||||
"promql": '(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes',
|
||||
"threshold": 0.85, # > 85% node memory(0-1 比例)
|
||||
"description": "Node 記憶體使用率(node-exporter,cadvisor 停止時替代)",
|
||||
"description": "Node 188 記憶體使用率(node-exporter,cadvisor 停止時替代)",
|
||||
},
|
||||
{
|
||||
"name": "pod_restart_rate",
|
||||
|
||||
Reference in New Issue
Block a user