fix: 修复实时RPM/TPM指标显示为0的问题

- 添加调试日志以追踪数据读取过程
- 修复getRealtimeSystemMetrics中的数据验证逻辑
- 添加测试脚本用于验证时间戳匹配问题
- 改进错误处理和日志记录

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
shaw
2025-07-30 14:49:39 +08:00
parent a6ab6b7abe
commit 21461863af
3 changed files with 265 additions and 11 deletions

View File

@@ -1008,18 +1008,25 @@ class RedisClient {
async getRealtimeSystemMetrics() {
try {
const config = require('../../config/config');
const windowMinutes = config.system.metricsWindow;
const windowMinutes = config.system.metricsWindow || 5;
const now = new Date();
const currentMinute = Math.floor(now.getTime() / 60000);
// 调试:打印当前时间和分钟时间戳
logger.debug(`🔍 Realtime metrics - Current time: ${now.toISOString()}, Minute timestamp: ${currentMinute}`);
// 使用Pipeline批量获取窗口内的所有分钟数据
const pipeline = this.client.pipeline();
const minuteKeys = [];
for (let i = 0; i < windowMinutes; i++) {
const minuteKey = `system:metrics:minute:${currentMinute - i}`;
minuteKeys.push(minuteKey);
pipeline.hgetall(minuteKey);
}
logger.debug(`🔍 Realtime metrics - Checking keys: ${minuteKeys.join(', ')}`);
const results = await pipeline.exec();
// 聚合计算
@@ -1029,23 +1036,32 @@ class RedisClient {
let totalOutputTokens = 0;
let totalCacheCreateTokens = 0;
let totalCacheReadTokens = 0;
let validDataCount = 0;
results.forEach(([err, data]) => {
if (!err && data) {
results.forEach(([err, data], index) => {
if (!err && data && Object.keys(data).length > 0) {
validDataCount++;
totalRequests += parseInt(data.requests || 0);
totalTokens += parseInt(data.totalTokens || 0);
totalInputTokens += parseInt(data.inputTokens || 0);
totalOutputTokens += parseInt(data.outputTokens || 0);
totalCacheCreateTokens += parseInt(data.cacheCreateTokens || 0);
totalCacheReadTokens += parseInt(data.cacheReadTokens || 0);
logger.debug(`🔍 Realtime metrics - Key ${minuteKeys[index]} data:`, {
requests: data.requests,
totalTokens: data.totalTokens
});
}
});
logger.debug(`🔍 Realtime metrics - Valid data count: ${validDataCount}/${windowMinutes}, Total requests: ${totalRequests}, Total tokens: ${totalTokens}`);
// 计算平均值(每分钟)
const realtimeRPM = windowMinutes > 0 ? Math.round((totalRequests / windowMinutes) * 100) / 100 : 0;
const realtimeTPM = windowMinutes > 0 ? Math.round((totalTokens / windowMinutes) * 100) / 100 : 0;
return {
const result = {
realtimeRPM,
realtimeTPM,
windowMinutes,
@@ -1056,6 +1072,10 @@ class RedisClient {
totalCacheCreateTokens,
totalCacheReadTokens
};
logger.debug(`🔍 Realtime metrics - Final result:`, result);
return result;
} catch (error) {
console.error('Error getting realtime system metrics:', error);
// 如果出错,返回历史平均值作为降级方案