From 029694a3ca325c30050da73e96d4f7db2a070b09 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Tue, 12 Jan 2021 12:12:48 +0200 Subject: [PATCH] improve how metrics are queried & displayed Signed-off-by: Jari Kolehmainen --- src/renderer/api/endpoints/daemon-set.api.ts | 21 ++++++++- src/renderer/api/endpoints/deployment.api.ts | 16 +++++++ src/renderer/api/endpoints/job.api.ts | 21 ++++++++- src/renderer/api/endpoints/metrics.api.ts | 9 ++++ src/renderer/api/endpoints/namespaces.api.ts | 19 +++++++- src/renderer/api/endpoints/replica-set.api.ts | 16 +++++++ .../api/endpoints/stateful-set.api.ts | 16 +++++++ .../+namespaces/namespace-details.tsx | 12 ++++++ .../components/+namespaces/namespace.store.ts | 7 ++- .../+workloads-daemonsets/daemonsets.store.ts | 8 ++-- .../deployments.store.ts | 8 ++-- .../+workloads-jobs/job-details.tsx | 11 +++++ .../components/+workloads-jobs/job.store.ts | 9 +++- .../+workloads-pods/container-charts.tsx | 8 ++-- .../components/+workloads-pods/pod-charts.tsx | 43 ++----------------- .../replicasets.store.ts | 8 ++-- .../statefulset.store.ts | 8 ++-- .../resource-metrics-text.tsx | 5 +-- 18 files changed, 173 insertions(+), 72 deletions(-) diff --git a/src/renderer/api/endpoints/daemon-set.api.ts b/src/renderer/api/endpoints/daemon-set.api.ts index 8dab807517..b77f6e9184 100644 --- a/src/renderer/api/endpoints/daemon-set.api.ts +++ b/src/renderer/api/endpoints/daemon-set.api.ts @@ -3,6 +3,7 @@ import { IPodContainer } from "./pods.api"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { IResourceMetrics, metricsApi } from "./metrics.api"; @autobind() export class DaemonSet extends WorkloadKubeObject { @@ -71,6 +72,24 @@ export class DaemonSet extends WorkloadKubeObject { } } -export const daemonSetApi = new KubeApi({ + +export class DaemonSetApi extends KubeApi { + getMetrics(daemonsets: DaemonSet[], namespace: string, selector = ""): Promise { + const podSelector = daemonsets.map(daemonset => `${daemonset.getName()}-[[:alnum:]]{5}`).join("|"); + const opts = { category: "pods", pods: podSelector, namespace, selector }; + + return metricsApi.getMetrics({ + cpuUsage: opts, + memoryUsage: opts, + fsUsage: opts, + networkReceive: opts, + networkTransmit: opts, + }, { + namespace, + }); + } +} + +export const daemonSetApi = new DaemonSetApi({ objectConstructor: DaemonSet, }); diff --git a/src/renderer/api/endpoints/deployment.api.ts b/src/renderer/api/endpoints/deployment.api.ts index 107e970d98..522097a561 100644 --- a/src/renderer/api/endpoints/deployment.api.ts +++ b/src/renderer/api/endpoints/deployment.api.ts @@ -3,6 +3,7 @@ import moment from "moment"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { IResourceMetrics, metricsApi } from "./metrics.api"; export class DeploymentApi extends KubeApi { protected getScaleApiUrl(params: { namespace: string; name: string }) { @@ -44,6 +45,21 @@ export class DeploymentApi extends KubeApi { } }); } + + getMetrics(deployments: Deployment[], namespace: string, selector = ""): Promise { + const podSelector = deployments.map(deployment => `${deployment.getName()}-[[:alnum:]]{9,}-[[:alnum:]]{5}`).join("|"); + const opts = { category: "pods", pods: podSelector, namespace, selector }; + + return metricsApi.getMetrics({ + cpuUsage: opts, + memoryUsage: opts, + fsUsage: opts, + networkReceive: opts, + networkTransmit: opts, + }, { + namespace, + }); + } } interface IContainerProbe { diff --git a/src/renderer/api/endpoints/job.api.ts b/src/renderer/api/endpoints/job.api.ts index 65b9bcfdc3..538e329e93 100644 --- a/src/renderer/api/endpoints/job.api.ts +++ b/src/renderer/api/endpoints/job.api.ts @@ -4,6 +4,7 @@ import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { IPodContainer } from "./pods.api"; import { KubeApi } from "../kube-api"; import { JsonApiParams } from "../json-api"; +import { IResourceMetrics, metricsApi } from "./metrics.api"; @autobind() export class Job extends WorkloadKubeObject { @@ -107,6 +108,24 @@ export class Job extends WorkloadKubeObject { } } -export const jobApi = new KubeApi({ + +export class JobApi extends KubeApi { + getMetrics(jobs: Job[], namespace: string, selector = ""): Promise { + const podSelector = jobs.map(job => `${job.getName()}-[[:alnum:]]{5}`).join("|"); + const opts = { category: "pods", pods: podSelector, namespace, selector }; + + return metricsApi.getMetrics({ + cpuUsage: opts, + memoryUsage: opts, + fsUsage: opts, + networkReceive: opts, + networkTransmit: opts, + }, { + namespace, + }); + } +} + +export const jobApi = new JobApi({ objectConstructor: Job, }); diff --git a/src/renderer/api/endpoints/metrics.api.ts b/src/renderer/api/endpoints/metrics.api.ts index 9c3ee74adc..c6d92e8b65 100644 --- a/src/renderer/api/endpoints/metrics.api.ts +++ b/src/renderer/api/endpoints/metrics.api.ts @@ -33,6 +33,15 @@ export interface IMetricsReqParams { namespace?: string; // rbac-proxy validation param } +export interface IResourceMetrics { + [metric: string]: T; + cpuUsage: T; + memoryUsage: T; + fsUsage: T; + networkReceive: T; + networkTransmit: T; +} + export const metricsApi = { async getMetrics(query: T, reqParams: IMetricsReqParams = {}): Promise { const { range = 3600, step = 60, namespace } = reqParams; diff --git a/src/renderer/api/endpoints/namespaces.api.ts b/src/renderer/api/endpoints/namespaces.api.ts index 430565bf57..a4d04bcb1a 100644 --- a/src/renderer/api/endpoints/namespaces.api.ts +++ b/src/renderer/api/endpoints/namespaces.api.ts @@ -1,6 +1,7 @@ import { KubeApi } from "../kube-api"; import { KubeObject } from "../kube-object"; import { autobind } from "../../utils"; +import { IResourceMetrics, metricsApi } from "./metrics.api"; export enum NamespaceStatus { ACTIVE = "Active", @@ -22,6 +23,22 @@ export class Namespace extends KubeObject { } } -export const namespacesApi = new KubeApi({ +export class NamespaceApi extends KubeApi { + getMetrics(namespace: string, selector = ""): Promise { + const opts = { category: "pods", pods: ".*", namespace, selector }; + + return metricsApi.getMetrics({ + cpuUsage: opts, + memoryUsage: opts, + fsUsage: opts, + networkReceive: opts, + networkTransmit: opts, + }, { + namespace, + }); + } +} + +export const namespacesApi = new NamespaceApi({ objectConstructor: Namespace, }); diff --git a/src/renderer/api/endpoints/replica-set.api.ts b/src/renderer/api/endpoints/replica-set.api.ts index eb1131f645..56b1abd4e5 100644 --- a/src/renderer/api/endpoints/replica-set.api.ts +++ b/src/renderer/api/endpoints/replica-set.api.ts @@ -3,6 +3,7 @@ import { autobind } from "../../utils"; import { WorkloadKubeObject } from "../workload-kube-object"; import { IPodContainer, Pod } from "./pods.api"; import { KubeApi } from "../kube-api"; +import { IResourceMetrics, metricsApi } from "./metrics.api"; export class ReplicaSetApi extends KubeApi { protected getScaleApiUrl(params: { namespace: string; name: string }) { @@ -25,6 +26,21 @@ export class ReplicaSetApi extends KubeApi { } }); } + + getMetrics(replicasets: ReplicaSet[], namespace: string, selector = ""): Promise { + const podSelector = replicasets.map(replicaset => `${replicaset.getName()}-[[:alnum:]]{5}`).join("|"); + const opts = { category: "pods", pods: podSelector, namespace, selector }; + + return metricsApi.getMetrics({ + cpuUsage: opts, + memoryUsage: opts, + fsUsage: opts, + networkReceive: opts, + networkTransmit: opts, + }, { + namespace, + }); + } } @autobind() diff --git a/src/renderer/api/endpoints/stateful-set.api.ts b/src/renderer/api/endpoints/stateful-set.api.ts index add2a554ba..ad7760e357 100644 --- a/src/renderer/api/endpoints/stateful-set.api.ts +++ b/src/renderer/api/endpoints/stateful-set.api.ts @@ -3,6 +3,7 @@ import { IPodContainer } from "./pods.api"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { IResourceMetrics, metricsApi } from "./metrics.api"; export class StatefulSetApi extends KubeApi { protected getScaleApiUrl(params: { namespace: string; name: string }) { @@ -25,6 +26,21 @@ export class StatefulSetApi extends KubeApi { } }); } + + getMetrics(statefulSets: StatefulSet[], namespace: string, selector = ""): Promise { + const podSelector = statefulSets.map(statefulset => `${statefulset.getName()}-[[:digit:]]+`).join("|"); + const opts = { category: "pods", pods: podSelector, namespace, selector }; + + return metricsApi.getMetrics({ + cpuUsage: opts, + memoryUsage: opts, + fsUsage: opts, + networkReceive: opts, + networkTransmit: opts, + }, { + namespace, + }); + } } @autobind() diff --git a/src/renderer/components/+namespaces/namespace-details.tsx b/src/renderer/components/+namespaces/namespace-details.tsx index f687630a96..78afcb1965 100644 --- a/src/renderer/components/+namespaces/namespace-details.tsx +++ b/src/renderer/components/+namespaces/namespace-details.tsx @@ -12,6 +12,9 @@ import { Spinner } from "../spinner"; import { resourceQuotaStore } from "../+config-resource-quotas/resource-quotas.store"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; +import { namespaceStore } from "./namespace.store"; +import { ResourceMetrics } from "../resource-metrics"; +import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; interface Props extends KubeObjectDetailsProps { } @@ -33,9 +36,18 @@ export class NamespaceDetails extends React.Component { if (!namespace) return; const status = namespace.getStatus(); + const metrics = namespaceStore.metrics; return (
+ {namespaceStore.isLoaded && ( + namespaceStore.loadMetrics(namespace)} + tabs={podMetricTabs} object={namespace} params={{ metrics }} + > + + + )} diff --git a/src/renderer/components/+namespaces/namespace.store.ts b/src/renderer/components/+namespaces/namespace.store.ts index ad02dd137c..434834d1af 100644 --- a/src/renderer/components/+namespaces/namespace.store.ts +++ b/src/renderer/components/+namespaces/namespace.store.ts @@ -1,7 +1,7 @@ import { action, comparer, observable, reaction } from "mobx"; import { autobind, createStorage } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; -import { Namespace, namespacesApi } from "../../api/endpoints"; +import { INamespaceMetrics, Namespace, namespacesApi } from "../../api/endpoints"; import { createPageParam } from "../../navigation"; import { apiManager } from "../../api/api-manager"; import { isAllowedResource } from "../../../common/rbac"; @@ -22,12 +22,17 @@ export const namespaceUrlParam = createPageParam({ export class NamespaceStore extends KubeObjectStore { api = namespacesApi; contextNs = observable.array(); + @observable metrics: INamespaceMetrics = null; constructor() { super(); this.init(); } + async loadMetrics(namespace: Namespace) { + this.metrics = await namespacesApi.getMetrics(namespace.getName(), ""); + } + private init() { this.setContext(this.initNamespaces); diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts b/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts index ad9713e96b..2129d7b1b9 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts +++ b/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts @@ -1,7 +1,7 @@ import { observable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; import { autobind } from "../../utils"; -import { DaemonSet, daemonSetApi, IPodMetrics, Pod, podsApi, PodStatus } from "../../api/endpoints"; +import { DaemonSet, daemonSetApi, IDaemonSetMetrics, Pod, PodStatus } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; @@ -9,12 +9,10 @@ import { apiManager } from "../../api/api-manager"; export class DaemonSetStore extends KubeObjectStore { api = daemonSetApi; - @observable metrics: IPodMetrics = null; + @observable metrics: IDaemonSetMetrics = null; async loadMetrics(daemonSet: DaemonSet) { - const pods = this.getChildPods(daemonSet); - - this.metrics = await podsApi.getMetrics(pods, daemonSet.getNs(), ""); + this.metrics = await daemonSetApi.getMetrics([daemonSet], daemonSet.getNs(), ""); } getChildPods(daemonSet: DaemonSet): Pod[] { diff --git a/src/renderer/components/+workloads-deployments/deployments.store.ts b/src/renderer/components/+workloads-deployments/deployments.store.ts index b9dc85eae5..c107711f1c 100644 --- a/src/renderer/components/+workloads-deployments/deployments.store.ts +++ b/src/renderer/components/+workloads-deployments/deployments.store.ts @@ -1,5 +1,5 @@ import { observable } from "mobx"; -import { Deployment, deploymentApi, IPodMetrics, podsApi, PodStatus } from "../../api/endpoints"; +import { Deployment, deploymentApi, IDeploymentMetrics, PodStatus } from "../../api/endpoints"; import { KubeObjectStore } from "../../kube-object.store"; import { autobind } from "../../utils"; import { podsStore } from "../+workloads-pods/pods.store"; @@ -8,7 +8,7 @@ import { apiManager } from "../../api/api-manager"; @autobind() export class DeploymentStore extends KubeObjectStore { api = deploymentApi; - @observable metrics: IPodMetrics = null; + @observable metrics: IDeploymentMetrics = null; protected sortItems(items: Deployment[]) { return super.sortItems(items, [ @@ -17,9 +17,7 @@ export class DeploymentStore extends KubeObjectStore { } async loadMetrics(deployment: Deployment) { - const pods = this.getChildPods(deployment); - - this.metrics = await podsApi.getMetrics(pods, deployment.getNs(), ""); + this.metrics = await deploymentApi.getMetrics([deployment], deployment.getNs(), ""); } getStatuses(deployments?: Deployment[]) { diff --git a/src/renderer/components/+workloads-jobs/job-details.tsx b/src/renderer/components/+workloads-jobs/job-details.tsx index dfa16fe760..0f7da2ca22 100644 --- a/src/renderer/components/+workloads-jobs/job-details.tsx +++ b/src/renderer/components/+workloads-jobs/job-details.tsx @@ -18,6 +18,8 @@ import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { lookupApiLink } from "../../api/kube-api"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; +import { ResourceMetrics } from "../resource-metrics"; +import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; interface Props extends KubeObjectDetailsProps { } @@ -40,9 +42,18 @@ export class JobDetails extends React.Component { const childPods = jobStore.getChildPods(job); const ownerRefs = job.getOwnerRefs(); const condition = job.getCondition(); + const metrics = jobStore.metrics; return (
+ {jobStore.isLoaded && ( + jobStore.loadMetrics(job)} + tabs={podMetricTabs} object={job} params={{ metrics }} + > + + + )} { diff --git a/src/renderer/components/+workloads-jobs/job.store.ts b/src/renderer/components/+workloads-jobs/job.store.ts index 569c9efb13..a34d425fef 100644 --- a/src/renderer/components/+workloads-jobs/job.store.ts +++ b/src/renderer/components/+workloads-jobs/job.store.ts @@ -1,14 +1,21 @@ import { KubeObjectStore } from "../../kube-object.store"; import { autobind } from "../../utils"; -import { Job, jobApi } from "../../api/endpoints/job.api"; +import { IJobMetrics, Job, jobApi } from "../../api/endpoints/job.api"; import { CronJob, Pod, PodStatus } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; +import { observable } from "mobx"; @autobind() export class JobStore extends KubeObjectStore { api = jobApi; + @observable metrics: IJobMetrics = null; + + async loadMetrics(job: Job) { + this.metrics = await jobApi.getMetrics([job], job.getNs(), ""); + } + getChildPods(job: Job): Pod[] { return podsStore.getPodsByOwner(job); } diff --git a/src/renderer/components/+workloads-pods/container-charts.tsx b/src/renderer/components/+workloads-pods/container-charts.tsx index ccea4ec788..000055e400 100644 --- a/src/renderer/components/+workloads-pods/container-charts.tsx +++ b/src/renderer/components/+workloads-pods/container-charts.tsx @@ -6,6 +6,7 @@ import { isMetricsEmpty, normalizeMetrics } from "../../api/endpoints/metrics.ap import { NoMetrics } from "../resource-metrics/no-metrics"; import { IResourceMetricsValue, ResourceMetricsContext } from "../resource-metrics"; import { themeStore } from "../../theme.store"; +import { mapValues } from "lodash"; type IContext = IResourceMetricsValue; @@ -16,10 +17,7 @@ export const ContainerCharts = observer(() => { if (!metrics) return null; if (isMetricsEmpty(metrics)) return ; - const values = Object.values(metrics) - .map(normalizeMetrics) - .map(({ data }) => data.result[0].values); - const [ + const { cpuUsage, cpuRequests, cpuLimits, @@ -27,7 +25,7 @@ export const ContainerCharts = observer(() => { memoryRequests, memoryLimits, fsUsage - ] = values; + } = mapValues(metrics, metric => normalizeMetrics(metric).data.result[0].values); const datasets = [ // CPU diff --git a/src/renderer/components/+workloads-pods/pod-charts.tsx b/src/renderer/components/+workloads-pods/pod-charts.tsx index c505126acb..1b69dac7ab 100644 --- a/src/renderer/components/+workloads-pods/pod-charts.tsx +++ b/src/renderer/components/+workloads-pods/pod-charts.tsx @@ -6,7 +6,7 @@ import { isMetricsEmpty, normalizeMetrics } from "../../api/endpoints/metrics.ap import { NoMetrics } from "../resource-metrics/no-metrics"; import { IResourceMetricsValue, ResourceMetricsContext } from "../resource-metrics"; import { WorkloadKubeObject } from "../../api/workload-kube-object"; -import { themeStore } from "../../theme.store"; +import { mapValues } from "lodash"; export const podMetricTabs = [ "CPU", @@ -19,27 +19,20 @@ type IContext = IResourceMetricsValue { const { params: { metrics }, tabId, object } = useContext(ResourceMetricsContext); - const { chartCapacityColor } = themeStore.activeTheme.colors; const id = object.getId(); if (!metrics) return null; if (isMetricsEmpty(metrics)) return ; const options = tabId == 0 ? cpuOptions : memoryOptions; - const values = Object.values(metrics) - .map(normalizeMetrics) - .map(({ data }) => data.result[0].values); - const [ + + const { cpuUsage, - cpuRequests, - cpuLimits, memoryUsage, - memoryRequests, - memoryLimits, fsUsage, networkReceive, networkTransmit - ] = values; + } = mapValues(metrics, metric => normalizeMetrics(metric).data.result[0].values); const datasets = [ // CPU @@ -50,20 +43,6 @@ export const PodCharts = observer(() => { tooltip: `Container CPU cores usage`, borderColor: "#3D90CE", data: cpuUsage.map(([x, y]) => ({ x, y })) - }, - { - id: `${id}-cpuRequests`, - label: `Requests`, - tooltip: `Container CPU requests`, - borderColor: "#30b24d", - data: cpuRequests.map(([x, y]) => ({ x, y })) - }, - { - id: `${id}-cpuLimits`, - label: `Limits`, - tooltip: `CPU limits`, - borderColor: chartCapacityColor, - data: cpuLimits.map(([x, y]) => ({ x, y })) } ], // Memory @@ -74,20 +53,6 @@ export const PodCharts = observer(() => { tooltip: `Container memory usage`, borderColor: "#c93dce", data: memoryUsage.map(([x, y]) => ({ x, y })) - }, - { - id: `${id}-memoryRequests`, - label: `Requests`, - tooltip: `Container memory requests`, - borderColor: "#30b24d", - data: memoryRequests.map(([x, y]) => ({ x, y })) - }, - { - id: `${id}-memoryLimits`, - label: `Limits`, - tooltip: `Container memory limits`, - borderColor: chartCapacityColor, - data: memoryLimits.map(([x, y]) => ({ x, y })) } ], // Network diff --git a/src/renderer/components/+workloads-replicasets/replicasets.store.ts b/src/renderer/components/+workloads-replicasets/replicasets.store.ts index 337f9c0ae1..34eee46222 100644 --- a/src/renderer/components/+workloads-replicasets/replicasets.store.ts +++ b/src/renderer/components/+workloads-replicasets/replicasets.store.ts @@ -1,7 +1,7 @@ import { observable } from "mobx"; import { autobind } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; -import { Deployment, IPodMetrics, podsApi, ReplicaSet, replicaSetApi } from "../../api/endpoints"; +import { Deployment, IReplicaSetMetrics, ReplicaSet, replicaSetApi } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; import { PodStatus } from "../../api/endpoints/pods.api"; @@ -9,12 +9,10 @@ import { PodStatus } from "../../api/endpoints/pods.api"; @autobind() export class ReplicaSetStore extends KubeObjectStore { api = replicaSetApi; - @observable metrics: IPodMetrics = null; + @observable metrics: IReplicaSetMetrics = null; async loadMetrics(replicaSet: ReplicaSet) { - const pods = this.getChildPods(replicaSet); - - this.metrics = await podsApi.getMetrics(pods, replicaSet.getNs(), ""); + this.metrics = await replicaSetApi.getMetrics([replicaSet], replicaSet.getNs(), ""); } getChildPods(replicaSet: ReplicaSet) { diff --git a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts index 12f1f663b9..33810b3172 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts +++ b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts @@ -1,19 +1,17 @@ import { observable } from "mobx"; import { autobind } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; -import { IPodMetrics, podsApi, PodStatus, StatefulSet, statefulSetApi } from "../../api/endpoints"; +import { IStatefulSetMetrics, PodStatus, StatefulSet, statefulSetApi } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; @autobind() export class StatefulSetStore extends KubeObjectStore { api = statefulSetApi; - @observable metrics: IPodMetrics = null; + @observable metrics: IStatefulSetMetrics = null; async loadMetrics(statefulSet: StatefulSet) { - const pods = this.getChildPods(statefulSet); - - this.metrics = await podsApi.getMetrics(pods, statefulSet.getNs(), ""); + this.metrics = await statefulSetApi.getMetrics([statefulSet], statefulSet.getNs(), ""); } getChildPods(statefulSet: StatefulSet) { diff --git a/src/renderer/components/resource-metrics/resource-metrics-text.tsx b/src/renderer/components/resource-metrics/resource-metrics-text.tsx index 38d2f7f77d..4f343c24cf 100644 --- a/src/renderer/components/resource-metrics/resource-metrics-text.tsx +++ b/src/renderer/components/resource-metrics/resource-metrics-text.tsx @@ -1,12 +1,11 @@ import React from "react"; -import { IPodMetrics } from "../../api/endpoints"; -import { getMetricLastPoints, IMetrics } from "../../api/endpoints/metrics.api"; +import { getMetricLastPoints, IResourceMetrics, IMetrics } from "../../api/endpoints/metrics.api"; import { bytesToUnits } from "../../utils"; import { Badge } from "../badge"; import { DrawerItem } from "../drawer"; interface Props { - metrics: IPodMetrics; + metrics: IResourceMetrics; } export function ResourceMetricsText(props: Props) {