From 89379fdddeeb22c617e4be3c9a0e4b4819d3ec05 Mon Sep 17 00:00:00 2001 From: LidolLxf <13660354959@163.com> Date: Fri, 12 Jun 2026 18:03:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=20initContainer=20cp?= =?UTF-8?q?u=20=E5=86=85=E5=AD=98=20metrics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcs-monitor/pkg/api/metrics/cluster.go | 34 +++++ .../bcs-monitor/pkg/api/metrics/node.go | 30 ++++ .../pkg/api/metrics/query/bcs_monitor.go | 16 ++ .../pkg/api/metrics/query/bk_monitor.go | 26 ++++ .../pkg/api/metrics/query/handler.go | 2 + bcs-services/bcs-monitor/pkg/api/routes.go | 4 + .../pkg/storegw/bcs_system/constants.go | 4 + .../pkg/storegw/bcs_system/metrics.go | 20 +++ .../storegw/bcs_system/source/base/base.go | 8 + .../bcs_system/source/bk_monitor/cluster.go | 137 ++++++++++++++++++ .../bcs_system/source/bk_monitor/node.go | 92 ++++++++++++ .../bcs_system/source/compute/cluster.go | 12 ++ .../storegw/bcs_system/source/compute/node.go | 12 ++ .../bcs_system/source/computev2/cluster.go | 12 ++ .../bcs_system/source/computev2/node.go | 12 ++ .../bcs_system/source/federation/cluster.go | 12 ++ .../bcs_system/source/federation/node.go | 12 ++ .../bcs_system/source/prometheus/cluster.go | 33 +++++ .../bcs_system/source/prometheus/node.go | 31 ++++ .../bcs_system/source/vcluster/cluster.go | 116 +++++++++++++++ .../bcs_system/source/vcluster/node.go | 12 ++ 21 files changed, 637 insertions(+) diff --git a/bcs-services/bcs-monitor/pkg/api/metrics/cluster.go b/bcs-services/bcs-monitor/pkg/api/metrics/cluster.go index 03866f2a2b..c044a415e5 100644 --- a/bcs-services/bcs-monitor/pkg/api/metrics/cluster.go +++ b/bcs-services/bcs-monitor/pkg/api/metrics/cluster.go @@ -161,3 +161,37 @@ func ClusterDiskioUsage(c context.Context, req *query.UsageQuery) (*promclient.R } return handler.ClusterDiskioUsage(rctx, req) } + +// ClusterCPURequestWithInitUsage 集群含 InitContainer 的 CPU 装箱率 +// @Summary 集群含 InitContainer 的 CPU 装箱率 +// @Tags Metrics +// @Success 200 {string} string +// @Router /cpu_request_with_init_usage [get] +func ClusterCPURequestWithInitUsage(c context.Context, req *query.UsageQuery) (*promclient.ResultData, error) { + rctx, err := rest.GetRestContext(c) + if err != nil { + return nil, err + } + handler, err := query.HandlerFactory(c, rctx.ClusterId) + if err != nil { + return nil, err + } + return handler.ClusterCPURequestWithInitUsage(rctx, req) +} + +// ClusterMemoryRequestWithInitUsage 集群含 InitContainer 的内存装箱率 +// @Summary 集群含 InitContainer 的内存装箱率 +// @Tags Metrics +// @Success 200 {string} string +// @Router /memory_request_with_init_usage [get] +func ClusterMemoryRequestWithInitUsage(c context.Context, req *query.UsageQuery) (*promclient.ResultData, error) { + rctx, err := rest.GetRestContext(c) + if err != nil { + return nil, err + } + handler, err := query.HandlerFactory(c, rctx.ClusterId) + if err != nil { + return nil, err + } + return handler.ClusterMemoryRequestWithInitUsage(rctx, req) +} diff --git a/bcs-services/bcs-monitor/pkg/api/metrics/node.go b/bcs-services/bcs-monitor/pkg/api/metrics/node.go index bd267acbee..0f746abd88 100644 --- a/bcs-services/bcs-monitor/pkg/api/metrics/node.go +++ b/bcs-services/bcs-monitor/pkg/api/metrics/node.go @@ -438,3 +438,33 @@ func GetNodeDiskioUsage(c context.Context, req *UsageQuery) (*promclient.ResultD return handleNodeMetric(rctx, promql, req) } + +// GetNodeCPURequestWithInitUsage 查询含 InitContainer 的 CPU 装箱率 +// @Summary 查询含 InitContainer 的 CPU 装箱率 +// @Tags Metrics +// @Success 200 {string} string +// @Router /nodes/:node/cpu_request_with_init_usage [get] +func GetNodeCPURequestWithInitUsage(c context.Context, req *UsageQuery) (*promclient.ResultData, error) { + rctx, err := rest.GetRestContext(c) + if err != nil { + return nil, err + } + promql := `bcs:node:cpu_request_with_init:usage{cluster_id="%s", node="%s", %s}` + + return handleNodeMetric(rctx, promql, req) +} + +// GetNodeMemoryRequestWithInitUsage 查询含 InitContainer 的内存装箱率 +// @Summary 查询含 InitContainer 的内存装箱率 +// @Tags Metrics +// @Success 200 {string} string +// @Router /nodes/:node/memory_request_with_init_usage [get] +func GetNodeMemoryRequestWithInitUsage(c context.Context, req *UsageQuery) (*promclient.ResultData, error) { + rctx, err := rest.GetRestContext(c) + if err != nil { + return nil, err + } + promql := `bcs:node:memory_request_with_init:usage{cluster_id="%s", node="%s", %s}` + + return handleNodeMetric(rctx, promql, req) +} diff --git a/bcs-services/bcs-monitor/pkg/api/metrics/query/bcs_monitor.go b/bcs-services/bcs-monitor/pkg/api/metrics/query/bcs_monitor.go index df54cfbac0..bd181242fb 100644 --- a/bcs-services/bcs-monitor/pkg/api/metrics/query/bcs_monitor.go +++ b/bcs-services/bcs-monitor/pkg/api/metrics/query/bcs_monitor.go @@ -152,6 +152,22 @@ func (BCSMonitorHandler) ClusterDiskioUsage(c *rest.Context, query *UsageQuery) return handleClusterMetric(c, promql, query) } +// ClusterCPURequestWithInitUsage implements Handler. +// nolint +func (BCSMonitorHandler) ClusterCPURequestWithInitUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) { + promql := `bcs:cluster:cpu_request_with_init:usage{cluster_id="%s", %s}` + + return handleClusterMetric(c, promql, query) +} + +// ClusterMemoryRequestWithInitUsage implements Handler. +// nolint +func (BCSMonitorHandler) ClusterMemoryRequestWithInitUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) { + promql := `bcs:cluster:memory_request_with_init:usage{cluster_id="%s", %s}` + + return handleClusterMetric(c, promql, query) +} + // NewBCSMonitorHandler new handler func NewBCSMonitorHandler() *BCSMonitorHandler { return &BCSMonitorHandler{} diff --git a/bcs-services/bcs-monitor/pkg/api/metrics/query/bk_monitor.go b/bcs-services/bcs-monitor/pkg/api/metrics/query/bk_monitor.go index 4593af5d6d..5edf90dfcc 100644 --- a/bcs-services/bcs-monitor/pkg/api/metrics/query/bk_monitor.go +++ b/bcs-services/bcs-monitor/pkg/api/metrics/query/bk_monitor.go @@ -167,6 +167,19 @@ func (h BKMonitorHandler) ClusterCPURequestUsage(c *rest.Context, query *UsageQu return h.handleBKMonitorClusterMetric(c, promql, query) } +// ClusterCPURequestWithInitUsage implements Handler. +// nolint +func (h BKMonitorHandler) ClusterCPURequestWithInitUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) { + promql := `(sum(avg_over_time(bkmonitor:kube_pod_container_resource_requests{bcs_cluster_id="%s", ` + + `node!=""%s, resource="cpu"}[2m])) + ` + + `sum(avg_over_time(bkmonitor:kube_pod_init_container_resource_requests{bcs_cluster_id="%s", ` + + `node!=""%s, resource="cpu"}[2m]))) / ` + + `sum(avg_over_time(bkmonitor:kube_node_status_allocatable{bcs_cluster_id="%s", ` + + `node!=""%s, resource="cpu"}[2m])) * 100` + + return h.handleBKMonitorClusterMetric(c, promql, query) +} + // ClusterMemoryUsage implements Handler. // nolint func (h BKMonitorHandler) ClusterMemoryUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) { @@ -185,6 +198,19 @@ func (h BKMonitorHandler) ClusterMemoryRequestUsage(c *rest.Context, query *Usag return h.handleBKMonitorClusterMetric(c, promql, query) } +// ClusterMemoryRequestWithInitUsage implements Handler. +// nolint +func (h BKMonitorHandler) ClusterMemoryRequestWithInitUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) { + promql := `(sum(avg_over_time(bkmonitor:kube_pod_container_resource_requests{bcs_cluster_id="%s", ` + + `node!=""%s, resource="memory"}[2m])) + ` + + `sum(avg_over_time(bkmonitor:kube_pod_init_container_resource_requests{bcs_cluster_id="%s", ` + + `node!=""%s, resource="memory"}[2m]))) / ` + + `sum(avg_over_time(bkmonitor:kube_node_status_allocatable{bcs_cluster_id="%s", ` + + `node!=""%s, resource="memory"}[2m])) * 100` + + return h.handleBKMonitorClusterMetric(c, promql, query) +} + // ClusterDiskUsage implements Handler. // nolint func (h BKMonitorHandler) ClusterDiskUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) { diff --git a/bcs-services/bcs-monitor/pkg/api/metrics/query/handler.go b/bcs-services/bcs-monitor/pkg/api/metrics/query/handler.go index 4925ad9bbc..9d0da170b2 100644 --- a/bcs-services/bcs-monitor/pkg/api/metrics/query/handler.go +++ b/bcs-services/bcs-monitor/pkg/api/metrics/query/handler.go @@ -37,6 +37,8 @@ type Handler interface { ClusterMemoryRequestUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) ClusterDiskUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) ClusterDiskioUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) + ClusterCPURequestWithInitUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) + ClusterMemoryRequestWithInitUsage(c *rest.Context, query *UsageQuery) (*promclient.ResultData, error) } // HandlerFactory 自动切换Prometheus/蓝鲸监控 diff --git a/bcs-services/bcs-monitor/pkg/api/routes.go b/bcs-services/bcs-monitor/pkg/api/routes.go index 59c471d318..def7347e65 100644 --- a/bcs-services/bcs-monitor/pkg/api/routes.go +++ b/bcs-services/bcs-monitor/pkg/api/routes.go @@ -168,8 +168,10 @@ func registerMetricsRoutes() http.Handler { route.Get("/overview", rest.Handle(metrics.GetClusterOverview)) route.Get("/cpu_usage", rest.Handle(metrics.ClusterCPUUsage)) route.Get("/cpu_request_usage", rest.Handle(metrics.ClusterCPURequestUsage)) + route.Get("/cpu_request_with_init_usage", rest.Handle(metrics.ClusterCPURequestWithInitUsage)) route.Get("/memory_usage", rest.Handle(metrics.ClusterMemoryUsage)) route.Get("/memory_request_usage", rest.Handle(metrics.ClusterMemoryRequestUsage)) + route.Get("/memory_request_with_init_usage", rest.Handle(metrics.ClusterMemoryRequestWithInitUsage)) route.Get("/disk_usage", rest.Handle(metrics.ClusterDiskUsage)) route.Get("/diskio_usage", rest.Handle(metrics.ClusterDiskioUsage)) route.Get("/pod_usage", rest.Handle(metrics.ClusterPodUsage)) @@ -180,8 +182,10 @@ func registerMetricsRoutes() http.Handler { route.Post("/nodes/overviews", rest.Handle(metrics.ListNodeOverviews)) route.Get("/nodes/{node}/cpu_usage", rest.Handle(metrics.GetNodeCPUUsage)) route.Get("/nodes/{node}/cpu_request_usage", rest.Handle(metrics.GetNodeCPURequestUsage)) + route.Get("/nodes/{node}/cpu_request_with_init_usage", rest.Handle(metrics.GetNodeCPURequestWithInitUsage)) route.Get("/nodes/{node}/memory_usage", rest.Handle(metrics.GetNodeMemoryUsage)) route.Get("/nodes/{node}/memory_request_usage", rest.Handle(metrics.GetNodeMemoryRequestUsage)) + route.Get("/nodes/{node}/memory_request_with_init_usage", rest.Handle(metrics.GetNodeMemoryRequestWithInitUsage)) route.Get("/nodes/{node}/network_receive", rest.Handle(metrics.GetNodeNetworkReceiveUsage)) route.Get("/nodes/{node}/network_transmit", rest.Handle(metrics.GetNodeNetworkTransmitUsage)) route.Get("/nodes/{node}/disk_usage", rest.Handle(metrics.GetNodeDiskUsage)) diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/constants.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/constants.go index ae88f1c2c2..18c0ed773b 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/constants.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/constants.go @@ -22,11 +22,13 @@ var AvailableNodeMetrics = []string{ "bcs:cluster:pod:used", "bcs:cluster:cpu:request", "bcs:cluster:cpu_request:usage", + "bcs:cluster:cpu_request_with_init:usage", "bcs:cluster:memory:total", "bcs:cluster:memory:used", "bcs:cluster:memory:usage", "bcs:cluster:memory:request", "bcs:cluster:memory_request:usage", + "bcs:cluster:memory_request_with_init:usage", "bcs:cluster:disk:total", "bcs:cluster:disk:used", "bcs:cluster:disk:usage", @@ -41,6 +43,7 @@ var AvailableNodeMetrics = []string{ "bcs:node:cpu:request", "bcs:node:cpu:usage", "bcs:node:cpu_request:usage", + "bcs:node:cpu_request_with_init:usage", "bcs:node:disk:usage", "bcs:node:disk:used", "bcs:node:disk:total", @@ -50,6 +53,7 @@ var AvailableNodeMetrics = []string{ "bcs:node:memory:request", "bcs:node:memory:usage", "bcs:node:memory_request:usage", + "bcs:node:memory_request_with_init:usage", "bcs:node:container_count", "bcs:node:pod_count", "bcs:node:pod_total", diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/metrics.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/metrics.go index b53797b480..6ef3cb9815 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/metrics.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/metrics.go @@ -89,6 +89,11 @@ var metricsMaps = map[string]metricsFn{ return mp.client.GetClusterCPURequestUsage(mp.ctx, mp.projectID, mp.clusterID, mp.startTime, mp.endTime, mp.stepDuration) }, + // GetClusterCPURequestWithInitUsage + "bcs:cluster:cpu_request_with_init:usage": func(mp metricsParams) ([]*prompb.TimeSeries, error) { + return mp.client.GetClusterCPURequestWithInitUsage(mp.ctx, mp.projectID, mp.clusterID, + mp.startTime, mp.endTime, mp.stepDuration) + }, // GetClusterMemoryTotal "bcs:cluster:memory:total": func(mp metricsParams) ([]*prompb.TimeSeries, error) { return mp.client.GetClusterMemoryTotal(mp.ctx, mp.projectID, mp.clusterID, @@ -114,6 +119,11 @@ var metricsMaps = map[string]metricsFn{ return mp.client.GetClusterMemoryRequestUsage(mp.ctx, mp.projectID, mp.clusterID, mp.startTime, mp.endTime, mp.stepDuration) }, + // GetClusterMemoryRequestWithInitUsage + "bcs:cluster:memory_request_with_init:usage": func(mp metricsParams) ([]*prompb.TimeSeries, error) { + return mp.client.GetClusterMemoryRequestWithInitUsage(mp.ctx, mp.projectID, mp.clusterID, + mp.startTime, mp.endTime, mp.stepDuration) + }, // GetClusterDiskTotal "bcs:cluster:disk:total": func(mp metricsParams) ([]*prompb.TimeSeries, error) { return mp.client.GetClusterDiskTotal(mp.ctx, mp.projectID, mp.clusterID, @@ -185,6 +195,11 @@ var metricsMaps = map[string]metricsFn{ return mp.client.GetNodeCPURequestUsage(mp.ctx, mp.projectID, mp.clusterID, mp.node, mp.startTime, mp.endTime, mp.stepDuration) }, + // GetNodeCPURequestWithInitUsage + "bcs:node:cpu_request_with_init:usage": func(mp metricsParams) ([]*prompb.TimeSeries, error) { + return mp.client.GetNodeCPURequestWithInitUsage(mp.ctx, mp.projectID, mp.clusterID, mp.node, + mp.startTime, mp.endTime, mp.stepDuration) + }, // GetNodeMemoryTotal "bcs:node:memory:total": func(mp metricsParams) ([]*prompb.TimeSeries, error) { return mp.client.GetNodeMemoryTotal(mp.ctx, mp.projectID, mp.clusterID, mp.node, @@ -210,6 +225,11 @@ var metricsMaps = map[string]metricsFn{ return mp.client.GetNodeMemoryRequestUsage(mp.ctx, mp.projectID, mp.clusterID, mp.node, mp.startTime, mp.endTime, mp.stepDuration) }, + // GetNodeMemoryRequestWithInitUsage + "bcs:node:memory_request_with_init:usage": func(mp metricsParams) ([]*prompb.TimeSeries, error) { + return mp.client.GetNodeMemoryRequestWithInitUsage(mp.ctx, mp.projectID, mp.clusterID, mp.node, + mp.startTime, mp.endTime, mp.stepDuration) + }, "bcs:node:disk:usage": func(mp metricsParams) ([]*prompb.TimeSeries, error) { return mp.client.GetNodeDiskUsage(mp.ctx, mp.projectID, mp.clusterID, mp.node, mp.startTime, mp.endTime, mp.stepDuration) diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/base/base.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/base/base.go index 2c3a2a2f25..c0f1232af2 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/base/base.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/base/base.go @@ -105,6 +105,10 @@ type MetricHandler interface { step time.Duration) ([]*prompb.TimeSeries, error) GetClusterDiskioTotal(ctx context.Context, projectId, clusterId string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) + GetClusterCPURequestWithInitUsage(ctx context.Context, projectId, clusterId string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) + GetClusterMemoryRequestWithInitUsage(ctx context.Context, projectId, clusterId string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) GetClusterGroupNodeNum(ctx context.Context, projectId, clusterId, group string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) GetClusterGroupMaxNodeNum(ctx context.Context, projectId, clusterId, group string, start, end time.Time, @@ -130,6 +134,10 @@ type MetricHandler interface { step time.Duration) ([]*prompb.TimeSeries, error) GetNodeMemoryRequestUsage(ctx context.Context, projectId, clusterId, nodeName string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) + GetNodeCPURequestWithInitUsage(ctx context.Context, projectId, clusterId, nodeName string, start, + end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) + GetNodeMemoryRequestWithInitUsage(ctx context.Context, projectId, clusterId, nodeName string, start, + end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) GetNodeDiskUsed(ctx context.Context, projectId, clusterId, nodeName string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) GetNodeDiskTotal(ctx context.Context, projectId, clusterId, nodeName string, start, end time.Time, diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/cluster.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/cluster.go index 1f4488a4b2..d38b38295c 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/cluster.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/cluster.go @@ -122,6 +122,16 @@ func (m *BKMonitor) GetClusterCPUTotal(ctx context.Context, projectID, clusterID return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterCPUTotalV2 ksm v2 获取集群CPU核心总量 +func (m *BKMonitor) GetClusterCPUTotalV2(ctx context.Context, projectID, clusterID string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := + `sum(avg_over_time(kube_node_status_allocatable{%s, ` + + `job="kube-state-metrics", node!="", node=~"%s", resource="cpu", %s}[1m]))` + // NOCC:goconst/string(设计如此) + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterCPUUsed 获取CPU核心使用量 func (m *BKMonitor) GetClusterCPUUsed(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -200,6 +210,16 @@ func (m *BKMonitor) GetClusterCPURequest(ctx context.Context, projectID, cluster return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterCPURequestV2 ksm v2 获取CPU Rquest +func (m *BKMonitor) GetClusterCPURequestV2(ctx context.Context, projectID, clusterID string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := ` + sum(avg_over_time(kube_pod_container_resource_requests{%s, job="kube-state-metrics", ` + + `node!="", node=~"%s", resource="cpu", %s}[1m]))` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterCPURequestUsage 获取CPU核心装箱率 func (m *BKMonitor) GetClusterCPURequestUsage(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -215,6 +235,25 @@ func (m *BKMonitor) GetClusterCPURequestUsage(ctx context.Context, projectID, cl return base.DivideSeries(seriesA, seriesB), nil } +// GetClusterCPURequestWithInitUsage 获取含 InitContainer 的 CPU 核心装箱率 +func (m *BKMonitor) GetClusterCPURequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + containerReqs, err := m.GetClusterCPURequestV2(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + initReqs, err := m.getClusterInitContainerCPURequest(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + total, err := m.GetClusterCPUTotalV2(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + combined := mergeSeriesPlus(containerReqs, initReqs) + return base.DivideSeries(combined, total), nil +} + // GetClusterMemoryTotal 获取集群CPU核心总量 func (m *BKMonitor) GetClusterMemoryTotal(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -226,6 +265,17 @@ func (m *BKMonitor) GetClusterMemoryTotal(ctx context.Context, projectID, cluste return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterMemoryTotalV2 ksm v2 获取集群内存总量 +func (m *BKMonitor) GetClusterMemoryTotalV2(ctx context.Context, projectID, clusterID string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + // NOCC:goconst/string(设计如此) + promql := + `sum(avg_over_time(kube_node_status_allocatable{%s, ` + + `job="kube-state-metrics", node!="", node=~"%s", resource="memory", %s}[1m]))` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterMemoryUsed 获取集群内存使用量 func (m *BKMonitor) GetClusterMemoryUsed(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -264,6 +314,16 @@ func (m *BKMonitor) GetClusterMemoryRequest(ctx context.Context, projectID, clus return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterMemoryRequestV2 ksm v2 获取内存 Request +func (m *BKMonitor) GetClusterMemoryRequestV2(ctx context.Context, projectID, clusterID string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := ` + sum(avg_over_time(kube_pod_container_resource_requests{%s, job="kube-state-metrics", ` + + `node!="", node=~"%s", resource="memory", %s}[1m]))` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterMemoryRequestUsage 获取内存装箱率 func (m *BKMonitor) GetClusterMemoryRequestUsage(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -366,3 +426,80 @@ func (m *BKMonitor) GetClusterDiskioTotal(ctx context.Context, projectID, cluste return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } + +// GetClusterMemoryRequestWithInitUsage 获取含 InitContainer 的内存装箱率 +func (m *BKMonitor) GetClusterMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + containerReqs, err := m.GetClusterMemoryRequestV2(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + initReqs, err := m.getClusterInitContainerMemoryRequest(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + total, err := m.GetClusterMemoryTotalV2(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + combined := mergeSeriesPlus(containerReqs, initReqs) + return base.DivideSeries(combined, total), nil +} + +// getClusterInitContainerCPURequest 获取集群中 initContainer 的 CPU request 总量 +func (m *BKMonitor) getClusterInitContainerCPURequest(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(avg_over_time(kube_pod_init_container_resource_requests{%s, job="kube-state-metrics", ` + + `resource="cpu", node!="", node=~"%s", %s}[1m]) * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{%s, job="kube-state-metrics"}))` + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + +// getClusterInitContainerMemoryRequest 获取集群中 initContainer 的 Memory request 总量 +func (m *BKMonitor) getClusterInitContainerMemoryRequest(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(avg_over_time(kube_pod_init_container_resource_requests{%s, job="kube-state-metrics", ` + + `resource="memory", node!="", node=~"%s", %s}[1m]) * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{%s, job="kube-state-metrics"}))` + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + +// mergeSeriesPlus 合并两组时序数据(对应时间点相加) +func mergeSeriesPlus(a, b []*prompb.TimeSeries) []*prompb.TimeSeries { + if len(b) == 0 { + return a + } + if len(a) == 0 { + return b + } + result := make([]*prompb.TimeSeries, 0, len(a)) + for i, sa := range a { + if i < len(b) { + merged := &prompb.TimeSeries{ + Labels: sa.Labels, + Samples: mergeSamplesPlus(sa.Samples, b[i].Samples), + } + result = append(result, merged) + } else { + result = append(result, sa) + } + } + return result +} + +// mergeSamplesPlus 合并两组样本(按时间戳相加) +func mergeSamplesPlus(a, b []prompb.Sample) []prompb.Sample { + result := make([]prompb.Sample, 0, len(a)) + bMap := make(map[int64]float64, len(b)) + for _, sb := range b { + bMap[sb.Timestamp] = sb.Value + } + for _, sa := range a { + val := sa.Value + if v, ok := bMap[sa.Timestamp]; ok { + val += v + } + result = append(result, prompb.Sample{Timestamp: sa.Timestamp, Value: val}) + } + return result +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/node.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/node.go index 00e489a246..b15d178c39 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/node.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/bk_monitor/node.go @@ -118,6 +118,15 @@ func (m *BKMonitor) GetNodeCPUTotal(ctx context.Context, projectID, clusterID, n return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) } +// GetNodeCPUTotalV2 ksm v2 节点CPU总量 +func (m *BKMonitor) GetNodeCPUTotalV2(ctx context.Context, projectID, clusterID, node string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(kube_node_status_allocatable{cluster_id="%s", node="%s", resource="cpu", ` + + `%s})` // nolint + + return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) +} + // GetNodeCPURequest 节点CPU请求量 func (m *BKMonitor) GetNodeCPURequest(ctx context.Context, projectID, clusterID, node string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -127,6 +136,15 @@ func (m *BKMonitor) GetNodeCPURequest(ctx context.Context, projectID, clusterID, return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) } +// GetNodeCPURequestV2 ksm v2 节点CPU请求量 +func (m *BKMonitor) GetNodeCPURequestV2(ctx context.Context, projectID, clusterID, node string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(kube_pod_container_resource_requests{cluster_id="%s", node="%s", resource="cpu", ` + + `%s})` // nolint + + return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) +} + // GetNodeCPUUsed 节点CPU使用量 func (m *BKMonitor) GetNodeCPUUsed(ctx context.Context, projectID, clusterID, node string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -175,6 +193,15 @@ func (m *BKMonitor) GetNodeMemoryTotal(ctx context.Context, projectID, clusterID return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) } +// GetNodeMemoryTotalV2 ksm v2 节点Memory总量 +func (m *BKMonitor) GetNodeMemoryTotalV2(ctx context.Context, projectID, clusterID, node string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(kube_node_status_allocatable{cluster_id="%s", node="%s", resource="memory", ` + + `%s})` + + return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) +} + // GetNodeMemoryRequest 节点Memory请求量 func (m *BKMonitor) GetNodeMemoryRequest(ctx context.Context, projectID, clusterID, node string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -184,6 +211,15 @@ func (m *BKMonitor) GetNodeMemoryRequest(ctx context.Context, projectID, cluster return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) } +// GetNodeMemoryRequestV2 ksm v2 节点Memory请求量 +func (m *BKMonitor) GetNodeMemoryRequestV2(ctx context.Context, projectID, clusterID, node string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(kube_pod_container_resource_requests{cluster_id="%s", node="%s", ` + + `resource="memory", %s})` + + return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) +} + // GetNodeMemoryUsed 节点Memory使用量 func (m *BKMonitor) GetNodeMemoryUsed(ctx context.Context, projectID, clusterID, node string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -327,3 +363,59 @@ func (m *BKMonitor) GetNodeNetworkReceive(ctx context.Context, projectID, cluste return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) } + +// GetNodeCPURequestWithInitUsage 节点含 InitContainer 的 CPU 装箱率 +func (m *BKMonitor) GetNodeCPURequestWithInitUsage(ctx context.Context, projectID, clusterID, node string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + containerReqs, err := m.GetNodeCPURequestV2(ctx, projectID, clusterID, node, start, end, step) + if err != nil { + return nil, err + } + initReqs, err := m.getNodeInitContainerCPURequest(ctx, projectID, clusterID, node, start, end, step) + if err != nil { + return nil, err + } + total, err := m.GetNodeCPUTotalV2(ctx, projectID, clusterID, node, start, end, step) + if err != nil { + return nil, err + } + combined := mergeSeriesPlus(containerReqs, initReqs) + return base.DivideSeries(combined, total), nil +} + +// GetNodeMemoryRequestWithInitUsage 节点含 InitContainer 的内存装箱率 +func (m *BKMonitor) GetNodeMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID, node string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + containerReqs, err := m.GetNodeMemoryRequestV2(ctx, projectID, clusterID, node, start, end, step) + if err != nil { + return nil, err + } + initReqs, err := m.getNodeInitContainerMemoryRequest(ctx, projectID, clusterID, node, start, end, step) + if err != nil { + return nil, err + } + total, err := m.GetNodeMemoryTotalV2(ctx, projectID, clusterID, node, start, end, step) + if err != nil { + return nil, err + } + combined := mergeSeriesPlus(containerReqs, initReqs) + return base.DivideSeries(combined, total), nil +} + +// getNodeInitContainerCPURequest 获取节点上 initContainer 的 CPU request 总量 +func (m *BKMonitor) getNodeInitContainerCPURequest(ctx context.Context, projectID, clusterID, node string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(kube_pod_init_container_resource_requests{cluster_id="%s", node="%s", ` + + `resource="cpu", %s}) * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{cluster_id="%s"})` + return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) +} + +// getNodeInitContainerMemoryRequest 获取节点上 initContainer 的 Memory request 总量 +func (m *BKMonitor) getNodeInitContainerMemoryRequest(ctx context.Context, projectID, clusterID, node string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(kube_pod_init_container_resource_requests{cluster_id="%s", node="%s", ` + + `resource="memory", %s}) * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{cluster_id="%s"})` + return m.handleNodeMetric(ctx, projectID, clusterID, node, promql, start, end, step) +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/cluster.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/cluster.go index e79cb9ab7e..1408ff439a 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/cluster.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/cluster.go @@ -142,3 +142,15 @@ func (p *Compute) GetClusterPodUsage(ctx context.Context, projectID, clusterID s step time.Duration) ([]*prompb.TimeSeries, error) { return nil, nil } + +// GetClusterCPURequestWithInitUsage 获取含 InitContainer 的 CPU 核心装箱率 +func (p *Compute) GetClusterCPURequestWithInitUsage(ctx context.Context, projectId, clusterId string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} + +// GetClusterMemoryRequestWithInitUsage 获取含 InitContainer 的内存装箱率 +func (p *Compute) GetClusterMemoryRequestWithInitUsage(ctx context.Context, projectId, clusterId string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/node.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/node.go index 240969af19..ddd1229773 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/node.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/compute/node.go @@ -140,3 +140,15 @@ func (m *Compute) GetNodeNetworkReceive(ctx context.Context, projectID, clusterI step time.Duration) ([]*prompb.TimeSeries, error) { return nil, nil } + +// GetNodeCPURequestWithInitUsage 节点含 InitContainer 的 CPU 装箱率 +func (m *Compute) GetNodeCPURequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} + +// GetNodeMemoryRequestWithInitUsage 节点含 InitContainer 的内存装箱率 +func (m *Compute) GetNodeMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/cluster.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/cluster.go index d88a5d63ea..ef41215520 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/cluster.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/cluster.go @@ -143,3 +143,15 @@ func (p *ComputeV2) GetClusterPodUsage(ctx context.Context, projectID, clusterID step time.Duration) ([]*prompb.TimeSeries, error) { return nil, nil } + +// GetClusterCPURequestWithInitUsage 获取含 InitContainer 的 CPU 核心装箱率 +func (p *ComputeV2) GetClusterCPURequestWithInitUsage(ctx context.Context, projectId, clusterId string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} + +// GetClusterMemoryRequestWithInitUsage 获取含 InitContainer 的内存装箱率 +func (p *ComputeV2) GetClusterMemoryRequestWithInitUsage(ctx context.Context, projectId, clusterId string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/node.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/node.go index 499ea9afd0..beb717f01f 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/node.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/computev2/node.go @@ -140,3 +140,15 @@ func (m *ComputeV2) GetNodeNetworkReceive(ctx context.Context, projectID, cluste step time.Duration) ([]*prompb.TimeSeries, error) { return nil, nil } + +// GetNodeCPURequestWithInitUsage 节点含 InitContainer 的 CPU 装箱率 +func (m *ComputeV2) GetNodeCPURequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} + +// GetNodeMemoryRequestWithInitUsage 节点含 InitContainer 的内存装箱率 +func (m *ComputeV2) GetNodeMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/cluster.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/cluster.go index 590973ec5f..58f5ee42eb 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/cluster.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/cluster.go @@ -144,3 +144,15 @@ func (p *Federation) GetClusterDiskioTotal(ctx context.Context, projectID, clust step time.Duration) ([]*prompb.TimeSeries, error) { return nil, nil } + +// GetClusterCPURequestWithInitUsage 获取含 InitContainer 的 CPU 核心装箱率 +func (p *Federation) GetClusterCPURequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} + +// GetClusterMemoryRequestWithInitUsage 获取含 InitContainer 的内存装箱率 +func (p *Federation) GetClusterMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/node.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/node.go index c45d388b1e..8fba1658b0 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/node.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/federation/node.go @@ -140,3 +140,15 @@ func (m *Federation) GetNodeNetworkReceive(ctx context.Context, projectID, clust step time.Duration) ([]*prompb.TimeSeries, error) { return nil, nil } + +// GetNodeCPURequestWithInitUsage 节点含 InitContainer 的 CPU 装箱率 +func (m *Federation) GetNodeCPURequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} + +// GetNodeMemoryRequestWithInitUsage 节点含 InitContainer 的内存装箱率 +func (m *Federation) GetNodeMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/cluster.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/cluster.go index a7bfb3019c..8a2315421e 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/cluster.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/cluster.go @@ -163,6 +163,23 @@ func (m *Prometheus) GetClusterCPURequestUsage(ctx context.Context, projectID, c return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterCPURequestWithInitUsage 获取含 InitContainer 的 CPU 核心装箱率 +// nolint +func (m *Prometheus) GetClusterCPURequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := + `(sum(kube_pod_container_resource_requests{cluster_id="%s", job="kube-state-metrics", ` + + `resource="cpu", node=~"%s", %s}) + ` + + `sum(kube_pod_init_container_resource_requests{cluster_id="%s", job="kube-state-metrics", ` + + `resource="cpu", node=~"%s", %s} * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{cluster_id="%s", ` + + `job="kube-state-metrics", %s}))) / ` + + `sum(count without(cpu, mode) (node_cpu_seconds_total{cluster_id="%s", job="node-exporter", ` + + `mode="idle", instance=~"%s", %s})) * 100` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterMemoryTotal 获取集群内存总量 func (m *Prometheus) GetClusterMemoryTotal(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -233,6 +250,22 @@ func (m *Prometheus) GetClusterMemoryRequestUsage(ctx context.Context, projectID return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterMemoryRequestWithInitUsage 获取含 InitContainer 的内存装箱率 +func (m *Prometheus) GetClusterMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := + `(sum(kube_pod_container_resource_requests{cluster_id="%s", resource="memory", ` + + `job="kube-state-metrics", node=~"%s", %s}) + ` + + `sum(kube_pod_init_container_resource_requests{cluster_id="%s", resource="memory", ` + + `job="kube-state-metrics", node=~"%s", %s} * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{cluster_id="%s", ` + + `job="kube-state-metrics", %s}))) / ` + + `sum(node_memory_MemTotal_bytes{cluster_id="%s", job="node-exporter", ` + + `instance=~"%s", %s}) * 100` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterDiskTotal 获取集群磁盘总量 func (m *Prometheus) GetClusterDiskTotal(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/node.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/node.go index 24c4a45aeb..d22741fa4e 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/node.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/prometheus/node.go @@ -151,6 +151,22 @@ func (m *Prometheus) GetNodeCPURequestUsage(ctx context.Context, projectID, clus return m.handleNodeMetric(ctx, projectID, clusterID, nodeName, promql, start, end, step) } +// GetNodeCPURequestWithInitUsage 节点含 InitContainer 的 CPU 装箱率 +func (m *Prometheus) GetNodeCPURequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := ` + (sum(kube_pod_container_resource_requests{cluster_id="%s", job="kube-state-metrics", ` + + `resource="cpu", node="%s", %s}) + ` + + `sum(kube_pod_init_container_resource_requests{cluster_id="%s", job="kube-state-metrics", ` + + `resource="cpu", node="%s", %s} * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{cluster_id="%s", ` + + `job="kube-state-metrics", %s}))) / ` + + `sum(count without(cpu, mode) (node_cpu_seconds_total{cluster_id="%s", job="node-exporter", ` + + `mode="idle", instance=~"%s", %s})) * 100` + + return m.handleNodeMetric(ctx, projectID, clusterID, nodeName, promql, start, end, step) +} + // GetNodeMemoryTotal 节点Memory总量 func (m *Prometheus) GetNodeMemoryTotal(ctx context.Context, projectID, clusterID, nodeName string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -210,6 +226,21 @@ func (m *Prometheus) GetNodeMemoryRequestUsage(ctx context.Context, projectID, c return m.handleNodeMetric(ctx, projectID, clusterID, nodeName, promql, start, end, step) } +// GetNodeMemoryRequestWithInitUsage 节点含 InitContainer 的内存装箱率 +func (m *Prometheus) GetNodeMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID, nodeName string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := ` + (sum(kube_pod_container_resource_requests{cluster_id="%s", job="kube-state-metrics", ` + + `resource="memory", node="%s", %s}) + ` + + `sum(kube_pod_init_container_resource_requests{cluster_id="%s", job="kube-state-metrics", ` + + `resource="memory", node="%s", %s} * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{cluster_id="%s", ` + + `job="kube-state-metrics", %s}))) / sum(node_memory_MemTotal_bytes{cluster_id="%s", ` + + `job="node-exporter", instance=~"%s", %s}) * 100` + + return m.handleNodeMetric(ctx, projectID, clusterID, nodeName, promql, start, end, step) +} + // GetNodeDiskTotal 节点磁盘总量 func (m *Prometheus) GetNodeDiskTotal(ctx context.Context, projectID, clusterID, nodeName string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/cluster.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/cluster.go index 832d3c804e..fc02967d9f 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/cluster.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/cluster.go @@ -93,6 +93,16 @@ func (m *VCluster) GetClusterCPURequest(ctx context.Context, projectID, clusterI return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterCPURequestV2 ksm v2 获取CPU Request +func (m *VCluster) GetClusterCPURequestV2(ctx context.Context, projectID, clusterID string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := + `sum(avg_over_time(kube_pod_container_resource_requests{%s, job="kube-state-metrics", ` + + `resource="cpu", %s}[1m]))` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterCPURequestUsage 获取CPU核心装箱率 func (m *VCluster) GetClusterCPURequestUsage(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -161,6 +171,16 @@ func (m *VCluster) GetClusterMemoryRequest(ctx context.Context, projectID, clust return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) } +// GetClusterMemoryRequestV2 ksm v2 获取内存 Request +func (m *VCluster) GetClusterMemoryRequestV2(ctx context.Context, projectID, clusterID string, start, end time.Time, + step time.Duration) ([]*prompb.TimeSeries, error) { + promql := + `sum(avg_over_time(kube_pod_container_resource_requests{%s, job="kube-state-metrics", ` + + `resource="memory", %s}[1m]))` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + // GetClusterMemoryRequestUsage 获取内存装箱率 func (m *VCluster) GetClusterMemoryRequestUsage(ctx context.Context, projectID, clusterID string, start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { @@ -249,3 +269,99 @@ func (m *VCluster) GetClusterPodUsage(ctx context.Context, projectID, clusterID } return base.DivideSeriesByValue(usedSeries, float64(cluster.NetworkSettings.MaxNodePodNum)), nil } + +// GetClusterInitContainerCPURequest 获取 InitContainer Request +func (m *VCluster) GetClusterInitContainerCPURequest(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := + `sum(avg_over_time(kube_pod_init_container_resource_requests{%s, job="kube-state-metrics", ` + + `resource="cpu", %s}[1m]) * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{%s, job="kube-state-metrics"}))` + + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + +// GetClusterInitContainerMemoryRequest 获取 InitContainer Memory request 总量 +func (m *VCluster) GetClusterInitContainerMemoryRequest(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + promql := `sum(avg_over_time(kube_pod_init_container_resource_requests{%s, job="kube-state-metrics", ` + + `resource="memory", %s}[1m]) * ` + + `on (namespace,pod,container) (kube_pod_init_container_status_running{%s, job="kube-state-metrics"}))` + return m.handleClusterMetric(ctx, projectID, clusterID, promql, start, end, step) +} + +// GetClusterCPURequestWithInitUsage 获取含 InitContainer 的 CPU 核心装箱率 +func (m *VCluster) GetClusterCPURequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + containerReqs, err := m.GetClusterCPURequestV2(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + initReqs, err := m.GetClusterInitContainerCPURequest(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + cls, err := bcs.GetCluster(clusterID) + if err != nil { + return nil, err + } + res := resource.MustParse(cls.VclusterInfo.Quota.CPULimits) + combined := vMergeSeriesPlus(containerReqs, initReqs) + return base.DivideSeriesByValue(combined, res.AsApproximateFloat64()), nil +} + +// GetClusterMemoryRequestWithInitUsage 获取含 InitContainer 的内存装箱率 +func (m *VCluster) GetClusterMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + containerReqs, err := m.GetClusterMemoryRequestV2(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + initReqs, err := m.GetClusterInitContainerMemoryRequest(ctx, projectID, clusterID, start, end, step) + if err != nil { + return nil, err + } + cls, err := bcs.GetCluster(clusterID) + if err != nil { + return nil, err + } + res := resource.MustParse(cls.VclusterInfo.Quota.MemoryLimits) + combined := vMergeSeriesPlus(containerReqs, initReqs) + return base.DivideSeriesByValue(combined, res.AsApproximateFloat64()), nil +} + +// vMergeSeriesPlus 合并两组时序数据(对应时间点相加) +func vMergeSeriesPlus(a, b []*prompb.TimeSeries) []*prompb.TimeSeries { + if len(b) == 0 { + return a + } + if len(a) == 0 { + return b + } + result := make([]*prompb.TimeSeries, 0, len(a)) + for i, sa := range a { + if i < len(b) { + result = append(result, &prompb.TimeSeries{Labels: sa.Labels, Samples: vMergeSamplesPlus(sa.Samples, b[i].Samples)}) + } else { + result = append(result, sa) + } + } + return result +} + +// vMergeSamplesPlus 合并两组样本 +func vMergeSamplesPlus(a, b []prompb.Sample) []prompb.Sample { + bMap := make(map[int64]float64, len(b)) + for _, sb := range b { + bMap[sb.Timestamp] = sb.Value + } + result := make([]prompb.Sample, 0, len(a)) + for _, sa := range a { + val := sa.Value + if v, ok := bMap[sa.Timestamp]; ok { + val += v + } + result = append(result, prompb.Sample{Timestamp: sa.Timestamp, Value: val}) + } + return result +} diff --git a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/node.go b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/node.go index 1081166ab5..08b1f96f05 100644 --- a/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/node.go +++ b/bcs-services/bcs-monitor/pkg/storegw/bcs_system/source/vcluster/node.go @@ -140,3 +140,15 @@ func (m *VCluster) GetNodeNetworkReceive(ctx context.Context, projectID, cluster step time.Duration) ([]*prompb.TimeSeries, error) { return nil, nil } + +// GetNodeCPURequestWithInitUsage 节点含 InitContainer 的 CPU 装箱率 +func (m *VCluster) GetNodeCPURequestWithInitUsage(ctx context.Context, projectID, clusterID, node string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +} + +// GetNodeMemoryRequestWithInitUsage 节点含 InitContainer 的内存装箱率 +func (m *VCluster) GetNodeMemoryRequestWithInitUsage(ctx context.Context, projectID, clusterID, node string, + start, end time.Time, step time.Duration) ([]*prompb.TimeSeries, error) { + return nil, nil +}