diff --git a/pkg/client/prometheusclient.go b/pkg/client/prometheusclient.go index a7c776a48..c879db3c6 100644 --- a/pkg/client/prometheusclient.go +++ b/pkg/client/prometheusclient.go @@ -20,22 +20,33 @@ import ( "strings" "time" + "os" + "github.com/emicklei/go-restful" "github.com/golang/glog" ) const ( - DefaultScheme = "http" - DefaultPrometheusService = "prometheus-k8s.monitoring.svc" - DefaultPrometheusPort = "9090" - PrometheusApiPath = "/api/v1/" - PrometheusEndpointUrl = DefaultScheme + "://" + DefaultPrometheusService + ":" + DefaultPrometheusPort + PrometheusApiPath - DefaultQueryStep = "10m" - DefaultQueryTimeout = "30s" - RangeQueryType = "query_range?" - DefaultQueryType = "query?" + DefaultScheme = "http" + DefaultPrometheusPort = "9090" + PrometheusApiPath = "/api/v1/" + DefaultQueryStep = "10m" + DefaultQueryTimeout = "30s" + RangeQueryType = "query_range?" + DefaultQueryType = "query?" + PrometheusAPIServerEnv = "PROMETHEUS_API_SERVER" ) +var PrometheusAPIServer = "prometheus-k8s.kubesphere-monitoring-system.svc" +var PrometheusEndpointUrl string + +func init() { + if env := os.Getenv(PrometheusAPIServerEnv); env != "" { + PrometheusAPIServer = env + } + PrometheusEndpointUrl = DefaultScheme + "://" + PrometheusAPIServer + ":" + DefaultPrometheusPort + PrometheusApiPath +} + type MonitoringRequestParams struct { Params url.Values QueryType string diff --git a/pkg/models/metrics/metrics.go b/pkg/models/metrics/metrics.go index 5287ab71c..7ac734dc0 100644 --- a/pkg/models/metrics/metrics.go +++ b/pkg/models/metrics/metrics.go @@ -895,7 +895,7 @@ func MonitorComponentStatus(monitoringRequest *client.MonitoringRequestParams) * for _, nsStatusItem := range nsStatus.(map[string]interface{}) { component := nsStatusItem.(models.Component) namspaceComponentTotalMap[ns] += 1 - if component.HealthyBackends == component.TotalBackends { + if component.HealthyBackends != 0 && component.HealthyBackends == component.TotalBackends { namspaceComponentHealthyMap[ns] += 1 } } diff --git a/pkg/models/metrics/metricsrule.go b/pkg/models/metrics/metricsrule.go index f0ff0811e..12a8dd063 100755 --- a/pkg/models/metrics/metricsrule.go +++ b/pkg/models/metrics/metricsrule.go @@ -152,7 +152,7 @@ func MakeNodeRule(nodeID string, nodesFilter string, metricsName string) string if nodesFilter == "" { nodesFilter = ".*" } - if strings.Contains(metricsName, "disk_size") || strings.Contains(metricsName, "pod") || strings.Contains(metricsName, "usage") || strings.Contains(metricsName, "inode") { + if strings.Contains(metricsName, "disk_size") || strings.Contains(metricsName, "pod") || strings.Contains(metricsName, "usage") || strings.Contains(metricsName, "inode") || strings.Contains(metricsName, "load") { // disk size promql if nodeID != "" { nodesFilter = "{" + "node" + "=" + "\"" + nodeID + "\"" + "}" diff --git a/pkg/models/metrics/metricsruleconst.go b/pkg/models/metrics/metricsruleconst.go index 05896333d..6ba2883ba 100644 --- a/pkg/models/metrics/metricsruleconst.go +++ b/pkg/models/metrics/metricsruleconst.go @@ -132,6 +132,10 @@ var ClusterMetricsNames = []string{ "cluster_namespace_count", "workspace_all_project_count", + + "cluster_load1", + "cluster_load5", + "cluster_load15", } var NodeMetricsNames = []string{ "node_cpu_utilisation", @@ -163,6 +167,10 @@ var NodeMetricsNames = []string{ "node_pod_running_count", "node_pod_succeeded_count", "node_pod_abnormal_count", + + "node_load1", + "node_load5", + "node_load15", } var WorkspaceMetricsNames = []string{ "workspace_cpu_usage", @@ -250,6 +258,8 @@ var NamespaceMetricsNames = []string{ "namespace_replicaset_count", "namespace_service_count", "namespace_secret_count", + + "namespace_ingresses_extensions_count", } var PodMetricsNames = []string{ @@ -297,57 +307,38 @@ var RulePromQLTmplMap = MetricMap{ "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": `sum(kube_pod_status_phase)`, - "cluster_pod_utilisation": `sum(kube_pod_status_phase) / sum(kube_node_status_capacity_pods)`, - "cluster_pod_running_count": `sum(kube_pod_status_phase{phase="Running"})`, - "cluster_pod_succeeded_count": `sum(kube_pod_status_phase{phase="Succeeded"})`, - "cluster_pod_abnormal_count": `sum(kube_pod_status_phase{phase=~"Failed|Pending|Unknown"})`, + "cluster_pod_count": `sum(kube_pod_info unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`, + "cluster_pod_quota": `sum(kube_node_status_capacity_pods unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`, + "cluster_pod_utilisation": `sum(kube_pod_info unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0)) / sum(kube_node_status_capacity_pods unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`, + "cluster_pod_running_count": `count(kube_pod_info unless on (pod) (kube_pod_status_phase{phase=~"Failed|Pending|Unknown|Succeeded"} > 0) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`, + "cluster_pod_succeeded_count": `count(kube_pod_info unless on (pod) (kube_pod_status_phase{phase=~"Failed|Pending|Unknown|Running"} > 0) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`, + "cluster_pod_abnormal_count": `count(kube_pod_info unless on (pod) (kube_pod_status_phase{phase=~"Succeeded|Running"} > 0) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0))`, - "cluster_node_online": `sum(kube_node_status_condition{condition="Ready",status="true"})`, - "cluster_node_offline": `sum(kube_node_status_condition{condition="Ready",status=~"unknown|false"})`, - "cluster_node_total": `sum(kube_node_status_condition{condition="Ready"})`, - "cluster_pod_quota": `sum(kube_node_status_capacity_pods)`, - "cluster_ingresses_extensions_count": `sum(kube_resourcequota{type="used", resource="count/ingresses.extensions"}) by (resource, type)`, + "cluster_node_online": `sum(kube_node_status_condition{condition="Ready",status="true"})`, + "cluster_node_offline": `sum(kube_node_status_condition{condition="Ready",status=~"unknown|false"})`, + "cluster_node_total": `sum(kube_node_status_condition{condition="Ready"})`, - "cluster_configmap_count_used": `sum(kube_resourcequota{type="used", resource="count/configmaps"}) by (resource, type)`, - "cluster_jobs_batch_count_used": `sum(kube_resourcequota{type="used", resource="count/jobs.batch"}) by (resource, type)`, - "cluster_roles_count_used": `sum(kube_resourcequota{type="used", resource="count/roles.rbac.authorization.k8s.io"}) by (resource, type)`, - "cluster_memory_limit_used": `sum(kube_resourcequota{type="used", resource="limits.memory"}) by (resource, type)`, - "cluster_pvc_used": `sum(kube_resourcequota{type="used", resource="persistentvolumeclaims"}) by (resource, type)`, - "cluster_memory_request_used": `sum(kube_resourcequota{type="used", resource="requests.memory"}) by (resource, type)`, - "cluster_pvc_count_used": `sum(kube_resourcequota{type="used", resource="count/persistentvolumeclaims"}) by (resource, type)`, - "cluster_cronjobs_batch_count_used": `sum(kube_resourcequota{type="used", resource="count/cronjobs.batch"}) by (resource, type)`, - "cluster_ingresses_extensions_count_used": `sum(kube_resourcequota{type="used", resource="count/ingresses.extensions"}) by (resource, type)`, - "cluster_cpu_limit_used": `sum(kube_resourcequota{type="used", resource="limits.cpu"}) by (resource, type)`, - "cluster_storage_request_used": `sum(kube_resourcequota{type="used", resource="requests.storage"}) by (resource, type)`, - "cluster_deployment_count_used": `sum(kube_resourcequota{type="used", resource="count/deployments.apps"}) by (resource, type)`, - "cluster_pod_count_used": `sum(kube_resourcequota{type="used", resource="count/pods"}) by (resource, type)`, - "cluster_statefulset_count_used": `sum(kube_resourcequota{type="used", resource="count/statefulsets.apps"}) by (resource, type)`, - "cluster_daemonset_count_used": `sum(kube_resourcequota{type="used", resource="count/daemonsets.apps"}) by (resource, type)`, - "cluster_secret_count_used": `sum(kube_resourcequota{type="used", resource="count/secrets"}) by (resource, type)`, - "cluster_service_count_used": `sum(kube_resourcequota{type="used", resource="count/services"}) by (resource, type)`, - "cluster_cpu_request_used": `sum(kube_resourcequota{type="used", resource="requests.cpu"}) by (resource, type)`, - "cluster_service_loadbalancer_used": `sum(kube_resourcequota{type="used", resource="services.loadbalancers"}) by (resource, type)`, + "cluster_ingresses_extensions_count": `sum(kube_ingress_labels)`, - "cluster_configmap_count_hard": `sum(kube_resourcequota{type="hard", resource="count/configmaps"}) by (resource, type)`, - "cluster_jobs_batch_count_hard": `sum(kube_resourcequota{type="hard", resource="count/jobs.batch"}) by (resource, type)`, - "cluster_roles_count_hard": `sum(kube_resourcequota{type="hard", resource="count/roles.rbac.authorization.k8s.io"}) by (resource, type)`, - "cluster_memory_limit_hard": `sum(kube_resourcequota{type="hard", resource="limits.memory"}) by (resource, type)`, - "cluster_pvc_hard": `sum(kube_resourcequota{type="hard", resource="persistentvolumeclaims"}) by (resource, type)`, - "cluster_memory_request_hard": `sum(kube_resourcequota{type="hard", resource="requests.memory"}) by (resource, type)`, - "cluster_pvc_count_hard": `sum(kube_resourcequota{type="hard", resource="count/persistentvolumeclaims"}) by (resource, type)`, - "cluster_cronjobs_batch_count_hard": `sum(kube_resourcequota{type="hard", resource="count/cronjobs.batch"}) by (resource, type)`, - "cluster_ingresses_extensions_count_hard": `sum(kube_resourcequota{type="hard", resource="count/ingresses.extensions"}) by (resource, type)`, - "cluster_cpu_limit_hard": `sum(kube_resourcequota{type="hard", resource="limits.cpu"}) by (resource, type)`, - "cluster_storage_request_hard": `sum(kube_resourcequota{type="hard", resource="requests.storage"}) by (resource, type)`, - "cluster_deployment_count_hard": `sum(kube_resourcequota{type="hard", resource="count/deployments.apps"}) by (resource, type)`, - "cluster_pod_count_hard": `sum(kube_resourcequota{type="hard", resource="count/pods"}) by (resource, type)`, - "cluster_statefulset_count_hard": `sum(kube_resourcequota{type="hard", resource="count/statefulsets.apps"}) by (resource, type)`, - "cluster_daemonset_count_hard": `sum(kube_resourcequota{type="hard", resource="count/daemonsets.apps"}) by (resource, type)`, - "cluster_secret_count_hard": `sum(kube_resourcequota{type="hard", resource="count/secrets"}) by (resource, type)`, - "cluster_service_count_hard": `sum(kube_resourcequota{type="hard", resource="count/services"}) by (resource, type)`, - "cluster_cpu_request_hard": `sum(kube_resourcequota{type="hard", resource="requests.cpu"}) by (resource, type)`, - "cluster_service_loadbalancer_hard": `sum(kube_resourcequota{type="hard", resource="services.loadbalancers"}) by (resource, type)`, + "cluster_configmap_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/configmaps"}) by (resource, type)`, + "cluster_jobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/jobs.batch"}) by (resource, type)`, + "cluster_roles_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/roles.rbac.authorization.k8s.io"}) by (resource, type)`, + "cluster_memory_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="limits.memory"}) by (resource, type)`, + "cluster_pvc_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="persistentvolumeclaims"}) by (resource, type)`, + "cluster_memory_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="requests.memory"}) by (resource, type)`, + "cluster_pvc_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/persistentvolumeclaims"}) by (resource, type)`, + "cluster_cronjobs_batch_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/cronjobs.batch"}) by (resource, type)`, + "cluster_ingresses_extensions_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/ingresses.extensions"}) by (resource, type)`, + "cluster_cpu_limit_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="limits.cpu"}) by (resource, type)`, + "cluster_storage_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="requests.storage"}) by (resource, type)`, + "cluster_deployment_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/deployments.apps"}) by (resource, type)`, + "cluster_pod_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/pods"}) by (resource, type)`, + "cluster_statefulset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/statefulsets.apps"}) by (resource, type)`, + "cluster_daemonset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/daemonsets.apps"}) by (resource, type)`, + "cluster_secret_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/secrets"}) by (resource, type)`, + "cluster_service_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="count/services"}) by (resource, type)`, + "cluster_cpu_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="requests.cpu"}) by (resource, type)`, + "cluster_service_loadbalancer_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", resource="services.loadbalancers"}) by (resource, type)`, "cluster_cronjob_count": `sum(kube_cronjob_labels)`, "cluster_pvc_count": `sum(kube_persistentvolumeclaim_info)`, @@ -362,6 +353,10 @@ var RulePromQLTmplMap = MetricMap{ "cluster_secret_count": `sum(kube_secret_info)`, "cluster_pv_count": `sum(kube_persistentvolume_labels)`, + "cluster_load1": `sum(node_load1{job="node-exporter"})`, + "cluster_load5": `sum(node_load5{job="node-exporter"})`, + "cluster_load15": `sum(node_load15{job="node-exporter"})`, + //node "node_cpu_utilisation": "node:node_cpu_utilisation:avg1m", "node_cpu_total": "node:node_num_cpu:sum", @@ -393,17 +388,21 @@ var RulePromQLTmplMap = MetricMap{ "node_disk_inode_usage": `node:disk_inodes_total:$1 - node:disk_inodes_free:$1`, "node_disk_inode_utilisation": `(1 - (node:disk_inodes_free:$1 / node:disk_inodes_total:$1))`, - "node_pod_count": `count(kube_pod_info$1) by (node)`, - "node_pod_quota": `sum(kube_node_status_capacity_pods$1) by (node)`, - "node_pod_utilisation": `sum(kube_pod_info$1) by (node) / sum(kube_node_status_capacity_pods$1) by (node)`, - "node_pod_running_count": `count(kube_pod_info$1 unless on (pod) (kube_pod_status_phase{phase=~"Failed|Pending|Unknown|Succeeded"} > 0)) by (node)`, - "node_pod_succeeded_count": `count(kube_pod_info$1 unless on (pod) (kube_pod_status_phase{phase=~"Failed|Pending|Unknown|Running"} > 0)) by (node)`, - "node_pod_abnormal_count": `count(kube_pod_info$1 unless on (pod) (kube_pod_status_phase{phase=~"Succeeded|Running"} > 0)) by (node)`, + "node_pod_count": `sum(kube_pod_info$1) by (node) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0)`, + "node_pod_quota": `sum(kube_node_status_capacity_pods$1) by (node) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0)`, + "node_pod_utilisation": `(sum(kube_pod_info$1) by (node) / sum(kube_node_status_capacity_pods$1) by (node)) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0)`, + "node_pod_running_count": `count(kube_pod_info$1 unless on (pod) (kube_pod_status_phase{phase=~"Failed|Pending|Unknown|Succeeded"} > 0)) by (node) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0)`, + "node_pod_succeeded_count": `count(kube_pod_info$1 unless on (pod) (kube_pod_status_phase{phase=~"Failed|Pending|Unknown|Running"} > 0)) by (node) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0)`, + "node_pod_abnormal_count": `count(kube_pod_info$1 unless on (pod) (kube_pod_status_phase{phase=~"Succeeded|Running"} > 0)) by (node) unless on (node) (kube_node_status_condition{condition="Ready",status=~"unknown|false"} > 0)`, // 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_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_load5": `sum by (node) (node_load5{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)`, + //namespace "namespace_cpu_usage": `namespace:container_cpu_usage_seconds_total:sum_rate{namespace=~"$1"}`, "namespace_memory_usage": `namespace:container_memory_usage_bytes:sum{namespace=~"$1"}`, @@ -415,45 +414,45 @@ var RulePromQLTmplMap = MetricMap{ "namespace_pod_succeeded_count": `sum(kube_pod_status_phase{phase="Succeeded", namespace=~"$1"}) by (namespace)`, "namespace_pod_abnormal_count": `sum(kube_pod_status_phase{phase=~"Failed|Pending|Unknown", namespace=~"$1"}) by (namespace)`, - "namespace_configmap_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/configmaps"}) by (namespace, resource, type)`, - "namespace_jobs_batch_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/jobs.batch"}) by (namespace, resource, type)`, - "namespace_roles_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (namespace, resource, type)`, - "namespace_memory_limit_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="limits.memory"}) by (namespace, resource, type)`, - "namespace_pvc_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="persistentvolumeclaims"}) by (namespace, resource, type)`, - "namespace_memory_request_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="requests.memory"}) by (namespace, resource, type)`, - "namespace_pvc_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (namespace, resource, type)`, - "namespace_cronjobs_batch_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/cronjobs.batch"}) by (namespace, resource, type)`, - "namespace_ingresses_extensions_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/ingresses.extensions"}) by (namespace, resource, type)`, - "namespace_cpu_limit_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="limits.cpu"}) by (namespace, resource, type)`, - "namespace_storage_request_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="requests.storage"}) by (namespace, resource, type)`, - "namespace_deployment_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/deployments.apps"}) by (namespace, resource, type)`, - "namespace_pod_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/pods"}) by (namespace, resource, type)`, - "namespace_statefulset_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/statefulsets.apps"}) by (namespace, resource, type)`, - "namespace_daemonset_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/daemonsets.apps"}) by (namespace, resource, type)`, - "namespace_secret_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/secrets"}) by (namespace, resource, type)`, - "namespace_service_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/services"}) by (namespace, resource, type)`, - "namespace_cpu_request_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="requests.cpu"}) by (namespace, resource, type)`, - "namespace_service_loadbalancer_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="services.loadbalancers"}) by (namespace, resource, type)`, + "namespace_configmap_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_roles_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_pvc_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_pvc_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_ingresses_extensions_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_storage_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_pod_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_daemonset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_service_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_service_loadbalancer_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="services.loadbalancers"}) by (namespace, resource, type)`, - "namespace_configmap_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/configmaps"}) by (namespace, resource, type)`, - "namespace_jobs_batch_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/jobs.batch"}) by (namespace, resource, type)`, - "namespace_roles_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (namespace, resource, type)`, - "namespace_memory_limit_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="limits.memory"}) by (namespace, resource, type)`, - "namespace_pvc_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="persistentvolumeclaims"}) by (namespace, resource, type)`, - "namespace_memory_request_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="requests.memory"}) by (namespace, resource, type)`, - "namespace_pvc_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (namespace, resource, type)`, - "namespace_cronjobs_batch_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/cronjobs.batch"}) by (namespace, resource, type)`, - "namespace_ingresses_extensions_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/ingresses.extensions"}) by (namespace, resource, type)`, - "namespace_cpu_limit_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="limits.cpu"}) by (namespace, resource, type)`, - "namespace_storage_request_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="requests.storage"}) by (namespace, resource, type)`, - "namespace_deployment_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/deployments.apps"}) by (namespace, resource, type)`, - "namespace_pod_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/pods"}) by (namespace, resource, type)`, - "namespace_statefulset_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/statefulsets.apps"}) by (namespace, resource, type)`, - "namespace_daemonset_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/daemonsets.apps"}) by (namespace, resource, type)`, - "namespace_secret_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/secrets"}) by (namespace, resource, type)`, - "namespace_service_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/services"}) by (namespace, resource, type)`, - "namespace_cpu_request_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="requests.cpu"}) by (namespace, resource, type)`, - "namespace_service_loadbalancer_hard": `sum(kube_resourcequota{type="hard", 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_jobs_batch_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_memory_limit_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_memory_request_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_cronjobs_batch_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_cpu_limit_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_deployment_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_statefulset_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_secret_count_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_cpu_request_hard": `sum(kube_resourcequota{resourcequota!="quota", resourcequota!="quota", type="hard", 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_cronjob_count": `sum(kube_cronjob_labels{namespace=~"$1"}) by (namespace)`, "namespace_pvc_count": `sum(kube_persistentvolumeclaim_info{namespace=~"$1"}) by (namespace)`, @@ -467,6 +466,8 @@ var RulePromQLTmplMap = MetricMap{ "namespace_service_count": `sum(kube_service_info{namespace=~"$1"}) by (namespace)`, "namespace_secret_count": `sum(kube_secret_info{namespace=~"$1"}) by (namespace)`, + "namespace_ingresses_extensions_count": `sum(kube_ingress_labels{namespace=~"$1"})`, + // 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_memory_usage": `sum(container_memory_usage_bytes{job="kubelet", namespace="$1", pod_name="$2", image!=""}) by (namespace, pod_name)`, @@ -505,46 +506,27 @@ var RulePromQLTmplMap = MetricMap{ "workspace_pod_succeeded_count": `sum(kube_pod_status_phase{phase="Succeeded", namespace=~"$1"})`, "workspace_pod_abnormal_count": `sum(kube_pod_status_phase{phase=~"Failed|Pending|Unknown", namespace=~"$1"})`, - "workspace_configmap_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/configmaps"}) by (resource, type)`, - "workspace_jobs_batch_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/jobs.batch"}) by (resource, type)`, - "workspace_roles_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (resource, type)`, - "workspace_memory_limit_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="limits.memory"}) by (resource, type)`, - "workspace_pvc_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="persistentvolumeclaims"}) by (resource, type)`, - "workspace_memory_request_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="requests.memory"}) by (resource, type)`, - "workspace_pvc_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (resource, type)`, - "workspace_cronjobs_batch_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/cronjobs.batch"}) by (resource, type)`, - "workspace_ingresses_extensions_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/ingresses.extensions"}) by (resource, type)`, - "workspace_cpu_limit_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="limits.cpu"}) by (resource, type)`, - "workspace_storage_request_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="requests.storage"}) by (resource, type)`, - "workspace_deployment_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/deployments.apps"}) by (resource, type)`, - "workspace_pod_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/pods"}) by (resource, type)`, - "workspace_statefulset_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/statefulsets.apps"}) by (resource, type)`, - "workspace_daemonset_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/daemonsets.apps"}) by (resource, type)`, - "workspace_secret_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/secrets"}) by (resource, type)`, - "workspace_service_count_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/services"}) by (resource, type)`, - "workspace_cpu_request_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="requests.cpu"}) by (resource, type)`, - "workspace_service_loadbalancer_used": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="services.loadbalancers"}) by (resource, type)`, + "workspace_configmap_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_roles_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_pvc_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_pvc_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_ingresses_extensions_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_storage_request_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_pod_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_daemonset_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_service_count_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", 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_service_loadbalancer_used": `sum(kube_resourcequota{resourcequota!="quota", type="used", namespace=~"$1", resource="services.loadbalancers"}) by (resource, type)`, - "workspace_configmap_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/configmaps"}) by (resource, type)`, - "workspace_jobs_batch_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/jobs.batch"}) by (resource, type)`, - "workspace_roles_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/roles.rbac.authorization.k8s.io"}) by (resource, type)`, - "workspace_memory_limit_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="limits.memory"}) by (resource, type)`, - "workspace_pvc_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="persistentvolumeclaims"}) by (resource, type)`, - "workspace_memory_request_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="requests.memory"}) by (resource, type)`, - "workspace_pvc_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/persistentvolumeclaims"}) by (resource, type)`, - "workspace_cronjobs_batch_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/cronjobs.batch"}) by (resource, type)`, - "workspace_ingresses_extensions_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/ingresses.extensions"}) by (resource, type)`, - "workspace_cpu_limit_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="limits.cpu"}) by (resource, type)`, - "workspace_storage_request_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="requests.storage"}) by (resource, type)`, - "workspace_deployment_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/deployments.apps"}) by (resource, type)`, - "workspace_pod_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/pods"}) by (resource, type)`, - "workspace_statefulset_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/statefulsets.apps"}) by (resource, type)`, - "workspace_daemonset_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/daemonsets.apps"}) by (resource, type)`, - "workspace_secret_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/secrets"}) by (resource, type)`, - "workspace_service_count_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="count/services"}) by (resource, type)`, - "workspace_cpu_request_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="requests.cpu"}) by (resource, type)`, - "workspace_service_loadbalancer_hard": `sum(kube_resourcequota{type="hard", namespace=~"$1", resource="services.loadbalancers"}) by (resource, type)`, - "workspace_ingresses_extensions_count": `sum(kube_resourcequota{type="used", namespace=~"$1", resource="count/ingresses.extensions"}) by (resource, type)`, + "workspace_ingresses_extensions_count": `sum(kube_ingress_labels{namespace=~"$1"})`, "workspace_cronjob_count": `sum(kube_cronjob_labels{namespace=~"$1"})`, "workspace_pvc_count": `sum(kube_persistentvolumeclaim_info{namespace=~"$1"})`, diff --git a/pkg/models/metrics/util.go b/pkg/models/metrics/util.go index 36b081461..b11e343dd 100644 --- a/pkg/models/metrics/util.go +++ b/pkg/models/metrics/util.go @@ -50,17 +50,9 @@ func (wrapper FormatedMetricDataWrapper) Swap(i, j int) { // sorted metric by ascending or descending order func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelMetric, resourceType string) (*FormatedLevelMetric, int) { - var maxLength = 0 - for _, metricItem := range fmtLevelMetric.Results { - if metricItem.Data.ResultType == ResultTypeVector && metricItem.Status == MetricStatusSuccess { - if maxLength < len(metricItem.Data.Result) { - maxLength = len(metricItem.Data.Result) - } - } - } if sortMetricName == "" { - return fmtLevelMetric, maxLength + return fmtLevelMetric, -1 } // default sort type is descending order @@ -72,6 +64,7 @@ func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelM // indexMap store sorted index for each node/namespace/pod var indexMap = make(map[string]int) + i := 0 for _, metricItem := range fmtLevelMetric.Results { if metricItem.Data.ResultType == ResultTypeVector && metricItem.Status == MetricStatusSuccess { if metricItem.MetricName == sortMetricName { @@ -95,7 +88,6 @@ func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelM }}) } - i := 0 for _, r := range metricItem.Data.Result { // for some reasons, 'metric' may not contain `resourceType` field // example: {"metric":{},"value":[1541142931.731,"3"]} @@ -118,34 +110,40 @@ func Sort(sortMetricName string, sortType string, fmtLevelMetric *FormatedLevelM } } + for resource, _ := range currentResourceMap { + if _, exist := indexMap[resource]; !exist { + indexMap[resource] = i + i = i + 1 + } + } + // sort other metric for i := 0; i < len(fmtLevelMetric.Results); i++ { re := fmtLevelMetric.Results[i] - if re.MetricName != sortMetricName && re.Data.ResultType == ResultTypeVector && re.Status == MetricStatusSuccess { + if re.Data.ResultType == ResultTypeVector && re.Status == MetricStatusSuccess { sortedMetric := make([]map[string]interface{}, len(indexMap)) - noneSortedMetric := make([]map[string]interface{}, 0) for j := 0; j < len(re.Data.Result); j++ { r := re.Data.Result[j] - k, ok := r[ResultItemMetric].(map[string]interface{})[resourceType] - if ok { + k, exist := r[ResultItemMetric].(map[string]interface{})[resourceType] + if exist { index, exist := indexMap[k.(string)] if exist { sortedMetric[index] = r - } else { - noneSortedMetric = append(noneSortedMetric, r) } } } - sortedMetric = append(sortedMetric, noneSortedMetric...) fmtLevelMetric.Results[i].Data.Result = sortedMetric } } - return fmtLevelMetric, maxLength + return fmtLevelMetric, len(indexMap) } func Page(pageNum string, limitNum string, fmtLevelMetric *FormatedLevelMetric, maxLength int) interface{} { + if maxLength <= 0 { + return fmtLevelMetric + } // matrix type can not be sorted for _, metricItem := range fmtLevelMetric.Results { if metricItem.Data.ResultType != ResultTypeVector { diff --git a/pkg/models/workspaces/workspaces.go b/pkg/models/workspaces/workspaces.go index 8667a89cc..c08190d25 100644 --- a/pkg/models/workspaces/workspaces.go +++ b/pkg/models/workspaces/workspaces.go @@ -1235,7 +1235,7 @@ func CountAll() (int, error) { if err != nil { return 0, err } - val, ok := count["total"] + val, ok := count["total_count"] if !ok { return 0, errors.New("not found") @@ -1297,7 +1297,7 @@ func GetAllAccountNums() (int, error) { if err != nil { return 0, err } - val, ok := count["total"] + val, ok := count["total_count"] if !ok { return 0, errors.New("not found")