mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	数据看板增加独立IP数量
This commit is contained in:
		@@ -85,6 +85,22 @@ func (this *TrafficDailyStatDAO) IncreaseDailyStat(tx *dbs.Tx, day string, bytes
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IncreaseIPs 增加独立IP统计数据
 | 
			
		||||
func (this *TrafficDailyStatDAO) IncreaseIPs(tx *dbs.Tx, day string, countIPs int64) error {
 | 
			
		||||
	if len(day) != 8 {
 | 
			
		||||
		return errors.New("invalid day '" + day + "'")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.Query(tx).
 | 
			
		||||
		Param("countIPs", countIPs).
 | 
			
		||||
		InsertOrUpdateQuickly(maps.Map{
 | 
			
		||||
			"day":      day,
 | 
			
		||||
			"countIPs": countIPs,
 | 
			
		||||
		}, maps.Map{
 | 
			
		||||
			"countIPs": dbs.SQL("countIPs+:countIPs"),
 | 
			
		||||
		})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindDailyStats 获取日期之间统计
 | 
			
		||||
func (this *TrafficDailyStatDAO) FindDailyStats(tx *dbs.Tx, dayFrom string, dayTo string) (result []*TrafficDailyStat, err error) {
 | 
			
		||||
	ones, err := this.Query(tx).
 | 
			
		||||
 
 | 
			
		||||
@@ -11,10 +11,20 @@ import (
 | 
			
		||||
func TestTrafficDailyStatDAO_IncreaseDayBytes(t *testing.T) {
 | 
			
		||||
	dbs.NotifyReady()
 | 
			
		||||
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	var now = time.Now()
 | 
			
		||||
	err := SharedTrafficDailyStatDAO.IncreaseDailyStat(nil, timeutil.Format("Ymd"), 1, 1, 1, 1, 1, 1)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log("ok", time.Since(now).Seconds()*1000, "ms")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestTrafficDailyStatDAO_IncreaseIPs(t *testing.T) {
 | 
			
		||||
	dbs.NotifyReady()
 | 
			
		||||
 | 
			
		||||
	var tx *dbs.Tx
 | 
			
		||||
	err := SharedTrafficDailyStatDAO.IncreaseIPs(tx, timeutil.Format("Ymd"), 123)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,19 @@
 | 
			
		||||
package stats
 | 
			
		||||
 | 
			
		||||
import "github.com/iwind/TeaGo/dbs"
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	TrafficDailyStatField_Id                  dbs.FieldName = "id"                  // ID
 | 
			
		||||
	TrafficDailyStatField_Day                 dbs.FieldName = "day"                 // YYYYMMDD
 | 
			
		||||
	TrafficDailyStatField_CachedBytes         dbs.FieldName = "cachedBytes"         // 缓存流量
 | 
			
		||||
	TrafficDailyStatField_Bytes               dbs.FieldName = "bytes"               // 流量字节
 | 
			
		||||
	TrafficDailyStatField_CountRequests       dbs.FieldName = "countRequests"       // 请求数
 | 
			
		||||
	TrafficDailyStatField_CountCachedRequests dbs.FieldName = "countCachedRequests" // 缓存请求数
 | 
			
		||||
	TrafficDailyStatField_CountAttackRequests dbs.FieldName = "countAttackRequests" // 攻击量
 | 
			
		||||
	TrafficDailyStatField_AttackBytes         dbs.FieldName = "attackBytes"         // 攻击流量
 | 
			
		||||
	TrafficDailyStatField_CountIPs            dbs.FieldName = "countIPs"            // 独立IP数
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TrafficDailyStat 总的流量统计(按天)
 | 
			
		||||
type TrafficDailyStat struct {
 | 
			
		||||
	Id                  uint64 `field:"id"`                  // ID
 | 
			
		||||
@@ -10,17 +24,19 @@ type TrafficDailyStat struct {
 | 
			
		||||
	CountCachedRequests uint64 `field:"countCachedRequests"` // 缓存请求数
 | 
			
		||||
	CountAttackRequests uint64 `field:"countAttackRequests"` // 攻击量
 | 
			
		||||
	AttackBytes         uint64 `field:"attackBytes"`         // 攻击流量
 | 
			
		||||
	CountIPs            uint64 `field:"countIPs"`            // 独立IP数
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type TrafficDailyStatOperator struct {
 | 
			
		||||
	Id                  interface{} // ID
 | 
			
		||||
	Day                 interface{} // YYYYMMDD
 | 
			
		||||
	CachedBytes         interface{} // 缓存流量
 | 
			
		||||
	Bytes               interface{} // 流量字节
 | 
			
		||||
	CountRequests       interface{} // 请求数
 | 
			
		||||
	CountCachedRequests interface{} // 缓存请求数
 | 
			
		||||
	CountAttackRequests interface{} // 攻击量
 | 
			
		||||
	AttackBytes         interface{} // 攻击流量
 | 
			
		||||
	Id                  any // ID
 | 
			
		||||
	Day                 any // YYYYMMDD
 | 
			
		||||
	CachedBytes         any // 缓存流量
 | 
			
		||||
	Bytes               any // 流量字节
 | 
			
		||||
	CountRequests       any // 请求数
 | 
			
		||||
	CountCachedRequests any // 缓存请求数
 | 
			
		||||
	CountAttackRequests any // 攻击量
 | 
			
		||||
	AttackBytes         any // 攻击流量
 | 
			
		||||
	CountIPs            any // 独立IP数
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewTrafficDailyStatOperator() *TrafficDailyStatOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -555,6 +555,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
 | 
			
		||||
	result.CountNodeClusters = countClusters
 | 
			
		||||
 | 
			
		||||
	// 节点数
 | 
			
		||||
	{
 | 
			
		||||
		this.BeginTag(ctx, "SharedNodeDAO.CountAllEnabledNodes")
 | 
			
		||||
		countNodes, err := models.SharedNodeDAO.CountAllEnabledNodes(tx)
 | 
			
		||||
		this.EndTag(ctx, "SharedNodeDAO.CountAllEnabledNodes")
 | 
			
		||||
@@ -562,6 +563,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		result.CountNodes = countNodes
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 离线节点
 | 
			
		||||
	this.BeginTag(ctx, "SharedNodeDAO.CountAllEnabledOfflineNodes")
 | 
			
		||||
@@ -572,7 +574,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
 | 
			
		||||
	}
 | 
			
		||||
	result.CountOfflineNodes = countOfflineNodes
 | 
			
		||||
 | 
			
		||||
	// 服务数
 | 
			
		||||
	// 网站数
 | 
			
		||||
	this.BeginTag(ctx, "SharedServerDAO.CountAllEnabledServers")
 | 
			
		||||
	countServers, err := models.SharedServerDAO.CountAllEnabledServers(tx)
 | 
			
		||||
	this.EndTag(ctx, "SharedServerDAO.CountAllEnabledServers")
 | 
			
		||||
@@ -660,6 +662,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
 | 
			
		||||
			CountCachedRequests: int64(stat.CountCachedRequests),
 | 
			
		||||
			CountAttackRequests: int64(stat.CountAttackRequests),
 | 
			
		||||
			AttackBytes:         int64(stat.AttackBytes),
 | 
			
		||||
			CountIPs:            int64(stat.CountIPs),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -732,9 +735,6 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
 | 
			
		||||
		topDomainStats = topDomainStatsCache.([]*stats.ServerDomainHourlyStat)
 | 
			
		||||
	}
 | 
			
		||||
	this.EndTag(ctx, "SharedServerDomainHourlyStatDAO.FindTopDomainStats")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	for _, stat := range topDomainStats {
 | 
			
		||||
		result.TopDomainStats = append(result.TopDomainStats, &pb.ComposeAdminDashboardResponse_DomainStat{
 | 
			
		||||
			ServerId:      int64(stat.ServerId),
 | 
			
		||||
@@ -752,9 +752,6 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
 | 
			
		||||
		pbCharts = pbChartsCache.([]*pb.MetricDataChart)
 | 
			
		||||
	}
 | 
			
		||||
	this.EndTag(ctx, "findMetricDataCharts")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	result.MetricDataCharts = pbCharts
 | 
			
		||||
 | 
			
		||||
	return result, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/events"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/goman"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
 | 
			
		||||
@@ -115,6 +116,9 @@ func init() {
 | 
			
		||||
 | 
			
		||||
								// 分时统计
 | 
			
		||||
								err = models.SharedUserPlanBandwidthStatDAO.UpdateUserPlanBandwidth(tx, stat.UserId, stat.UserPlanId, stat.NodeRegionId, stat.Day, stat.TimeAt, stat.Bytes, stat.TotalBytes, stat.CachedBytes, stat.AttackBytes, stat.CountRequests, stat.CountCachedRequests, stat.CountAttackRequests, stat.CountWebsocketConnections)
 | 
			
		||||
								if err != nil {
 | 
			
		||||
									remotelogs.Error("SharedUserPlanBandwidthStatDAO", "UpdateUserPlanBandwidth: " + err.Error())
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
@@ -122,7 +126,15 @@ func init() {
 | 
			
		||||
						if stat.UserId > 0 {
 | 
			
		||||
							err = models.SharedUserBandwidthStatDAO.UpdateUserBandwidth(tx, stat.UserId, stat.NodeRegionId, stat.Day, stat.TimeAt, stat.Bytes, stat.TotalBytes, stat.CachedBytes, stat.AttackBytes, stat.CountRequests, stat.CountCachedRequests, stat.CountAttackRequests)
 | 
			
		||||
							if err != nil {
 | 
			
		||||
								remotelogs.Error("SharedUserBandwidthStatDAO", "dump bandwidth stats failed: "+err.Error())
 | 
			
		||||
								remotelogs.Error("SharedUserBandwidthStatDAO", "UpdateUserBandwidth: "+err.Error())
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						// 更新整体的独立IP统计
 | 
			
		||||
						if stat.CountIPs > 0 {
 | 
			
		||||
							err = stats.SharedTrafficDailyStatDAO.IncreaseIPs(tx, stat.Day, stat.CountIPs)
 | 
			
		||||
							if err != nil {
 | 
			
		||||
								remotelogs.Error("SharedTrafficDailyStatDAO", "IncreaseIPs: "+err.Error())
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
 
 | 
			
		||||
@@ -243805,7 +243805,7 @@
 | 
			
		||||
      "name": "edgeTrafficDailyStats",
 | 
			
		||||
      "engine": "InnoDB",
 | 
			
		||||
      "charset": "utf8mb4_general_ci",
 | 
			
		||||
      "definition": "CREATE TABLE `edgeTrafficDailyStats` (\n  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `day` varchar(8) DEFAULT NULL COMMENT 'YYYYMMDD',\n  `cachedBytes` bigint(20) unsigned DEFAULT '0' COMMENT '缓存流量',\n  `bytes` bigint(20) unsigned DEFAULT NULL COMMENT '流量字节',\n  `countRequests` bigint(20) unsigned DEFAULT '0' COMMENT '请求数',\n  `countCachedRequests` bigint(20) unsigned DEFAULT '0' COMMENT '缓存请求数',\n  `countAttackRequests` bigint(20) unsigned DEFAULT '0' COMMENT '攻击量',\n  `attackBytes` bigint(20) unsigned DEFAULT '0' COMMENT '攻击流量',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `day` (`day`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='总的流量统计(按天)'",
 | 
			
		||||
      "definition": "CREATE TABLE `edgeTrafficDailyStats` (\n  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `day` varchar(8) DEFAULT NULL COMMENT 'YYYYMMDD',\n  `cachedBytes` bigint(20) unsigned DEFAULT '0' COMMENT '缓存流量',\n  `bytes` bigint(20) unsigned DEFAULT '0' COMMENT '流量字节',\n  `countRequests` bigint(20) unsigned DEFAULT '0' COMMENT '请求数',\n  `countCachedRequests` bigint(20) unsigned DEFAULT '0' COMMENT '缓存请求数',\n  `countAttackRequests` bigint(20) unsigned DEFAULT '0' COMMENT '攻击量',\n  `attackBytes` bigint(20) unsigned DEFAULT '0' COMMENT '攻击流量',\n  `countIPs` bigint(20) unsigned DEFAULT '0' COMMENT '独立IP数',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `day` (`day`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='总的流量统计(按天)'",
 | 
			
		||||
      "fields": [
 | 
			
		||||
        {
 | 
			
		||||
          "name": "id",
 | 
			
		||||
@@ -243821,7 +243821,7 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "bytes",
 | 
			
		||||
          "definition": "bigint(20) unsigned COMMENT '流量字节'"
 | 
			
		||||
          "definition": "bigint(20) unsigned DEFAULT '0' COMMENT '流量字节'"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "countRequests",
 | 
			
		||||
@@ -243838,6 +243838,10 @@
 | 
			
		||||
        {
 | 
			
		||||
          "name": "attackBytes",
 | 
			
		||||
          "definition": "bigint(20) unsigned DEFAULT '0' COMMENT '攻击流量'"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "countIPs",
 | 
			
		||||
          "definition": "bigint(20) unsigned DEFAULT '0' COMMENT '独立IP数'"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "indexes": [
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user