feat(ai): redesign the Jev triage state and add JEV_MODE=enforce review rules

第 2 回キャンペーンの突き合わせ結果を反映した。triage の state にコードで計算した
最新値の要約(now: プローブ、1 分 p95、1 分エラー率、再起動数、slo_now_ok)と
直近 5 分のエラーログ抜粋を加え、recovering は slo_now_ok を読むだけにした。
layer の choice を irreversible_needed の noul に置き換え、target_valid は
カタログ action のときだけ尋ねる。JEV_MODE=enforce では review の 2 ルール
(best_action 不一致かつ確信度 0.9 以上、target_valid 0.5 未満)で提案を
escalate に格下げし、判断を res.jev.enforced に記録する。既定は shadow のまま。
This commit is contained in:
seon committed 2026-10-08 17:45:28 +09:00
1 parent 795be156d9
commit 13797e5741
5 files changed
+178 -30

No files matched your search

+19
View File
@@ -7,6 +7,7 @@ import (
"encoding/json"
"fmt"
"io"
"math"
"net/http"
"net/url"
"os"
@@ -206,6 +207,24 @@ func (r *Runner) queryMetrics(ctx context.Context, promql string, minutes int64)
return map[string]any{"series_count": len(pr.Data.Result), "series": out, "range_minutes": minutes}, nil
}
// Instant runs an instant PromQL query and returns the first sample as a float (NaN when the series is absent).
func (r *Runner) Instant(ctx context.Context, promql string) (float64, error) {
q := url.Values{"query": {promql}}
var pr promResp
if err := r.getJSON(ctx, strings.TrimRight(r.cfg.MimirURL, "/")+"/api/v1/query?"+q.Encode(), &pr); err != nil {
return math.NaN(), err
}
if len(pr.Data.Result) == 0 || len(pr.Data.Result[0].Value) != 2 {
return math.NaN(), nil
}
sv, _ := pr.Data.Result[0].Value[1].(string)
f, err := strconv.ParseFloat(sv, 64)
if err != nil {
return math.NaN(), err
}
return f, nil
}
func (r *Runner) probeStatus(ctx context.Context) (any, error) {
q := url.Values{"query": {"probe_success"}}
var pr promResp