Aggregate monitor history into daily rollups and add maintenance helpers for rollup refresh and history cleanup.
66 lines
2.7 KiB
Go
66 lines
2.7 KiB
Go
package service
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/QuantumNous/new-api/model"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestAggregateChannelMonitorDailyRollupsForDateUpsertsIdempotently(t *testing.T) {
|
|
db := setupChannelMonitorTestDB(t)
|
|
day := time.Date(2026, 5, 20, 10, 0, 0, 0, time.UTC)
|
|
|
|
histories := []model.ChannelMonitorHistory{
|
|
{MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "pass", LatencyMs: 100, CheckedAt: day.Add(-9 * time.Hour)},
|
|
{MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "degraded", LatencyMs: 300, CheckedAt: day.Add(-8 * time.Hour)},
|
|
{MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "failed", LatencyMs: 500, CheckedAt: day.Add(-7 * time.Hour)},
|
|
{MonitorId: 12, ChannelId: 8, ModelName: "other-model", Status: "pass", LatencyMs: 900, CheckedAt: day.Add(-6 * time.Hour)},
|
|
{MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "pass", LatencyMs: 999, CheckedAt: day.Add(15 * time.Hour)},
|
|
}
|
|
require.NoError(t, db.Create(&histories).Error)
|
|
|
|
written, err := AggregateChannelMonitorDailyRollupsForDate(day)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, written)
|
|
|
|
written, err = AggregateChannelMonitorDailyRollupsForDate(day)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, written)
|
|
|
|
var rollup model.ChannelMonitorDailyRollup
|
|
require.NoError(t, db.First(&rollup, "monitor_id = ? AND channel_id = ? AND model_name = ? AND date = ?", 11, 7, "gpt-test", "2026-05-20").Error)
|
|
require.Equal(t, 3, rollup.TotalChecks)
|
|
require.Equal(t, 1, rollup.PassCount)
|
|
require.Equal(t, 1, rollup.DegradedCount)
|
|
require.Equal(t, 1, rollup.FailedCount)
|
|
require.Equal(t, 300, rollup.AvgLatencyMs)
|
|
|
|
var count int64
|
|
require.NoError(t, db.Model(&model.ChannelMonitorDailyRollup{}).
|
|
Where("monitor_id = ? AND channel_id = ? AND model_name = ? AND date = ?", 11, 7, "gpt-test", "2026-05-20").
|
|
Count(&count).Error)
|
|
require.Equal(t, int64(1), count)
|
|
}
|
|
|
|
func TestCleanOldChannelMonitorHistoryDeletesRecordsBeforeRetention(t *testing.T) {
|
|
db := setupChannelMonitorTestDB(t)
|
|
now := time.Date(2026, 5, 20, 12, 0, 0, 0, time.UTC)
|
|
|
|
histories := []model.ChannelMonitorHistory{
|
|
{MonitorId: 1, ChannelId: 1, ModelName: "old", Status: "pass", CheckedAt: now.AddDate(0, 0, -8)},
|
|
{MonitorId: 1, ChannelId: 1, ModelName: "recent", Status: "pass", CheckedAt: now.AddDate(0, 0, -6)},
|
|
}
|
|
require.NoError(t, db.Create(&histories).Error)
|
|
|
|
deleted, err := CleanOldChannelMonitorHistory(7*24*time.Hour, now)
|
|
require.NoError(t, err)
|
|
require.Equal(t, int64(1), deleted)
|
|
|
|
var remaining []model.ChannelMonitorHistory
|
|
require.NoError(t, db.Order("id ASC").Find(&remaining).Error)
|
|
require.Len(t, remaining, 1)
|
|
require.Equal(t, "recent", remaining[0].ModelName)
|
|
}
|