From f1c325713d34ff745cbe780c6fed16cb0f4cf144 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Thu, 21 Jan 2021 20:22:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E8=8A=82=E7=82=B9/=E9=9B=86?= =?UTF-8?q?=E7=BE=A4=E7=9A=84=E6=B5=81=E9=87=8F=E7=BB=9F=E8=AE=A1=E4=BB=A5?= =?UTF-8?q?=E5=A4=87=E5=B0=86=E6=9D=A5=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../node_cluster_traffic_daily_stat_dao.go | 50 +++++++++++++++++++ ...ode_cluster_traffic_daily_stat_dao_test.go | 5 ++ .../node_cluster_traffic_daily_stat_model.go | 20 ++++++++ ...de_cluster_traffic_daily_stat_model_ext.go | 1 + .../stats/node_traffic_daily_stat_dao.go | 50 +++++++++++++++++++ .../stats/node_traffic_daily_stat_dao_test.go | 5 ++ .../stats/node_traffic_daily_stat_model.go | 20 ++++++++ .../node_traffic_daily_stat_model_ext.go | 1 + .../{ => stats}/traffic_daily_stat_dao.go | 2 +- .../traffic_daily_stat_dao_test.go | 4 +- .../{ => stats}/traffic_daily_stat_model.go | 2 +- .../stats/traffic_daily_stat_model_ext.go | 1 + .../{ => stats}/traffic_hourly_stat_dao.go | 2 +- .../traffic_hourly_stat_dao_test.go | 4 +- .../{ => stats}/traffic_hourly_stat_model.go | 2 +- .../stats/traffic_hourly_stat_model_ext.go | 1 + .../db/models/traffic_daily_stat_model_ext.go | 1 - .../models/traffic_hourly_stat_model_ext.go | 1 - internal/rpc/services/service_admin.go | 5 +- .../rpc/services/service_server_daily_stat.go | 29 +++++++++-- 20 files changed, 189 insertions(+), 17 deletions(-) create mode 100644 internal/db/models/stats/node_cluster_traffic_daily_stat_dao.go create mode 100644 internal/db/models/stats/node_cluster_traffic_daily_stat_dao_test.go create mode 100644 internal/db/models/stats/node_cluster_traffic_daily_stat_model.go create mode 100644 internal/db/models/stats/node_cluster_traffic_daily_stat_model_ext.go create mode 100644 internal/db/models/stats/node_traffic_daily_stat_dao.go create mode 100644 internal/db/models/stats/node_traffic_daily_stat_dao_test.go create mode 100644 internal/db/models/stats/node_traffic_daily_stat_model.go create mode 100644 internal/db/models/stats/node_traffic_daily_stat_model_ext.go rename internal/db/models/{ => stats}/traffic_daily_stat_dao.go (99%) rename internal/db/models/{ => stats}/traffic_daily_stat_dao_test.go (77%) rename internal/db/models/{ => stats}/traffic_daily_stat_model.go (96%) create mode 100644 internal/db/models/stats/traffic_daily_stat_model_ext.go rename internal/db/models/{ => stats}/traffic_hourly_stat_dao.go (99%) rename internal/db/models/{ => stats}/traffic_hourly_stat_dao_test.go (76%) rename internal/db/models/{ => stats}/traffic_hourly_stat_model.go (96%) create mode 100644 internal/db/models/stats/traffic_hourly_stat_model_ext.go delete mode 100644 internal/db/models/traffic_daily_stat_model_ext.go delete mode 100644 internal/db/models/traffic_hourly_stat_model_ext.go diff --git a/internal/db/models/stats/node_cluster_traffic_daily_stat_dao.go b/internal/db/models/stats/node_cluster_traffic_daily_stat_dao.go new file mode 100644 index 00000000..4cd16f83 --- /dev/null +++ b/internal/db/models/stats/node_cluster_traffic_daily_stat_dao.go @@ -0,0 +1,50 @@ +package stats + +import ( + "github.com/TeaOSLab/EdgeAPI/internal/errors" + _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/maps" +) + +type NodeClusterTrafficDailyStatDAO dbs.DAO + +func NewNodeClusterTrafficDailyStatDAO() *NodeClusterTrafficDailyStatDAO { + return dbs.NewDAO(&NodeClusterTrafficDailyStatDAO{ + DAOObject: dbs.DAOObject{ + DB: Tea.Env, + Table: "edgeNodeClusterTrafficDailyStats", + Model: new(NodeClusterTrafficDailyStat), + PkName: "id", + }, + }).(*NodeClusterTrafficDailyStatDAO) +} + +var SharedNodeClusterTrafficDailyStatDAO *NodeClusterTrafficDailyStatDAO + +func init() { + dbs.OnReady(func() { + SharedNodeClusterTrafficDailyStatDAO = NewNodeClusterTrafficDailyStatDAO() + }) +} + +// 增加流量 +func (this *NodeClusterTrafficDailyStatDAO) IncreaseDailyBytes(tx *dbs.Tx, clusterId int64, day string, bytes int64) error { + if len(day) != 8 { + return errors.New("invalid day '" + day + "'") + } + err := this.Query(tx). + Param("bytes", bytes). + InsertOrUpdateQuickly(maps.Map{ + "clusterId": clusterId, + "day": day, + "bytes": bytes, + }, maps.Map{ + "bytes": dbs.SQL("bytes+:bytes"), + }) + if err != nil { + return err + } + return nil +} diff --git a/internal/db/models/stats/node_cluster_traffic_daily_stat_dao_test.go b/internal/db/models/stats/node_cluster_traffic_daily_stat_dao_test.go new file mode 100644 index 00000000..6b0462b3 --- /dev/null +++ b/internal/db/models/stats/node_cluster_traffic_daily_stat_dao_test.go @@ -0,0 +1,5 @@ +package stats + +import ( + _ "github.com/go-sql-driver/mysql" +) diff --git a/internal/db/models/stats/node_cluster_traffic_daily_stat_model.go b/internal/db/models/stats/node_cluster_traffic_daily_stat_model.go new file mode 100644 index 00000000..4285ab4b --- /dev/null +++ b/internal/db/models/stats/node_cluster_traffic_daily_stat_model.go @@ -0,0 +1,20 @@ +package stats + +// 总的流量统计(按天) +type NodeClusterTrafficDailyStat struct { + Id uint64 `field:"id"` // ID + ClusterId uint32 `field:"clusterId"` // 集群ID + Day string `field:"day"` // YYYYMMDD + Bytes uint64 `field:"bytes"` // 流量字节 +} + +type NodeClusterTrafficDailyStatOperator struct { + Id interface{} // ID + ClusterId interface{} // 集群ID + Day interface{} // YYYYMMDD + Bytes interface{} // 流量字节 +} + +func NewNodeClusterTrafficDailyStatOperator() *NodeClusterTrafficDailyStatOperator { + return &NodeClusterTrafficDailyStatOperator{} +} diff --git a/internal/db/models/stats/node_cluster_traffic_daily_stat_model_ext.go b/internal/db/models/stats/node_cluster_traffic_daily_stat_model_ext.go new file mode 100644 index 00000000..43b4fd56 --- /dev/null +++ b/internal/db/models/stats/node_cluster_traffic_daily_stat_model_ext.go @@ -0,0 +1 @@ +package stats diff --git a/internal/db/models/stats/node_traffic_daily_stat_dao.go b/internal/db/models/stats/node_traffic_daily_stat_dao.go new file mode 100644 index 00000000..23e32ae1 --- /dev/null +++ b/internal/db/models/stats/node_traffic_daily_stat_dao.go @@ -0,0 +1,50 @@ +package stats + +import ( + "github.com/TeaOSLab/EdgeAPI/internal/errors" + _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/maps" +) + +type NodeTrafficDailyStatDAO dbs.DAO + +func NewNodeTrafficDailyStatDAO() *NodeTrafficDailyStatDAO { + return dbs.NewDAO(&NodeTrafficDailyStatDAO{ + DAOObject: dbs.DAOObject{ + DB: Tea.Env, + Table: "edgeNodeTrafficDailyStats", + Model: new(NodeTrafficDailyStat), + PkName: "id", + }, + }).(*NodeTrafficDailyStatDAO) +} + +var SharedNodeTrafficDailyStatDAO *NodeTrafficDailyStatDAO + +func init() { + dbs.OnReady(func() { + SharedNodeTrafficDailyStatDAO = NewNodeTrafficDailyStatDAO() + }) +} + +// 增加流量 +func (this *NodeTrafficDailyStatDAO) IncreaseDailyBytes(tx *dbs.Tx, nodeId int64, day string, bytes int64) error { + if len(day) != 8 { + return errors.New("invalid day '" + day + "'") + } + err := this.Query(tx). + Param("bytes", bytes). + InsertOrUpdateQuickly(maps.Map{ + "nodeId": nodeId, + "day": day, + "bytes": bytes, + }, maps.Map{ + "bytes": dbs.SQL("bytes+:bytes"), + }) + if err != nil { + return err + } + return nil +} diff --git a/internal/db/models/stats/node_traffic_daily_stat_dao_test.go b/internal/db/models/stats/node_traffic_daily_stat_dao_test.go new file mode 100644 index 00000000..6b0462b3 --- /dev/null +++ b/internal/db/models/stats/node_traffic_daily_stat_dao_test.go @@ -0,0 +1,5 @@ +package stats + +import ( + _ "github.com/go-sql-driver/mysql" +) diff --git a/internal/db/models/stats/node_traffic_daily_stat_model.go b/internal/db/models/stats/node_traffic_daily_stat_model.go new file mode 100644 index 00000000..377bb1f1 --- /dev/null +++ b/internal/db/models/stats/node_traffic_daily_stat_model.go @@ -0,0 +1,20 @@ +package stats + +// 总的流量统计(按天) +type NodeTrafficDailyStat struct { + Id uint64 `field:"id"` // ID + NodeId uint32 `field:"nodeId"` // 集群ID + Day string `field:"day"` // YYYYMMDD + Bytes uint64 `field:"bytes"` // 流量字节 +} + +type NodeTrafficDailyStatOperator struct { + Id interface{} // ID + NodeId interface{} // 集群ID + Day interface{} // YYYYMMDD + Bytes interface{} // 流量字节 +} + +func NewNodeTrafficDailyStatOperator() *NodeTrafficDailyStatOperator { + return &NodeTrafficDailyStatOperator{} +} diff --git a/internal/db/models/stats/node_traffic_daily_stat_model_ext.go b/internal/db/models/stats/node_traffic_daily_stat_model_ext.go new file mode 100644 index 00000000..43b4fd56 --- /dev/null +++ b/internal/db/models/stats/node_traffic_daily_stat_model_ext.go @@ -0,0 +1 @@ +package stats diff --git a/internal/db/models/traffic_daily_stat_dao.go b/internal/db/models/stats/traffic_daily_stat_dao.go similarity index 99% rename from internal/db/models/traffic_daily_stat_dao.go rename to internal/db/models/stats/traffic_daily_stat_dao.go index 0a06e00d..37aaa5e7 100644 --- a/internal/db/models/traffic_daily_stat_dao.go +++ b/internal/db/models/stats/traffic_daily_stat_dao.go @@ -1,4 +1,4 @@ -package models +package stats import ( "github.com/TeaOSLab/EdgeAPI/internal/errors" diff --git a/internal/db/models/traffic_daily_stat_dao_test.go b/internal/db/models/stats/traffic_daily_stat_dao_test.go similarity index 77% rename from internal/db/models/traffic_daily_stat_dao_test.go rename to internal/db/models/stats/traffic_daily_stat_dao_test.go index f59249e4..eb2134bd 100644 --- a/internal/db/models/traffic_daily_stat_dao_test.go +++ b/internal/db/models/stats/traffic_daily_stat_dao_test.go @@ -1,4 +1,4 @@ -package models +package stats import ( _ "github.com/go-sql-driver/mysql" @@ -12,7 +12,7 @@ func TestTrafficDailyStatDAO_IncreaseDayBytes(t *testing.T) { dbs.NotifyReady() now := time.Now() - err := SharedTrafficDailyStatDAO.IncreaseDayBytes(nil, timeutil.Format("Ymd"), 1) + err := SharedTrafficDailyStatDAO.IncreaseDailyBytes(nil, timeutil.Format("Ymd"), 1) if err != nil { t.Fatal(err) } diff --git a/internal/db/models/traffic_daily_stat_model.go b/internal/db/models/stats/traffic_daily_stat_model.go similarity index 96% rename from internal/db/models/traffic_daily_stat_model.go rename to internal/db/models/stats/traffic_daily_stat_model.go index ceec708d..13036df0 100644 --- a/internal/db/models/traffic_daily_stat_model.go +++ b/internal/db/models/stats/traffic_daily_stat_model.go @@ -1,4 +1,4 @@ -package models +package stats // 总的流量统计 type TrafficDailyStat struct { diff --git a/internal/db/models/stats/traffic_daily_stat_model_ext.go b/internal/db/models/stats/traffic_daily_stat_model_ext.go new file mode 100644 index 00000000..43b4fd56 --- /dev/null +++ b/internal/db/models/stats/traffic_daily_stat_model_ext.go @@ -0,0 +1 @@ +package stats diff --git a/internal/db/models/traffic_hourly_stat_dao.go b/internal/db/models/stats/traffic_hourly_stat_dao.go similarity index 99% rename from internal/db/models/traffic_hourly_stat_dao.go rename to internal/db/models/stats/traffic_hourly_stat_dao.go index fa913512..c8965d25 100644 --- a/internal/db/models/traffic_hourly_stat_dao.go +++ b/internal/db/models/stats/traffic_hourly_stat_dao.go @@ -1,4 +1,4 @@ -package models +package stats import ( "github.com/TeaOSLab/EdgeAPI/internal/errors" diff --git a/internal/db/models/traffic_hourly_stat_dao_test.go b/internal/db/models/stats/traffic_hourly_stat_dao_test.go similarity index 76% rename from internal/db/models/traffic_hourly_stat_dao_test.go rename to internal/db/models/stats/traffic_hourly_stat_dao_test.go index 3e30fa04..fc49b4ee 100644 --- a/internal/db/models/traffic_hourly_stat_dao_test.go +++ b/internal/db/models/stats/traffic_hourly_stat_dao_test.go @@ -1,4 +1,4 @@ -package models +package stats import ( _ "github.com/go-sql-driver/mysql" @@ -12,7 +12,7 @@ func TestTrafficHourlyStatDAO_IncreaseDayBytes(t *testing.T) { dbs.NotifyReady() now := time.Now() - err := SharedTrafficHourlyStatDAO.IncreaseDayBytes(nil, timeutil.Format("YmdH"), 1) + err := SharedTrafficHourlyStatDAO.IncreaseHourlyBytes(nil, timeutil.Format("YmdH"), 1) if err != nil { t.Fatal(err) } diff --git a/internal/db/models/traffic_hourly_stat_model.go b/internal/db/models/stats/traffic_hourly_stat_model.go similarity index 96% rename from internal/db/models/traffic_hourly_stat_model.go rename to internal/db/models/stats/traffic_hourly_stat_model.go index afaa4ad3..0a71a234 100644 --- a/internal/db/models/traffic_hourly_stat_model.go +++ b/internal/db/models/stats/traffic_hourly_stat_model.go @@ -1,4 +1,4 @@ -package models +package stats // 总的流量统计(按小时) type TrafficHourlyStat struct { diff --git a/internal/db/models/stats/traffic_hourly_stat_model_ext.go b/internal/db/models/stats/traffic_hourly_stat_model_ext.go new file mode 100644 index 00000000..43b4fd56 --- /dev/null +++ b/internal/db/models/stats/traffic_hourly_stat_model_ext.go @@ -0,0 +1 @@ +package stats diff --git a/internal/db/models/traffic_daily_stat_model_ext.go b/internal/db/models/traffic_daily_stat_model_ext.go deleted file mode 100644 index 2640e7f9..00000000 --- a/internal/db/models/traffic_daily_stat_model_ext.go +++ /dev/null @@ -1 +0,0 @@ -package models diff --git a/internal/db/models/traffic_hourly_stat_model_ext.go b/internal/db/models/traffic_hourly_stat_model_ext.go deleted file mode 100644 index 2640e7f9..00000000 --- a/internal/db/models/traffic_hourly_stat_model_ext.go +++ /dev/null @@ -1 +0,0 @@ -package models diff --git a/internal/rpc/services/service_admin.go b/internal/rpc/services/service_admin.go index 670db016..18676391 100644 --- a/internal/rpc/services/service_admin.go +++ b/internal/rpc/services/service_admin.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "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/EdgeAPI/internal/utils" @@ -515,7 +516,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com // 按日流量统计 dayFrom := timeutil.Format("Ymd", time.Now().AddDate(0, 0, -14)) - dailyTrafficStats, err := models.SharedTrafficDailyStatDAO.FindDailyStats(tx, dayFrom, timeutil.Format("Ymd")) + dailyTrafficStats, err := stats.SharedTrafficDailyStatDAO.FindDailyStats(tx, dayFrom, timeutil.Format("Ymd")) if err != nil { return nil, err } @@ -529,7 +530,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com // 小时流量统计 hourFrom := timeutil.Format("YmdH", time.Now().Add(-23*time.Hour)) hourTo := timeutil.Format("YmdH") - hourlyTrafficStats, err := models.SharedTrafficHourlyStatDAO.FindHourlyStats(tx, hourFrom, hourTo) + hourlyTrafficStats, err := stats.SharedTrafficHourlyStatDAO.FindHourlyStats(tx, hourFrom, hourTo) if err != nil { return nil, err } diff --git a/internal/rpc/services/service_server_daily_stat.go b/internal/rpc/services/service_server_daily_stat.go index 09b6243e..0caf9490 100644 --- a/internal/rpc/services/service_server_daily_stat.go +++ b/internal/rpc/services/service_server_daily_stat.go @@ -3,6 +3,7 @@ package services import ( "context" "github.com/TeaOSLab/EdgeAPI/internal/db/models" + "github.com/TeaOSLab/EdgeAPI/internal/db/models/stats" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" timeutil "github.com/iwind/TeaGo/utils/time" ) @@ -14,7 +15,7 @@ type ServerDailyStatService struct { // 上传统计 func (this *ServerDailyStatService) UploadServerDailyStats(ctx context.Context, req *pb.UploadServerDailyStatsRequest) (*pb.RPCSuccess, error) { - _, err := this.ValidateNode(ctx) + nodeId, err := this.ValidateNode(ctx) if err != nil { return nil, err } @@ -30,19 +31,37 @@ func (this *ServerDailyStatService) UploadServerDailyStats(ctx context.Context, // TODO 将来改成每小时入库一次 for _, stat := range req.Stats { // 总体流量(按天) - err = models.SharedTrafficDailyStatDAO.IncreaseDailyBytes(tx, timeutil.FormatTime("Ymd", stat.CreatedAt), stat.Bytes) + err = stats.SharedTrafficDailyStatDAO.IncreaseDailyBytes(tx, timeutil.FormatTime("Ymd", stat.CreatedAt), stat.Bytes) if err != nil { return nil, err } // 总体统计(按小时) - err = models.SharedTrafficHourlyStatDAO.IncreaseHourlyBytes(tx, timeutil.FormatTime("YmdH", stat.CreatedAt), stat.Bytes) + err = stats.SharedTrafficHourlyStatDAO.IncreaseHourlyBytes(tx, timeutil.FormatTime("YmdH", stat.CreatedAt), stat.Bytes) if err != nil { return nil, err } - } - // TODO 集群流量/节点流量 + // 节点流量 + if nodeId > 0 { + err = stats.SharedNodeTrafficDailyStatDAO.IncreaseDailyBytes(tx, nodeId, timeutil.FormatTime("Ymd", stat.CreatedAt), stat.Bytes) + if err != nil { + return nil, err + } + + // 集群流量 + clusterId, err := models.SharedNodeDAO.FindNodeClusterId(tx, nodeId) + if err != nil { + return nil, err + } + if clusterId > 0 { + err = stats.SharedNodeClusterTrafficDailyStatDAO.IncreaseDailyBytes(tx, clusterId, timeutil.FormatTime("Ymd", stat.CreatedAt), stat.Bytes) + if err != nil { + return nil, err + } + } + } + } return this.Success() }