From 963be2bc63429141cb669bbd2344c0aa3ed790ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Sun, 27 Jun 2021 21:59:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B6=E6=AE=B5=E6=80=A7=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/rpc_client.go | 8 + .../cluster/settings/health/runPopup.go | 3 + .../default/clusters/cluster/settings/init.go | 7 + .../cluster/settings/metrics/createPopup.go | 61 +++++++ .../cluster/settings/metrics/delete.go | 13 ++ .../cluster/settings/metrics/index.go | 51 ++++++ .../clusters/clusterutils/cluster_helper.go | 155 +++++------------- .../servers/iplists/bindHTTPFirewallPopup.go | 2 + .../servers/iplists/unbindHTTPFirewall.go | 2 + .../actions/default/servers/metrics/charts.go | 25 +++ .../default/servers/metrics/createPopup.go | 83 ++++++++++ .../actions/default/servers/metrics/delete.go | 26 +++ .../actions/default/servers/metrics/index.go | 61 +++++++ .../actions/default/servers/metrics/init.go | 24 +++ .../actions/default/servers/metrics/item.go | 25 +++ .../actions/default/servers/metrics/update.go | 73 ++++++++- .../actions/default/servers/metrics/utils.go | 37 +++++ internal/web/actions/default/ui/components.go | 18 ++ internal/web/helpers/user_must_auth.go | 5 + internal/web/import.go | 1 + .../common/health-check-config-box.js | 1 + web/public/js/components/common/links.js | 2 +- .../server/metric-keys-config-box.js | 41 ++++- web/public/js/utils.js | 4 +- web/views/@default/@layout.css | 7 +- web/views/@default/@layout.css.map | 2 +- web/views/@default/@layout.html | 2 +- web/views/@default/@layout.less | 8 +- .../cluster/settings/health/runPopup.html | 2 +- .../cluster/settings/metrics/createPopup.html | 38 +++++ .../cluster/settings/metrics/index.html | 47 ++++++ .../cluster/settings/metrics/index.js | 30 ++++ .../clusters/cluster/settings/toa/index.html | 2 +- web/views/@default/servers/create.html | 1 + .../@default/servers/metrics/@item_menu.html | 7 + .../@default/servers/metrics/charts.html | 4 + .../@default/servers/metrics/createPopup.html | 54 ++++++ web/views/@default/servers/metrics/index.html | 46 ++++++ web/views/@default/servers/metrics/index.js | 27 +++ web/views/@default/servers/metrics/item.html | 27 +++ .../@default/servers/metrics/update.html | 60 +++++++ web/views/@default/servers/metrics/update.js | 3 + 42 files changed, 956 insertions(+), 139 deletions(-) create mode 100644 internal/web/actions/default/clusters/cluster/settings/metrics/createPopup.go create mode 100644 internal/web/actions/default/clusters/cluster/settings/metrics/delete.go create mode 100644 internal/web/actions/default/clusters/cluster/settings/metrics/index.go create mode 100644 internal/web/actions/default/servers/metrics/charts.go create mode 100644 internal/web/actions/default/servers/metrics/createPopup.go create mode 100644 internal/web/actions/default/servers/metrics/delete.go create mode 100644 internal/web/actions/default/servers/metrics/index.go create mode 100644 internal/web/actions/default/servers/metrics/init.go create mode 100644 internal/web/actions/default/servers/metrics/item.go create mode 100644 internal/web/actions/default/servers/metrics/utils.go create mode 100644 web/views/@default/clusters/cluster/settings/metrics/createPopup.html create mode 100644 web/views/@default/clusters/cluster/settings/metrics/index.html create mode 100644 web/views/@default/clusters/cluster/settings/metrics/index.js create mode 100644 web/views/@default/servers/metrics/@item_menu.html create mode 100644 web/views/@default/servers/metrics/charts.html create mode 100644 web/views/@default/servers/metrics/createPopup.html create mode 100644 web/views/@default/servers/metrics/index.html create mode 100644 web/views/@default/servers/metrics/index.js create mode 100644 web/views/@default/servers/metrics/item.html create mode 100644 web/views/@default/servers/metrics/update.html create mode 100644 web/views/@default/servers/metrics/update.js diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index 4688fd84..0ffb74b2 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -388,6 +388,14 @@ func (this *RPCClient) NSAccessLogRPC() pb.NSAccessLogServiceClient { return pb.NewNSAccessLogServiceClient(this.pickConn()) } +func (this *RPCClient) MetricItemRPC() pb.MetricItemServiceClient { + return pb.NewMetricItemServiceClient(this.pickConn()) +} + +func (this *RPCClient) NodeClusterMetricItemRPC() pb.NodeClusterMetricItemServiceClient { + return pb.NewNodeClusterMetricItemServiceClient(this.pickConn()) +} + // Context 构造Admin上下文 func (this *RPCClient) Context(adminId int64) context.Context { ctx := context.Background() diff --git a/internal/web/actions/default/clusters/cluster/settings/health/runPopup.go b/internal/web/actions/default/clusters/cluster/settings/health/runPopup.go index 7084946b..69a19d83 100644 --- a/internal/web/actions/default/clusters/cluster/settings/health/runPopup.go +++ b/internal/web/actions/default/clusters/cluster/settings/health/runPopup.go @@ -32,6 +32,9 @@ func (this *RunPopupAction) RunPost(params struct { this.Fail(err.Error()) } + if resp.Results == nil { + resp.Results = []*pb.ExecuteNodeClusterHealthCheckResponse_Result{} + } this.Data["results"] = resp.Results this.Success() } diff --git a/internal/web/actions/default/clusters/cluster/settings/init.go b/internal/web/actions/default/clusters/cluster/settings/init.go index b92fe649..55ae2c9e 100644 --- a/internal/web/actions/default/clusters/cluster/settings/init.go +++ b/internal/web/actions/default/clusters/cluster/settings/init.go @@ -7,6 +7,7 @@ import ( firewallActions "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings/firewall-actions" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings/health" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings/message" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings/metrics" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings/services" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings/thresholds" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings/toa" @@ -67,6 +68,12 @@ func init() { GetPost("/updatePopup", new(thresholds.UpdatePopupAction)). Post("/delete", new(thresholds.DeleteAction)). + // 指标 + Prefix("/clusters/cluster/settings/metrics"). + Get("", new(metrics.IndexAction)). + GetPost("/createPopup", new(metrics.CreatePopupAction)). + Post("/delete", new(metrics.DeleteAction)). + EndAll() }) } diff --git a/internal/web/actions/default/clusters/cluster/settings/metrics/createPopup.go b/internal/web/actions/default/clusters/cluster/settings/metrics/createPopup.go new file mode 100644 index 00000000..ba3144c9 --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/settings/metrics/createPopup.go @@ -0,0 +1,61 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct { + Category string +}) { + if len(params.Category) == 0 { + params.Category = "http" + } + this.Data["category"] = params.Category + + countResp, err := this.RPC().MetricItemRPC().CountAllEnabledMetricItems(this.AdminContext(), &pb.CountAllEnabledMetricItemsRequest{Category: params.Category}) + if err != nil { + this.ErrorPage(err) + return + } + var count = countResp.Count + page := this.NewPage(count) + this.Data["page"] = page.AsHTML() + + itemsResp, err := this.RPC().MetricItemRPC().ListEnabledMetricItems(this.AdminContext(), &pb.ListEnabledMetricItemsRequest{ + Category: params.Category, + Offset: page.Offset, + Size: page.Size, + }) + if err != nil { + this.ErrorPage(err) + return + } + var itemMaps = []maps.Map{} + for _, item := range itemsResp.MetricItems { + itemMaps = append(itemMaps, maps.Map{ + "id": item.Id, + "name": item.Name, + "isOn": item.IsOn, + "period": item.Period, + "periodUnit": item.PeriodUnit, + "keys": item.Keys, + "value": item.Value, + "category": item.Category, + }) + } + this.Data["items"] = itemMaps + + this.Show() +} diff --git a/internal/web/actions/default/clusters/cluster/settings/metrics/delete.go b/internal/web/actions/default/clusters/cluster/settings/metrics/delete.go new file mode 100644 index 00000000..60128ba9 --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/settings/metrics/delete.go @@ -0,0 +1,13 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct{}) { + this.Success() +} diff --git a/internal/web/actions/default/clusters/cluster/settings/metrics/index.go b/internal/web/actions/default/clusters/cluster/settings/metrics/index.go new file mode 100644 index 00000000..6bb2e072 --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/settings/metrics/index.go @@ -0,0 +1,51 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "setting", "setting") + this.SecondMenu("metric") +} + +func (this *IndexAction) RunGet(params struct { + ClusterId int64 + Category string +}) { + if len(params.Category) == 0 { + params.Category = "http" + } + this.Data["category"] = params.Category + + itemsResp, err := this.RPC().NodeClusterMetricItemRPC().FindAllNodeClusterMetricItems(this.AdminContext(), &pb.FindAllNodeClusterMetricItemsRequest{NodeClusterId: params.ClusterId}) + if err != nil { + this.ErrorPage(err) + return + } + + var itemMaps = []maps.Map{} + for _, item := range itemsResp.MetricItems { + itemMaps = append(itemMaps, maps.Map{ + "id": item.Id, + "name": item.Name, + "isOn": item.IsOn, + "period": item.Period, + "periodUnit": item.PeriodUnit, + "keys": item.Keys, + "value": item.Value, + "category": item.Category, + }) + } + this.Data["items"] = itemMaps + + this.Show() +} diff --git a/internal/web/actions/default/clusters/clusterutils/cluster_helper.go b/internal/web/actions/default/clusters/clusterutils/cluster_helper.go index 96663951..eb6dde8e 100644 --- a/internal/web/actions/default/clusters/clusterutils/cluster_helper.go +++ b/internal/web/actions/default/clusters/clusterutils/cluster_helper.go @@ -1,15 +1,12 @@ package clusterutils import ( - "encoding/json" teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" "github.com/TeaOSLab/EdgeAdmin/internal/rpc" "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/maps" @@ -39,7 +36,8 @@ func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext action.Data["clusterId"] = clusterId if clusterId > 0 { - cluster, err := dao.SharedNodeClusterDAO.FindEnabledNodeCluster(actionPtr.(rpc.ContextInterface).AdminContext(), clusterId) + var ctx = actionPtr.(rpc.ContextInterface).AdminContext() + cluster, err := dao.SharedNodeClusterDAO.FindEnabledNodeCluster(ctx, clusterId) if err != nil { logs.Error(err) return @@ -49,6 +47,16 @@ func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext return } + clusterInfo, err := dao.SharedNodeClusterDAO.FindEnabledNodeClusterConfigInfo(ctx, clusterId) + if err != nil { + logs.Error(err) + return + } + if clusterInfo == nil { + action.WriteString("can not find cluster info") + return + } + tabbar := actionutils.NewTabbar() tabbar.Add("集群列表", "", "/clusters", "", false) tabbar.Add("集群节点", "", "/clusters/cluster?clusterId="+clusterIdString, "server", selectedTabbar == "node") @@ -65,7 +73,7 @@ func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext secondMenuItem := action.Data.GetString("secondMenuItem") switch selectedTabbar { case "setting": - action.Data["leftMenuItems"] = this.createSettingMenu(cluster, secondMenuItem) + action.Data["leftMenuItems"] = this.createSettingMenu(cluster, clusterInfo, secondMenuItem) } } @@ -73,7 +81,7 @@ func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext } // 设置菜单 -func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, selectedItem string) (items []maps.Map) { +func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, info *pb.FindEnabledNodeClusterConfigInfoResponse, selectedItem string) (items []maps.Map) { clusterId := numberutils.FormatInt64(cluster.Id) items = append(items, maps.Map{ "name": "基础设置", @@ -93,25 +101,19 @@ func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, selectedIt "isOn": cluster.HttpFirewallPolicyId > 0, }) - { - hasActions, _ := this.checkFirewallActions(cluster.Id) - items = append(items, maps.Map{ - "name": "WAF动作", - "url": "/clusters/cluster/settings/firewall-actions?clusterId=" + clusterId, - "isActive": selectedItem == "firewallAction", - "isOn": hasActions, - }) - } + items = append(items, maps.Map{ + "name": "WAF动作", + "url": "/clusters/cluster/settings/firewall-actions?clusterId=" + clusterId, + "isActive": selectedItem == "firewallAction", + "isOn": info != nil && info.HasFirewallActions, + }) - { - healthCheckIsOn, _ := this.checkHealthCheckIsOn(cluster.Id) - items = append(items, maps.Map{ - "name": "健康检查", - "url": "/clusters/cluster/settings/health?clusterId=" + clusterId, - "isActive": selectedItem == "health", - "isOn": healthCheckIsOn, - }) - } + items = append(items, maps.Map{ + "name": "健康检查", + "url": "/clusters/cluster/settings/health?clusterId=" + clusterId, + "isActive": selectedItem == "health", + "isOn": info != nil && info.HealthCheckIsOn, + }) items = append(items, maps.Map{ "name": "DNS设置", @@ -119,22 +121,26 @@ func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, selectedIt "isActive": selectedItem == "dns", "isOn": cluster.DnsDomainId > 0 || len(cluster.DnsName) > 0, }) + /**items = append(items, maps.Map{ + "name": "统计指标", + "url": "/clusters/cluster/settings/metrics?clusterId=" + clusterId, + "isActive": selectedItem == "metric", + "isOn": info != nil && info.HasMetricItems, + })**/ + if teaconst.IsPlus { - hasThresholds, _ := this.checkThresholds(cluster.Id) items = append(items, maps.Map{ "name": "阈值设置", "url": "/clusters/cluster/settings/thresholds?clusterId=" + clusterId, "isActive": selectedItem == "threshold", - "isOn": hasThresholds, + "isOn": info != nil && info.HasThresholds, }) - } - if teaconst.IsPlus { - hasMessageReceivers, _ := this.checkMessages(cluster.Id) + items = append(items, maps.Map{ "name": "消息通知", "url": "/clusters/cluster/settings/message?clusterId=" + clusterId, "isActive": selectedItem == "message", - "isOn": hasMessageReceivers, + "isOn": info != nil && info.HasMessageReceivers, }) } @@ -150,99 +156,12 @@ func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, selectedIt "isActive": selectedItem == "service", }) { - isChecked, _ := this.checkTOA(cluster.Id) items = append(items, maps.Map{ "name": "TOA设置", "url": "/clusters/cluster/settings/toa?clusterId=" + clusterId, "isActive": selectedItem == "toa", - "isOn": isChecked, + "isOn": info != nil && info.IsTOAEnabled, }) } return } - -// 检查健康检查是否开启 -func (this *ClusterHelper) checkHealthCheckIsOn(clusterId int64) (bool, error) { - rpcClient, err := rpc.SharedRPC() - if err != nil { - return false, err - } - resp, err := rpcClient.NodeClusterRPC().FindNodeClusterHealthCheckConfig(rpcClient.Context(0), &pb.FindNodeClusterHealthCheckConfigRequest{NodeClusterId: clusterId}) - if err != nil { - return false, err - } - if len(resp.HealthCheckJSON) > 0 { - healthCheckConfig := &serverconfigs.HealthCheckConfig{} - err = json.Unmarshal(resp.HealthCheckJSON, healthCheckConfig) - if err != nil { - return false, err - } - return healthCheckConfig.IsOn, nil - } - return false, nil -} - -// 检查是否有WAF动作 -func (this *ClusterHelper) checkFirewallActions(clusterId int64) (bool, error) { - rpcClient, err := rpc.SharedRPC() - if err != nil { - return false, err - } - resp, err := rpcClient.NodeClusterFirewallActionRPC().CountAllEnabledNodeClusterFirewallActions(rpcClient.Context(0), &pb.CountAllEnabledNodeClusterFirewallActionsRequest{NodeClusterId: clusterId}) - if err != nil { - return false, err - } - return resp.Count > 0, nil -} - -// 检查阈值是否已经设置 -func (this *ClusterHelper) checkThresholds(clusterId int64) (bool, error) { - rpcClient, err := rpc.SharedRPC() - if err != nil { - return false, err - } - resp, err := rpcClient.NodeThresholdRPC().CountAllEnabledNodeThresholds(rpcClient.Context(0), &pb.CountAllEnabledNodeThresholdsRequest{ - Role: "node", - NodeClusterId: clusterId, - }) - if err != nil { - return false, err - } - return resp.Count > 0, nil -} - -// 检查消息通知是否已经设置 -func (this *ClusterHelper) checkMessages(clusterId int64) (bool, error) { - rpcClient, err := rpc.SharedRPC() - if err != nil { - return false, err - } - resp, err := rpcClient.MessageReceiverRPC().CountAllEnabledMessageReceivers(rpcClient.Context(0), &pb.CountAllEnabledMessageReceiversRequest{ - NodeClusterId: clusterId, - }) - if err != nil { - return false, err - } - return resp.Count > 0, nil -} - -// 检查TOA是否设置 -func (this *ClusterHelper) checkTOA(clusterId int64) (bool, error) { - rpcClient, err := rpc.SharedRPC() - if err != nil { - return false, err - } - resp, err := rpcClient.NodeClusterRPC().FindEnabledNodeClusterTOA(rpcClient.Context(0), &pb.FindEnabledNodeClusterTOARequest{NodeClusterId: clusterId}) - if err != nil { - return false, err - } - if len(resp.ToaJSON) == 0 { - return false, nil - } - var toaConfig = &nodeconfigs.TOAConfig{} - err = json.Unmarshal(resp.ToaJSON, toaConfig) - if err != nil { - return false, err - } - return toaConfig.IsOn, nil -} diff --git a/internal/web/actions/default/servers/iplists/bindHTTPFirewallPopup.go b/internal/web/actions/default/servers/iplists/bindHTTPFirewallPopup.go index 2e8dd9b5..4ea80e30 100644 --- a/internal/web/actions/default/servers/iplists/bindHTTPFirewallPopup.go +++ b/internal/web/actions/default/servers/iplists/bindHTTPFirewallPopup.go @@ -99,6 +99,8 @@ func (this *BindHTTPFirewallPopupAction) RunPost(params struct { Must *actions.Must }) { + defer this.CreateLogInfo("绑定IP名单 %d 到WAF策略 %d", params.ListId, params.HttpFirewallPolicyId) + // List类型 listResp, err := this.RPC().IPListRPC().FindEnabledIPList(this.AdminContext(), &pb.FindEnabledIPListRequest{IpListId: params.ListId}) if err != nil { diff --git a/internal/web/actions/default/servers/iplists/unbindHTTPFirewall.go b/internal/web/actions/default/servers/iplists/unbindHTTPFirewall.go index dfff9d3d..1e8656c8 100644 --- a/internal/web/actions/default/servers/iplists/unbindHTTPFirewall.go +++ b/internal/web/actions/default/servers/iplists/unbindHTTPFirewall.go @@ -18,6 +18,8 @@ func (this *UnbindHTTPFirewallAction) RunPost(params struct { HttpFirewallPolicyId int64 ListId int64 }) { + defer this.CreateLogInfo("接触绑定IP名单 %d WAF策略 %d", params.ListId, params.HttpFirewallPolicyId) + // List类型 listResp, err := this.RPC().IPListRPC().FindEnabledIPList(this.AdminContext(), &pb.FindEnabledIPListRequest{IpListId: params.ListId}) if err != nil { diff --git a/internal/web/actions/default/servers/metrics/charts.go b/internal/web/actions/default/servers/metrics/charts.go new file mode 100644 index 00000000..445a3fea --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts.go @@ -0,0 +1,25 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type ChartsAction struct { + actionutils.ParentAction +} + +func (this *ChartsAction) Init() { + this.Nav("", "", "chart") +} + +func (this *ChartsAction) RunGet(params struct { + ItemId int64 +}) { + err := InitItem(this.Parent(), params.ItemId) + if err != nil { + this.ErrorPage(err) + return + } + + this.Show() +} diff --git a/internal/web/actions/default/servers/metrics/createPopup.go b/internal/web/actions/default/servers/metrics/createPopup.go new file mode 100644 index 00000000..40124302 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/createPopup.go @@ -0,0 +1,83 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct { + Category string +}) { + this.Data["category"] = params.Category + + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + Name string + Category string + KeysJSON []byte + PeriodJSON []byte + Value string + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + params.Must. + Field("name", params.Name). + Require("请输入指标名称") + + if len(params.Category) == 0 { + this.Fail("请选择指标类型") + } + + // 统计对象 + if len(params.KeysJSON) == 0 { + this.FailField("keys", "请选择指标统计的对象") + } + var keys = []string{} + err := json.Unmarshal(params.KeysJSON, &keys) + if err != nil { + this.FailField("keys", "解析指标对象失败") + } + if len(keys) == 0 { + this.FailField("keys", "请选择指标统计的对象") + } + + var periodMap = maps.Map{} + err = json.Unmarshal(params.PeriodJSON, &periodMap) + if err != nil { + this.FailField("period", "解析统计周期失败") + } + var period = periodMap.GetInt32("period") + var periodUnit = periodMap.GetString("unit") + + createResp, err := this.RPC().MetricItemRPC().CreateMetricItem(this.AdminContext(), &pb.CreateMetricItemRequest{ + Code: "", // TODO 未来实现 + Category: params.Category, + Name: params.Name, + Keys: keys, + Period: period, + PeriodUnit: periodUnit, + Value: params.Value, + }) + if err != nil { + this.ErrorPage(err) + return + } + defer this.CreateLogInfo("创建统计指标 %d", createResp.MetricItemId) + this.Success() +} diff --git a/internal/web/actions/default/servers/metrics/delete.go b/internal/web/actions/default/servers/metrics/delete.go new file mode 100644 index 00000000..64c35f89 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/delete.go @@ -0,0 +1,26 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + ItemId int64 +}) { + defer this.CreateLogInfo("删除统计指标") + + _, err := this.RPC().MetricItemRPC().DeleteMetricItem(this.AdminContext(), &pb.DeleteMetricItemRequest{MetricItemId: params.ItemId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/metrics/index.go b/internal/web/actions/default/servers/metrics/index.go new file mode 100644 index 00000000..5463cc6c --- /dev/null +++ b/internal/web/actions/default/servers/metrics/index.go @@ -0,0 +1,61 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "") +} + +func (this *IndexAction) RunGet(params struct { + Category string +}) { + if len(params.Category) == 0 { + params.Category = "http" + } + this.Data["category"] = params.Category + + countResp, err := this.RPC().MetricItemRPC().CountAllEnabledMetricItems(this.AdminContext(), &pb.CountAllEnabledMetricItemsRequest{Category: params.Category}) + if err != nil { + this.ErrorPage(err) + return + } + var count = countResp.Count + page := this.NewPage(count) + this.Data["page"] = page.AsHTML() + + itemsResp, err := this.RPC().MetricItemRPC().ListEnabledMetricItems(this.AdminContext(), &pb.ListEnabledMetricItemsRequest{ + Category: params.Category, + Offset: page.Offset, + Size: page.Size, + }) + if err != nil { + this.ErrorPage(err) + return + } + var itemMaps = []maps.Map{} + for _, item := range itemsResp.MetricItems { + itemMaps = append(itemMaps, maps.Map{ + "id": item.Id, + "name": item.Name, + "isOn": item.IsOn, + "period": item.Period, + "periodUnit": item.PeriodUnit, + "keys": item.Keys, + "value": item.Value, + "category": item.Category, + }) + } + this.Data["items"] = itemMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/metrics/init.go b/internal/web/actions/default/servers/metrics/init.go new file mode 100644 index 00000000..8ab69e43 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/init.go @@ -0,0 +1,24 @@ +package metrics + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). + Data("teaMenu", "servers"). + Data("teaSubMenu", "metric"). + Prefix("/servers/metrics"). + Get("", new(IndexAction)). + GetPost("/createPopup", new(CreatePopupAction)). + GetPost("/update", new(UpdateAction)). + Post("/delete", new(DeleteAction)). + Get("/item", new(ItemAction)). + Get("/charts", new(ChartsAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/servers/metrics/item.go b/internal/web/actions/default/servers/metrics/item.go new file mode 100644 index 00000000..0f47eacb --- /dev/null +++ b/internal/web/actions/default/servers/metrics/item.go @@ -0,0 +1,25 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type ItemAction struct { + actionutils.ParentAction +} + +func (this *ItemAction) Init() { + this.Nav("", "", "item") +} + +func (this *ItemAction) RunGet(params struct { + ItemId int64 +}) { + err := InitItem(this.Parent(), params.ItemId) + if err != nil { + this.ErrorPage(err) + return + } + + this.Show() +} diff --git a/internal/web/actions/default/servers/metrics/update.go b/internal/web/actions/default/servers/metrics/update.go index 1377bcf8..4f0dae9c 100644 --- a/internal/web/actions/default/servers/metrics/update.go +++ b/internal/web/actions/default/servers/metrics/update.go @@ -2,16 +2,83 @@ package metrics -import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) type UpdateAction struct { actionutils.ParentAction } func (this *UpdateAction) Init() { - this.Nav("", "", "") + this.Nav("", "", "update") } -func (this *UpdateAction) RunGet(params struct{}) { +func (this *UpdateAction) RunGet(params struct { + ItemId int64 +}) { + err := InitItem(this.Parent(), params.ItemId) + if err != nil { + this.ErrorPage(err) + return + } + this.Show() } + +func (this *UpdateAction) RunPost(params struct { + ItemId int64 + Name string + KeysJSON []byte + PeriodJSON []byte + Value string + IsOn bool + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + params.Must. + Field("name", params.Name). + Require("请输入指标名称") + + // 统计对象 + if len(params.KeysJSON) == 0 { + this.FailField("keys", "请选择指标统计的对象") + } + var keys = []string{} + err := json.Unmarshal(params.KeysJSON, &keys) + if err != nil { + this.FailField("keys", "解析指标对象失败") + } + if len(keys) == 0 { + this.FailField("keys", "请选择指标统计的对象") + } + + var periodMap = maps.Map{} + err = json.Unmarshal(params.PeriodJSON, &periodMap) + if err != nil { + this.FailField("period", "解析统计周期失败") + } + var period = periodMap.GetInt32("period") + var periodUnit = periodMap.GetString("unit") + + _, err = this.RPC().MetricItemRPC().UpdateMetricItem(this.AdminContext(), &pb.UpdateMetricItemRequest{ + MetricItemId: params.ItemId, + Name: params.Name, + Keys: keys, + Period: period, + PeriodUnit: periodUnit, + Value: params.Value, + IsOn: params.IsOn, + }) + if err != nil { + this.ErrorPage(err) + return + } + defer this.CreateLogInfo("修改统计指标 %d", params.ItemId) + this.Success() +} diff --git a/internal/web/actions/default/servers/metrics/utils.go b/internal/web/actions/default/servers/metrics/utils.go new file mode 100644 index 00000000..37e12dcf --- /dev/null +++ b/internal/web/actions/default/servers/metrics/utils.go @@ -0,0 +1,37 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package metrics + +import ( + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +func InitItem(parent *actionutils.ParentAction, itemId int64) error { + client, err := rpc.SharedRPC() + if err != nil { + return err + } + resp, err := client.MetricItemRPC().FindEnabledMetricItem(parent.AdminContext(), &pb.FindEnabledMetricItemRequest{MetricItemId: itemId}) + if err != nil { + return err + } + var item = resp.MetricItem + if item == nil { + return errors.New("not found") + } + parent.Data["item"] = maps.Map{ + "id": item.Id, + "name": item.Name, + "isOn": item.IsOn, + "keys": item.Keys, + "value": item.Value, + "period": item.Period, + "periodUnit": item.PeriodUnit, + "category": item.Category, + } + return nil +} diff --git a/internal/web/actions/default/ui/components.go b/internal/web/actions/default/ui/components.go index f11d6928..eb174363 100644 --- a/internal/web/actions/default/ui/components.go +++ b/internal/web/actions/default/ui/components.go @@ -2,22 +2,33 @@ package ui import ( "bytes" + "crypto/md5" "encoding/json" + "fmt" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/conds/condutils" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/files" "github.com/iwind/TeaGo/logs" + "net/http" ) type ComponentsAction actions.Action var componentsData = []byte{} +var componentsDataSum string func (this *ComponentsAction) RunGet(params struct{}) { this.AddHeader("Content-Type", "text/javascript; charset=utf-8") + // etag + var requestETag = this.Header("If-None-Match") + if len(requestETag) > 0 && requestETag == "\""+componentsDataSum+"\"" { + this.ResponseWriter.WriteHeader(http.StatusNotModified) + return + } + if !Tea.IsTesting() && len(componentsData) > 0 { this.AddHeader("Last-Modified", "Fri, 06 Sep 2019 08:29:50 GMT") this.Write(componentsData) @@ -81,5 +92,12 @@ func (this *ComponentsAction) RunGet(params struct{}) { } componentsData = buffer.Bytes() + + // ETag + var h = md5.New() + h.Write(buffer.Bytes()) + componentsDataSum = fmt.Sprintf("%x", h.Sum(nil)) + this.AddHeader("ETag", "\""+componentsDataSum+"\"") + this.Write(componentsData) } diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index 0fe92b5c..16d4710d 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -177,6 +177,11 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map { "url": "/servers/certs", "code": "cert", }, + /**{ + "name": "统计指标", + "url": "/servers/metrics", + "code": "metric", + },**/ }, }, { diff --git a/internal/web/import.go b/internal/web/import.go index 5ae82605..0e67319e 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -110,6 +110,7 @@ import ( _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/stat" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/iplists" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics" // 设置相关 _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings" diff --git a/web/public/js/components/common/health-check-config-box.js b/web/public/js/components/common/health-check-config-box.js index f361036f..ae9cfc28 100644 --- a/web/public/js/components/common/health-check-config-box.js +++ b/web/public/js/components/common/health-check-config-box.js @@ -176,6 +176,7 @@ Vue.component("health-check-config-box", { 域名 +

在此集群上可以访问到的一个域名。

diff --git a/web/public/js/components/common/links.js b/web/public/js/components/common/links.js index 09b1e690..33eee44b 100644 --- a/web/public/js/components/common/links.js +++ b/web/public/js/components/common/links.js @@ -62,7 +62,7 @@ Vue.component("tip-icon", { teaweb.popupTip(this.content) } }, - template: `` + template: `` }) // 提交点击事件 diff --git a/web/public/js/components/server/metric-keys-config-box.js b/web/public/js/components/server/metric-keys-config-box.js index ac9a5a30..a6a01d54 100644 --- a/web/public/js/components/server/metric-keys-config-box.js +++ b/web/public/js/components/server/metric-keys-config-box.js @@ -8,29 +8,52 @@ Vue.component("metric-keys-config-box", { } return { keys: keys, - isAdding: false + isAdding: false, + key: "" + } + }, + methods: { + cancel: function () { + this.key = "" + this.isAdding = false + }, + confirm: function () { + if (this.key.length > 0) { + this.keys.push(this.key) + this.cancel() + } + }, + add: function () { + this.isAdding = true + let that = this + setTimeout(function () { + that.$refs.key.focus() + }, 100) + }, + remove: function (index) { + this.keys.$remove(index) } }, - methods: {}, template: `
+
-
- +
+ {{key}}  
-
+
- +
- +
-
- +
+
` }) \ No newline at end of file diff --git a/web/public/js/utils.js b/web/public/js/utils.js index 9ecbdf77..e6f48b34 100644 --- a/web/public/js/utils.js +++ b/web/public/js/utils.js @@ -219,9 +219,9 @@ window.teaweb = { }, popupTip: function (html) { Swal.fire({ - html: '' + html + "", + html: '
' + html + "
", width: "30em", - padding: "5em", + padding: "4em", showConfirmButton: false, showCloseButton: true, focusConfirm: false diff --git a/web/views/@default/@layout.css b/web/views/@default/@layout.css index 7ccfa5eb..5a2f9418 100644 --- a/web/views/@default/@layout.css +++ b/web/views/@default/@layout.css @@ -219,9 +219,14 @@ p.margin { .main-menu .ui.menu .sub-items .item { padding-left: 2.8em !important; } +.main-menu .ui.menu .sub-items .item .icon { + position: absolute; + left: 1.1em; + top: 0.93em; +} @media screen and (max-width: 512px) { .main-menu .ui.menu .sub-items .item { - padding-left: 1em!important; + padding-left: 1em !important; } } .main-menu .ui.menu .sub-items .item.active { diff --git a/web/views/@default/@layout.css.map b/web/views/@default/@layout.css.map index 6b5b0aee..d19ee5a3 100644 --- a/web/views/@default/@layout.css.map +++ b/web/views/@default/@layout.css.map @@ -1 +1 @@ -{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"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","file":"@layout.css"} \ No newline at end of file +{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"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","file":"@layout.css"} \ No newline at end of file diff --git a/web/views/@default/@layout.html b/web/views/@default/@layout.html index 8ae86d22..b1548513 100644 --- a/web/views/@default/@layout.html +++ b/web/views/@default/@layout.html @@ -85,7 +85,7 @@
{{module.subtitle}}
diff --git a/web/views/@default/@layout.less b/web/views/@default/@layout.less index e87dfa61..1aa13547 100644 --- a/web/views/@default/@layout.less +++ b/web/views/@default/@layout.less @@ -172,11 +172,17 @@ div.margin, p.margin { .sub-items { .item { padding-left: 2.8em !important; + + .icon { + position: absolute; + left: 1.1em; + top: 0.93em; + } } @media screen and (max-width: 512px) { .item { - padding-left: 1em!important; + padding-left: 1em !important; } } diff --git a/web/views/@default/clusters/cluster/settings/health/runPopup.html b/web/views/@default/clusters/cluster/settings/health/runPopup.html index d26cb1ea..b15ef255 100644 --- a/web/views/@default/clusters/cluster/settings/health/runPopup.html +++ b/web/views/@default/clusters/cluster/settings/health/runPopup.html @@ -6,7 +6,7 @@

成功节点:{{countSuccess}}   失败节点:{{countFail}}

- +
diff --git a/web/views/@default/clusters/cluster/settings/metrics/createPopup.html b/web/views/@default/clusters/cluster/settings/metrics/createPopup.html new file mode 100644 index 00000000..01e89ab4 --- /dev/null +++ b/web/views/@default/clusters/cluster/settings/metrics/createPopup.html @@ -0,0 +1,38 @@ +{$layout "layout_popup"} + +

添加指标

+ +

暂时还没有指标。

+
节点
+ + + + + + + + + + + + + + + + + + +
指标名称统计对象统计周期统计数值状态操作
{{item.name}} + {{key}} + + {{item.period}} {{item.periodUnit}} + + {{item.value}} + + + + 添加 + 已添加 +
+ +
\ No newline at end of file diff --git a/web/views/@default/clusters/cluster/settings/metrics/index.html b/web/views/@default/clusters/cluster/settings/metrics/index.html new file mode 100644 index 00000000..73e03ab3 --- /dev/null +++ b/web/views/@default/clusters/cluster/settings/metrics/index.html @@ -0,0 +1,47 @@ +{$layout} +{$template "/left_menu"} + +
+ + HTTP + TCP + UDP + | + [添加指标] + | + + + +

暂时还没有设置指标。

+ + + + + + + + + + + + + + + + + + + + +
指标名称统计对象统计周期统计数值状态操作
{{item.name}} + {{key}} + + {{item.period}} {{item.periodUnit}} + + {{item.value}} + + + + 删除 +
+
\ No newline at end of file diff --git a/web/views/@default/clusters/cluster/settings/metrics/index.js b/web/views/@default/clusters/cluster/settings/metrics/index.js new file mode 100644 index 00000000..5c47b9b4 --- /dev/null +++ b/web/views/@default/clusters/cluster/settings/metrics/index.js @@ -0,0 +1,30 @@ +Tea.context(function () { + this.createItem = function () { + teaweb.popup(Tea.url(".createPopup", { + clusterId: this.clusterId + }), { + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + }, + width: "50em", + height: "25em" + }) + } + + this.deleteItem = function (itemId) { + let that = this + teaweb.confirm("确定要删除这个指标吗?", function () { + that.$post(".delete") + .params({ + itemId: itemId + }) + .success(function () { + teaweb.success("删除成功", function () { + teaweb.reload() + }) + }) + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/settings/toa/index.html b/web/views/@default/clusters/cluster/settings/toa/index.html index 0601d01b..a5a9de32 100644 --- a/web/views/@default/clusters/cluster/settings/toa/index.html +++ b/web/views/@default/clusters/cluster/settings/toa/index.html @@ -12,7 +12,7 @@ 是否启用TOA -

在启用之前,请确保当前集群下所有节点服务器已经安装TOA模块和libnetfilter_queue,并启用了IPTables。

+

在启用之前,请确保当前集群下所有节点服务器已经安装libnetfilter_queue,并启用了IPTables。

diff --git a/web/views/@default/servers/create.html b/web/views/@default/servers/create.html index 50301aff..186ba53e 100644 --- a/web/views/@default/servers/create.html +++ b/web/views/@default/servers/create.html @@ -41,6 +41,7 @@ 绑定域名 +

绑定后,才能通过域名可以访问不同的服务。

diff --git a/web/views/@default/servers/metrics/@item_menu.html b/web/views/@default/servers/metrics/@item_menu.html new file mode 100644 index 00000000..1e58cc7e --- /dev/null +++ b/web/views/@default/servers/metrics/@item_menu.html @@ -0,0 +1,7 @@ + + 指标列表 + | + "{{item.name}}"详情 + 修改 + 图表 + \ No newline at end of file diff --git a/web/views/@default/servers/metrics/charts.html b/web/views/@default/servers/metrics/charts.html new file mode 100644 index 00000000..952d7082 --- /dev/null +++ b/web/views/@default/servers/metrics/charts.html @@ -0,0 +1,4 @@ +{$layout} +{$template "item_menu"} + +

此功能暂未开通,敬等期待。

\ No newline at end of file diff --git a/web/views/@default/servers/metrics/createPopup.html b/web/views/@default/servers/metrics/createPopup.html new file mode 100644 index 00000000..e1714df5 --- /dev/null +++ b/web/views/@default/servers/metrics/createPopup.html @@ -0,0 +1,54 @@ +{$layout "layout_popup"} + +

创建{{category.toUpperCase()}}统计指标

+ + + + + + + + + + + + + + + + + + + + +
指标名称 * + +
统计对象 * + +
统计周期 * + +
统计数值 * + + + + + + + + +
+ +
\ No newline at end of file diff --git a/web/views/@default/servers/metrics/index.html b/web/views/@default/servers/metrics/index.html new file mode 100644 index 00000000..c0667596 --- /dev/null +++ b/web/views/@default/servers/metrics/index.html @@ -0,0 +1,46 @@ +{$layout} + + + HTTP + TCP + UDP + | + [创建指标] + | + + + +

暂时还没有指标。

+ + + + + + + + + + + + + + + + + + + +
指标名称统计对象统计周期统计数值状态操作
{{item.name}} + {{key}} + + {{item.period}} {{item.periodUnit}} + + {{item.value}} + + + + 详情   + 删除 +
+ +
\ No newline at end of file diff --git a/web/views/@default/servers/metrics/index.js b/web/views/@default/servers/metrics/index.js new file mode 100644 index 00000000..1bf60e59 --- /dev/null +++ b/web/views/@default/servers/metrics/index.js @@ -0,0 +1,27 @@ +Tea.context(function () { + this.createItem = function () { + teaweb.popup(Tea.url(".createPopup?category=" + this.category), { + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + }, + height: "26em" + }) + } + + this.deleteItem = function (itemId) { + let that = this + teaweb.confirm("确定要删除此指标吗?", function () { + that.$post(".delete") + .params({ + itemId: itemId + }) + .success(function () { + teaweb.success("删除成功", function () { + teaweb.reload() + }) + }) + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/servers/metrics/item.html b/web/views/@default/servers/metrics/item.html new file mode 100644 index 00000000..321d6b13 --- /dev/null +++ b/web/views/@default/servers/metrics/item.html @@ -0,0 +1,27 @@ +{$layout} +{$template "item_menu"} + + + + + + + + + + + + + + + + + + +
指标名称 + {{item.name}} +
状态
统计周期 + {{item.period}} {{item.periodUnit}} +
统计数值 + {{item.value}} +
\ No newline at end of file diff --git a/web/views/@default/servers/metrics/update.html b/web/views/@default/servers/metrics/update.html new file mode 100644 index 00000000..466300d9 --- /dev/null +++ b/web/views/@default/servers/metrics/update.html @@ -0,0 +1,60 @@ +{$layout "layout"} +{$template "item_menu"} + +
+ + + + + + + + + + + + + + + + + + + + + + + +
指标名称 * + +
统计对象 * + +
统计周期 * + +
统计数值 * + + + + + + + + +
是否启用 + +
+ +
\ No newline at end of file diff --git a/web/views/@default/servers/metrics/update.js b/web/views/@default/servers/metrics/update.js new file mode 100644 index 00000000..ca299eaf --- /dev/null +++ b/web/views/@default/servers/metrics/update.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifySuccess("保存成功", "/servers/metrics/item?itemId=" + this.item.id) +}) \ No newline at end of file