fix: follow live request results and prioritize usable groups

This commit is contained in:
cneicy committed 2026-09-26 14:49:12 +08:00
1 parent 5152a4080e
commit d09216bbde
12 files changed
+257 -86

No files matched your search

+26 -14
View File
@@ -126,7 +126,7 @@ func currentGroupMonitors(ctx context.Context, admin bool) ([]UptimeGroupResult,
groupCacheSnapshot.updated = now
groupCacheSnapshot.channels = string(encoded)
}
successes := perfmetrics.LatestUserSuccess(ctx, order)
userResults := perfmetrics.LatestUserResults(ctx, order)
monitors := make([]Monitor, 0, len(order))
for _, group := range order {
monitor := Monitor{ID: model.DetectionSecretHash(group)[:16], Name: group, Status: -1, Models: models[group]}
@@ -158,16 +158,8 @@ func currentGroupMonitors(ctx context.Context, admin bool) ([]UptimeGroupResult,
monitor.Metrics.Group = monitor.Name
}
monitor.Pelican = detections[group].Pelican
monitor.StatusSource = "requests"
if monitor.ChannelDisabled {
monitor.StatusSource = "disabled"
} else if monitor.Status < 0 {
monitor.Status = detections[group].Status
monitor.StatusSource = "detection"
monitor.StatusCheckedAt = detections[group].At
}
monitor.ProbeHistory = detections[group].ProbeHistory
applyUserSuccess(&monitor, successes[group], detections[group].At, now.Unix())
applyCurrentStatus(&monitor, userResults[group], now.Unix())
monitors = append(monitors, monitor)
}
return []UptimeGroupResult{{CategoryName: "Groups", Monitors: monitors}}, nil
@@ -196,11 +188,31 @@ func requestStatus(rate float64) int {
return 0
}
func applyUserSuccess(monitor *Monitor, success, probe, now int64) {
if !monitor.ChannelDisabled && success > 0 && success >= now-900 && success >= probe {
monitor.Status = 1
func applyCurrentStatus(monitor *Monitor, result perfmetrics.UserRequestResult, now int64) {
monitor.Status, monitor.StatusCheckedAt = -1, 0
monitor.StatusSource = "detection"
if monitor.ChannelDisabled {
monitor.Status = 0
monitor.StatusSource = "disabled"
return
}
// Current availability uses dedicated probes, not quality tests or hourly
// request ratios. Allow one missed 15-minute probe before evidence expires.
for _, probe := range monitor.ProbeHistory {
if probe.At > 0 && probe.At >= now-1800 && probe.At <= now && probe.At >= monitor.StatusCheckedAt {
monitor.Status = probe.Status
monitor.StatusCheckedAt = probe.At
}
}
// The latest real user result is stronger evidence than synthetic checks
// on another member channel, whether it succeeded or failed.
if at := result.At / 1000; at > 0 && at >= now-900 && at <= now {
monitor.Status = 0
if result.Success {
monitor.Status = 1
}
monitor.StatusSource = "requests"
monitor.StatusCheckedAt = success
monitor.StatusCheckedAt = at
}
}