监控
This commit is contained in:
@@ -186,3 +186,66 @@ func (m *PollingQueueManager) GetTotalQueueDepth(ctx context.Context, taskType s
|
||||
}
|
||||
return total, firstErr
|
||||
}
|
||||
|
||||
// GetTotalDueCount 获取指定任务类型所有分片中已到期的队列数量。
|
||||
// 只统计 score <= now 的成员,用于后台监控展示真实待调度积压。
|
||||
func (m *PollingQueueManager) GetTotalDueCount(ctx context.Context, taskType string, now time.Time) (int64, error) {
|
||||
var total int64
|
||||
var firstErr error
|
||||
for i := 0; i < m.shardCount; i++ {
|
||||
key := constants.RedisPollingShardQueueKey(i, taskType)
|
||||
count, err := m.redis.ZCount(ctx, key, "-inf", fmt.Sprintf("%d", now.Unix())).Result()
|
||||
if err != nil {
|
||||
m.logger.Warn("获取分片到期数量失败",
|
||||
zap.Int("shard_id", i),
|
||||
zap.String("task_type", taskType),
|
||||
zap.Error(err))
|
||||
if firstErr == nil {
|
||||
firstErr = err
|
||||
}
|
||||
continue
|
||||
}
|
||||
total += count
|
||||
}
|
||||
return total, firstErr
|
||||
}
|
||||
|
||||
// GetAverageWaitTime 获取指定任务类型所有分片最早若干任务的平均等待秒数。
|
||||
// 每个分片最多取 samplePerShard 条,避免监控接口扫描完整队列。
|
||||
func (m *PollingQueueManager) GetAverageWaitTime(ctx context.Context, taskType string, now time.Time, samplePerShard int64) (float64, error) {
|
||||
if samplePerShard <= 0 {
|
||||
samplePerShard = 10
|
||||
}
|
||||
|
||||
var totalWait float64
|
||||
var sampleCount int64
|
||||
var firstErr error
|
||||
nowUnix := now.Unix()
|
||||
|
||||
for i := 0; i < m.shardCount; i++ {
|
||||
key := constants.RedisPollingShardQueueKey(i, taskType)
|
||||
earliest, err := m.redis.ZRangeWithScores(ctx, key, 0, samplePerShard-1).Result()
|
||||
if err != nil {
|
||||
m.logger.Warn("获取分片最早任务失败",
|
||||
zap.Int("shard_id", i),
|
||||
zap.String("task_type", taskType),
|
||||
zap.Error(err))
|
||||
if firstErr == nil {
|
||||
firstErr = err
|
||||
}
|
||||
continue
|
||||
}
|
||||
for _, z := range earliest {
|
||||
waitTime := float64(nowUnix) - z.Score
|
||||
if waitTime > 0 {
|
||||
totalWait += waitTime
|
||||
}
|
||||
sampleCount++
|
||||
}
|
||||
}
|
||||
|
||||
if sampleCount == 0 {
|
||||
return 0, firstErr
|
||||
}
|
||||
return totalWait / float64(sampleCount), firstErr
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user