fix(dashboard): 修复性能指标 RPM/TPM 显示为0的问题

- 修复 Admin Dashboard Handler 遗漏返回 rpm/tpm 字段
- 将性能统计时间窗口从1分钟改为5分钟平均值,数据更稳定
This commit is contained in:
shaw
2025-12-24 19:58:33 +08:00
parent 870b21916c
commit aaadd6ed04
5 changed files with 17 additions and 12 deletions

View File

@@ -107,6 +107,10 @@ func (h *DashboardHandler) GetStats(c *gin.Context) {
// 系统运行统计 // 系统运行统计
"average_duration_ms": stats.AverageDurationMs, "average_duration_ms": stats.AverageDurationMs,
"uptime": uptime, "uptime": uptime,
// 性能指标
"rpm": stats.Rpm,
"tpm": stats.Tpm,
}) })
} }

View File

@@ -44,8 +44,8 @@ type DashboardStats struct {
AverageDurationMs float64 `json:"average_duration_ms"` // 平均响应时间 AverageDurationMs float64 `json:"average_duration_ms"` // 平均响应时间
// 性能指标 // 性能指标
Rpm int64 `json:"rpm"` // 最近1分钟请求数 Rpm int64 `json:"rpm"` // 近5分钟平均每分钟请求数
Tpm int64 `json:"tpm"` // 最近1分钟Token数 Tpm int64 `json:"tpm"` // 近5分钟平均每分钟Token数
} }
// TrendDataPoint represents a single point in trend data // TrendDataPoint represents a single point in trend data
@@ -121,8 +121,8 @@ type UserDashboardStats struct {
AverageDurationMs float64 `json:"average_duration_ms"` AverageDurationMs float64 `json:"average_duration_ms"`
// 性能指标 // 性能指标
Rpm int64 `json:"rpm"` // 最近1分钟请求数 Rpm int64 `json:"rpm"` // 近5分钟平均每分钟请求数
Tpm int64 `json:"tpm"` // 最近1分钟Token数 Tpm int64 `json:"tpm"` // 近5分钟平均每分钟Token数
} }
// UsageLogFilters represents filters for usage log queries // UsageLogFilters represents filters for usage log queries

View File

@@ -19,9 +19,9 @@ func NewUsageLogRepository(db *gorm.DB) *UsageLogRepository {
return &UsageLogRepository{db: db} return &UsageLogRepository{db: db}
} }
// getPerformanceStats 获取 RPM 和 TPM可选按用户过滤 // getPerformanceStats 获取 RPM 和 TPM近5分钟平均值可选按用户过滤)
func (r *UsageLogRepository) getPerformanceStats(ctx context.Context, userID int64) (rpm, tpm int64) { func (r *UsageLogRepository) getPerformanceStats(ctx context.Context, userID int64) (rpm, tpm int64) {
oneMinuteAgo := time.Now().Add(-1 * time.Minute) fiveMinutesAgo := time.Now().Add(-5 * time.Minute)
var perfStats struct { var perfStats struct {
RequestCount int64 `gorm:"column:request_count"` RequestCount int64 `gorm:"column:request_count"`
TokenCount int64 `gorm:"column:token_count"` TokenCount int64 `gorm:"column:token_count"`
@@ -32,14 +32,15 @@ func (r *UsageLogRepository) getPerformanceStats(ctx context.Context, userID int
COUNT(*) as request_count, COUNT(*) as request_count,
COALESCE(SUM(input_tokens + output_tokens), 0) as token_count COALESCE(SUM(input_tokens + output_tokens), 0) as token_count
`). `).
Where("created_at >= ?", oneMinuteAgo) Where("created_at >= ?", fiveMinutesAgo)
if userID > 0 { if userID > 0 {
db = db.Where("user_id = ?", userID) db = db.Where("user_id = ?", userID)
} }
db.Scan(&perfStats) db.Scan(&perfStats)
return perfStats.RequestCount, perfStats.TokenCount // 返回5分钟平均值
return perfStats.RequestCount / 5, perfStats.TokenCount / 5
} }
func (r *UsageLogRepository) Create(ctx context.Context, log *model.UsageLog) error { func (r *UsageLogRepository) Create(ctx context.Context, log *model.UsageLog) error {

View File

@@ -35,8 +35,8 @@ export interface UserDashboardStats {
today_cost: number; // 今日标准计费 today_cost: number; // 今日标准计费
today_actual_cost: number; // 今日实际扣除 today_actual_cost: number; // 今日实际扣除
average_duration_ms: number; average_duration_ms: number;
rpm: number; // 最近1分钟请求数 rpm: number; // 近5分钟平均每分钟请求数
tpm: number; // 最近1分钟Token数 tpm: number; // 近5分钟平均每分钟Token数
} }
export interface TrendParams { export interface TrendParams {

View File

@@ -520,8 +520,8 @@ export interface DashboardStats {
uptime: number; // 系统运行时间(秒) uptime: number; // 系统运行时间(秒)
// 性能指标 // 性能指标
rpm: number; // 最近1分钟请求数 rpm: number; // 近5分钟平均每分钟请求数
tpm: number; // 最近1分钟Token数 tpm: number; // 近5分钟平均每分钟Token数
} }
export interface UsageStatsResponse { export interface UsageStatsResponse {