fix(critic-h2-h4): proactive_inspector metric 改名 + probe_success fallback
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:
Your Name
2026-04-26 20:40:57 +08:00
parent 32affaffeb
commit 75b404379b

View File

@@ -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_totalnode 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)` fallbackprobe_success 全部不可達時不誤觸發
MONITORED_METRICS: list[dict[str, Any]] = [
{
"name": "http_error_rate",
# probe_successBlackbox 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=0prod-docker-188 離線),改用 node-exporter node-level CPU
# 實測確認avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) → 有資料
# threshold 0.85 = 85% CPU 使用率node level0-1 比例)
"promql": 'avg(rate(node_cpu_seconds_total{mode!="idle"}[5m]))',
"threshold": 0.85, # > 85% node CPU所有 core 平均)
"description": "Node CPU 使用率node-exportercadvisor 停止時替代)",
"description": "Node 188 CPU 使用率node-exportercadvisor 停止時替代)",
},
{
"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 memory0-1 比例)
"description": "Node 記憶體使用率node-exportercadvisor 停止時替代)",
"description": "Node 188 記憶體使用率node-exportercadvisor 停止時替代)",
},
{
"name": "pod_restart_rate",