增加多个服务流量、带宽统计API

This commit is contained in:
刘祥超
2022-10-03 19:28:03 +08:00
parent f7dd9e3f39
commit 1db4661c75
16 changed files with 779 additions and 40 deletions

View File

@@ -1,6 +1,7 @@
package utils
import (
"fmt"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/iwind/TeaGo/lists"
"github.com/iwind/TeaGo/types"
@@ -10,13 +11,13 @@ import (
)
// 分钟时间点
type timeMinute struct {
type timeDayMinute struct {
Day string
Minute string
}
// 分钟时间范围
type timeMinuteRange struct {
type timeDayMinuteRange struct {
Day string
MinuteFrom string
MinuteTo string
@@ -169,20 +170,20 @@ func RangeHours(hourFrom string, hourTo string) ([]string, error) {
}
// RangeMinutes 计算若干个时间点,返回结果为 [ [day1, minute1], [day2, minute2] ... ]
func RangeMinutes(toTime time.Time, count int, everyMinutes int64) []timeMinute {
func RangeMinutes(toTime time.Time, count int, everyMinutes int32) []timeDayMinute {
var everySeconds = everyMinutes * 60
if everySeconds <= 0 {
everySeconds = 300
}
var result = []timeMinute{}
var fromTime = time.Unix(toTime.Unix()-everySeconds*int64(count-1), 0)
var result = []timeDayMinute{}
var fromTime = time.Unix(toTime.Unix()-int64(everySeconds)*int64(count-1), 0)
for {
var timestamp = fromTime.Unix() / everySeconds * everySeconds
result = append(result, timeMinute{
var timestamp = fromTime.Unix() / int64(everySeconds) * int64(everySeconds)
result = append(result, timeDayMinute{
Day: timeutil.FormatTime("Ymd", timestamp),
Minute: timeutil.FormatTime("Hi", timestamp),
})
fromTime = time.Unix(fromTime.Unix()+everySeconds, 0)
fromTime = time.Unix(fromTime.Unix()+int64(everySeconds), 0)
count--
if count <= 0 {
@@ -194,14 +195,14 @@ func RangeMinutes(toTime time.Time, count int, everyMinutes int64) []timeMinute
}
// GroupMinuteRanges 将时间点分组
func GroupMinuteRanges(minutes []timeMinute) []timeMinuteRange {
var result = []*timeMinuteRange{}
func GroupMinuteRanges(minutes []timeDayMinute) []timeDayMinuteRange {
var result = []*timeDayMinuteRange{}
var lastDay = ""
var lastRange *timeMinuteRange
var lastRange *timeDayMinuteRange
for _, minute := range minutes {
if minute.Day != lastDay {
lastDay = minute.Day
lastRange = &timeMinuteRange{
lastRange = &timeDayMinuteRange{
Day: minute.Day,
MinuteFrom: minute.Minute,
MinuteTo: minute.Minute,
@@ -214,9 +215,64 @@ func GroupMinuteRanges(minutes []timeMinute) []timeMinuteRange {
}
}
var finalResult = []timeMinuteRange{}
var finalResult = []timeDayMinuteRange{}
for _, minutePtr := range result {
finalResult = append(finalResult, *minutePtr)
}
return finalResult
}
// RangeTimes 计算时间点
func RangeTimes(timeFrom string, timeTo string, everyMinutes int32) (result []string, err error) {
if everyMinutes <= 0 {
return nil, errors.New("invalid 'everyMinutes'")
}
var reg = regexp.MustCompile(`^\d{4}$`)
if !reg.MatchString(timeFrom) {
return nil, errors.New("invalid timeFrom '" + timeFrom + "'")
}
if !reg.MatchString(timeTo) {
return nil, errors.New("invalid timeTo '" + timeTo + "'")
}
if timeFrom > timeTo {
// swap
timeFrom, timeTo = timeTo, timeFrom
}
var everyMinutesInt = int(everyMinutes)
var fromHour = types.Int(timeFrom[:2])
var fromMinute = types.Int(timeFrom[2:])
var toHour = types.Int(timeTo[:2])
var toMinute = types.Int(timeTo[2:])
if fromMinute%everyMinutesInt == 0 {
result = append(result, timeFrom)
}
for {
fromMinute += everyMinutesInt
if fromMinute > 59 {
fromHour += fromMinute / 60
fromMinute = fromMinute % 60
}
if fromHour > toHour || (fromHour == toHour && fromMinute > toMinute) {
break
}
result = append(result, fmt.Sprintf("%02d%02d", fromHour, fromMinute))
}
return
}
// Range24HourTimes 计算24小时时间点
// 从 00:00 - 23:59
func Range24HourTimes(everyMinutes int32) ([]string, error) {
if everyMinutes <= 0 {
return nil, errors.New("invalid 'everyMinutes'")
}
return RangeTimes("0000", "2359", everyMinutes)
}