mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-12-25 06:26:35 +08:00
增加多个服务流量、带宽统计API
This commit is contained in:
@@ -1466,6 +1466,38 @@ func (this *ServerService) FindAllEnabledServerNamesWithUserId(ctx context.Conte
|
||||
return &pb.FindAllEnabledServerNamesWithUserIdResponse{ServerNames: serverNames}, nil
|
||||
}
|
||||
|
||||
// FindAllUserServers 查找一个用户下的所有服务
|
||||
func (this *ServerService) FindAllUserServers(ctx context.Context, req *pb.FindAllUserServersRequest) (*pb.FindAllUserServersResponse, error) {
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if userId > 0 {
|
||||
req.UserId = userId
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
servers, err := models.SharedServerDAO.FindAllEnabledServersWithUserId(tx, req.UserId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var pbServers = []*pb.Server{}
|
||||
for _, server := range servers {
|
||||
pbServers = append(pbServers, &pb.Server{
|
||||
Id: int64(server.Id),
|
||||
Name: server.Name,
|
||||
FirstServerName: server.FirstServerName(),
|
||||
IsOn: server.IsOn,
|
||||
})
|
||||
}
|
||||
|
||||
return &pb.FindAllUserServersResponse{
|
||||
Servers: pbServers,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// FindEnabledUserServerBasic 查找服务基本信息
|
||||
func (this *ServerService) FindEnabledUserServerBasic(ctx context.Context, req *pb.FindEnabledUserServerBasicRequest) (*pb.FindEnabledUserServerBasicResponse, error) {
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
|
||||
@@ -11,6 +11,8 @@ import (
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
@@ -211,3 +213,86 @@ func (this *ServerBandwidthStatService) FindDailyServerBandwidthStats(ctx contex
|
||||
Stats: stats,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// FindDailyServerBandwidthStatsBetweenDays 读取日期段内的带宽数据
|
||||
func (this *ServerBandwidthStatService) FindDailyServerBandwidthStatsBetweenDays(ctx context.Context, req *pb.FindDailyServerBandwidthStatsBetweenDaysRequest) (*pb.FindDailyServerBandwidthStatsBetweenDaysResponse, error) {
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
|
||||
if userId > 0 {
|
||||
req.UserId = userId
|
||||
|
||||
// 检查权限
|
||||
if req.ServerId > 0 {
|
||||
err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if req.UserId <= 0 && req.ServerId <= 0 {
|
||||
return &pb.FindDailyServerBandwidthStatsBetweenDaysResponse{
|
||||
Stats: nil,
|
||||
}, nil
|
||||
}
|
||||
|
||||
req.DayFrom = strings.ReplaceAll(req.DayFrom, "-", "")
|
||||
req.DayTo = strings.ReplaceAll(req.DayTo, "-", "")
|
||||
|
||||
var dayReg = regexp.MustCompile(`^\d{8}$`)
|
||||
if !dayReg.MatchString(req.DayFrom) {
|
||||
return nil, errors.New("invalid dayFrom '" + req.DayFrom + "'")
|
||||
}
|
||||
if !dayReg.MatchString(req.DayTo) {
|
||||
return nil, errors.New("invalid dayTo '" + req.DayTo + "'")
|
||||
}
|
||||
|
||||
var pbStats = []*pb.FindDailyServerBandwidthStatsBetweenDaysResponse_Stat{}
|
||||
var pbNthStat *pb.FindDailyServerBandwidthStatsBetweenDaysResponse_Stat
|
||||
if req.ServerId > 0 { // 服务统计
|
||||
pbStats, err = models.SharedServerBandwidthStatDAO.FindBandwidthStatsBetweenDays(tx, req.ServerId, req.DayFrom, req.DayTo)
|
||||
|
||||
// nth
|
||||
stat, err := models.SharedServerBandwidthStatDAO.FindPercentileBetweenDays(tx, req.ServerId, req.DayFrom, req.DayTo, req.Percentile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if stat != nil {
|
||||
pbNthStat = &pb.FindDailyServerBandwidthStatsBetweenDaysResponse_Stat{
|
||||
Day: stat.Day,
|
||||
TimeAt: stat.TimeAt,
|
||||
Bytes: int64(stat.Bytes),
|
||||
Bits: int64(stat.Bytes * 8),
|
||||
}
|
||||
}
|
||||
} else { // 用户统计
|
||||
pbStats, err = models.SharedUserBandwidthStatDAO.FindUserBandwidthStatsBetweenDays(tx, req.UserId, req.DayFrom, req.DayTo)
|
||||
|
||||
// nth
|
||||
stat, err := models.SharedUserBandwidthStatDAO.FindPercentileBetweenDays(tx, req.UserId, req.DayFrom, req.DayTo, req.Percentile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if stat != nil {
|
||||
pbNthStat = &pb.FindDailyServerBandwidthStatsBetweenDaysResponse_Stat{
|
||||
Day: stat.Day,
|
||||
TimeAt: stat.TimeAt,
|
||||
Bytes: int64(stat.Bytes),
|
||||
Bits: int64(stat.Bytes * 8),
|
||||
}
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &pb.FindDailyServerBandwidthStatsBetweenDaysResponse{
|
||||
Stats: pbStats,
|
||||
NthStat: pbNthStat,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -4,12 +4,14 @@ import (
|
||||
"context"
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||
"math"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -237,7 +239,7 @@ func (this *ServerDailyStatService) FindLatestServerDailyStats(ctx context.Conte
|
||||
if req.Days > 0 {
|
||||
for i := int32(0); i < req.Days; i++ {
|
||||
dayString := timeutil.Format("Ymd", time.Now().AddDate(0, 0, -int(i)))
|
||||
stat, err := models.SharedServerDailyStatDAO.SumDailyStat(tx, req.ServerId, dayString)
|
||||
stat, err := models.SharedServerDailyStatDAO.SumDailyStat(tx, 0, req.ServerId, dayString, dayString)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -255,6 +257,60 @@ func (this *ServerDailyStatService) FindLatestServerDailyStats(ctx context.Conte
|
||||
return &pb.FindLatestServerDailyStatsResponse{Stats: result}, nil
|
||||
}
|
||||
|
||||
// FindServerDailyStatsBetweenDays 读取日期段内的流量数据
|
||||
func (this *ServerDailyStatService) FindServerDailyStatsBetweenDays(ctx context.Context, req *pb.FindServerDailyStatsBetweenDaysRequest) (*pb.FindServerDailyStatsBetweenDaysResponse, error) {
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
if userId > 0 {
|
||||
req.UserId = userId
|
||||
|
||||
// 检查权限
|
||||
if req.ServerId > 0 {
|
||||
err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var reg = regexp.MustCompile(`^\d{8}$`)
|
||||
req.DayFrom = strings.ReplaceAll(req.DayFrom, "-", "")
|
||||
req.DayTo = strings.ReplaceAll(req.DayTo, "-", "")
|
||||
if !reg.MatchString(req.DayFrom) {
|
||||
return nil, errors.New("invalid dayFrom '" + req.DayFrom + "'")
|
||||
}
|
||||
if !reg.MatchString(req.DayTo) {
|
||||
return nil, errors.New("invalid dayTo '" + req.DayTo + "'")
|
||||
}
|
||||
|
||||
dailyStats, err := models.SharedServerDailyStatDAO.FindStatsBetweenDays(tx, req.UserId, req.ServerId, req.DayFrom, req.DayTo)
|
||||
var pbStats = []*pb.FindServerDailyStatsBetweenDaysResponse_Stat{}
|
||||
for _, stat := range dailyStats {
|
||||
// 防止数据出错
|
||||
if len(stat.TimeFrom) < 4 {
|
||||
continue
|
||||
}
|
||||
|
||||
pbStats = append(pbStats, &pb.FindServerDailyStatsBetweenDaysResponse_Stat{
|
||||
Day: stat.Day,
|
||||
TimeFrom: stat.TimeFrom,
|
||||
TimeTo: stat.TimeTo,
|
||||
TimeAt: stat.TimeFrom[:4],
|
||||
Bytes: int64(stat.Bytes),
|
||||
CachedBytes: int64(stat.CachedBytes),
|
||||
CountRequests: int64(stat.CountRequests),
|
||||
CountCachedRequests: int64(stat.CountCachedRequests),
|
||||
})
|
||||
}
|
||||
return &pb.FindServerDailyStatsBetweenDaysResponse{
|
||||
Stats: pbStats,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// SumCurrentServerDailyStats 查找单个服务当前统计数据
|
||||
func (this *ServerDailyStatService) SumCurrentServerDailyStats(ctx context.Context, req *pb.SumCurrentServerDailyStatsRequest) (*pb.SumCurrentServerDailyStatsResponse, error) {
|
||||
_, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||
@@ -307,19 +363,42 @@ func (this *ServerDailyStatService) SumServerDailyStats(ctx context.Context, req
|
||||
|
||||
// 检查用户
|
||||
if userId > 0 {
|
||||
err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
req.UserId = userId
|
||||
|
||||
if req.ServerId > 0 {
|
||||
err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 某日统计
|
||||
var day = timeutil.Format("Ymd")
|
||||
if regexp.MustCompile(`^\d{8}$`).MatchString(req.Day) {
|
||||
day = req.Day
|
||||
req.Day = strings.ReplaceAll(req.Day, "-", "")
|
||||
req.DayFrom = strings.ReplaceAll(req.DayFrom, "-", "")
|
||||
req.DayTo = strings.ReplaceAll(req.DayTo, "-", "")
|
||||
|
||||
var dayReg = regexp.MustCompile(`^\d{8}$`)
|
||||
if len(req.Day) > 0 {
|
||||
if !dayReg.MatchString(req.Day) {
|
||||
return nil, errors.New("invalid day '" + req.Day + "'")
|
||||
}
|
||||
|
||||
req.DayFrom = req.Day
|
||||
req.DayTo = req.Day
|
||||
} else if len(req.DayFrom) > 0 && len(req.DayTo) > 0 {
|
||||
if !dayReg.MatchString(req.DayFrom) {
|
||||
return nil, errors.New("invalid dayFrom '" + req.DayFrom + "'")
|
||||
}
|
||||
if !dayReg.MatchString(req.DayTo) {
|
||||
return nil, errors.New("invalid dayTo '" + req.DayTo + "'")
|
||||
}
|
||||
} else {
|
||||
req.DayFrom = timeutil.Format("Ymd")
|
||||
req.DayTo = req.DayFrom
|
||||
}
|
||||
|
||||
stat, err := models.SharedServerDailyStatDAO.SumDailyStat(tx, req.ServerId, day)
|
||||
stat, err := models.SharedServerDailyStatDAO.SumDailyStat(tx, req.UserId, req.ServerId, req.DayFrom, req.DayTo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -477,6 +477,7 @@ func (this *ServerStatBoardService) ComposeServerStatBoard(ctx context.Context,
|
||||
Day: stat.Day,
|
||||
TimeAt: stat.TimeAt,
|
||||
Bytes: int64(stat.Bytes),
|
||||
Bits: int64(stat.Bytes * 8),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -486,12 +487,14 @@ func (this *ServerStatBoardService) ComposeServerStatBoard(ctx context.Context,
|
||||
if ok {
|
||||
pbBandwidthStats = append(pbBandwidthStats, stat)
|
||||
} else {
|
||||
var bytes = ServerBandwidthGetCacheBytes(req.ServerId, minute.Day, minute.Minute) // 从当前缓存中读取
|
||||
pbBandwidthStats = append(pbBandwidthStats, &pb.ServerBandwidthStat{
|
||||
Id: 0,
|
||||
ServerId: req.ServerId,
|
||||
Day: minute.Day,
|
||||
TimeAt: minute.Minute,
|
||||
Bytes: ServerBandwidthGetCacheBytes(req.ServerId, minute.Day, minute.Minute), // 从当前缓存中读取
|
||||
Bytes: bytes,
|
||||
Bits: bytes * 8,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -479,11 +479,11 @@ func (this *UserService) ComposeUserDashboard(ctx context.Context, req *pb.Compo
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 近 15 日流量带宽趋势
|
||||
// 近 30 日流量带宽趋势
|
||||
var dailyTrafficStats = []*pb.ComposeUserDashboardResponse_DailyTrafficStat{}
|
||||
var dailyPeekBandwidthStats = []*pb.ComposeUserDashboardResponse_DailyPeekBandwidthStat{}
|
||||
|
||||
for i := 14; i >= 0; i-- {
|
||||
for i := 30; i >= 0; i-- {
|
||||
var day = timeutil.Format("Ymd", time.Now().AddDate(0, 0, -i))
|
||||
|
||||
// 流量
|
||||
|
||||
Reference in New Issue
Block a user