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.
23 lines
690 B
Go
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()
|
|
}
|