ccpoad / internal /storage /sql /metrics_finalize.go
anyalerob's picture
Upload folder using huggingface_hub
2986042 verified
Raw
History Blame Contribute Delete
2.05 kB
package sql
import (
"context"
"fmt"
"log"
"time"
"ccLoad/internal/model"
)
type metricAggregationHelper struct {
totalFirstByteTime float64
firstByteCount int
totalDuration float64
durationCount int
}
func (s *SQLStore) finalizeMetricPoints(ctx context.Context, mapp map[int64]*model.MetricPoint, helperMap map[int64]*metricAggregationHelper, channelIDsToFetch map[int64]bool, since, until time.Time, bucket time.Duration) []model.MetricPoint {
channelNames, err := s.fetchChannelNamesBatch(ctx, channelIDsToFetch)
if err != nil {
log.Printf("[WARN] 批量查询渠道名称失败: %v", err)
channelNames = make(map[int64]string)
}
for bucketTs, mp := range mapp {
newChannels := make(map[string]model.ChannelMetric)
for key, metric := range mp.Channels {
if key == "未知渠道" {
newChannels[key] = metric
continue
}
var channelID int64
_, _ = fmt.Sscanf(key, "ch_%d", &channelID)
if name, ok := channelNames[channelID]; ok {
newChannels[name] = metric
} else {
newChannels["未知渠道"] = metric
}
}
mp.Channels = newChannels
if helper, ok := helperMap[bucketTs]; ok {
if helper.firstByteCount > 0 {
avgFBT := helper.totalFirstByteTime / float64(helper.firstByteCount)
mp.AvgFirstByteTimeSeconds = new(float64)
*mp.AvgFirstByteTimeSeconds = avgFBT
mp.FirstByteSampleCount = helper.firstByteCount
}
if helper.durationCount > 0 {
avgDur := helper.totalDuration / float64(helper.durationCount)
mp.AvgDurationSeconds = new(float64)
*mp.AvgDurationSeconds = avgDur
mp.DurationSampleCount = helper.durationCount
}
}
}
out := []model.MetricPoint{}
endTime := until.Truncate(bucket).Add(bucket)
startTime := since.Truncate(bucket)
for t := startTime; t.Before(endTime); t = t.Add(bucket) {
ts := t.Unix()
if mp, ok := mapp[ts]; ok {
out = append(out, *mp)
} else {
out = append(out, model.MetricPoint{
Ts: t,
Channels: make(map[string]model.ChannelMetric),
})
}
}
return out
}