From c9a9441f3e5bfefa22cdeea1cbd80c4b4c235c4d Mon Sep 17 00:00:00 2001 From: naiba Date: Sun, 15 Aug 2021 16:38:05 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20[0.9.19]=20=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E6=95=B0/=E8=BF=9E=E6=8E=A5=E6=95=B0/=E8=B4=9F=E8=BD=BD=20?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E6=8A=A5=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- cmd/agent/main.go | 4 +- cmd/agent/monitor/monitor.go | 27 +++++ model/host.go | 18 ++++ model/rule.go | 52 +++++---- proto/nezha.pb.go | 123 ++++++++++++++++------ proto/nezha.proto | 6 ++ resource/template/theme-default/home.html | 6 ++ service/dao/dao.go | 2 +- 9 files changed, 189 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index a819d7f..10a5f4e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
LOGO designed by 熊大 .

-    +   

:trollface: 哪吒监控 一站式轻监控轻运维系统。支持系统状态、HTTP(SSL 证书变更、即将到期、到期)、TCP、Ping 监控报警,命令批量执行和计划任务。

@@ -102,9 +102,12 @@ URL 里面也可放置占位符,请求时会进行简单的字符串替换。 ##### 基本规则 - type - - cpu、memory、swap、disk - - net_in_speed(入站网速)、net_out_speed(出站网速)、net_all_speed(双向网速)、transfer_in(入站流量)、transfer_out(出站流量)、transfer_all(双向流量) - - offline + - `cpu`、`memory`、`swap`、`disk` + - `net_in_speed` 入站网速、`net_out_speed` 出站网速、`net_all_speed` 双向网速、`transfer_in` 入站流量、`transfer_out` 出站流量、`transfer_all` 双向流量 + - `offline` 离线监控 + - `load1`、`load5`、`load15` 负载 + - `process_count` 线程数 *目前取线程数占用资源太多,暂时不支持* + - `tcp_conn_count`、`udp_conn_count` 网络连接数 - duration:持续秒数,秒数内采样记录 30% 以上触发阈值才会报警(防数据插针) - min/max - 流量、网速类数值 为字节(1KB=1024B,1MB = 1024\*1024B) diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 9d0c87e..9048efa 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -265,10 +265,8 @@ func doTask(task *pb.Task) { func reportState() { var lastReportHostInfo time.Time var err error - var now time.Time defer println("reportState exit", time.Now(), "=>", err) for { - now = time.Now() // 为了更准确的记录时段流量,inited 后再上传状态信息 if client != nil && inited { monitor.TrackNetworkSpeed() @@ -284,7 +282,7 @@ func reportState() { client.ReportSystemInfo(context.Background(), monitor.GetHost().PB()) } } - time.Sleep(time.Until(now.Add(time.Second))) + time.Sleep(time.Second) } } diff --git a/cmd/agent/monitor/monitor.go b/cmd/agent/monitor/monitor.go index 7734d83..c64b0ff 100644 --- a/cmd/agent/monitor/monitor.go +++ b/cmd/agent/monitor/monitor.go @@ -11,8 +11,10 @@ import ( "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v3/load" "github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v3/net" + "github.com/shirou/gopsutil/v3/process" "github.com/naiba/nezha/model" ) @@ -77,6 +79,7 @@ func GetState() *model.HostState { var swapMemUsed uint64 if runtime.GOOS == "windows" { + // gopsutil 在 Windows 下不能正确取 swap ms, _ := mem.SwapMemory() swapMemUsed = ms.Used } else { @@ -89,6 +92,24 @@ func GetState() *model.HostState { cpuPercent = cp[0] } _, diskUsed := getDiskTotalAndUsed() + loadStat, _ := load.Avg() + + tcpConns, _ := net.Connections("tcp") + udpConns, _ := net.Connections("udp") + + ps, _ := process.Pids() + // log.Println("pids", len(ps), err) + // var threads uint64 + // for i := 0; i < len(ps); i++ { + // p, err := process.NewProcess(ps[i]) + // if err != nil { + // continue + // } + // c, _ := p.NumThreads() + // threads += uint64(c) + // } + // log.Println("threads", threads) + return &model.HostState{ CPU: cpuPercent, MemUsed: mv.Total - mv.Available, @@ -99,6 +120,12 @@ func GetState() *model.HostState { NetInSpeed: atomic.LoadUint64(&netInSpeed), NetOutSpeed: atomic.LoadUint64(&netOutSpeed), Uptime: hi.Uptime, + Load1: loadStat.Load1, + Load5: loadStat.Load5, + Load15: loadStat.Load15, + TcpConnCount: uint64(len(tcpConns)), + UdpConnCount: uint64(len(udpConns)), + ProcessCount: uint64(len(ps)), } } diff --git a/model/host.go b/model/host.go index 6e4431e..94d5669 100644 --- a/model/host.go +++ b/model/host.go @@ -20,6 +20,12 @@ type HostState struct { NetInSpeed uint64 NetOutSpeed uint64 Uptime uint64 + Load1 float64 + Load5 float64 + Load15 float64 + TcpConnCount uint64 + UdpConnCount uint64 + ProcessCount uint64 } func (s *HostState) PB() *pb.State { @@ -33,6 +39,12 @@ func (s *HostState) PB() *pb.State { NetInSpeed: s.NetInSpeed, NetOutSpeed: s.NetOutSpeed, Uptime: s.Uptime, + Load1: s.Load1, + Load5: s.Load5, + Load15: s.Load15, + TcpConnCount: s.TcpConnCount, + UdpConnCount: s.UdpConnCount, + ProcessCount: s.ProcessCount, } } @@ -47,6 +59,12 @@ func PB2State(s *pb.State) HostState { NetInSpeed: s.GetNetInSpeed(), NetOutSpeed: s.GetNetOutSpeed(), Uptime: s.GetUptime(), + Load1: s.GetLoad1(), + Load5: s.GetLoad5(), + Load15: s.GetLoad15(), + TcpConnCount: s.GetTcpConnCount(), + UdpConnCount: s.GetUdpConnCount(), + ProcessCount: s.GetProcessCount(), } } diff --git a/model/rule.go b/model/rule.go index 9e049bc..2fb3a72 100644 --- a/model/rule.go +++ b/model/rule.go @@ -21,8 +21,8 @@ type Rule struct { // net_all_speed、transfer_in、transfer_out、transfer_all、offline // transfer_in_cycle、transfer_out_cycle、transfer_all_cycle Type string `json:"type,omitempty"` - Min uint64 `json:"min,omitempty"` // 最小阈值 (百分比、字节 kb ÷ 1024) - Max uint64 `json:"max,omitempty"` // 最大阈值 (百分比、字节 kb ÷ 1024) + Min float64 `json:"min,omitempty"` // 最小阈值 (百分比、字节 kb ÷ 1024) + Max float64 `json:"max,omitempty"` // 最大阈值 (百分比、字节 kb ÷ 1024) CycleStart time.Time `json:"cycle_start,omitempty"` // 流量统计的开始时间 CycleInterval uint64 `json:"cycle_interval,omitempty"` // 流量统计周期 Duration uint64 `json:"duration,omitempty"` // 持续时间 (秒) @@ -34,11 +34,11 @@ type Rule struct { LastCycleStatus map[uint64]interface{} `json:"-"` } -func percentage(used, total uint64) uint64 { +func percentage(used, total uint64) float64 { if total == 0 { return 0 } - return used * 100 / total + return float64(used) * 100 / float64(total) } // Snapshot 未通过规则返回 struct{}{}, 通过返回 nil @@ -57,11 +57,11 @@ func (u *Rule) Snapshot(server *Server, db *gorm.DB) interface{} { return u.LastCycleStatus[server.ID] } - var src uint64 + var src float64 switch u.Type { case "cpu": - src = uint64(server.State.CPU) + src = float64(server.State.CPU) case "memory": src = percentage(server.State.MemUsed, server.Host.MemTotal) case "swap": @@ -69,44 +69,56 @@ func (u *Rule) Snapshot(server *Server, db *gorm.DB) interface{} { case "disk": src = percentage(server.State.DiskUsed, server.Host.DiskTotal) case "net_in_speed": - src = server.State.NetInSpeed + src = float64(server.State.NetInSpeed) case "net_out_speed": - src = server.State.NetOutSpeed + src = float64(server.State.NetOutSpeed) case "net_all_speed": - src = server.State.NetOutSpeed + server.State.NetOutSpeed + src = float64(server.State.NetOutSpeed + server.State.NetOutSpeed) case "transfer_in": - src = server.State.NetInTransfer + src = float64(server.State.NetInTransfer) case "transfer_out": - src = server.State.NetOutTransfer + src = float64(server.State.NetOutTransfer) case "transfer_all": - src = server.State.NetOutTransfer + server.State.NetInTransfer + src = float64(server.State.NetOutTransfer + server.State.NetInTransfer) case "offline": if server.LastActive.IsZero() { src = 0 } else { - src = uint64(server.LastActive.Unix()) + src = float64(server.LastActive.Unix()) } case "transfer_in_cycle": - src = server.State.NetInTransfer - uint64(server.PrevHourlyTransferIn) + src = float64(server.State.NetInTransfer - uint64(server.PrevHourlyTransferIn)) if u.CycleInterval != 1 { var res NResult db.Model(&Transfer{}).Select("SUM(`in`) AS n").Where("created_at > ? AND server_id = ?", u.GetTransferDurationStart(), server.ID).Scan(&res) - src += res.N + src += float64(res.N) } case "transfer_out_cycle": - src = server.State.NetOutTransfer - uint64(server.PrevHourlyTransferOut) + src = float64(server.State.NetOutTransfer - uint64(server.PrevHourlyTransferOut)) if u.CycleInterval != 1 { var res NResult db.Model(&Transfer{}).Select("SUM(`out`) AS n").Where("created_at > ? AND server_id = ?", u.GetTransferDurationStart(), server.ID).Scan(&res) - src += res.N + src += float64(res.N) } case "transfer_all_cycle": - src = server.State.NetOutTransfer - uint64(server.PrevHourlyTransferOut) + server.State.NetInTransfer - uint64(server.PrevHourlyTransferIn) + src = float64(server.State.NetOutTransfer - uint64(server.PrevHourlyTransferOut) + server.State.NetInTransfer - uint64(server.PrevHourlyTransferIn)) if u.CycleInterval != 1 { var res NResult db.Model(&Transfer{}).Select("SUM(`in`+`out`) AS n").Where("created_at > ? AND server_id = ?", u.GetTransferDurationStart(), server.ID).Scan(&res) - src += res.N + src += float64(res.N) } + case "load1": + src = server.State.Load1 + case "load5": + src = server.State.Load5 + case "load15": + src = server.State.Load15 + case "tcp_conn_count": + src = float64(server.State.TcpConnCount) + case "udp_conn_count": + src = float64(server.State.UdpConnCount) + case "process_count": + src = float64(server.State.ProcessCount) } // 循环区间流量检测 · 更新下次需要检测时间 @@ -129,7 +141,7 @@ func (u *Rule) Snapshot(server *Server, db *gorm.DB) interface{} { } } - if u.Type == "offline" && uint64(time.Now().Unix())-src > 6 { + if u.Type == "offline" && float64(time.Now().Unix())-src > 6 { return struct{}{} } else if (u.Max > 0 && src > u.Max) || (u.Min > 0 && src < u.Min) { return struct{}{} diff --git a/proto/nezha.pb.go b/proto/nezha.pb.go index 0217cf5..7d57bfd 100644 --- a/proto/nezha.pb.go +++ b/proto/nezha.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.17.3 // source: proto/nezha.proto package proto @@ -178,6 +178,12 @@ type State struct { NetInSpeed uint64 `protobuf:"varint,8,opt,name=net_in_speed,json=netInSpeed,proto3" json:"net_in_speed,omitempty"` NetOutSpeed uint64 `protobuf:"varint,9,opt,name=net_out_speed,json=netOutSpeed,proto3" json:"net_out_speed,omitempty"` Uptime uint64 `protobuf:"varint,10,opt,name=uptime,proto3" json:"uptime,omitempty"` + Load1 float64 `protobuf:"fixed64,11,opt,name=load1,proto3" json:"load1,omitempty"` + Load5 float64 `protobuf:"fixed64,12,opt,name=load5,proto3" json:"load5,omitempty"` + Load15 float64 `protobuf:"fixed64,13,opt,name=load15,proto3" json:"load15,omitempty"` + TcpConnCount uint64 `protobuf:"varint,14,opt,name=tcp_conn_count,json=tcpConnCount,proto3" json:"tcp_conn_count,omitempty"` + UdpConnCount uint64 `protobuf:"varint,15,opt,name=udp_conn_count,json=udpConnCount,proto3" json:"udp_conn_count,omitempty"` + ProcessCount uint64 `protobuf:"varint,16,opt,name=process_count,json=processCount,proto3" json:"process_count,omitempty"` } func (x *State) Reset() { @@ -275,6 +281,48 @@ func (x *State) GetUptime() uint64 { return 0 } +func (x *State) GetLoad1() float64 { + if x != nil { + return x.Load1 + } + return 0 +} + +func (x *State) GetLoad5() float64 { + if x != nil { + return x.Load5 + } + return 0 +} + +func (x *State) GetLoad15() float64 { + if x != nil { + return x.Load15 + } + return 0 +} + +func (x *State) GetTcpConnCount() uint64 { + if x != nil { + return x.TcpConnCount + } + return 0 +} + +func (x *State) GetUdpConnCount() uint64 { + if x != nil { + return x.UdpConnCount + } + return 0 +} + +func (x *State) GetProcessCount() uint64 { + if x != nil { + return x.ProcessCount + } + return 0 +} + type Task struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -490,7 +538,7 @@ var file_proto_nezha_proto_rawDesc = []byte{ 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd3, 0x03, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x65, 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x65, 0x6d, @@ -508,36 +556,47 @@ var file_proto_nezha_proto_rawDesc = []byte{ 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x65, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x4f, 0x75, 0x74, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, - 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7a, - 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x22, 0x21, 0x0a, 0x07, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x32, 0xd6, 0x01, - 0x0a, 0x0c, 0x4e, 0x65, 0x7a, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, - 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, - 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x0b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x42, 0x07, 0x5a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x6f, 0x61, 0x64, 0x31, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x6c, + 0x6f, 0x61, 0x64, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x61, 0x64, 0x35, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x61, 0x64, 0x35, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, + 0x61, 0x64, 0x31, 0x35, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, + 0x31, 0x35, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x63, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x63, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x64, 0x70, 0x5f, + 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x75, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x7a, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x22, + 0x21, 0x0a, 0x07, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x64, 0x32, 0xd6, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x7a, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0a, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x0e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x2b, + 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x42, 0x07, 0x5a, 0x05, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/nezha.proto b/proto/nezha.proto index 372825a..a613c3d 100644 --- a/proto/nezha.proto +++ b/proto/nezha.proto @@ -35,6 +35,12 @@ message State { uint64 net_in_speed = 8; uint64 net_out_speed = 9; uint64 uptime = 10; + double load1 = 11; + double load5 = 12; + double load15 = 13; + uint64 tcp_conn_count = 14; + uint64 udp_conn_count = 15; + uint64 process_count = 16; } message Task { diff --git a/resource/template/theme-default/home.html b/resource/template/theme-default/home.html index 94001c9..6cd731d 100644 --- a/resource/template/theme-default/home.html +++ b/resource/template/theme-default/home.html @@ -51,6 +51,9 @@ class="arrow alternate circle up outline icon" >@#formatByteSize(server.State.NetOutTransfer)#@
+ 负载:@# toFixed2(server.State.Load1) #@/@# toFixed2(server.State.Load5) #@/@# toFixed2(server.State.Load15) #@
+ 进程数:@# server.State.ProcessCount #@
+ 连接数:TCP @# server.State.TcpConnCount #@ / UDP @# server.State.UdpConnCount #@
启动:@# formatTimestamp(server.Host.BootTime) #@
活动:@# new Date(server.LastActive).toLocaleString() #@
版本:@#server.Host.Version#@
@@ -166,6 +169,9 @@ }); }, methods: { + toFixed2(f){ + return f.toFixed(2) + }, group() { this.groups = groupingData(this.data, "Tag") }, diff --git a/service/dao/dao.go b/service/dao/dao.go index 82c1a3a..c7fca45 100644 --- a/service/dao/dao.go +++ b/service/dao/dao.go @@ -13,7 +13,7 @@ import ( pb "github.com/naiba/nezha/proto" ) -var Version = "v0.9.18" // !!记得修改 README 中的 badge 版本!! +var Version = "v0.9.19" // !!记得修改 README 中的 badge 版本!! var ( Conf *model.Config