changed promqls and fixed several monitoring bugs

This commit is contained in:
Carman Zhang
2018-11-20 19:01:55 +08:00
parent 7f780bd3fb
commit 982c4ac30e
5 changed files with 282 additions and 176 deletions

View File

@@ -73,12 +73,14 @@ func (u Monitor) monitorAllWorkspaces(request *restful.Request, response *restfu
requestParams := client.ParseMonitoringRequestParams(request) requestParams := client.ParseMonitoringRequestParams(request)
if requestParams.Tp == "_statistics" { tp := requestParams.Tp
if tp == "_statistics" {
// merge multiple metric: all-devops, all-roles, all-projects...this api is designed for admin // merge multiple metric: all-devops, all-roles, all-projects...this api is designed for admin
res := metrics.MonitorAllWorkspacesStatistics() res := metrics.MonitorAllWorkspacesStatistics()
response.WriteAsJson(res) response.WriteAsJson(res)
} else {
} else if tp == "rank" {
rawMetrics := metrics.MonitorAllWorkspaces(requestParams) rawMetrics := metrics.MonitorAllWorkspaces(requestParams)
// sorting // sorting
sortedMetrics, maxMetricCount := metrics.Sort(requestParams.SortMetricName, requestParams.SortType, rawMetrics, metrics.MetricLevelWorkspace) sortedMetrics, maxMetricCount := metrics.Sort(requestParams.SortMetricName, requestParams.SortType, rawMetrics, metrics.MetricLevelWorkspace)
@@ -86,6 +88,9 @@ func (u Monitor) monitorAllWorkspaces(request *restful.Request, response *restfu
pagedMetrics := metrics.Page(requestParams.PageNum, requestParams.LimitNum, sortedMetrics, maxMetricCount) pagedMetrics := metrics.Page(requestParams.PageNum, requestParams.LimitNum, sortedMetrics, maxMetricCount)
response.WriteAsJson(pagedMetrics) response.WriteAsJson(pagedMetrics)
} else {
res := metrics.MonitorAllMetrics(requestParams, metrics.MetricLevelWorkspace)
response.WriteAsJson(res)
} }
} }
@@ -145,10 +150,6 @@ func (u Monitor) monitorCluster(request *restful.Request, response *restful.Resp
queryType, params := metrics.AssembleClusterMetricRequestInfo(requestParams, metricName) queryType, params := metrics.AssembleClusterMetricRequestInfo(requestParams, metricName)
res := metrics.GetMetric(queryType, params, metricName) res := metrics.GetMetric(queryType, params, metricName)
if metricName == metrics.MetricNameWorkspaceAllProjectCount {
res = metrics.MonitorWorkspaceNamespaceHistory(res)
}
response.WriteAsJson(res) response.WriteAsJson(res)
} else { } else {
// multiple // multiple

View File

@@ -277,12 +277,28 @@ func AssembleNamespaceMetricRequestInfo(monitoringRequest *client.MonitoringRequ
return queryType, params return queryType, params
} }
func AssembleWorkspaceMetricRequestInfo(monitoringRequest *client.MonitoringRequestParams, namespaceList []string, metricName string) (string, string) { func AssembleSpecificWorkspaceMetricRequestInfo(monitoringRequest *client.MonitoringRequestParams, namespaceList []string, metricName string) (string, string) {
nsFilter := "^(" + strings.Join(namespaceList, "|") + ")$" nsFilter := "^(" + strings.Join(namespaceList, "|") + ")$"
queryType := monitoringRequest.QueryType queryType := monitoringRequest.QueryType
rule := MakeWorkspacePromQL(metricName, nsFilter) rule := MakeSpecificWorkspacePromQL(metricName, nsFilter)
paramValues := monitoringRequest.Params
params := makeRequestParamString(rule, paramValues)
return queryType, params
}
func AssembleAllWorkspaceMetricRequestInfo(monitoringRequest *client.MonitoringRequestParams, namespaceList []string, metricName string) (string, string) {
var nsFilter = "^()$"
if namespaceList != nil {
nsFilter = "^(" + strings.Join(namespaceList, "|") + ")$"
}
queryType := monitoringRequest.QueryType
rule := MakeAllWorkspacesPromQL(metricName, nsFilter)
paramValues := monitoringRequest.Params paramValues := monitoringRequest.Params
params := makeRequestParamString(rule, paramValues) params := makeRequestParamString(rule, paramValues)
return queryType, params return queryType, params
@@ -330,6 +346,9 @@ func MonitorAllWorkspaces(monitoringRequest *client.MonitoringRequestParams) *Fo
} }
var filterMetricsName []string var filterMetricsName []string
for _, metricName := range WorkspaceMetricsNames { for _, metricName := range WorkspaceMetricsNames {
if metricName == MetricNameWorkspaceAllProjectCount {
continue
}
bol, err := regexp.MatchString(metricsFilter, metricName) bol, err := regexp.MatchString(metricsFilter, metricName)
if err == nil && bol { if err == nil && bol {
filterMetricsName = append(filterMetricsName, metricName) filterMetricsName = append(filterMetricsName, metricName)
@@ -400,7 +419,7 @@ func collectWorkspaceMetric(monitoringRequest *client.MonitoringRequestParams, w
wg.Add(1) wg.Add(1)
go func(metricName string) { go func(metricName string) {
queryType, params := AssembleWorkspaceMetricRequestInfo(monitoringRequest, namespaceArray, metricName) queryType, params := AssembleSpecificWorkspaceMetricRequestInfo(monitoringRequest, namespaceArray, metricName)
ch <- GetMetric(queryType, params, metricName) ch <- GetMetric(queryType, params, metricName)
wg.Done() wg.Done()
@@ -448,11 +467,6 @@ func MonitorAllMetrics(monitoringRequest *client.MonitoringRequestParams, resour
queryType, params := AssembleClusterMetricRequestInfo(monitoringRequest, metricName) queryType, params := AssembleClusterMetricRequestInfo(monitoringRequest, metricName)
clusterMetrics := GetMetric(queryType, params, metricName) clusterMetrics := GetMetric(queryType, params, metricName)
// for this special case, get namespace history which in a workspace by determining namespace label
if metricName == MetricNameWorkspaceAllProjectCount {
clusterMetrics = MonitorWorkspaceNamespaceHistory(clusterMetrics)
}
ch <- clusterMetrics ch <- clusterMetrics
wg.Done() wg.Done()
@@ -476,6 +490,8 @@ func MonitorAllMetrics(monitoringRequest *client.MonitoringRequestParams, resour
} }
case MetricLevelWorkspace: case MetricLevelWorkspace:
{ {
// a specific workspace's metrics
if monitoringRequest.WsName != "" {
namespaceArray, err := workspaces.WorkspaceNamespaces(monitoringRequest.WsName) namespaceArray, err := workspaces.WorkspaceNamespaces(monitoringRequest.WsName)
if err != nil { if err != nil {
glog.Errorln(err.Error()) glog.Errorln(err.Error())
@@ -484,6 +500,10 @@ func MonitorAllMetrics(monitoringRequest *client.MonitoringRequestParams, resour
if monitoringRequest.Tp == "rank" { if monitoringRequest.Tp == "rank" {
for _, metricName := range NamespaceMetricsNames { for _, metricName := range NamespaceMetricsNames {
if metricName == MetricNameWorkspaceAllProjectCount {
continue
}
bol, err := regexp.MatchString(metricsFilter, metricName) bol, err := regexp.MatchString(metricsFilter, metricName)
ns := "^(" + strings.Join(namespaceArray, "|") + ")$" ns := "^(" + strings.Join(namespaceArray, "|") + ")$"
monitoringRequest.NsFilter = ns monitoringRequest.NsFilter = ns
@@ -499,12 +519,55 @@ func MonitorAllMetrics(monitoringRequest *client.MonitoringRequestParams, resour
} else { } else {
for _, metricName := range WorkspaceMetricsNames { for _, metricName := range WorkspaceMetricsNames {
if metricName == MetricNameWorkspaceAllProjectCount {
continue
}
bol, err := regexp.MatchString(metricsFilter, metricName) bol, err := regexp.MatchString(metricsFilter, metricName)
if err == nil && bol { if err == nil && bol {
wg.Add(1) wg.Add(1)
go func(metricName string) { go func(metricName string) {
queryType, params := AssembleWorkspaceMetricRequestInfo(monitoringRequest, namespaceArray, metricName) queryType, params := AssembleSpecificWorkspaceMetricRequestInfo(monitoringRequest, namespaceArray, metricName)
ch <- GetMetric(queryType, params, metricName) ch <- GetMetric(queryType, params, metricName)
wg.Done()
}(metricName)
}
}
}
} else {
// sum all workspaces
_, namespaceWorkspaceMap, err := workspaces.GetAllOrgAndProjList()
if err != nil {
glog.Errorln(err.Error())
}
nsList := make([]string, 0)
for ns := range namespaceWorkspaceMap {
if namespaceWorkspaceMap[ns] == "" {
nsList = append(nsList, ns)
}
}
for _, metricName := range WorkspaceMetricsNames {
bol, err := regexp.MatchString(metricsFilter, metricName)
if err == nil && bol {
wg.Add(1)
go func(metricName string) {
queryType, params := AssembleAllWorkspaceMetricRequestInfo(monitoringRequest, nil, metricName)
if metricName == MetricNameWorkspaceAllProjectCount {
res := GetMetric(queryType, params, metricName)
res = MonitorWorkspaceNamespaceHistory(res)
ch <- res
} else {
ch <- GetMetric(queryType, params, metricName)
}
wg.Done() wg.Done()
}(metricName) }(metricName)
} }

View File

@@ -57,8 +57,18 @@ func MakeWorkloadRule(wkKind, wkName, namespace string) string {
return rule return rule
} }
func MakeWorkspacePromQL(metricsName string, nsFilter string) string { func MakeAllWorkspacesPromQL(metricsName, nsFilter string) string {
promql := RulePromQLTmplMap[metricsName]
var promql = RulePromQLTmplMap[metricsName]
nsFilter = "!~\"" + nsFilter + "\""
promql = strings.Replace(promql, "$1", nsFilter, -1)
return promql
}
func MakeSpecificWorkspacePromQL(metricsName, nsFilter string) string {
var promql = RulePromQLTmplMap[metricsName]
nsFilter = "=~\"" + nsFilter + "\""
promql = strings.Replace(promql, "$1", nsFilter, -1) promql = strings.Replace(promql, "$1", nsFilter, -1)
return promql return promql
} }

View File

@@ -89,9 +89,9 @@ var ClusterMetricsNames = []string{
"cluster_cpu_usage", "cluster_cpu_usage",
"cluster_cpu_total", "cluster_cpu_total",
"cluster_memory_utilisation", "cluster_memory_utilisation",
"cluster_memory_bytes_available", "cluster_memory_available",
"cluster_memory_bytes_total", "cluster_memory_total",
"cluster_memory_bytes_usage", "cluster_memory_usage_wo_cache",
"cluster_net_utilisation", "cluster_net_utilisation",
"cluster_net_bytes_transmitted", "cluster_net_bytes_transmitted",
"cluster_net_bytes_received", "cluster_net_bytes_received",
@@ -131,7 +131,6 @@ var ClusterMetricsNames = []string{
"cluster_secret_count", "cluster_secret_count",
"cluster_namespace_count", "cluster_namespace_count",
"workspace_all_project_count",
"cluster_load1", "cluster_load1",
"cluster_load5", "cluster_load5",
@@ -142,9 +141,10 @@ var NodeMetricsNames = []string{
"node_cpu_total", "node_cpu_total",
"node_cpu_usage", "node_cpu_usage",
"node_memory_utilisation", "node_memory_utilisation",
"node_memory_bytes_usage", "node_memory_usage_wo_cache",
"node_memory_bytes_available", "node_memory_available",
"node_memory_bytes_total", "node_memory_total",
"node_net_utilisation", "node_net_utilisation",
"node_net_bytes_transmitted", "node_net_bytes_transmitted",
"node_net_bytes_received", "node_net_bytes_received",
@@ -195,6 +195,8 @@ var WorkspaceMetricsNames = []string{
"workspace_replicaset_count", "workspace_replicaset_count",
"workspace_service_count", "workspace_service_count",
"workspace_secret_count", "workspace_secret_count",
"workspace_all_project_count",
} }
var NamespaceMetricsNames = []string{ var NamespaceMetricsNames = []string{
"namespace_cpu_usage", "namespace_cpu_usage",
@@ -284,9 +286,10 @@ var RulePromQLTmplMap = MetricMap{
"cluster_cpu_usage": `:node_cpu_utilisation:avg1m * sum(node:node_num_cpu:sum)`, "cluster_cpu_usage": `:node_cpu_utilisation:avg1m * sum(node:node_num_cpu:sum)`,
"cluster_cpu_total": "sum(node:node_num_cpu:sum)", "cluster_cpu_total": "sum(node:node_num_cpu:sum)",
"cluster_memory_utilisation": ":node_memory_utilisation:", "cluster_memory_utilisation": ":node_memory_utilisation:",
"cluster_memory_bytes_available": "sum(node:node_memory_bytes_available:sum)", "cluster_memory_available": "sum(node:node_memory_bytes_available:sum)",
"cluster_memory_bytes_total": "sum(node:node_memory_bytes_total:sum)", "cluster_memory_total": "sum(node:node_memory_bytes_total:sum)",
"cluster_memory_bytes_usage": "sum(node:node_memory_bytes_total:sum) - sum(node:node_memory_bytes_available:sum)", "cluster_memory_usage_wo_cache": "sum(node:node_memory_bytes_total:sum) - sum(node:node_memory_bytes_available:sum)",
"cluster_net_utilisation": ":node_net_utilisation:sum_irate", "cluster_net_utilisation": ":node_net_utilisation:sum_irate",
"cluster_net_bytes_transmitted": "sum(node:node_net_bytes_transmitted:sum_irate)", "cluster_net_bytes_transmitted": "sum(node:node_net_bytes_transmitted:sum_irate)",
"cluster_net_bytes_received": "sum(node:node_net_bytes_received:sum_irate)", "cluster_net_bytes_received": "sum(node:node_net_bytes_received:sum_irate)",
@@ -304,7 +307,6 @@ var RulePromQLTmplMap = MetricMap{
"cluster_disk_inode_utilisation": `1 - sum(node:disk_inodes_free:) / sum(node:disk_inodes_total:)`, "cluster_disk_inode_utilisation": `1 - sum(node:disk_inodes_free:) / sum(node:disk_inodes_total:)`,
"cluster_namespace_count": `count(kube_namespace_annotations)`, "cluster_namespace_count": `count(kube_namespace_annotations)`,
"workspace_all_project_count": `count(kube_namespace_annotations)`,
// cluster_pod_count = cluster_pod_running_count + cluster_pod_succeeded_count + cluster_pod_abnormal_count // cluster_pod_count = cluster_pod_running_count + cluster_pod_succeeded_count + cluster_pod_abnormal_count
"cluster_pod_count": `sum(kube_pod_info unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`, "cluster_pod_count": `sum(kube_pod_info unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`,
@@ -353,16 +355,18 @@ var RulePromQLTmplMap = MetricMap{
"cluster_secret_count": `sum(kube_secret_info)`, "cluster_secret_count": `sum(kube_secret_info)`,
"cluster_pv_count": `sum(kube_persistentvolume_labels)`, "cluster_pv_count": `sum(kube_persistentvolume_labels)`,
"cluster_load1": `sum(node_load1{job="node-exporter"})`, "cluster_load1": `sum(node_load1{job="node-exporter"}) / sum(node:node_num_cpu:sum)`,
"cluster_load5": `sum(node_load5{job="node-exporter"})`, "cluster_load5": `sum(node_load5{job="node-exporter"}) / sum(node:node_num_cpu:sum)`,
"cluster_load15": `sum(node_load15{job="node-exporter"})`, "cluster_load15": `sum(node_load15{job="node-exporter"}) / sum(node:node_num_cpu:sum)`,
//node //node
"node_cpu_utilisation": "node:node_cpu_utilisation:avg1m", "node_cpu_utilisation": "node:node_cpu_utilisation:avg1m",
"node_cpu_total": "node:node_num_cpu:sum", "node_cpu_total": "node:node_num_cpu:sum",
"node_memory_utilisation": "node:node_memory_utilisation:", "node_memory_utilisation": "node:node_memory_utilisation:",
"node_memory_bytes_available": "node:node_memory_bytes_available:sum", "node_memory_available": "node:node_memory_bytes_available:sum",
"node_memory_bytes_total": "node:node_memory_bytes_total:sum", "node_memory_total": "node:node_memory_bytes_total:sum",
"node_memory_usage_wo_cache": "node:node_memory_bytes_total:sum$1 - node:node_memory_bytes_available:sum$1",
// Node network utilisation (bytes received + bytes transmitted per second) // Node network utilisation (bytes received + bytes transmitted per second)
"node_net_utilisation": "node:node_net_utilisation:sum_irate", "node_net_utilisation": "node:node_net_utilisation:sum_irate",
// Node network bytes transmitted per second // Node network bytes transmitted per second
@@ -397,76 +401,75 @@ var RulePromQLTmplMap = MetricMap{
// without log node: unless on(node) kube_node_labels{label_role="log"} // without log node: unless on(node) kube_node_labels{label_role="log"}
"node_cpu_usage": `node:node_cpu_utilisation:avg1m$1 * node:node_num_cpu:sum$1`, "node_cpu_usage": `node:node_cpu_utilisation:avg1m$1 * node:node_num_cpu:sum$1`,
"node_memory_bytes_usage": "node:node_memory_bytes_total:sum$1 - node:node_memory_bytes_available:sum$1",
"node_load1": `sum by (node) (node_load1{job="node-exporter"} * on (namespace, pod) group_left(node) node_namespace_pod:kube_pod_info:$1)`, "node_load1": `sum by (node) (node_load1{job="node-exporter"} * on (namespace, pod) group_left(node) node_namespace_pod:kube_pod_info:$1) / node:node_num_cpu:sum`,
"node_load5": `sum by (node) (node_load5{job="node-exporter"} * on (namespace, pod) group_left(node) node_namespace_pod:kube_pod_info:$1)`, "node_load5": `sum by (node) (node_load5{job="node-exporter"} * on (namespace, pod) group_left(node) node_namespace_pod:kube_pod_info:$1) / node:node_num_cpu:sum`,
"node_load15": `sum by (node) (node_load15{job="node-exporter"} * on (namespace, pod) group_left(node) node_namespace_pod:kube_pod_info:$1)`, "node_load15": `sum by (node) (node_load15{job="node-exporter"} * on (namespace, pod) group_left(node) node_namespace_pod:kube_pod_info:$1) / node:node_num_cpu:sum`,
//namespace //namespace
"namespace_cpu_usage": `namespace:container_cpu_usage_seconds_total:sum_rate{namespace=~"$1"}`, "namespace_cpu_usage": `namespace:container_cpu_usage_seconds_total:sum_rate{namespace!="", namespace=~"$1"}`,
"namespace_memory_usage": `namespace:container_memory_usage_bytes:sum{namespace=~"$1"}`, "namespace_memory_usage": `namespace:container_memory_usage_bytes:sum{namespace!="", namespace=~"$1"}`,
"namespace_memory_usage_wo_cache": `namespace:container_memory_usage_bytes_wo_cache:sum{namespace=~"$1"}`, "namespace_memory_usage_wo_cache": `namespace:container_memory_usage_bytes_wo_cache:sum{namespace!="", namespace=~"$1"}`,
"namespace_net_bytes_transmitted": `sum by (namespace) (irate(container_network_transmit_bytes_total{namespace=~"$1", pod_name!="", interface="eth0", job="kubelet"}[5m]))`, "namespace_net_bytes_transmitted": `sum by (namespace) (irate(container_network_transmit_bytes_total{namespace!="", namespace=~"$1", pod_name!="", interface="eth0", job="kubelet"}[5m]))`,
"namespace_net_bytes_received": `sum by (namespace) (irate(container_network_receive_bytes_total{namespace=~"$1", pod_name!="", interface="eth0", job="kubelet"}[5m]))`, "namespace_net_bytes_received": `sum by (namespace) (irate(container_network_receive_bytes_total{namespace!="", namespace=~"$1", pod_name!="", interface="eth0", job="kubelet"}[5m]))`,
"namespace_pod_count": `sum(kube_pod_status_phase{namespace=~"$1"}) by (namespace)`, "namespace_pod_count": `sum(kube_pod_status_phase{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_pod_running_count": `sum(kube_pod_status_phase{phase="Running", namespace=~"$1"}) by (namespace)`, "namespace_pod_running_count": `sum(kube_pod_status_phase{phase="Running", namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_pod_succeeded_count": `sum(kube_pod_status_phase{phase="Succeeded", namespace=~"$1"}) by (namespace)`, "namespace_pod_succeeded_count": `sum(kube_pod_status_phase{phase="Succeeded", namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_pod_abnormal_count": `sum(kube_pod_status_phase{phase=~"Failed|Pending|Unknown", namespace=~"$1"}) by (namespace)`, "namespace_pod_abnormal_count": `sum(kube_pod_status_phase{phase=~"Failed|Pending|Unknown", namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_configmap_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/configmaps"}) by (namespace, resource, type)`, "namespace_configmap_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/configmaps"}) by (namespace, resource, type)`,
"namespace_jobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/jobs.batch"}) by (namespace, resource, type)`, "namespace_jobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/jobs.batch"}) by (namespace, resource, type)`,
"namespace_roles_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (namespace, resource, type)`, "namespace_roles_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (namespace, resource, type)`,
"namespace_memory_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="limits.memory"}) by (namespace, resource, type)`, "namespace_memory_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="limits.memory"}) by (namespace, resource, type)`,
"namespace_pvc_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="persistentvolumeclaims"}) by (namespace, resource, type)`, "namespace_pvc_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="persistentvolumeclaims"}) by (namespace, resource, type)`,
"namespace_memory_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="requests.memory"}) by (namespace, resource, type)`, "namespace_memory_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="requests.memory"}) by (namespace, resource, type)`,
"namespace_pvc_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (namespace, resource, type)`, "namespace_pvc_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (namespace, resource, type)`,
"namespace_cronjobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/cronjobs.batch"}) by (namespace, resource, type)`, "namespace_cronjobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/cronjobs.batch"}) by (namespace, resource, type)`,
"namespace_ingresses_extensions_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/ingresses.extensions"}) by (namespace, resource, type)`, "namespace_ingresses_extensions_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/ingresses.extensions"}) by (namespace, resource, type)`,
"namespace_cpu_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="limits.cpu"}) by (namespace, resource, type)`, "namespace_cpu_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="limits.cpu"}) by (namespace, resource, type)`,
"namespace_storage_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="requests.storage"}) by (namespace, resource, type)`, "namespace_storage_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="requests.storage"}) by (namespace, resource, type)`,
"namespace_deployment_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/deployments.apps"}) by (namespace, resource, type)`, "namespace_deployment_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/deployments.apps"}) by (namespace, resource, type)`,
"namespace_pod_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/pods"}) by (namespace, resource, type)`, "namespace_pod_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/pods"}) by (namespace, resource, type)`,
"namespace_statefulset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/statefulsets.apps"}) by (namespace, resource, type)`, "namespace_statefulset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/statefulsets.apps"}) by (namespace, resource, type)`,
"namespace_daemonset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/daemonsets.apps"}) by (namespace, resource, type)`, "namespace_daemonset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/daemonsets.apps"}) by (namespace, resource, type)`,
"namespace_secret_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/secrets"}) by (namespace, resource, type)`, "namespace_secret_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/secrets"}) by (namespace, resource, type)`,
"namespace_service_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/services"}) by (namespace, resource, type)`, "namespace_service_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="count/services"}) by (namespace, resource, type)`,
"namespace_cpu_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="requests.cpu"}) by (namespace, resource, type)`, "namespace_cpu_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="requests.cpu"}) by (namespace, resource, type)`,
"namespace_service_loadbalancer_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="services.loadbalancers"}) by (namespace, resource, type)`, "namespace_service_loadbalancer_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace=~"$1", resource="services.loadbalancers"}) by (namespace, resource, type)`,
"namespace_configmap_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/configmaps"}) by (namespace, resource, type)`, "namespace_configmap_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/configmaps"}) by (namespace, resource, type)`,
"namespace_jobs_batch_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/jobs.batch"}) by (namespace, resource, type)`, "namespace_jobs_batch_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/jobs.batch"}) by (namespace, resource, type)`,
"namespace_roles_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (namespace, resource, type)`, "namespace_roles_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (namespace, resource, type)`,
"namespace_memory_limit_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="limits.memory"}) by (namespace, resource, type)`, "namespace_memory_limit_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="limits.memory"}) by (namespace, resource, type)`,
"namespace_pvc_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="persistentvolumeclaims"}) by (namespace, resource, type)`, "namespace_pvc_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="persistentvolumeclaims"}) by (namespace, resource, type)`,
"namespace_memory_request_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="requests.memory"}) by (namespace, resource, type)`, "namespace_memory_request_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="requests.memory"}) by (namespace, resource, type)`,
"namespace_pvc_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (namespace, resource, type)`, "namespace_pvc_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (namespace, resource, type)`,
"namespace_cronjobs_batch_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/cronjobs.batch"}) by (namespace, resource, type)`, "namespace_cronjobs_batch_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/cronjobs.batch"}) by (namespace, resource, type)`,
"namespace_ingresses_extensions_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/ingresses.extensions"}) by (namespace, resource, type)`, "namespace_ingresses_extensions_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/ingresses.extensions"}) by (namespace, resource, type)`,
"namespace_cpu_limit_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="limits.cpu"}) by (namespace, resource, type)`, "namespace_cpu_limit_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="limits.cpu"}) by (namespace, resource, type)`,
"namespace_storage_request_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="requests.storage"}) by (namespace, resource, type)`, "namespace_storage_request_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="requests.storage"}) by (namespace, resource, type)`,
"namespace_deployment_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/deployments.apps"}) by (namespace, resource, type)`, "namespace_deployment_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/deployments.apps"}) by (namespace, resource, type)`,
"namespace_pod_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/pods"}) by (namespace, resource, type)`, "namespace_pod_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/pods"}) by (namespace, resource, type)`,
"namespace_statefulset_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/statefulsets.apps"}) by (namespace, resource, type)`, "namespace_statefulset_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/statefulsets.apps"}) by (namespace, resource, type)`,
"namespace_daemonset_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/daemonsets.apps"}) by (namespace, resource, type)`, "namespace_daemonset_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/daemonsets.apps"}) by (namespace, resource, type)`,
"namespace_secret_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/secrets"}) by (namespace, resource, type)`, "namespace_secret_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/secrets"}) by (namespace, resource, type)`,
"namespace_service_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="count/services"}) by (namespace, resource, type)`, "namespace_service_count_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="count/services"}) by (namespace, resource, type)`,
"namespace_cpu_request_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="requests.cpu"}) by (namespace, resource, type)`, "namespace_cpu_request_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="requests.cpu"}) by (namespace, resource, type)`,
"namespace_service_loadbalancer_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", namespace=~"$1", resource="services.loadbalancers"}) by (namespace, resource, type)`, "namespace_service_loadbalancer_hard": `sum(kube_resourcequota{resourcequota!="quota", type="hard", namespace!="", namespace=~"$1", resource="services.loadbalancers"}) by (namespace, resource, type)`,
"namespace_cronjob_count": `sum(kube_cronjob_labels{namespace=~"$1"}) by (namespace)`, "namespace_cronjob_count": `sum(kube_cronjob_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_pvc_count": `sum(kube_persistentvolumeclaim_info{namespace=~"$1"}) by (namespace)`, "namespace_pvc_count": `sum(kube_persistentvolumeclaim_info{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_daemonset_count": `sum(kube_daemonset_labels{namespace=~"$1"}) by (namespace)`, "namespace_daemonset_count": `sum(kube_daemonset_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_deployment_count": `sum(kube_deployment_labels{namespace=~"$1"}) by (namespace)`, "namespace_deployment_count": `sum(kube_deployment_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_endpoint_count": `sum(kube_endpoint_labels{namespace=~"$1"}) by (namespace)`, "namespace_endpoint_count": `sum(kube_endpoint_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_hpa_count": `sum(kube_hpa_labels{namespace=~"$1"}) by (namespace)`, "namespace_hpa_count": `sum(kube_hpa_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_job_count": `sum(kube_job_labels{namespace=~"$1"}) by (namespace)`, "namespace_job_count": `sum(kube_job_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_statefulset_count": `sum(kube_statefulset_labels{namespace=~"$1"}) by (namespace)`, "namespace_statefulset_count": `sum(kube_statefulset_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_replicaset_count": `count(kube_replicaset_created{namespace=~"$1"}) by (namespace)`, "namespace_replicaset_count": `count(kube_replicaset_created{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_service_count": `sum(kube_service_info{namespace=~"$1"}) by (namespace)`, "namespace_service_count": `sum(kube_service_info{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_secret_count": `sum(kube_secret_info{namespace=~"$1"}) by (namespace)`, "namespace_secret_count": `sum(kube_secret_info{namespace!="", namespace=~"$1"}) by (namespace)`,
"namespace_ingresses_extensions_count": `sum(kube_ingress_labels{namespace=~"$1"})`, "namespace_ingresses_extensions_count": `sum(kube_ingress_labels{namespace!="", namespace=~"$1"}) by (namespace)`,
// pod // pod
"pod_cpu_usage": `sum(irate(container_cpu_usage_seconds_total{job="kubelet", namespace="$1", pod_name="$2", image!=""}[5m])) by (namespace, pod_name)`, "pod_cpu_usage": `sum(irate(container_cpu_usage_seconds_total{job="kubelet", namespace="$1", pod_name="$2", image!=""}[5m])) by (namespace, pod_name)`,
@@ -496,47 +499,49 @@ var RulePromQLTmplMap = MetricMap{
"container_memory_usage_all": `container_memory_usage_bytes{namespace="$1", pod_name="$2", container_name=~"$3", container_name!="POD"}`, "container_memory_usage_all": `container_memory_usage_bytes{namespace="$1", pod_name="$2", container_name=~"$3", container_name!="POD"}`,
// workspace // workspace
"workspace_cpu_usage": `sum(namespace:container_cpu_usage_seconds_total:sum_rate{namespace =~"$1"})`, "workspace_cpu_usage": `sum(namespace:container_cpu_usage_seconds_total:sum_rate{namespace!="", namespace$1})`,
"workspace_memory_usage": `sum(namespace:container_memory_usage_bytes:sum{namespace =~"$1"})`, "workspace_memory_usage": `sum(namespace:container_memory_usage_bytes:sum{namespace!="", namespace$1})`,
"workspace_memory_usage_wo_cache": `sum(namespace:container_memory_usage_bytes_wo_cache:sum{namespace =~"$1"})`, "workspace_memory_usage_wo_cache": `sum(namespace:container_memory_usage_bytes_wo_cache:sum{namespace!="", namespace$1})`,
"workspace_net_bytes_transmitted": `sum(sum by (namespace) (irate(container_network_transmit_bytes_total{namespace=~"$1", pod_name!="", interface="eth0", job="kubelet"}[5m])))`, "workspace_net_bytes_transmitted": `sum(sum by (namespace) (irate(container_network_transmit_bytes_total{namespace!="", namespace$1, pod_name!="", interface="eth0", job="kubelet"}[5m])))`,
"workspace_net_bytes_received": `sum(sum by (namespace) (irate(container_network_receive_bytes_total{namespace=~"$1", pod_name!="", interface="eth0", job="kubelet"}[5m])))`, "workspace_net_bytes_received": `sum(sum by (namespace) (irate(container_network_receive_bytes_total{namespace!="", namespace$1, pod_name!="", interface="eth0", job="kubelet"}[5m])))`,
"workspace_pod_count": `sum(kube_pod_status_phase{namespace=~"$1"})`, "workspace_pod_count": `sum(kube_pod_status_phase{namespace!="", namespace$1})`,
"workspace_pod_running_count": `sum(kube_pod_status_phase{phase="Running", namespace=~"$1"})`, "workspace_pod_running_count": `sum(kube_pod_status_phase{phase="Running", namespace!="", namespace$1})`,
"workspace_pod_succeeded_count": `sum(kube_pod_status_phase{phase="Succeeded", namespace=~"$1"})`, "workspace_pod_succeeded_count": `sum(kube_pod_status_phase{phase="Succeeded", namespace!="", namespace$1})`,
"workspace_pod_abnormal_count": `sum(kube_pod_status_phase{phase=~"Failed|Pending|Unknown", namespace=~"$1"})`, "workspace_pod_abnormal_count": `sum(kube_pod_status_phase{phase=~"Failed|Pending|Unknown", namespace!="", namespace$1})`,
"workspace_configmap_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/configmaps"}) by (resource, type)`, "workspace_configmap_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/configmaps"}) by (resource, type)`,
"workspace_jobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/jobs.batch"}) by (resource, type)`, "workspace_jobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/jobs.batch"}) by (resource, type)`,
"workspace_roles_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (resource, type)`, "workspace_roles_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/roles.rbac.authorization.k8s.io"}) by (resource, type)`,
"workspace_memory_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="limits.memory"}) by (resource, type)`, "workspace_memory_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="limits.memory"}) by (resource, type)`,
"workspace_pvc_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="persistentvolumeclaims"}) by (resource, type)`, "workspace_pvc_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="persistentvolumeclaims"}) by (resource, type)`,
"workspace_memory_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="requests.memory"}) by (resource, type)`, "workspace_memory_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="requests.memory"}) by (resource, type)`,
"workspace_pvc_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (resource, type)`, "workspace_pvc_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/persistentvolumeclaims"}) by (resource, type)`,
"workspace_cronjobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/cronjobs.batch"}) by (resource, type)`, "workspace_cronjobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/cronjobs.batch"}) by (resource, type)`,
"workspace_ingresses_extensions_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/ingresses.extensions"}) by (resource, type)`, "workspace_ingresses_extensions_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/ingresses.extensions"}) by (resource, type)`,
"workspace_cpu_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="limits.cpu"}) by (resource, type)`, "workspace_cpu_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="limits.cpu"}) by (resource, type)`,
"workspace_storage_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="requests.storage"}) by (resource, type)`, "workspace_storage_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="requests.storage"}) by (resource, type)`,
"workspace_deployment_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/deployments.apps"}) by (resource, type)`, "workspace_deployment_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/deployments.apps"}) by (resource, type)`,
"workspace_pod_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/pods"}) by (resource, type)`, "workspace_pod_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/pods"}) by (resource, type)`,
"workspace_statefulset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/statefulsets.apps"}) by (resource, type)`, "workspace_statefulset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/statefulsets.apps"}) by (resource, type)`,
"workspace_daemonset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/daemonsets.apps"}) by (resource, type)`, "workspace_daemonset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/daemonsets.apps"}) by (resource, type)`,
"workspace_secret_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/secrets"}) by (resource, type)`, "workspace_secret_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/secrets"}) by (resource, type)`,
"workspace_service_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="count/services"}) by (resource, type)`, "workspace_service_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="count/services"}) by (resource, type)`,
"workspace_cpu_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="requests.cpu"}) by (resource, type)`, "workspace_cpu_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="requests.cpu"}) by (resource, type)`,
"workspace_service_loadbalancer_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="services.loadbalancers"}) by (resource, type)`, "workspace_service_loadbalancer_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace!="", namespace$1, resource="services.loadbalancers"}) by (resource, type)`,
"workspace_ingresses_extensions_count": `sum(kube_ingress_labels{namespace=~"$1"})`, "workspace_ingresses_extensions_count": `sum(kube_ingress_labels{namespace!="", namespace$1})`,
"workspace_cronjob_count": `sum(kube_cronjob_labels{namespace=~"$1"})`, "workspace_cronjob_count": `sum(kube_cronjob_labels{namespace!="", namespace$1})`,
"workspace_pvc_count": `sum(kube_persistentvolumeclaim_info{namespace=~"$1"})`, "workspace_pvc_count": `sum(kube_persistentvolumeclaim_info{namespace!="", namespace$1})`,
"workspace_daemonset_count": `sum(kube_daemonset_labels{namespace=~"$1"})`, "workspace_daemonset_count": `sum(kube_daemonset_labels{namespace!="", namespace$1})`,
"workspace_deployment_count": `sum(kube_deployment_labels{namespace=~"$1"})`, "workspace_deployment_count": `sum(kube_deployment_labels{namespace!="", namespace$1})`,
"workspace_endpoint_count": `sum(kube_endpoint_labels{namespace=~"$1"})`, "workspace_endpoint_count": `sum(kube_endpoint_labels{namespace!="", namespace$1})`,
"workspace_hpa_count": `sum(kube_hpa_labels{namespace=~"$1"})`, "workspace_hpa_count": `sum(kube_hpa_labels{namespace!="", namespace$1})`,
"workspace_job_count": `sum(kube_job_labels{namespace=~"$1"})`, "workspace_job_count": `sum(kube_job_labels{namespace!="", namespace$1})`,
"workspace_statefulset_count": `sum(kube_statefulset_labels{namespace=~"$1"})`, "workspace_statefulset_count": `sum(kube_statefulset_labels{namespace!="", namespace$1})`,
"workspace_replicaset_count": `count(kube_replicaset_created{namespace=~"$1"})`, "workspace_replicaset_count": `count(kube_replicaset_created{namespace!="", namespace$1})`,
"workspace_service_count": `sum(kube_service_info{namespace=~"$1"})`, "workspace_service_count": `sum(kube_service_info{namespace!="", namespace$1})`,
"workspace_secret_count": `sum(kube_secret_info{namespace=~"$1"})`, "workspace_secret_count": `sum(kube_secret_info{namespace!="", namespace$1})`,
"workspace_all_project_count": `count(kube_namespace_annotations)`,
} }

View File

@@ -23,6 +23,8 @@ import (
"strconv" "strconv"
"unicode" "unicode"
"runtime/debug"
"github.com/golang/glog" "github.com/golang/glog"
) )
@@ -50,6 +52,12 @@ func (wrapper FormatedMetricDataWrapper) Swap(i, j int) {
// sorted metric by ascending or descending order // sorted metric by ascending or descending order
func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelMetric, resourceType string) (*FormatedLevelMetric, int) { func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelMetric, resourceType string) (*FormatedLevelMetric, int) {
defer func() {
if err := recover(); err != nil {
glog.Errorln(err)
debug.PrintStack()
}
}()
if sortMetricName == "" { if sortMetricName == "" {
return fmtLevelMetric, -1 return fmtLevelMetric, -1
@@ -75,6 +83,12 @@ func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelM
value2 := (*q)[ResultItemValue].([]interface{}) value2 := (*q)[ResultItemValue].([]interface{})
v1, _ := strconv.ParseFloat(value1[len(value1)-1].(string), 64) v1, _ := strconv.ParseFloat(value1[len(value1)-1].(string), 64)
v2, _ := strconv.ParseFloat(value2[len(value2)-1].(string), 64) v2, _ := strconv.ParseFloat(value2[len(value2)-1].(string), 64)
if v1 == v2 {
resourceName1 := (*p)[ResultItemMetric].(map[string]interface{})[resourceType]
resourceName2 := (*q)[ResultItemMetric].(map[string]interface{})[resourceType]
return resourceName1.(string) < resourceName2.(string)
}
return v1 < v2 return v1 < v2
}}) }})
} else { } else {
@@ -84,6 +98,13 @@ func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelM
value2 := (*q)[ResultItemValue].([]interface{}) value2 := (*q)[ResultItemValue].([]interface{})
v1, _ := strconv.ParseFloat(value1[len(value1)-1].(string), 64) v1, _ := strconv.ParseFloat(value1[len(value1)-1].(string), 64)
v2, _ := strconv.ParseFloat(value2[len(value2)-1].(string), 64) v2, _ := strconv.ParseFloat(value2[len(value2)-1].(string), 64)
if v1 == v2 {
resourceName1 := (*p)[ResultItemMetric].(map[string]interface{})[resourceType]
resourceName2 := (*q)[ResultItemMetric].(map[string]interface{})[resourceType]
return resourceName1.(string) > resourceName2.(string)
}
return v1 > v2 return v1 > v2
}}) }})
} }
@@ -110,7 +131,13 @@ func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelM
} }
} }
for resource, _ := range currentResourceMap { var keys []string
for k := range currentResourceMap {
keys = append(keys, k)
}
sort.Strings(keys)
for _, resource := range keys {
if _, exist := indexMap[resource]; !exist { if _, exist := indexMap[resource]; !exist {
indexMap[resource] = i indexMap[resource] = i
i = i + 1 i = i + 1