feat(panel): CPU average window 15m -> 5m in panels and CLI

- Switch the CPU average window from -15m to -5m across admin/user panels
  and the CLI list/show path (mgr.List, mgr.Show, BatchUsers, PanelResources).
- Relabel the column/card to 5分钟CPU / 5m CPU.

The dashboard CPU figure now reflects the trailing 5-minute average.
This commit is contained in:
bluebluesoda committed 2026-08-25 05:49:26 +00:00
1 parent bd55fc4a77
commit 1a104e3cb0
6 files changed
+10 -10

No files matched your search

@@ -195,7 +195,7 @@ a.copy.copied { border-color: #86efac; background: #dcfce7; color: #15803d; }
<th>{{if eq .Lang "zh"}}状态{{else}}State{{end}}</th>
<th>{{if eq .Lang "zh"}}端口/SSH{{else}}Ports/SSH{{end}}</th>
<th>{{if eq .Lang "zh"}}配额 CPU/内存/磁盘{{else}}Quota CPU/Mem/Disk{{end}}</th>
<th class="sortable" data-type="number">{{if eq .Lang "zh"}}15分钟CPU{{else}}15m CPU{{end}}<span class="ind"></span></th>
<th class="sortable" data-type="number">{{if eq .Lang "zh"}}5分钟CPU{{else}}5m CPU{{end}}<span class="ind"></span></th>
<th class="sortable" data-type="number">{{if eq .Lang "zh"}}内存{{else}}Mem{{end}}<span class="ind"></span></th>
<th class="sortable" data-type="number">{{if eq .Lang "zh"}}进程{{else}}Procs{{end}}<span class="ind"></span></th>
<th class="sortable" data-type="number">{{if eq .Lang "zh"}}磁盘{{else}}Disk{{end}}<span class="ind"></span></th>
@@ -417,7 +417,7 @@ function del(name){
var qc = document.getElementById('quotaCpu');
if (qc) qc.addEventListener('input', function(){ syncCpuStep(qc); });
})();
// Clickable column headers for Name / 15m CPU / Mem / Procs / Disk: cycle
// Clickable column headers for Name / 5m CPU / Mem / Procs / Disk: cycle
// ascending -> descending -> default. Only one column sorts at a time; the
// default state restores the original render order.
(function(){
+2 -2
View File
@@ -130,7 +130,7 @@ func readUptime() time.Duration {
}
// UserStatus is one row of the admin user table: the DB user record plus the
// latest persisted resource sample and fifteen-minute CPU average.
// latest persisted resource sample and five-minute CPU average.
type UserStatus struct {
User *db.User
State string
@@ -154,7 +154,7 @@ func (m *Manager) BatchUsers() ([]*UserStatus, error) {
if err != nil {
return nil, err
}
average, err := m.db.AverageCPU(time.Now().Add(-15 * time.Minute).Unix())
average, err := m.db.AverageCPU(time.Now().Add(-5 * time.Minute).Unix())
if err != nil {
return nil, err
}
+2 -2
View File
@@ -716,7 +716,7 @@ func (m *Manager) List() ([]*Result, error) {
return nil, err
}
latest, _ := m.db.LatestResourceSamples()
average, _ := m.db.AverageCPU(time.Now().Add(-15 * time.Minute).Unix())
average, _ := m.db.AverageCPU(time.Now().Add(-5 * time.Minute).Unix())
live := m.liveStatusFallback(users, latest)
out := make([]*Result, 0, len(users))
for _, u := range users {
@@ -735,7 +735,7 @@ func (m *Manager) Show(name string) (*Result, error) {
return nil, err
}
latest, _ := m.db.LatestResourceSamples()
average, _ := m.db.AverageCPU(time.Now().Add(-15 * time.Minute).Unix())
average, _ := m.db.AverageCPU(time.Now().Add(-5 * time.Minute).Unix())
sample, hasSample := latest[u.ID]
live := m.liveStatusFallback([]*db.User{u}, latest)
avg, hasAverage := average[u.ID]
+2 -2
View File
@@ -229,14 +229,14 @@ func decorateStoredUsage(r *Result, sample db.ResourceSample, hasSample bool, av
}
// PanelResources returns the persisted usage for a user's panel page: the
// fifteen-minute CPU average and the latest memory/disk usage, formatted for
// five-minute CPU average and the latest memory/disk usage, formatted for
// display. No Incus call is made — the data comes from the background sampler.
func (m *Manager) PanelResources(userID int64) (cpuUse, memUse, diskUse string) {
latest, err := m.db.LatestResourceSamples()
if err != nil {
return "-", "-", "-"
}
avg, err := m.db.AverageCPU(time.Now().Add(-15 * time.Minute).Unix())
avg, err := m.db.AverageCPU(time.Now().Add(-5 * time.Minute).Unix())
if err != nil {
avg = map[int64]float64{}
}
+1 -1
View File
@@ -311,7 +311,7 @@ func (s *Server) buildData(u *db.User, msg, errMsg string) pageData {
Msg: msg,
Err: errMsg,
}
// Resource usage comes from the persisted sampler snapshot (fifteen-minute
// Resource usage comes from the persisted sampler snapshot (five-minute
// CPU average plus latest memory/disk), never from a live Incus sample.
d.CPUUse, d.MemUse, d.DiskUsed = s.mgr.PanelResources(u.ID)
// One `incus list` call only for the container status (must be live).
+1 -1
View File
@@ -196,7 +196,7 @@ footer a{color:var(--muted);text-decoration:underline}
<div class="qitem"><span class="qlabel">{{if eq .Lang "zh"}}磁盘{{else}}Disk{{end}}</span><span class="qval">{{.QuotaDisk}}</span></div>
</div>
<div class="qgrid">
<div class="qitem"><span class="qlabel">{{if eq .Lang "zh"}}15分钟CPU{{else}}15m CPU{{end}}</span><span class="qval">{{.CPUUse}}</span></div>
<div class="qitem"><span class="qlabel">{{if eq .Lang "zh"}}5分钟CPU{{else}}5m CPU{{end}}</span><span class="qval">{{.CPUUse}}</span></div>
<div class="qitem"><span class="qlabel">{{if eq .Lang "zh"}}已用内存{{else}}Mem used{{end}}</span><span class="qval">{{.MemUse}}</span></div>
<div class="qitem"><span class="qlabel">{{if eq .Lang "zh"}}已用磁盘{{else}}Disk used{{end}}</span><span class="qval">{{.DiskUsed}}</span></div>
</div>