Files
3x-ui-agent/internal/web/job/probe_history_job.go
T
Rogue 3e052c42b8 feat(probe): history store + whole-machine traffic ledger in probe.db (item 7 B2)
New internal/web/service/probe package keeps probe history in its own
probe.db beside the panel DB (single connection, WAL), so history
writes never contend with the panel write lock.

- Minute rows per hub semantics: a held-reading rhythm books traffic
  against each reading own arrival; minute buckets merge (means,
  rounded int means, peaks) and the stored net rate derives from the
  kernel counters between row marks, falling back to agent rates at
  epoch breaks.
- probe_traffic ledger: accumulate is a line port of hub traffic.rs
  (baseline alignment, same-boot shrink books 0, epoch change books 0,
  unseen-boot exception books the whole counters-since-boot measured
  against the master last-seen stamp, per-direction period resets,
  saturating adds); reads gate stale day/month stamps to zero.
- probe_meta rows are ensured for every reporting agent (B3 edits
  them in place); probe_ping_* tables are created now, written by B4.
- Hourly roll_up behind a watermark (hour-aligned, late grace,
  pre-retention hours skipped unfoldered) and watermark-guarded
  chunked prune (minute tier 7 days or the retention window when
  shorter; hourly tier to retention_days, default 7, cap 365).
- Wiring: heartbeat files probe samples after the snapshot update
  (last-seen captured before touch); housekeeping hangs off the
  existing robfig/cron in web.startTask (@hourly + one pass a minute
  after startup, mirroring the hub boot pass); Server.stop books held
  readings. Every failure path logs and degrades - a broken probe.db
  never fails a heartbeat or the panel.
2026-10-22 19:43:59 +00:00

23 lines
690 B
Go

package job
import (
"github.com/mhsanaei/3x-ui/v3/internal/web/service/probe"
)
// ProbeHistoryJob is the hourly housekeeping of the item 7 probe
// history (roll_up + prune against probe.db). The heavy lifting lives
// in the probe package; the job is a thin cron shell, and every failure
// is logged there rather than propagated — a broken history store must
// never disturb the panel.
type ProbeHistoryJob struct{}
// NewProbeHistoryJob creates a probe history maintenance job instance.
func NewProbeHistoryJob() *ProbeHistoryJob {
return new(ProbeHistoryJob)
}
// Run executes one maintenance pass (roll_up, then prune).
func (j *ProbeHistoryJob) Run() {
probe.Maintain()
}