diff --git a/internal/db/models/stats/server_region_country_daily_stat_dao.go b/internal/db/models/stats/server_region_country_daily_stat_dao.go index 6d985e64..9525f96d 100644 --- a/internal/db/models/stats/server_region_country_daily_stat_dao.go +++ b/internal/db/models/stats/server_region_country_daily_stat_dao.go @@ -145,6 +145,22 @@ func (this *ServerRegionCountryDailyStatDAO) SumDailyTotalAttackRequests(tx *dbs SumInt64("countAttackRequests", 0) } +// SumDailyTotalBytesWithServerId 计算单个服务的总流量 +func (this *ServerRegionCountryDailyStatDAO) SumDailyTotalBytesWithServerId(tx *dbs.Tx, day string, serverId int64) (int64, error) { + return this.Query(tx). + Attr("day", day). + Attr("serverId", serverId). + SumInt64("bytes", 0) +} + +// SumDailyTotalAttackRequestsWithServerId 计算单个服务的总攻击次数 +func (this *ServerRegionCountryDailyStatDAO) SumDailyTotalAttackRequestsWithServerId(tx *dbs.Tx, day string, serverId int64) (int64, error) { + return this.Query(tx). + Attr("day", day). + Attr("serverId", serverId). + SumInt64("countAttackRequests", 0) +} + // Clean 清理统计数据 func (this *ServerRegionCountryDailyStatDAO) Clean(tx *dbs.Tx) error { // 只保留7天的 diff --git a/internal/rpc/services/service_server_stat_board.go b/internal/rpc/services/service_server_stat_board.go index 374b8c92..c69c4910 100644 --- a/internal/rpc/services/service_server_stat_board.go +++ b/internal/rpc/services/service_server_stat_board.go @@ -6,6 +6,7 @@ import ( "context" "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/db/models" + "github.com/TeaOSLab/EdgeAPI/internal/db/models/regions" "github.com/TeaOSLab/EdgeAPI/internal/db/models/stats" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeCommon/pkg/configutils" @@ -514,6 +515,34 @@ func (this *ServerStatBoardService) ComposeServerStatBoard(ctx context.Context, }) } + // 地区流量排行 + totalCountryBytes, err := stats.SharedServerRegionCountryDailyStatDAO.SumDailyTotalBytesWithServerId(tx, timeutil.Format("Ymd"), req.ServerId) + if err != nil { + return nil, err + } + + if totalCountryBytes > 0 { + topCountryStats, err := stats.SharedServerRegionCountryDailyStatDAO.ListServerStats(tx, req.ServerId, timeutil.Format("Ymd"), "bytes", 0, 100) + if err != nil { + return nil, err + } + + for _, stat := range topCountryStats { + countryName, err := regions.SharedRegionCountryDAO.FindRegionCountryName(tx, int64(stat.CountryId)) + if err != nil { + return nil, err + } + result.TopCountryStats = append(result.TopCountryStats, &pb.ComposeServerStatBoardResponse_CountryStat{ + CountryName: countryName, + Bytes: int64(stat.Bytes), + CountRequests: int64(stat.CountRequests), + AttackBytes: int64(stat.AttackBytes), + CountAttackRequests: int64(stat.CountAttackRequests), + Percent: float32(stat.Bytes*100) / float32(totalCountryBytes), + }) + } + } + // 指标 clusterId, err := models.SharedServerDAO.FindServerClusterId(tx, req.ServerId) if err != nil {