mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	优化节点列表
This commit is contained in:
		@@ -97,6 +97,7 @@ func (this *NodeClusterDAO) FindAllEnableClusters(tx *dbs.Tx) (result []*NodeClu
 | 
				
			|||||||
	_, err = this.Query(tx).
 | 
						_, err = this.Query(tx).
 | 
				
			||||||
		State(NodeClusterStateEnabled).
 | 
							State(NodeClusterStateEnabled).
 | 
				
			||||||
		Slice(&result).
 | 
							Slice(&result).
 | 
				
			||||||
 | 
							Desc("isPinned").
 | 
				
			||||||
		Desc("order").
 | 
							Desc("order").
 | 
				
			||||||
		DescPk().
 | 
							DescPk().
 | 
				
			||||||
		FindAll()
 | 
							FindAll()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -385,6 +385,10 @@ func (this *NodeDAO) ListEnabledNodesMatch(tx *dbs.Tx,
 | 
				
			|||||||
		query.Asc("IF(JSON_EXTRACT(status, '$.updatedAt')>UNIX_TIMESTAMP()-120, IFNULL(JSON_EXTRACT(status, '$.trafficOutBytes'), 0), 0)")
 | 
							query.Asc("IF(JSON_EXTRACT(status, '$.updatedAt')>UNIX_TIMESTAMP()-120, IFNULL(JSON_EXTRACT(status, '$.trafficOutBytes'), 0), 0)")
 | 
				
			||||||
	case "trafficOutDesc":
 | 
						case "trafficOutDesc":
 | 
				
			||||||
		query.Desc("IF(JSON_EXTRACT(status, '$.updatedAt')>UNIX_TIMESTAMP()-120, IFNULL(JSON_EXTRACT(status, '$.trafficOutBytes'), 0), 0)")
 | 
							query.Desc("IF(JSON_EXTRACT(status, '$.updatedAt')>UNIX_TIMESTAMP()-120, IFNULL(JSON_EXTRACT(status, '$.trafficOutBytes'), 0), 0)")
 | 
				
			||||||
 | 
						case "loadAsc":
 | 
				
			||||||
 | 
							query.Asc("IF(JSON_EXTRACT(status, '$.updatedAt')>UNIX_TIMESTAMP()-120, IFNULL(JSON_EXTRACT(status, '$.load1m'), 0), 0)")
 | 
				
			||||||
 | 
						case "loadDesc":
 | 
				
			||||||
 | 
							query.Desc("IF(JSON_EXTRACT(status, '$.updatedAt')>UNIX_TIMESTAMP()-120, IFNULL(JSON_EXTRACT(status, '$.load1m'), 0), 0)")
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		query.Desc("level")
 | 
							query.Desc("level")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package models
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
@@ -9,6 +10,7 @@ import (
 | 
				
			|||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
	timeutil "github.com/iwind/TeaGo/utils/time"
 | 
						timeutil "github.com/iwind/TeaGo/utils/time"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,9 +37,9 @@ func init() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CreateValue 创建值
 | 
					// CreateValue 创建值
 | 
				
			||||||
func (this *NodeValueDAO) CreateValue(tx *dbs.Tx, clusterId int64, role nodeconfigs.NodeRole, nodeId int64, item string, valueJSON []byte, createdAt int64) error {
 | 
					func (this *NodeValueDAO) CreateValue(tx *dbs.Tx, clusterId int64, role nodeconfigs.NodeRole, nodeId int64, item string, valueJSON []byte, createdAt int64) error {
 | 
				
			||||||
	day := timeutil.FormatTime("Ymd", createdAt)
 | 
						var day = timeutil.FormatTime("Ymd", createdAt)
 | 
				
			||||||
	hour := timeutil.FormatTime("YmdH", createdAt)
 | 
						var hour = timeutil.FormatTime("YmdH", createdAt)
 | 
				
			||||||
	minute := timeutil.FormatTime("YmdHi", createdAt)
 | 
						var minute = timeutil.FormatTime("YmdHi", createdAt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return this.Query(tx).
 | 
						return this.Query(tx).
 | 
				
			||||||
		InsertOrUpdateQuickly(maps.Map{
 | 
							InsertOrUpdateQuickly(maps.Map{
 | 
				
			||||||
@@ -171,6 +173,34 @@ func (this *NodeValueDAO) ListValuesForNSNodes(tx *dbs.Tx, item string, key stri
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SumAllNodeValues 计算所有节点的某项参数值
 | 
				
			||||||
 | 
					func (this *NodeValueDAO) SumAllNodeValues(tx *dbs.Tx, role string, item nodeconfigs.NodeValueItem, param string, duration int32, durationUnit nodeconfigs.NodeValueDurationUnit) (total float64, avg float64, max float64, err error) {
 | 
				
			||||||
 | 
						if duration <= 0 {
 | 
				
			||||||
 | 
							return 0, 0, 0, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var query = this.Query(tx).
 | 
				
			||||||
 | 
							Result("SUM(JSON_EXTRACT(value, '$."+param+"')) AS sumValue", "AVG(JSON_EXTRACT(value, '$."+param+"')) AS avgValue", "MAX(JSON_EXTRACT(value, '$."+param+"')) AS maxValueResult"). // maxValue 是个MySQL Keyword,这里使用maxValueResult代替
 | 
				
			||||||
 | 
							Attr("role", role).
 | 
				
			||||||
 | 
							Attr("item", item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch durationUnit {
 | 
				
			||||||
 | 
						case nodeconfigs.NodeValueDurationUnitMinute:
 | 
				
			||||||
 | 
							fromMinute := timeutil.FormatTime("YmdHi", time.Now().Unix()-int64(duration*60))
 | 
				
			||||||
 | 
							query.Attr("minute", fromMinute)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							fromMinute := timeutil.FormatTime("YmdHi", time.Now().Unix()-int64(duration*60))
 | 
				
			||||||
 | 
							query.Attr("minute", fromMinute)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m, _, err := query.FindOne()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, 0, 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return m.GetFloat64("sumValue"), m.GetFloat64("avgValue"), m.GetFloat64("maxValueResult"), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SumNodeValues 计算节点的某项参数值
 | 
					// SumNodeValues 计算节点的某项参数值
 | 
				
			||||||
func (this *NodeValueDAO) SumNodeValues(tx *dbs.Tx, role string, nodeId int64, item string, param string, method nodeconfigs.NodeValueSumMethod, duration int32, durationUnit nodeconfigs.NodeValueDurationUnit) (float64, error) {
 | 
					func (this *NodeValueDAO) SumNodeValues(tx *dbs.Tx, role string, nodeId int64, item string, param string, method nodeconfigs.NodeValueSumMethod, duration int32, durationUnit nodeconfigs.NodeValueDurationUnit) (float64, error) {
 | 
				
			||||||
	if duration <= 0 {
 | 
						if duration <= 0 {
 | 
				
			||||||
@@ -261,11 +291,13 @@ func (this *NodeValueDAO) SumNodeClusterValues(tx *dbs.Tx, role string, clusterI
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// FindLatestNodeValue 获取最近一条数据
 | 
					// FindLatestNodeValue 获取最近一条数据
 | 
				
			||||||
func (this *NodeValueDAO) FindLatestNodeValue(tx *dbs.Tx, role string, nodeId int64, item string) (*NodeValue, error) {
 | 
					func (this *NodeValueDAO) FindLatestNodeValue(tx *dbs.Tx, role string, nodeId int64, item string) (*NodeValue, error) {
 | 
				
			||||||
 | 
						fromMinute := timeutil.FormatTime("YmdHi", time.Now().Unix()-int64(60))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	one, err := this.Query(tx).
 | 
						one, err := this.Query(tx).
 | 
				
			||||||
		Attr("role", role).
 | 
							Attr("role", role).
 | 
				
			||||||
		Attr("nodeId", nodeId).
 | 
							Attr("nodeId", nodeId).
 | 
				
			||||||
		Attr("item", item).
 | 
							Attr("item", item).
 | 
				
			||||||
		DescPk().
 | 
							Attr("minute", fromMinute).
 | 
				
			||||||
		Find()
 | 
							Find()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -275,3 +307,62 @@ func (this *NodeValueDAO) FindLatestNodeValue(tx *dbs.Tx, role string, nodeId in
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return one.(*NodeValue), nil
 | 
						return one.(*NodeValue), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ComposeNodeStatus 组合节点状态值
 | 
				
			||||||
 | 
					func (this *NodeValueDAO) ComposeNodeStatus(tx *dbs.Tx, role string, nodeId int64, statusConfig *nodeconfigs.NodeStatus) error {
 | 
				
			||||||
 | 
						var items = []string{
 | 
				
			||||||
 | 
							nodeconfigs.NodeValueItemCPU,
 | 
				
			||||||
 | 
							nodeconfigs.NodeValueItemMemory,
 | 
				
			||||||
 | 
							nodeconfigs.NodeValueItemLoad,
 | 
				
			||||||
 | 
							nodeconfigs.NodeValueItemTrafficOut,
 | 
				
			||||||
 | 
							nodeconfigs.NodeValueItemTrafficIn,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ones, err := this.Query(tx).
 | 
				
			||||||
 | 
							Result("item", "value").
 | 
				
			||||||
 | 
							Attr("role", role).
 | 
				
			||||||
 | 
							Attr("nodeId", nodeId).
 | 
				
			||||||
 | 
							Attr("minute", timeutil.FormatTime("YmdHi", time.Now().Unix()-60)).
 | 
				
			||||||
 | 
							Where("item IN ('" + strings.Join(items, "', '") + "')").
 | 
				
			||||||
 | 
							FindAll()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, one := range ones {
 | 
				
			||||||
 | 
							var oneValue = one.(*NodeValue)
 | 
				
			||||||
 | 
							var valueMap = oneValue.DecodeMapValue()
 | 
				
			||||||
 | 
							switch oneValue.Item {
 | 
				
			||||||
 | 
							case nodeconfigs.NodeValueItemCPU:
 | 
				
			||||||
 | 
								statusConfig.CPUUsage = valueMap.GetFloat64("usage")
 | 
				
			||||||
 | 
							case nodeconfigs.NodeValueItemMemory:
 | 
				
			||||||
 | 
								statusConfig.MemoryUsage = valueMap.GetFloat64("usage")
 | 
				
			||||||
 | 
							case nodeconfigs.NodeValueItemLoad:
 | 
				
			||||||
 | 
								statusConfig.Load1m = valueMap.GetFloat64("load1m")
 | 
				
			||||||
 | 
								statusConfig.Load5m = valueMap.GetFloat64("load5m")
 | 
				
			||||||
 | 
								statusConfig.Load15m = valueMap.GetFloat64("load15m")
 | 
				
			||||||
 | 
							case nodeconfigs.NodeValueItemTrafficOut:
 | 
				
			||||||
 | 
								statusConfig.TrafficOutBytes = valueMap.GetUint64("total")
 | 
				
			||||||
 | 
							case nodeconfigs.NodeValueItemTrafficIn:
 | 
				
			||||||
 | 
								statusConfig.TrafficInBytes = valueMap.GetUint64("total")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ComposeNodeStatusJSON 组合节点状态值,并转换为JSON数据
 | 
				
			||||||
 | 
					func (this *NodeValueDAO) ComposeNodeStatusJSON(tx *dbs.Tx, role string, nodeId int64, statusJSON []byte) ([]byte, error) {
 | 
				
			||||||
 | 
						var statusConfig = &nodeconfigs.NodeStatus{}
 | 
				
			||||||
 | 
						if len(statusJSON) > 0 {
 | 
				
			||||||
 | 
							err := json.Unmarshal(statusJSON, statusConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := this.ComposeNodeStatus(tx, role, nodeId, statusConfig)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return json.Marshal(statusConfig)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ import (
 | 
				
			|||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	_ "github.com/iwind/TeaGo/bootstrap"
 | 
						_ "github.com/iwind/TeaGo/bootstrap"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"github.com/iwind/TeaGo/rands"
 | 
						"github.com/iwind/TeaGo/rands"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
@@ -52,3 +53,29 @@ func TestNodeValueDAO_CreateManyValues(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	t.Log("finished")
 | 
						t.Log("finished")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestNodeValueDAO_SumAllNodeValues(t *testing.T) {
 | 
				
			||||||
 | 
						var dao = models.NewNodeValueDAO()
 | 
				
			||||||
 | 
						sum, avg, max, err := dao.SumAllNodeValues(nil, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemCPU, "usage", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.Log("sum:", sum, "avg:", avg, "max:", max)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestNodeValueDAO_ComposeNodeStatus(t *testing.T) {
 | 
				
			||||||
 | 
						var dao = models.NewNodeValueDAO()
 | 
				
			||||||
 | 
						one, err := dao.Query(nil).DescPk().Find()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if one != nil {
 | 
				
			||||||
 | 
							var config = &nodeconfigs.NodeStatus{}
 | 
				
			||||||
 | 
							err = dao.ComposeNodeStatus(nil, one.(*models.NodeValue).Role, int64(one.(*models.NodeValue).NodeId), config)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								t.Fatal(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							logs.PrintAsJSON(config, t)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@ import (
 | 
				
			|||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
 | 
				
			||||||
	"github.com/andybalholm/brotli"
 | 
						"github.com/andybalholm/brotli"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/lists"
 | 
				
			||||||
	"github.com/iwind/TeaGo/logs"
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
	stringutil "github.com/iwind/TeaGo/utils/string"
 | 
						stringutil "github.com/iwind/TeaGo/utils/string"
 | 
				
			||||||
@@ -181,19 +182,21 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	tx := this.NullTx()
 | 
						tx := this.NullTx()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clusterDNS, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, req.NodeClusterId, nil)
 | 
						var dnsDomainId = int64(0)
 | 
				
			||||||
	if err != nil {
 | 
						var domainRoutes = []*dnstypes.Route{}
 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dnsDomainId := int64(0)
 | 
						if req.NodeClusterId > 0 {
 | 
				
			||||||
	domainRoutes := []*dnstypes.Route{}
 | 
							clusterDNS, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, req.NodeClusterId, nil)
 | 
				
			||||||
	if clusterDNS != nil {
 | 
							if err != nil {
 | 
				
			||||||
		dnsDomainId = int64(clusterDNS.DnsDomainId)
 | 
								return nil, err
 | 
				
			||||||
		if clusterDNS.DnsDomainId > 0 {
 | 
							}
 | 
				
			||||||
			domainRoutes, err = dns.SharedDNSDomainDAO.FindDomainRoutes(tx, dnsDomainId)
 | 
							if clusterDNS != nil {
 | 
				
			||||||
			if err != nil {
 | 
								dnsDomainId = int64(clusterDNS.DnsDomainId)
 | 
				
			||||||
				return nil, err
 | 
								if clusterDNS.DnsDomainId > 0 {
 | 
				
			||||||
 | 
									domainRoutes, err = dns.SharedDNSDomainDAO.FindDomainRoutes(tx, dnsDomainId)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return nil, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -216,13 +219,18 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
 | 
				
			|||||||
		order = "trafficOutAsc"
 | 
							order = "trafficOutAsc"
 | 
				
			||||||
	} else if req.TrafficOutDesc {
 | 
						} else if req.TrafficOutDesc {
 | 
				
			||||||
		order = "trafficOutDesc"
 | 
							order = "trafficOutDesc"
 | 
				
			||||||
 | 
						} else if req.LoadAsc {
 | 
				
			||||||
 | 
							order = "loadAsc"
 | 
				
			||||||
 | 
						} else if req.LoadDesc {
 | 
				
			||||||
 | 
							order = "loadDesc"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nodes, err := models.SharedNodeDAO.ListEnabledNodesMatch(tx, req.NodeClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState), req.Keyword, req.NodeGroupId, req.NodeRegionId, req.Level, true, order, req.Offset, req.Size)
 | 
						nodes, err := models.SharedNodeDAO.ListEnabledNodesMatch(tx, req.NodeClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState), req.Keyword, req.NodeGroupId, req.NodeRegionId, req.Level, true, order, req.Offset, req.Size)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	result := []*pb.Node{}
 | 
						var result = []*pb.Node{}
 | 
				
			||||||
 | 
						var cacheMap = utils.NewCacheMap()
 | 
				
			||||||
	for _, node := range nodes {
 | 
						for _, node := range nodes {
 | 
				
			||||||
		// 主集群信息
 | 
							// 主集群信息
 | 
				
			||||||
		clusterName, err := models.SharedNodeClusterDAO.FindNodeClusterName(tx, int64(node.ClusterId))
 | 
							clusterName, err := models.SharedNodeClusterDAO.FindNodeClusterName(tx, int64(node.ClusterId))
 | 
				
			||||||
@@ -277,19 +285,54 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// DNS线路
 | 
							// DNS线路
 | 
				
			||||||
		routeCodes, err := node.DNSRouteCodesForDomainId(dnsDomainId)
 | 
							var pbRoutes = []*pb.DNSRoute{}
 | 
				
			||||||
		if err != nil {
 | 
							if dnsDomainId > 0 {
 | 
				
			||||||
			return nil, err
 | 
								routeCodes, err := node.DNSRouteCodesForDomainId(dnsDomainId)
 | 
				
			||||||
		}
 | 
								if err != nil {
 | 
				
			||||||
		pbRoutes := []*pb.DNSRoute{}
 | 
									return nil, err
 | 
				
			||||||
		for _, routeCode := range routeCodes {
 | 
								}
 | 
				
			||||||
			for _, route := range domainRoutes {
 | 
					
 | 
				
			||||||
				if route.Code == routeCode {
 | 
								for _, routeCode := range routeCodes {
 | 
				
			||||||
					pbRoutes = append(pbRoutes, &pb.DNSRoute{
 | 
									for _, route := range domainRoutes {
 | 
				
			||||||
						Name: route.Name,
 | 
										if route.Code == routeCode {
 | 
				
			||||||
						Code: route.Code,
 | 
											pbRoutes = append(pbRoutes, &pb.DNSRoute{
 | 
				
			||||||
					})
 | 
												Name: route.Name,
 | 
				
			||||||
					break
 | 
												Code: route.Code,
 | 
				
			||||||
 | 
											})
 | 
				
			||||||
 | 
											break
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else if req.NodeClusterId == 0 {
 | 
				
			||||||
 | 
								var clusterDomainIds = []int64{}
 | 
				
			||||||
 | 
								for _, clusterId := range node.AllClusterIds() {
 | 
				
			||||||
 | 
									clusterDNSInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, cacheMap)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return nil, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if clusterDNSInfo != nil && clusterDNSInfo.DnsDomainId > 0 {
 | 
				
			||||||
 | 
										clusterDomainIds = append(clusterDomainIds, int64(clusterDNSInfo.DnsDomainId))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for domainId, routeCodes := range node.DNSRouteCodes() {
 | 
				
			||||||
 | 
									if domainId == 0 {
 | 
				
			||||||
 | 
										continue
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if !lists.ContainsInt64(clusterDomainIds, domainId) {
 | 
				
			||||||
 | 
										continue
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									for _, routeCode := range routeCodes {
 | 
				
			||||||
 | 
										routeName, err := dns.SharedDNSDomainDAO.FindDomainRouteName(tx, domainId, routeCode)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return nil, err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if len(routeName) > 0 {
 | 
				
			||||||
 | 
											pbRoutes = append(pbRoutes, &pb.DNSRoute{
 | 
				
			||||||
 | 
												Name: routeName,
 | 
				
			||||||
 | 
												Code: routeCode,
 | 
				
			||||||
 | 
											})
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -310,12 +353,18 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 状态
 | 
				
			||||||
 | 
							statusJSON, err := models.SharedNodeValueDAO.ComposeNodeStatusJSON(tx, nodeconfigs.NodeRoleNode, int64(node.Id), node.Status)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		result = append(result, &pb.Node{
 | 
							result = append(result, &pb.Node{
 | 
				
			||||||
			Id:          int64(node.Id),
 | 
								Id:          int64(node.Id),
 | 
				
			||||||
			Name:        node.Name,
 | 
								Name:        node.Name,
 | 
				
			||||||
			Version:     int64(node.Version),
 | 
								Version:     int64(node.Version),
 | 
				
			||||||
			IsInstalled: node.IsInstalled,
 | 
								IsInstalled: node.IsInstalled,
 | 
				
			||||||
			StatusJSON:  node.Status,
 | 
								StatusJSON:  statusJSON,
 | 
				
			||||||
			NodeCluster: &pb.NodeCluster{
 | 
								NodeCluster: &pb.NodeCluster{
 | 
				
			||||||
				Id:   int64(node.ClusterId),
 | 
									Id:   int64(node.ClusterId),
 | 
				
			||||||
				Name: clusterName,
 | 
									Name: clusterName,
 | 
				
			||||||
@@ -455,6 +504,7 @@ func (this *NodeService) FindEnabledNode(ctx context.Context, req *pb.FindEnable
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						var clusterIds = []int64{int64(node.ClusterId)}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 从集群信息
 | 
						// 从集群信息
 | 
				
			||||||
	var secondaryPBClusters []*pb.NodeCluster
 | 
						var secondaryPBClusters []*pb.NodeCluster
 | 
				
			||||||
@@ -471,6 +521,7 @@ func (this *NodeService) FindEnabledNode(ctx context.Context, req *pb.FindEnable
 | 
				
			|||||||
			IsOn: cluster.IsOn,
 | 
								IsOn: cluster.IsOn,
 | 
				
			||||||
			Name: cluster.Name,
 | 
								Name: cluster.Name,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
							clusterIds = append(clusterIds, int64(cluster.Id))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 认证信息
 | 
						// 认证信息
 | 
				
			||||||
@@ -556,10 +607,49 @@ func (this *NodeService) FindEnabledNode(ctx context.Context, req *pb.FindEnable
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 线路
 | 
				
			||||||
 | 
						var pbRoutes = []*pb.DNSRoute{}
 | 
				
			||||||
 | 
						var clusterDomainIds = []int64{}
 | 
				
			||||||
 | 
						for _, clusterId := range node.AllClusterIds() {
 | 
				
			||||||
 | 
							clusterDNSInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if clusterDNSInfo != nil && clusterDNSInfo.DnsDomainId > 0 {
 | 
				
			||||||
 | 
								clusterDomainIds = append(clusterDomainIds, int64(clusterDNSInfo.DnsDomainId))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for domainId, routeCodes := range node.DNSRouteCodes() {
 | 
				
			||||||
 | 
							if domainId == 0 {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !lists.ContainsInt64(clusterDomainIds, domainId) {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, routeCode := range routeCodes {
 | 
				
			||||||
 | 
								routeName, err := dns.SharedDNSDomainDAO.FindDomainRouteName(tx, domainId, routeCode)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if len(routeName) > 0 {
 | 
				
			||||||
 | 
									pbRoutes = append(pbRoutes, &pb.DNSRoute{
 | 
				
			||||||
 | 
										Name: routeName,
 | 
				
			||||||
 | 
										Code: routeCode,
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 监控状态
 | 
				
			||||||
 | 
						statusJSON, err := models.SharedNodeValueDAO.ComposeNodeStatusJSON(tx, nodeconfigs.NodeRoleNode, int64(node.Id), node.Status)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &pb.FindEnabledNodeResponse{Node: &pb.Node{
 | 
						return &pb.FindEnabledNodeResponse{Node: &pb.Node{
 | 
				
			||||||
		Id:            int64(node.Id),
 | 
							Id:            int64(node.Id),
 | 
				
			||||||
		Name:          node.Name,
 | 
							Name:          node.Name,
 | 
				
			||||||
		StatusJSON:    node.Status,
 | 
							StatusJSON:    statusJSON,
 | 
				
			||||||
		UniqueId:      node.UniqueId,
 | 
							UniqueId:      node.UniqueId,
 | 
				
			||||||
		Version:       int64(node.Version),
 | 
							Version:       int64(node.Version),
 | 
				
			||||||
		LatestVersion: int64(node.LatestVersion),
 | 
							LatestVersion: int64(node.LatestVersion),
 | 
				
			||||||
@@ -582,6 +672,7 @@ func (this *NodeService) FindEnabledNode(ctx context.Context, req *pb.FindEnable
 | 
				
			|||||||
		MaxCacheMemoryCapacity: pbMaxCacheMemoryCapacity,
 | 
							MaxCacheMemoryCapacity: pbMaxCacheMemoryCapacity,
 | 
				
			||||||
		CacheDiskDir:           node.CacheDiskDir,
 | 
							CacheDiskDir:           node.CacheDiskDir,
 | 
				
			||||||
		Level:                  int32(node.Level),
 | 
							Level:                  int32(node.Level),
 | 
				
			||||||
 | 
							DnsRoutes:              pbRoutes,
 | 
				
			||||||
	}}, nil
 | 
						}}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,9 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NodeValueService struct {
 | 
					type NodeValueService struct {
 | 
				
			||||||
@@ -60,7 +62,7 @@ func (this *NodeValueService) ListNodeValues(ctx context.Context, req *pb.ListNo
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pbValues := []*pb.NodeValue{}
 | 
						var pbValues = []*pb.NodeValue{}
 | 
				
			||||||
	for _, value := range values {
 | 
						for _, value := range values {
 | 
				
			||||||
		pbValues = append(pbValues, &pb.NodeValue{
 | 
							pbValues = append(pbValues, &pb.NodeValue{
 | 
				
			||||||
			ValueJSON: value.Value,
 | 
								ValueJSON: value.Value,
 | 
				
			||||||
@@ -70,3 +72,80 @@ func (this *NodeValueService) ListNodeValues(ctx context.Context, req *pb.ListNo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return &pb.ListNodeValuesResponse{NodeValues: pbValues}, nil
 | 
						return &pb.ListNodeValuesResponse{NodeValues: pbValues}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SumAllNodeValueStats 读取所有节点的最新数据
 | 
				
			||||||
 | 
					func (this *NodeValueService) SumAllNodeValueStats(ctx context.Context, req *pb.SumAllNodeValueStatsRequest) (*pb.SumAllNodeValueStatsResponse, error) {
 | 
				
			||||||
 | 
						_, err := this.ValidateAdmin(ctx, 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var tx = this.NullTx()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var result = &pb.SumAllNodeValueStatsResponse{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// traffic
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							total, _, _, err := models.SharedNodeValueDAO.SumAllNodeValues(tx, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemTrafficOut, "total", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result.TotalTrafficBytesPerSecond = types.Int64(total) / 60
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// cpu
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_, avg, max, err := models.SharedNodeValueDAO.SumAllNodeValues(tx, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemCPU, "usage", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result.AvgCPUUsage = types.Float32(avg)
 | 
				
			||||||
 | 
							result.MaxCPUUsage = types.Float32(max)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							total, _, _, err := models.SharedNodeValueDAO.SumAllNodeValues(tx, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemCPU, "cores", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result.TotalCPUCores = types.Int32(total)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// memory
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_, avg, max, err := models.SharedNodeValueDAO.SumAllNodeValues(tx, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemMemory, "usage", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result.AvgMemoryUsage = types.Float32(avg)
 | 
				
			||||||
 | 
							result.MaxMemoryUsage = types.Float32(max)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							total, _, _, err := models.SharedNodeValueDAO.SumAllNodeValues(tx, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemMemory, "total", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result.TotalMemoryBytes = types.Int64(total)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// load
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_, avg, max, err := models.SharedNodeValueDAO.SumAllNodeValues(tx, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemLoad, "load1m", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result.AvgLoad1Min = types.Float32(avg)
 | 
				
			||||||
 | 
							result.MaxLoad1Min = types.Float32(max)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_, avg, _, err := models.SharedNodeValueDAO.SumAllNodeValues(tx, nodeconfigs.NodeRoleNode, nodeconfigs.NodeValueItemLoad, "load5m", 1, nodeconfigs.NodeValueDurationUnitMinute)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result.AvgLoad5Min = types.Float32(avg)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -433,6 +433,7 @@ func (this *ServerGroupService) FindEnabledServerGroupConfigInfo(ctx context.Con
 | 
				
			|||||||
		ServerGroupId: int64(group.Id),
 | 
							ServerGroupId: int64(group.Id),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// http
 | 
				
			||||||
	if len(group.HttpReverseProxy) > 0 {
 | 
						if len(group.HttpReverseProxy) > 0 {
 | 
				
			||||||
		var ref = &serverconfigs.ReverseProxyRef{}
 | 
							var ref = &serverconfigs.ReverseProxyRef{}
 | 
				
			||||||
		err = json.Unmarshal(group.HttpReverseProxy, ref)
 | 
							err = json.Unmarshal(group.HttpReverseProxy, ref)
 | 
				
			||||||
@@ -442,6 +443,7 @@ func (this *ServerGroupService) FindEnabledServerGroupConfigInfo(ctx context.Con
 | 
				
			|||||||
		result.HasHTTPReverseProxy = ref.IsPrior
 | 
							result.HasHTTPReverseProxy = ref.IsPrior
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// tcp
 | 
				
			||||||
	if len(group.TcpReverseProxy) > 0 {
 | 
						if len(group.TcpReverseProxy) > 0 {
 | 
				
			||||||
		var ref = &serverconfigs.ReverseProxyRef{}
 | 
							var ref = &serverconfigs.ReverseProxyRef{}
 | 
				
			||||||
		err = json.Unmarshal(group.TcpReverseProxy, ref)
 | 
							err = json.Unmarshal(group.TcpReverseProxy, ref)
 | 
				
			||||||
@@ -451,6 +453,7 @@ func (this *ServerGroupService) FindEnabledServerGroupConfigInfo(ctx context.Con
 | 
				
			|||||||
		result.HasTCPReverseProxy = ref.IsPrior
 | 
							result.HasTCPReverseProxy = ref.IsPrior
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// udp
 | 
				
			||||||
	if len(group.UdpReverseProxy) > 0 {
 | 
						if len(group.UdpReverseProxy) > 0 {
 | 
				
			||||||
		var ref = &serverconfigs.ReverseProxyRef{}
 | 
							var ref = &serverconfigs.ReverseProxyRef{}
 | 
				
			||||||
		err = json.Unmarshal(group.UdpReverseProxy, ref)
 | 
							err = json.Unmarshal(group.UdpReverseProxy, ref)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user