From 1d09251a704c5fa0f3baddc6ccfd290f2bc9b258 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Mon, 19 Jul 2021 13:06:57 +0300 Subject: [PATCH] Metrics for namespaces and jobs Signed-off-by: Alex Andreev --- src/main/cluster.ts | 2 ++ .../+namespaces/namespace-details.tsx | 36 +++++++++++++++---- .../+workloads-jobs/job-details.tsx | 24 ++++++++++++- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/main/cluster.ts b/src/main/cluster.ts index bf893f8484..d15de5ce4b 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -62,6 +62,8 @@ export enum ClusterMetricsResourceType { VolumeClaim = "VolumeClaim", ReplicaSet = "ReplicaSet", DaemonSet = "DaemonSet", + Job = "Job", + Namespace = "Namespace" } export type ClusterRefreshOptions = { diff --git a/src/renderer/components/+namespaces/namespace-details.tsx b/src/renderer/components/+namespaces/namespace-details.tsx index 95103f553b..f61db41711 100644 --- a/src/renderer/components/+namespaces/namespace-details.tsx +++ b/src/renderer/components/+namespaces/namespace-details.tsx @@ -22,28 +22,44 @@ import "./namespace-details.scss"; import React from "react"; -import { computed, makeObservable } from "mobx"; -import { observer } from "mobx-react"; +import { computed, makeObservable, observable, reaction } from "mobx"; +import { disposeOnUnmount, observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import { cssNames } from "../../utils"; -import type { Namespace } from "../../api/endpoints"; +import { getMetricsForNamespace, IPodMetrics, Namespace } from "../../api/endpoints"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; import { Link } from "react-router-dom"; import { Spinner } from "../spinner"; import { resourceQuotaStore } from "../+config-resource-quotas/resource-quotas.store"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { limitRangeStore } from "../+config-limit-ranges/limit-ranges.store"; +import { ResourceMetrics } from "../resource-metrics"; +import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; interface Props extends KubeObjectDetailsProps { } @observer export class NamespaceDetails extends React.Component { + @observable metrics: IPodMetrics = null; + constructor(props: Props) { super(props); makeObservable(this); } + @disposeOnUnmount + clean = reaction(() => this.props.object, () => { + this.metrics = null; + }); + + componentDidMount() { + resourceQuotaStore.reloadAll(); + limitRangeStore.reloadAll(); + } + @computed get quotas() { const namespace = this.props.object.getName(); @@ -56,9 +72,8 @@ export class NamespaceDetails extends React.Component { return limitRangeStore.getAllByNs(namespace); } - componentDidMount() { - resourceQuotaStore.reloadAll(); - limitRangeStore.reloadAll(); + async loadMetrics() { + this.metrics = await getMetricsForNamespace(this.props.object.getName(), ""); } render() { @@ -66,9 +81,18 @@ export class NamespaceDetails extends React.Component { if (!namespace) return null; const status = namespace.getStatus(); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Namespace); return (
+ {!isMetricHidden && ( + + + + )} diff --git a/src/renderer/components/+workloads-jobs/job-details.tsx b/src/renderer/components/+workloads-jobs/job-details.tsx index 02cd5b41d4..a371b2d46f 100644 --- a/src/renderer/components/+workloads-jobs/job-details.tsx +++ b/src/renderer/components/+workloads-jobs/job-details.tsx @@ -33,20 +33,33 @@ import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities" import { podsStore } from "../+workloads-pods/pods.store"; import { jobStore } from "./job.store"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; -import type { Job } from "../../api/endpoints"; +import { getMetricsForJobs, IPodMetrics, Job } from "../../api/endpoints"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { lookupApiLink } from "../../api/kube-api"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; +import { observable } from "mobx"; +import { podMetricTabs, PodCharts } from "../+workloads-pods/pod-charts"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ResourceMetrics } from "../resource-metrics"; interface Props extends KubeObjectDetailsProps { } @observer export class JobDetails extends React.Component { + @observable metrics: IPodMetrics = null; + async componentDidMount() { podsStore.reloadAll(); } + async loadMetrics() { + const { object: job } = this.props; + + this.metrics = await getMetricsForJobs([job], job.getNs(), ""); + } + render() { const { object: job } = this.props; @@ -57,9 +70,18 @@ export class JobDetails extends React.Component { const childPods = jobStore.getChildPods(job); const ownerRefs = job.getOwnerRefs(); const condition = job.getCondition(); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Job); return (
+ {!isMetricHidden && ( + + + + )} {