Files
seon fd08c32501 feat(ai-env,alerting): reference queries per alert in slo.md, rule expression as alert annotation
第 4 回 V-G1 で LLM が route フィルタのない 5 分窓の p95(0.017 秒)を根拠に
「遅延なし」と結論した。slo.md にアラートごとの基準クエリ(規則と同じ式、
legacy のインスタンス別遅延と要求率を含む)を書き、確かめ直すときは同じ式を
使わせる。各規則の annotations.condition に式をそのまま入れ、AI 側が
「アラート条件が解消したか」を計算できるようにする(Jev の recovering 再定義)。
2026-10-09 08:33:22 +09:00

16 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
可用性: キャンペーン期間を通じて avg_over_time(probe_success[5m]) >= 99.5%。レイテンシ: api の p95(histogram_quantile(0.95, sum by (le) (rate(demo_http_request_duration_seconds_bucket{route=~"orders|price"}[5m]))))が 0.5 秒未満。エラー率: 5 分間の 5xx / 全リクエストが 1% 未満。
復旧(t_recover)は、プローブが 12 回連続(3 分)で成功し、かつ 5 分窓のレイテンシとエラー率が SLO の内側に戻ったときにハーネスが宣言する。
層: 1 = プラットフォーム内部の自動復旧(kubelet の再起動、ReplicaSet、Argo CD selfHeal、MIG autohealing、compose の restart)。2 = あなたの提案 + Discord での人の承認、実行はハーネス。3 = 人だけが行う(不可逆な操作、15 分以内に承認がない場合、確信度 0.5 未満)。
アラートルールと意味: ProbeDown(probe_success == 0 が 1 分、症状のみ)、ApiLatencyHigh(直近 1 分の p95 > 500 ms が 2 分)、ApiErrorRateHigh(5xx > 1% が 3 分)、PodCrashLooping(5 分で 3 回以上の再起動。まず層 1、5 分後に層 2)、LegacyUnhealthy(up な legacy-api インスタンスが 2 未満。まず autohealing、10 分後に層 2)、DbReplicationLag(遅延 > 60 秒、または replay が一時停止)、ApiMemoryPressure(api コンテナのメモリが limit の 80% 超を 1 分継続。グレーゾーン、承認後に rollout restart)、DbPrimaryDown(TCP 5432 の失敗が 1 分)、GitOpsDrift(OutOfSync が 5 分。selfHeal が処理する)。
アラートを確かめ直すときは、必ずアラート規則と同じ式(基準クエリ)を使う。route フィルタを外した式は healthz の速い要求で希釈され、遅延を見逃す(第 4 回 V-G1 の誤診)。基準クエリ:
- ProbeDown: probe_success{job="blackbox",target="alb"}
- ApiLatencyHigh: histogram_quantile(0.95, sum by (le) (rate(demo_http_request_duration_seconds_bucket{route=~"orders|price"}[1m])))。遅延の所在を分ける: api→legacy の上流遅延は histogram_quantile(0.95, sum by (le) (rate(demo_legacy_request_duration_seconds_bucket[1m])))、legacy のインスタンス別は histogram_quantile(0.95, sum by (instance, le) (rate(legacy_http_request_duration_seconds_bucket[1m])))、インスタンス別の要求率は sum by (instance) (rate(legacy_http_requests_total{route!="healthz"}[2m]))。1 分窓が高く 5 分窓が低いのは ILB が接続を別インスタンスへ逃がした直後で、遅いインスタンスが残っている限り原因は消えていない(network_latency_legacy、処置は mig.recreate_instance、対象はそのインスタンス名 legacy-xxxx)。
- ApiErrorRateHigh: sum(rate(demo_http_requests_total{route=~"orders|price",status=~"5.."}[5m])) / sum(rate(demo_http_requests_total{route=~"orders|price"}[5m]))
- ApiMemoryPressure: max by (pod) (container_memory_working_set_bytes{namespace="demo",container="api"}) / on (pod) max by (pod) (kube_pod_container_resource_limits{namespace="demo",container="api",resource="memory"})
- PodCrashLooping: increase(kube_pod_container_status_restarts_total{namespace="demo"}[5m])
- LegacyUnhealthy: up{job="legacy-api"}
- DbReplicationLag: max(pg_replication_lag_seconds) と max(pg_is_wal_replay_paused)
- DbPrimaryDown: probe_success{job="blackbox",target="db-primary"}
- GitOpsDrift: argocd_app_info{sync_status!="Synced"}
アラートの annotations.condition にも規則の式がそのまま入っている。