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:
1 parent
795be156d9
commit
13797e5741
5 files changed
+178
-30
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user