Files
APIPark/module/monitor/format.go
T
2025-04-29 00:34:58 +08:00

95 lines
2.1 KiB
Go

package monitor
import (
"fmt"
"strconv"
"time"
)
func formatCount(count int64) string {
switch {
case count < 1000:
return strconv.FormatInt(count, 10)
case count < 1000000:
return fmt.Sprintf("%.1fK", float64(count)/1000)
case count < 1000000000:
return fmt.Sprintf("%.1fM", float64(count)/1000000)
case count < 1000000000000:
return fmt.Sprintf("%.1fB", float64(count)/1000000000)
default:
return fmt.Sprintf("%.1fT", float64(count)/1000000000000)
}
}
func formatByte(b int64) string {
const (
KB = 1000
MB = KB * 1000
GB = MB * 1000
TB = GB * 1000
PB = TB * 1000
)
switch {
case b < KB:
return fmt.Sprintf("%dB", b)
case b < MB:
return fmt.Sprintf("%.1fKB", float64(b)/KB)
case b < GB:
return fmt.Sprintf("%.1fMB", float64(b)/MB)
case b < TB:
return fmt.Sprintf("%.1fGB", float64(b)/GB)
case b < PB:
return fmt.Sprintf("%.1fTB", float64(b)/TB)
default:
return fmt.Sprintf("%.1fPB", float64(b)/PB)
}
}
const (
oneMinute = 60
oneHour = 3600
oneDay = 24 * oneHour
tenDay = 10 * oneDay
oneYear = 365 * oneDay
bucketMinuteRetention = (7 - 1) * oneDay
bucketHourRetention = (90 - 1) * oneDay
bucketDayRetention = (5*365 - 1) * oneDay
)
// getTimeIntervalAndBucket 根据start和end来获取窗口时间间隔,窗口偏移量offset,以及使用的bucket, 查询的startTime也会格式化
func getTimeInterval(startTime, endTime time.Time) int64 {
startToNow := time.Now().Unix() - startTime.Unix()
//结合可使用的最小桶,根据end-start时间间隔来得出合适的桶和趋势图时间间隔
diff := endTime.Unix() - startTime.Unix()
if diff <= oneHour {
return 5 * oneMinute
} else if diff <= oneDay {
switch {
case startToNow <= bucketHourRetention:
return oneHour
case startToNow <= bucketDayRetention:
return oneDay
default:
return 7 * oneDay
}
} else if diff <= tenDay {
switch {
case startToNow <= bucketHourRetention:
return oneHour
case startToNow <= bucketDayRetention:
return oneDay
default:
return 7 * oneDay
}
} else {
return 7 * oneDay
}
}