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 94ce656c..6d985e64 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 @@ -94,8 +94,10 @@ func (this *ServerRegionCountryDailyStatDAO) ListServerStats(tx *dbs.Tx, serverI query.Desc("countRequests") case "attackBytes": query.Desc("attackBytes") + query.Gt("attackBytes", 0) case "countAttackRequests": query.Desc("countAttackRequests") + query.Gt("countAttackRequests", 0) } _, err = query.FindAll() @@ -119,21 +121,30 @@ func (this *ServerRegionCountryDailyStatDAO) ListSumStats(tx *dbs.Tx, day string query.Desc("countRequests") case "attackBytes": query.Desc("attackBytes") + query.Gt("attackBytes", 0) case "countAttackRequests": query.Desc("countAttackRequests") + query.Gt("countAttackRequests", 0) } _, err = query.FindAll() return } -// SumDailyBytes 计算总流量 +// SumDailyTotalBytes 计算总流量 func (this *ServerRegionCountryDailyStatDAO) SumDailyTotalBytes(tx *dbs.Tx, day string) (int64, error) { return this.Query(tx). Attr("day", day). SumInt64("bytes", 0) } +// SumDailyTotalAttackRequests 计算总攻击次数 +func (this *ServerRegionCountryDailyStatDAO) SumDailyTotalAttackRequests(tx *dbs.Tx, day string) (int64, error) { + return this.Query(tx). + Attr("day", day). + SumInt64("countAttackRequests", 0) +} + // Clean 清理统计数据 func (this *ServerRegionCountryDailyStatDAO) Clean(tx *dbs.Tx) error { // 只保留7天的 diff --git a/internal/rpc/services/service_admin.go b/internal/rpc/services/service_admin.go index b323ba0c..1f40b97a 100644 --- a/internal/rpc/services/service_admin.go +++ b/internal/rpc/services/service_admin.go @@ -736,14 +736,14 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com } } - // 流量排行 + // 地区流量排行 if isPlus { - totalBytes, err := stats.SharedServerRegionCountryDailyStatDAO.SumDailyTotalBytes(tx, timeutil.Format("Ymd")) + totalCountryBytes, err := stats.SharedServerRegionCountryDailyStatDAO.SumDailyTotalBytes(tx, timeutil.Format("Ymd")) if err != nil { return nil, err } - if totalBytes > 0 { + if totalCountryBytes > 0 { topCountryStats, err := stats.SharedServerRegionCountryDailyStatDAO.ListSumStats(tx, timeutil.Format("Ymd"), "bytes", 0, 100) if err != nil { return nil, err @@ -755,10 +755,12 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com return nil, err } result.TopCountryStats = append(result.TopCountryStats, &pb.ComposeAdminDashboardResponse_CountryStat{ - CountryName: countryName, - Bytes: int64(stat.Bytes), - CountRequests: int64(stat.CountRequests), - Percent: float32(stat.Bytes*100) / float32(totalBytes), + 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), }) } } diff --git a/internal/rpc/services/service_firewall.go b/internal/rpc/services/service_firewall.go index cbdd5812..d00d1b04 100644 --- a/internal/rpc/services/service_firewall.go +++ b/internal/rpc/services/service_firewall.go @@ -5,6 +5,7 @@ package services import ( "context" "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/utils" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" @@ -215,6 +216,34 @@ func (this *FirewallService) ComposeFirewallGlobalBoard(ctx context.Context, req }) } + // 地区流量排行 + totalCountryRequests, err := stats.SharedServerRegionCountryDailyStatDAO.SumDailyTotalAttackRequests(tx, timeutil.Format("Ymd")) + if err != nil { + return nil, err + } + + if totalCountryRequests > 0 { + topCountryStats, err := stats.SharedServerRegionCountryDailyStatDAO.ListSumStats(tx, timeutil.Format("Ymd"), "countAttackRequests", 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.ComposeFirewallGlobalBoardResponse_CountryStat{ + CountryName: countryName, + Bytes: int64(stat.Bytes), + CountRequests: int64(stat.CountRequests), + AttackBytes: int64(stat.AttackBytes), + CountAttackRequests: int64(stat.CountAttackRequests), + Percent: float32(stat.CountAttackRequests*100) / float32(totalCountryRequests), + }) + } + } + return result, nil }