mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	[API节点]列表显示版本号、CPU、内存、状态等信息
This commit is contained in:
		
							
								
								
									
										3
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								go.mod
									
									
									
									
									
								
							@@ -5,9 +5,11 @@ go 1.15
 | 
				
			|||||||
replace github.com/TeaOSLab/EdgeCommon => ../EdgeCommon
 | 
					replace github.com/TeaOSLab/EdgeCommon => ../EdgeCommon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
 | 
						github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
 | 
				
			||||||
	github.com/TeaOSLab/EdgeCommon v0.0.0-00010101000000-000000000000
 | 
						github.com/TeaOSLab/EdgeCommon v0.0.0-00010101000000-000000000000
 | 
				
			||||||
	github.com/aliyun/alibaba-cloud-sdk-go v1.61.641
 | 
						github.com/aliyun/alibaba-cloud-sdk-go v1.61.641
 | 
				
			||||||
	github.com/go-acme/lego/v4 v4.1.2
 | 
						github.com/go-acme/lego/v4 v4.1.2
 | 
				
			||||||
 | 
						github.com/go-ole/go-ole v1.2.4 // indirect
 | 
				
			||||||
	github.com/go-sql-driver/mysql v1.5.0
 | 
						github.com/go-sql-driver/mysql v1.5.0
 | 
				
			||||||
	github.com/go-yaml/yaml v2.1.0+incompatible
 | 
						github.com/go-yaml/yaml v2.1.0+incompatible
 | 
				
			||||||
	github.com/golang/protobuf v1.4.2
 | 
						github.com/golang/protobuf v1.4.2
 | 
				
			||||||
@@ -15,6 +17,7 @@ require (
 | 
				
			|||||||
	github.com/lionsoul2014/ip2region v2.2.0-release+incompatible
 | 
						github.com/lionsoul2014/ip2region v2.2.0-release+incompatible
 | 
				
			||||||
	github.com/mozillazg/go-pinyin v0.18.0
 | 
						github.com/mozillazg/go-pinyin v0.18.0
 | 
				
			||||||
	github.com/pkg/sftp v1.12.0
 | 
						github.com/pkg/sftp v1.12.0
 | 
				
			||||||
 | 
						github.com/shirou/gopsutil v2.20.9+incompatible
 | 
				
			||||||
	golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
 | 
						golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
 | 
				
			||||||
	google.golang.org/grpc v1.32.0
 | 
						google.golang.org/grpc v1.32.0
 | 
				
			||||||
	google.golang.org/protobuf v1.25.0
 | 
						google.golang.org/protobuf v1.25.0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								go.sum
									
									
									
									
									
								
							@@ -41,6 +41,8 @@ github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7/go.mod h1:Q5Db
 | 
				
			|||||||
github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks=
 | 
					github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks=
 | 
				
			||||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 | 
					github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 | 
				
			||||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 | 
					github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 | 
				
			||||||
 | 
					github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
 | 
				
			||||||
 | 
					github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 | 
				
			||||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.18/go.mod h1:L+HB2uBoDgi3+r1pJEJcbGwyyHhd2QXaGsKLbDwtm8Q=
 | 
					github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.18/go.mod h1:L+HB2uBoDgi3+r1pJEJcbGwyyHhd2QXaGsKLbDwtm8Q=
 | 
				
			||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
					github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
				
			||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
					github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
				
			||||||
@@ -96,6 +98,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2
 | 
				
			|||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
					github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
					github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
					github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
				
			||||||
 | 
					github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
 | 
				
			||||||
 | 
					github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
 | 
				
			||||||
github.com/go-redis/redis/v8 v8.0.0-beta.7/go.mod h1:FGJAWDWFht1sQ4qxyJHZZbVyvnVcKQN0E3u5/5lRz+g=
 | 
					github.com/go-redis/redis/v8 v8.0.0-beta.7/go.mod h1:FGJAWDWFht1sQ4qxyJHZZbVyvnVcKQN0E3u5/5lRz+g=
 | 
				
			||||||
github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8=
 | 
					github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8=
 | 
				
			||||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
 | 
					github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
 | 
				
			||||||
@@ -276,6 +280,10 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
 | 
				
			|||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
					github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
				
			||||||
github.com/sacloud/libsacloud v1.36.2/go.mod h1:P7YAOVmnIn3DKHqCZcUKYUXmSwGBm3yS7IBEjKVSrjg=
 | 
					github.com/sacloud/libsacloud v1.36.2/go.mod h1:P7YAOVmnIn3DKHqCZcUKYUXmSwGBm3yS7IBEjKVSrjg=
 | 
				
			||||||
 | 
					github.com/shirou/gopsutil v2.20.9+incompatible h1:msXs2frUV+O/JLva9EDLpuJ84PrFsdCTCQex8PUdtkQ=
 | 
				
			||||||
 | 
					github.com/shirou/gopsutil v2.20.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 | 
				
			||||||
 | 
					github.com/shirou/gopsutil v3.20.11+incompatible h1:LJr4ZQK4mPpIV5gOa4jCOKOGb4ty4DZO54I4FGqIpto=
 | 
				
			||||||
 | 
					github.com/shirou/gopsutil v3.20.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 | 
				
			||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 | 
					github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 | 
				
			||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
					github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
@@ -300,8 +308,6 @@ github.com/vultr/govultr v0.5.0/go.mod h1:wZZXZbYbqyY1n3AldoeYNZK4Wnmmoq6dNFkvd5
 | 
				
			|||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 | 
					github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 | 
				
			||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 | 
					github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 | 
				
			||||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 | 
					github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 | 
				
			||||||
github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119 h1:YyPWX3jLOtYKulBR6AScGIs74lLrJcgeKRwcbAuQOG4=
 | 
					 | 
				
			||||||
github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119/go.mod h1:/nuTSlK+okRfR/vnIPqR89fFKonnWPiZymN5ydRJkX8=
 | 
					 | 
				
			||||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 | 
					go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 | 
				
			||||||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 | 
					go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 | 
				
			||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
					go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
package teaconst
 | 
					package teaconst
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	Version = "0.0.6.1"
 | 
						Version = "0.0.6.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ProductName   = "Edge API"
 | 
						ProductName   = "Edge API"
 | 
				
			||||||
	ProcessName   = "edge-api"
 | 
						ProcessName   = "edge-api"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -232,6 +232,15 @@ func (this *APINodeDAO) FindEnabledAPINodeIdWithAddr(protocol string, host strin
 | 
				
			|||||||
	return int64(one.(*APINode).Id), nil
 | 
						return int64(one.(*APINode).Id), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 设置API节点状态
 | 
				
			||||||
 | 
					func (this *APINodeDAO) UpdateAPINodeStatus(apiNodeId int64, statusJSON []byte) error {
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(apiNodeId).
 | 
				
			||||||
 | 
							Set("status", statusJSON).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 生成唯一ID
 | 
					// 生成唯一ID
 | 
				
			||||||
func (this *APINodeDAO) genUniqueId() (string, error) {
 | 
					func (this *APINodeDAO) genUniqueId() (string, error) {
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,14 @@
 | 
				
			|||||||
package events
 | 
					package events
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Event = string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						EventStart  Event = "start"  // start loading
 | 
				
			||||||
 | 
						EventLoaded Event = "loaded" // first load
 | 
				
			||||||
 | 
						EventQuit   Event = "quit"   // quit node gracefully
 | 
				
			||||||
 | 
						EventReload Event = "reload" // reload config
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 节点更新事件
 | 
					// 节点更新事件
 | 
				
			||||||
// TODO 改成事件
 | 
					// TODO 改成事件
 | 
				
			||||||
var NodeDNSChanges = make(chan int64, 128)
 | 
					var NodeDNSChanges = make(chan int64, 128)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								internal/events/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								internal/events/utils.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					package events
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var eventsMap = map[string][]func(){} // event => []callbacks
 | 
				
			||||||
 | 
					var locker = sync.Mutex{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 增加事件回调
 | 
				
			||||||
 | 
					func On(event string, callback func()) {
 | 
				
			||||||
 | 
						locker.Lock()
 | 
				
			||||||
 | 
						defer locker.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						callbacks, _ := eventsMap[event]
 | 
				
			||||||
 | 
						callbacks = append(callbacks, callback)
 | 
				
			||||||
 | 
						eventsMap[event] = callbacks
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 通知事件
 | 
				
			||||||
 | 
					func Notify(event string) {
 | 
				
			||||||
 | 
						locker.Lock()
 | 
				
			||||||
 | 
						callbacks, _ := eventsMap[event]
 | 
				
			||||||
 | 
						locker.Unlock()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for _, callback := range callbacks {
 | 
				
			||||||
 | 
							callback()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -68,6 +68,9 @@ func (this *APINode) Start() {
 | 
				
			|||||||
	// 设置rlimit
 | 
						// 设置rlimit
 | 
				
			||||||
	_ = utils.SetRLimit(1024 * 1024)
 | 
						_ = utils.SetRLimit(1024 * 1024)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 状态变更计时器
 | 
				
			||||||
 | 
						go NewNodeStatusExecutor().Listen()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 监听RPC服务
 | 
						// 监听RPC服务
 | 
				
			||||||
	logs.Println("[API_NODE]starting rpc ...")
 | 
						logs.Println("[API_NODE]starting rpc ...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -136,6 +139,8 @@ func (this *APINode) Start() {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// HTTP接口
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !isListening {
 | 
						if !isListening {
 | 
				
			||||||
		logs.Println("[API_NODE]the api node does have a listening address")
 | 
							logs.Println("[API_NODE]the api node does have a listening address")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										181
									
								
								internal/nodes/node_status_executor.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								internal/nodes/node_status_executor.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,181 @@
 | 
				
			|||||||
 | 
					package nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/events"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/lists"
 | 
				
			||||||
 | 
						"github.com/shirou/gopsutil/cpu"
 | 
				
			||||||
 | 
						"github.com/shirou/gopsutil/disk"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type NodeStatusExecutor struct {
 | 
				
			||||||
 | 
						isFirstTime bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cpuUpdatedTime   time.Time
 | 
				
			||||||
 | 
						cpuLogicalCount  int
 | 
				
			||||||
 | 
						cpuPhysicalCount int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewNodeStatusExecutor() *NodeStatusExecutor {
 | 
				
			||||||
 | 
						return &NodeStatusExecutor{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) Listen() {
 | 
				
			||||||
 | 
						this.isFirstTime = true
 | 
				
			||||||
 | 
						this.cpuUpdatedTime = time.Now()
 | 
				
			||||||
 | 
						this.update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO 这个时间间隔可以配置
 | 
				
			||||||
 | 
						ticker := time.NewTicker(30 * time.Second)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						events.On(events.EventQuit, func() {
 | 
				
			||||||
 | 
							remotelogs.Println("NODE_STATUS", "quit executor")
 | 
				
			||||||
 | 
							ticker.Stop()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for range ticker.C {
 | 
				
			||||||
 | 
							this.isFirstTime = false
 | 
				
			||||||
 | 
							this.update()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) update() {
 | 
				
			||||||
 | 
						if sharedAPIConfig == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						status := &nodeconfigs.NodeStatus{}
 | 
				
			||||||
 | 
						status.BuildVersion = teaconst.Version
 | 
				
			||||||
 | 
						status.OS = runtime.GOOS
 | 
				
			||||||
 | 
						status.Arch = runtime.GOARCH
 | 
				
			||||||
 | 
						status.ConfigVersion = 0
 | 
				
			||||||
 | 
						status.IsActive = true
 | 
				
			||||||
 | 
						status.ConnectionCount = 0 // TODO 实现连接数计算
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hostname, _ := os.Hostname()
 | 
				
			||||||
 | 
						status.Hostname = hostname
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.updateCPU(status)
 | 
				
			||||||
 | 
						this.updateMem(status)
 | 
				
			||||||
 | 
						this.updateLoad(status)
 | 
				
			||||||
 | 
						this.updateDisk(status)
 | 
				
			||||||
 | 
						status.UpdatedAt = time.Now().Unix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//  发送数据
 | 
				
			||||||
 | 
						jsonData, err := json.Marshal(status)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							remotelogs.Error("NODE_STATUS", "serial NodeStatus fail: "+err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = models.SharedAPINodeDAO.UpdateAPINodeStatus(sharedAPIConfig.NumberId(), jsonData)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							remotelogs.Error("NODE_STATUS", "rpc UpdateNodeStatus() failed: "+err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新CPU
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) updateCPU(status *nodeconfigs.NodeStatus) {
 | 
				
			||||||
 | 
						duration := time.Duration(0)
 | 
				
			||||||
 | 
						if this.isFirstTime {
 | 
				
			||||||
 | 
							duration = 100 * time.Millisecond
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						percents, err := cpu.Percent(duration, false)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							status.Error = "cpu.Percent(): " + err.Error()
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(percents) == 0 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						status.CPUUsage = percents[0] / 100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if time.Since(this.cpuUpdatedTime) > 300*time.Second { // 每隔5分钟才会更新一次
 | 
				
			||||||
 | 
							this.cpuUpdatedTime = time.Now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							status.CPULogicalCount, err = cpu.Counts(true)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								status.Error = "cpu.Counts(): " + err.Error()
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							status.CPUPhysicalCount, err = cpu.Counts(false)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								status.Error = "cpu.Counts(): " + err.Error()
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							this.cpuLogicalCount = status.CPULogicalCount
 | 
				
			||||||
 | 
							this.cpuPhysicalCount = status.CPUPhysicalCount
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							status.CPULogicalCount = this.cpuLogicalCount
 | 
				
			||||||
 | 
							status.CPUPhysicalCount = this.cpuPhysicalCount
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新硬盘
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) updateDisk(status *nodeconfigs.NodeStatus) {
 | 
				
			||||||
 | 
						partitions, err := disk.Partitions(false)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							remotelogs.Error("NODE_STATUS", err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						lists.Sort(partitions, func(i int, j int) bool {
 | 
				
			||||||
 | 
							p1 := partitions[i]
 | 
				
			||||||
 | 
							p2 := partitions[j]
 | 
				
			||||||
 | 
							return p1.Mountpoint > p2.Mountpoint
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 当前TeaWeb所在的fs
 | 
				
			||||||
 | 
						rootFS := ""
 | 
				
			||||||
 | 
						rootTotal := uint64(0)
 | 
				
			||||||
 | 
						if lists.ContainsString([]string{"darwin", "linux", "freebsd"}, runtime.GOOS) {
 | 
				
			||||||
 | 
							for _, p := range partitions {
 | 
				
			||||||
 | 
								if p.Mountpoint == "/" {
 | 
				
			||||||
 | 
									rootFS = p.Fstype
 | 
				
			||||||
 | 
									usage, _ := disk.Usage(p.Mountpoint)
 | 
				
			||||||
 | 
									if usage != nil {
 | 
				
			||||||
 | 
										rootTotal = usage.Total
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						total := rootTotal
 | 
				
			||||||
 | 
						totalUsage := uint64(0)
 | 
				
			||||||
 | 
						maxUsage := float64(0)
 | 
				
			||||||
 | 
						for _, partition := range partitions {
 | 
				
			||||||
 | 
							if runtime.GOOS != "windows" && !strings.Contains(partition.Device, "/") && !strings.Contains(partition.Device, "\\") {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 跳过不同fs的
 | 
				
			||||||
 | 
							if len(rootFS) > 0 && rootFS != partition.Fstype {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							usage, err := disk.Usage(partition.Mountpoint)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if partition.Mountpoint != "/" && (usage.Total != rootTotal || total == 0) {
 | 
				
			||||||
 | 
								total += usage.Total
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							totalUsage += usage.Used
 | 
				
			||||||
 | 
							if usage.UsedPercent >= maxUsage {
 | 
				
			||||||
 | 
								maxUsage = usage.UsedPercent
 | 
				
			||||||
 | 
								status.DiskMaxUsagePartition = partition.Mountpoint
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						status.DiskTotal = total
 | 
				
			||||||
 | 
						status.DiskUsage = float64(totalUsage) / float64(total)
 | 
				
			||||||
 | 
						status.DiskMaxUsage = maxUsage / 100
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								internal/nodes/node_status_executor_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								internal/nodes/node_status_executor_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					package nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/shirou/gopsutil/cpu"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestNodeStatusExecutor_CPU(t *testing.T) {
 | 
				
			||||||
 | 
						countLogicCPU, err := cpu.Counts(true)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.Log("logic count:", countLogicCPU)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						countPhysicalCPU, err := cpu.Counts(false)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.Log("physical count:", countPhysicalCPU)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						percents, err := cpu.Percent(100 * time.Millisecond, false)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.Log(percents)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										41
									
								
								internal/nodes/node_status_executor_unix.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								internal/nodes/node_status_executor_unix.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					// +build !windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
				
			||||||
 | 
						"github.com/shirou/gopsutil/load"
 | 
				
			||||||
 | 
						"github.com/shirou/gopsutil/mem"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新内存
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) updateMem(status *nodeconfigs.NodeStatus) {
 | 
				
			||||||
 | 
						stat, err := mem.VirtualMemory()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 重新计算内存
 | 
				
			||||||
 | 
						if stat.Total > 0 {
 | 
				
			||||||
 | 
							stat.Used = stat.Total - stat.Free - stat.Buffers - stat.Cached
 | 
				
			||||||
 | 
							status.MemoryUsage = float64(stat.Used) / float64(stat.Total)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						status.MemoryTotal = stat.Total
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新负载
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) updateLoad(status *nodeconfigs.NodeStatus) {
 | 
				
			||||||
 | 
						stat, err := load.Avg()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							status.Error = err.Error()
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if stat == nil {
 | 
				
			||||||
 | 
							status.Error = "load is nil"
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						status.Load1m = stat.Load1
 | 
				
			||||||
 | 
						status.Load5m = stat.Load5
 | 
				
			||||||
 | 
						status.Load15m = stat.Load15
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										101
									
								
								internal/nodes/node_status_executor_windows.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								internal/nodes/node_status_executor_windows.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
				
			|||||||
 | 
					// +build windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"github.com/shirou/gopsutil/cpu"
 | 
				
			||||||
 | 
						"github.com/shirou/gopsutil/mem"
 | 
				
			||||||
 | 
						"math"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type WindowsLoadValue struct {
 | 
				
			||||||
 | 
						Timestamp int64
 | 
				
			||||||
 | 
						Value     int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var windowsLoadValues = []*WindowsLoadValue{}
 | 
				
			||||||
 | 
					var windowsLoadLocker = &sync.Mutex{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新内存
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) updateMem(status *NodeStatus) {
 | 
				
			||||||
 | 
						stat, err := mem.VirtualMemory()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							status.Error = err.Error()
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						status.MemoryUsage = stat.UsedPercent
 | 
				
			||||||
 | 
						status.MemoryTotal = stat.Total
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新负载
 | 
				
			||||||
 | 
					func (this *NodeStatusExecutor) updateLoad(status *NodeStatus) {
 | 
				
			||||||
 | 
						timestamp := time.Now().Unix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						currentLoad := 0
 | 
				
			||||||
 | 
						info, err := cpu.ProcInfo()
 | 
				
			||||||
 | 
						if err == nil && len(info) > 0 && info[0].ProcessorQueueLength < 1000 {
 | 
				
			||||||
 | 
							currentLoad = int(info[0].ProcessorQueueLength)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 删除15分钟之前的数据
 | 
				
			||||||
 | 
						windowsLoadLocker.Lock()
 | 
				
			||||||
 | 
						result := []*WindowsLoadValue{}
 | 
				
			||||||
 | 
						for _, v := range windowsLoadValues {
 | 
				
			||||||
 | 
							if timestamp-v.Timestamp > 15*60 {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result = append(result, v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						result = append(result, &WindowsLoadValue{
 | 
				
			||||||
 | 
							Timestamp: timestamp,
 | 
				
			||||||
 | 
							Value:     currentLoad,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						windowsLoadValues = result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						total1 := 0
 | 
				
			||||||
 | 
						count1 := 0
 | 
				
			||||||
 | 
						total5 := 0
 | 
				
			||||||
 | 
						count5 := 0
 | 
				
			||||||
 | 
						total15 := 0
 | 
				
			||||||
 | 
						count15 := 0
 | 
				
			||||||
 | 
						for _, v := range result {
 | 
				
			||||||
 | 
							if timestamp-v.Timestamp <= 60 {
 | 
				
			||||||
 | 
								total1 += v.Value
 | 
				
			||||||
 | 
								count1++
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if timestamp-v.Timestamp <= 300 {
 | 
				
			||||||
 | 
								total5 += v.Value
 | 
				
			||||||
 | 
								count5++
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							total15 += v.Value
 | 
				
			||||||
 | 
							count15++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						load1 := float64(0)
 | 
				
			||||||
 | 
						load5 := float64(0)
 | 
				
			||||||
 | 
						load15 := float64(0)
 | 
				
			||||||
 | 
						if count1 > 0 {
 | 
				
			||||||
 | 
							load1 = math.Round(float64(total1*100)/float64(count1)) / 100
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if count5 > 0 {
 | 
				
			||||||
 | 
							load5 = math.Round(float64(total5*100)/float64(count5)) / 100
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if count15 > 0 {
 | 
				
			||||||
 | 
							load15 = math.Round(float64(total15*100)/float64(count15)) / 100
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						windowsLoadLocker.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 在老Windows上不显示错误
 | 
				
			||||||
 | 
						if err == context.DeadlineExceeded {
 | 
				
			||||||
 | 
							err = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						status.Load1m = load1
 | 
				
			||||||
 | 
						status.Load5m = load5
 | 
				
			||||||
 | 
						status.Load15m = load15
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										90
									
								
								internal/remotelogs/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								internal/remotelogs/utils.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					package remotelogs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var logChan = make(chan *pb.NodeLog, 1024)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						// 定期上传日志
 | 
				
			||||||
 | 
						ticker := time.NewTicker(60 * time.Second)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							for range ticker.C {
 | 
				
			||||||
 | 
								// TODO
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 打印普通信息
 | 
				
			||||||
 | 
					func Println(tag string, description string) {
 | 
				
			||||||
 | 
						logs.Println("[" + tag + "]" + description)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nodeConfig, _ := nodeconfigs.SharedNodeConfig()
 | 
				
			||||||
 | 
						if nodeConfig == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						select {
 | 
				
			||||||
 | 
						case logChan <- &pb.NodeLog{
 | 
				
			||||||
 | 
							Role:        teaconst.Role,
 | 
				
			||||||
 | 
							Tag:         tag,
 | 
				
			||||||
 | 
							Description: description,
 | 
				
			||||||
 | 
							Level:       "info",
 | 
				
			||||||
 | 
							NodeId:      nodeConfig.Id,
 | 
				
			||||||
 | 
							CreatedAt:   time.Now().Unix(),
 | 
				
			||||||
 | 
						}:
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 打印警告信息
 | 
				
			||||||
 | 
					func Warn(tag string, description string) {
 | 
				
			||||||
 | 
						logs.Println("[" + tag + "]" + description)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nodeConfig, _ := nodeconfigs.SharedNodeConfig()
 | 
				
			||||||
 | 
						if nodeConfig == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						select {
 | 
				
			||||||
 | 
						case logChan <- &pb.NodeLog{
 | 
				
			||||||
 | 
							Role:        teaconst.Role,
 | 
				
			||||||
 | 
							Tag:         tag,
 | 
				
			||||||
 | 
							Description: description,
 | 
				
			||||||
 | 
							Level:       "warning",
 | 
				
			||||||
 | 
							NodeId:      nodeConfig.Id,
 | 
				
			||||||
 | 
							CreatedAt:   time.Now().Unix(),
 | 
				
			||||||
 | 
						}:
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 打印错误信息
 | 
				
			||||||
 | 
					func Error(tag string, description string) {
 | 
				
			||||||
 | 
						logs.Println("[" + tag + "]" + description)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nodeConfig, _ := nodeconfigs.SharedNodeConfig()
 | 
				
			||||||
 | 
						if nodeConfig == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						select {
 | 
				
			||||||
 | 
						case logChan <- &pb.NodeLog{
 | 
				
			||||||
 | 
							Role:        teaconst.Role,
 | 
				
			||||||
 | 
							Tag:         tag,
 | 
				
			||||||
 | 
							Description: description,
 | 
				
			||||||
 | 
							Level:       "error",
 | 
				
			||||||
 | 
							NodeId:      nodeConfig.Id,
 | 
				
			||||||
 | 
							CreatedAt:   time.Now().Unix(),
 | 
				
			||||||
 | 
						}:
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -140,6 +140,7 @@ func (this *APINodeService) ListEnabledAPINodes(ctx context.Context, req *pb.Lis
 | 
				
			|||||||
			HttpsJSON:       []byte(node.Https),
 | 
								HttpsJSON:       []byte(node.Https),
 | 
				
			||||||
			AccessAddrsJSON: []byte(node.AccessAddrs),
 | 
								AccessAddrsJSON: []byte(node.AccessAddrs),
 | 
				
			||||||
			AccessAddrs:     accessAddrs,
 | 
								AccessAddrs:     accessAddrs,
 | 
				
			||||||
 | 
								StatusJSON:      []byte(node.Status),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user