From 4ff49bdbd770b9b472b69bd020a7cabb6033e8ce Mon Sep 17 00:00:00 2001 From: Piotr Roszatycki Date: Sat, 21 Oct 2023 23:21:00 +0200 Subject: [PATCH 1/2] Setting per cluster for mountpoints in the filesystem metrics Signed-off-by: Piotr Roszatycki --- packages/core/src/common/cluster-types.ts | 1 + .../metrics/add-metrics-route.injectable.ts | 3 ++- .../cluster-settings/prometheus-setting.tsx | 27 ++++++++++++++++++- .../src/helm-provider.injectable.ts | 8 +++--- .../src/lens-provider.injectable.ts | 8 +++--- .../src/operator-provider.injectable.ts.ts | 8 +++--- .../src/stacklight-provider.injectable.ts | 8 +++--- 7 files changed, 45 insertions(+), 18 deletions(-) diff --git a/packages/core/src/common/cluster-types.ts b/packages/core/src/common/cluster-types.ts index a8ce7da9125c..cd4f89d51c8a 100644 --- a/packages/core/src/common/cluster-types.ts +++ b/packages/core/src/common/cluster-types.ts @@ -125,6 +125,7 @@ export interface ClusterPrometheusPreferences { prometheusProvider?: { type: string; }; + filesystemMountpoints?: string; } /** diff --git a/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts b/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts index bc0071431b9b..eaf6dba4cd18 100644 --- a/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts +++ b/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts @@ -69,6 +69,7 @@ const addMetricsRouteInjectable = getRouteInjectable({ const queryParams: Partial> = Object.fromEntries(query.entries()); const prometheusMetadata: ClusterPrometheusMetadata = {}; const prometheusHandler = di.inject(prometheusHandlerInjectable, cluster); + const mountpoints = cluster.preferences.filesystemMountpoints || "/"; try { const { prometheusPath, provider } = await prometheusHandler.getPrometheusDetails(); @@ -99,7 +100,7 @@ const addMetricsRouteInjectable = getRouteInjectable({ const data = payload as Record>; const queries = object.entries(data) .map(([queryName, queryOpts]) => ( - provider.getQuery(queryOpts, queryName) + provider.getQuery({ ...queryOpts, mountpoints }, queryName) )); const result = await loadMetrics(queries, cluster, prometheusPath, queryParams); diff --git a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx index 011107101f06..0597752c3868 100644 --- a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx +++ b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx @@ -32,6 +32,7 @@ interface Dependencies { @observer class NonInjectedClusterPrometheusSetting extends React.Component { + @observable mountpoints = ""; @observable path = ""; @observable selectedOption: ProviderValue = autoDetectPrometheus; @observable loading = true; @@ -68,7 +69,7 @@ class NonInjectedClusterPrometheusSetting extends React.Component { - const { prometheus, prometheusProvider } = this.props.cluster.preferences; + const { prometheus, prometheusProvider, filesystemMountpoints } = this.props.cluster.preferences; if (prometheus) { const prefix = prometheus.prefix || ""; @@ -83,6 +84,10 @@ class NonInjectedClusterPrometheusSetting extends React.Component { + this.props.cluster.preferences.filesystemMountpoints = this.mountpoints; + }; + render() { return ( <> @@ -165,6 +174,22 @@ class NonInjectedClusterPrometheusSetting extends React.Component )} + <> +
+
+ + this.mountpoints = value} + onBlur={this.onSaveMountpoints} + placeholder="/" + /> + + {`A regexp for the label with the filesystem mountpoints that will create a graph for disk usage. For the root disk only use "/" and for all disks use ".*".`} + +
+ ); } diff --git a/packages/technical-features/prometheus/src/helm-provider.injectable.ts b/packages/technical-features/prometheus/src/helm-provider.injectable.ts index ac6b46d4e4f6..6395877e46ab 100644 --- a/packages/technical-features/prometheus/src/helm-provider.injectable.ts +++ b/packages/technical-features/prometheus/src/helm-provider.injectable.ts @@ -50,9 +50,9 @@ export const getHelmLikeQueryFor = case "podAllocatableCapacity": return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="pods"}) by (component)`; case "fsSize": - return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"}) by (node)`; case "fsUsage": - return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"} - node_filesystem_avail_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"} - node_filesystem_avail_bytes{node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"}) by (node)`; } break; case "nodes": @@ -72,9 +72,9 @@ export const getHelmLikeQueryFor = case "cpuAllocatableCapacity": return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`; case "fsSize": - return `sum(node_filesystem_size_bytes{mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"}) by (node)`; case "fsUsage": - return `sum(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"} - node_filesystem_avail_bytes{mountpoint=~"${opts.mountpoints}"}) by (node)`; } break; case "pods": diff --git a/packages/technical-features/prometheus/src/lens-provider.injectable.ts b/packages/technical-features/prometheus/src/lens-provider.injectable.ts index cb8b7bbf5ac5..025fe50a719c 100644 --- a/packages/technical-features/prometheus/src/lens-provider.injectable.ts +++ b/packages/technical-features/prometheus/src/lens-provider.injectable.ts @@ -50,9 +50,9 @@ export const getLensLikeQueryFor = case "podAllocatableCapacity": return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="pods"}) by (component)`; case "fsSize": - return `sum(node_filesystem_size_bytes{kubernetes_node=~"${opts.nodes}", mountpoint="/"}) by (kubernetes_node)`; + return `sum(node_filesystem_size_bytes{kubernetes_node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"}) by (kubernetes_node)`; case "fsUsage": - return `sum(node_filesystem_size_bytes{kubernetes_node=~"${opts.nodes}", mountpoint="/"} - node_filesystem_avail_bytes{kubernetes_node=~"${opts.nodes}", mountpoint="/"}) by (kubernetes_node)`; + return `sum(node_filesystem_size_bytes{kubernetes_node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"} - node_filesystem_avail_bytes{kubernetes_node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"}) by (kubernetes_node)`; } break; case "nodes": @@ -72,9 +72,9 @@ export const getLensLikeQueryFor = case "cpuAllocatableCapacity": return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`; case "fsSize": - return `sum(node_filesystem_size_bytes{mountpoint="/"}) by (kubernetes_node)`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"}) by (kubernetes_node)`; case "fsUsage": - return `sum(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) by (kubernetes_node)`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"} - node_filesystem_avail_bytes{mountpoint=~"${opts.mountpoints}"}) by (kubernetes_node)`; } break; case "pods": diff --git a/packages/technical-features/prometheus/src/operator-provider.injectable.ts.ts b/packages/technical-features/prometheus/src/operator-provider.injectable.ts.ts index d8da7255b6b7..a63e4813dc64 100644 --- a/packages/technical-features/prometheus/src/operator-provider.injectable.ts.ts +++ b/packages/technical-features/prometheus/src/operator-provider.injectable.ts.ts @@ -50,9 +50,9 @@ export const getOperatorLikeQueryFor = case "podAllocatableCapacity": return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="pods"})`; case "fsSize": - return `sum(node_filesystem_size_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"})`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"})`; case "fsUsage": - return `sum(node_filesystem_size_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"} - node_filesystem_avail_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"})`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"} - node_filesystem_avail_bytes{mountpoint=~"${opts.mountpoints}"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"})`; } break; case "nodes": @@ -72,9 +72,9 @@ export const getOperatorLikeQueryFor = case "cpuAllocatableCapacity": return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`; case "fsSize": - return `sum(node_filesystem_size_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info) by (node)`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"} * on (pod,namespace) group_left(node) kube_pod_info) by (node)`; case "fsUsage": - return `sum((node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) * on (pod, namespace) group_left(node) kube_pod_info) by (node)`; + return `sum((node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"} - node_filesystem_avail_bytes{mountpoint=~"${opts.mountpoints}"}) * on (pod, namespace) group_left(node) kube_pod_info) by (node)`; } break; case "pods": diff --git a/packages/technical-features/prometheus/src/stacklight-provider.injectable.ts b/packages/technical-features/prometheus/src/stacklight-provider.injectable.ts index 36979d36ea85..25dee9b91583 100644 --- a/packages/technical-features/prometheus/src/stacklight-provider.injectable.ts +++ b/packages/technical-features/prometheus/src/stacklight-provider.injectable.ts @@ -50,9 +50,9 @@ export const getStacklightLikeQueryFor = case "podAllocatableCapacity": return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="pods"}) by (component)`; case "fsSize": - return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"}) by (node)`; case "fsUsage": - return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"} - node_filesystem_avail_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"} - node_filesystem_avail_bytes{node=~"${opts.nodes}", mountpoint=~"${opts.mountpoints}"}) by (node)`; } break; case "nodes": @@ -72,9 +72,9 @@ export const getStacklightLikeQueryFor = case "cpuAllocatableCapacity": return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`; case "fsSize": - return `sum(node_filesystem_size_bytes{mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"}) by (node)`; case "fsUsage": - return `sum(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) by (node)`; + return `sum(node_filesystem_size_bytes{mountpoint=~"${opts.mountpoints}"} - node_filesystem_avail_bytes{mountpoint=~"${opts.mountpoints}"}) by (node)`; } break; case "pods": From dbad7bbdc908d1a823c9be412f32c7c7d04c875a Mon Sep 17 00:00:00 2001 From: Piotr Roszatycki Date: Sun, 22 Oct 2023 11:50:38 +0200 Subject: [PATCH 2/2] Less hardcoded values Signed-off-by: Piotr Roszatycki --- packages/core/src/common/cluster-types.ts | 5 +++++ .../src/main/routes/metrics/add-metrics-route.injectable.ts | 4 ++-- .../components/cluster-settings/prometheus-setting.tsx | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/core/src/common/cluster-types.ts b/packages/core/src/common/cluster-types.ts index cd4f89d51c8a..6cc923da0d70 100644 --- a/packages/core/src/common/cluster-types.ts +++ b/packages/core/src/common/cluster-types.ts @@ -175,6 +175,11 @@ export enum ClusterMetricsResourceType { Namespace = "Namespace", } +/** + * The default filesystem mountpoints for metrics + */ +export const initialFilesystemMountpoints = "/"; + /** * The default node shell image */ diff --git a/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts b/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts index eaf6dba4cd18..e356da731580 100644 --- a/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts +++ b/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts @@ -6,7 +6,7 @@ import { apiPrefix } from "../../../common/vars"; import { getRouteInjectable } from "../../router/router.injectable"; import type { ClusterPrometheusMetadata } from "../../../common/cluster-types"; -import { ClusterMetadataKey } from "../../../common/cluster-types"; +import { ClusterMetadataKey, initialFilesystemMountpoints } from "../../../common/cluster-types"; import type { Cluster } from "../../../common/cluster/cluster"; import { clusterRoute } from "../../router/route"; import { isObject } from "lodash"; @@ -69,7 +69,7 @@ const addMetricsRouteInjectable = getRouteInjectable({ const queryParams: Partial> = Object.fromEntries(query.entries()); const prometheusMetadata: ClusterPrometheusMetadata = {}; const prometheusHandler = di.inject(prometheusHandlerInjectable, cluster); - const mountpoints = cluster.preferences.filesystemMountpoints || "/"; + const mountpoints = cluster.preferences.filesystemMountpoints || initialFilesystemMountpoints; try { const { prometheusPath, provider } = await prometheusHandler.getPrometheusDetails(); diff --git a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx index 0597752c3868..810a20c05120 100644 --- a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx +++ b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx @@ -6,6 +6,7 @@ import React from "react"; import { observer, disposeOnUnmount } from "mobx-react"; import type { Cluster } from "../../../common/cluster/cluster"; +import { initialFilesystemMountpoints } from "../../../common/cluster-types"; import { SubTitle } from "../layout/sub-title"; import type { SelectOption } from "../select"; import { Select } from "../select"; @@ -36,6 +37,7 @@ class NonInjectedClusterPrometheusSetting extends React.Component(); @computed get options(): SelectOption[] { @@ -183,7 +185,7 @@ class NonInjectedClusterPrometheusSetting extends React.Component this.mountpoints = value} onBlur={this.onSaveMountpoints} - placeholder="/" + placeholder={this.initialFilesystemMountpoints} /> {`A regexp for the label with the filesystem mountpoints that will create a graph for disk usage. For the root disk only use "/" and for all disks use ".*".`}