diff --git a/packages/core/src/features/metrics/metrics-feature.ts b/packages/core/src/features/metrics/metrics-feature.ts
index bac4ff6739..d32659a32d 100644
--- a/packages/core/src/features/metrics/metrics-feature.ts
+++ b/packages/core/src/features/metrics/metrics-feature.ts
@@ -3,10 +3,11 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getFeature } from "@k8slens/feature-core";
-import { clusterOverviewUIBlockInjectionToken, podDetailsMetricsInjectionToken } from "@k8slens/metrics";
+import { clusterOverviewUIBlockInjectionToken, podDetailsContainerMetricsInjectionToken, podDetailsMetricsInjectionToken } from "@k8slens/metrics";
import { getInjectable } from "@ogre-tools/injectable";
import { ClusterMetrics } from "../../renderer/components/+cluster/cluster-metrics";
import { ClusterPieCharts } from "../../renderer/components/+cluster/cluster-pie-charts";
+import { PodDetailsContainerMetrics } from "../../renderer/components/+workloads-pods/pod-details-container-metrics";
import PodMetricsDetailsComponent from "../../renderer/components/+workloads-pods/pod-metrics-details-component";
const clusterPieChartsClusterOverviewInjectable = getInjectable({
@@ -33,15 +34,21 @@ const clusterMetricsOverviewBlockInjectable = getInjectable({
injectionToken: clusterOverviewUIBlockInjectionToken,
});
-const podMetricsDetailsComponentInjectable = getInjectable({
- id: "pod-metrics-details-component-injectable",
- instantiate: () => ({
- id: "pod-metrics-details-component-injectable",
- Component: PodMetricsDetailsComponent,
- }),
+const podDetailsMetricsInjectable = getInjectable({
+ id: "pod-details-metrics-injectable",
+ instantiate: () => PodMetricsDetailsComponent,
injectionToken: podDetailsMetricsInjectionToken,
});
+const podDetailsContainerMetricsInjectable = getInjectable({
+ id: "pod-details-container-metrics-injectable",
+ instantiate: () => ({
+ id: "pod-details-container-metrics",
+ Component: PodDetailsContainerMetrics,
+ }),
+ injectionToken: podDetailsContainerMetricsInjectionToken,
+});
+
export const metricsFeature = getFeature({
id: "core-metrics-feature",
@@ -49,6 +56,7 @@ export const metricsFeature = getFeature({
di.register(clusterPieChartsClusterOverviewInjectable);
di.register(clusterMetricsOverviewBlockInjectable);
- di.register(podMetricsDetailsComponentInjectable);
+ di.register(podDetailsMetricsInjectable);
+ di.register(podDetailsContainerMetricsInjectable);
},
});
diff --git a/packages/core/src/renderer/components/+workloads-pods/details/containers/pod-details-containers.tsx b/packages/core/src/renderer/components/+workloads-pods/details/containers/pod-details-containers.tsx
new file mode 100644
index 0000000000..1ee0636bc6
--- /dev/null
+++ b/packages/core/src/renderer/components/+workloads-pods/details/containers/pod-details-containers.tsx
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+import React from "react";
+import { DrawerTitle } from "../../../drawer";
+import { PodDetailsContainer } from "../../pod-details-container";
+import type { Pod } from "../../../../../common/k8s-api/endpoints";
+import { observer } from "mobx-react";
+
+interface PodDetailsContainersProps {
+ pod: Pod;
+}
+
+const PodDetailsContainers = observer(({ pod }: PodDetailsContainersProps) => {
+ const containers = pod.getContainers();
+
+ return (
+ <>
+ Containers
+ {containers.map(container => (
+
+ ))}
+ >
+ );
+});
+
+export { PodDetailsContainers };
diff --git a/packages/core/src/renderer/components/+workloads-pods/details/containers/pod-details-init-containers.tsx b/packages/core/src/renderer/components/+workloads-pods/details/containers/pod-details-init-containers.tsx
new file mode 100644
index 0000000000..f02956775b
--- /dev/null
+++ b/packages/core/src/renderer/components/+workloads-pods/details/containers/pod-details-init-containers.tsx
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+import React from "react";
+import { DrawerTitle } from "../../../drawer";
+import { PodDetailsContainer } from "../../pod-details-container";
+import type { Pod } from "../../../../../common/k8s-api/endpoints";
+import { observer } from "mobx-react";
+
+interface PodDetailsContainersProps {
+ pod: Pod;
+}
+
+const NonInjectedPodDetailsInitContainers = observer(({ pod }: PodDetailsContainersProps) => {
+ const initContainers = pod.getInitContainers();
+
+ if (initContainers.length === 0) {
+ return null;
+ }
+
+ return (
+ <>
+ Init Containers
+ {initContainers.map(container => (
+
+ ))}
+ >
+ );
+});
+
+const PodDetailsInitContainers = NonInjectedPodDetailsInitContainers;
+
+export { PodDetailsInitContainers };
+
+
diff --git a/packages/core/src/renderer/components/+workloads-pods/pod-details-container-metrics.tsx b/packages/core/src/renderer/components/+workloads-pods/pod-details-container-metrics.tsx
new file mode 100644
index 0000000000..57907f87af
--- /dev/null
+++ b/packages/core/src/renderer/components/+workloads-pods/pod-details-container-metrics.tsx
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+import type { IAsyncComputed } from "@ogre-tools/injectable-react";
+import { withInjectables } from "@ogre-tools/injectable-react";
+import { toJS } from "mobx";
+import { observer } from "mobx-react-lite";
+import React from "react";
+import type { Container, Pod } from "../../../common/k8s-api/endpoints";
+import { getItemMetrics } from "../../../common/k8s-api/endpoints/metrics.api";
+import type { PodMetricData } from "../../../common/k8s-api/endpoints/metrics.api/request-pod-metrics.injectable";
+import { ResourceMetrics } from "../resource-metrics";
+import { ContainerCharts } from "./container-charts";
+import podContainerMetricsInjectable from "./container-metrics.injectable";
+
+interface ContainerMetricsProps {
+ container: Container;
+ pod: Pod;
+}
+
+interface Dependencies {
+ podContainerMetrics: IAsyncComputed;
+}
+
+const NonInjectedPodDetailsContainerMetrics = observer(({ pod, container, podContainerMetrics }: ContainerMetricsProps & Dependencies) => {
+ const metrics = getItemMetrics(toJS(podContainerMetrics.value.get()), container.name);
+
+ if (!metrics) {
+ return null;
+ }
+
+ return (
+
+
+
+ );
+});
+
+export const PodDetailsContainerMetrics = withInjectables(NonInjectedPodDetailsContainerMetrics, {
+ getProps: (di, props) => ({
+ ...props,
+ podContainerMetrics: di.inject(podContainerMetricsInjectable, props.pod),
+ }),
+});
diff --git a/packages/core/src/renderer/components/+workloads-pods/pod-details-container.tsx b/packages/core/src/renderer/components/+workloads-pods/pod-details-container.tsx
index d066497780..d5127d978a 100644
--- a/packages/core/src/renderer/components/+workloads-pods/pod-details-container.tsx
+++ b/packages/core/src/renderer/components/+workloads-pods/pod-details-container.tsx
@@ -13,9 +13,6 @@ import { StatusBrick } from "../status-brick";
import { Badge } from "../badge";
import { ContainerEnvironment } from "./pod-container-env";
import { PodContainerPort } from "./pod-container-port";
-import { ResourceMetrics } from "../resource-metrics";
-import type { MetricData } from "../../../common/k8s-api/endpoints/metrics.api";
-import { ContainerCharts } from "./container-charts";
import { LocaleDate } from "../locale-date";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
import type { PortForwardStore } from "../../port-forward";
@@ -24,16 +21,18 @@ import { withInjectables } from "@ogre-tools/injectable-react";
import portForwardStoreInjectable from "../../port-forward/port-forward-store/port-forward-store.injectable";
import type { IComputedValue } from "mobx";
import enabledMetricsInjectable from "../../api/catalog/entity/metrics-enabled.injectable";
+import type { PodDetailsContainerMetricsComponent } from "@k8slens/metrics";
+import { podDetailsContainerMetricsInjectionToken } from "@k8slens/metrics";
export interface PodDetailsContainerProps {
pod: Pod;
container: Container;
- metrics?: Partial>;
}
interface Dependencies {
portForwardStore: PortForwardStore;
containerMetricsVisible: IComputedValue;
+ containerMetrics: PodDetailsContainerMetricsComponent[];
}
@observer
@@ -84,7 +83,7 @@ class NonInjectedPodDetailsContainer extends React.Component
{name}
- {(isMetricVisible && !isInitContainer && metrics) && (
-
-
-
+ {(isMetricVisible && !isInitContainer) && (
+ <>
+ {containerMetrics.map(ContainerMetrics => (
+
+ ))}
+ >
)}
{status && (
@@ -218,5 +214,6 @@ export const PodDetailsContainer = withInjectables {
}
@@ -45,13 +41,12 @@ interface Dependencies {
runtimeClassApi: RuntimeClassApi;
serviceAccountApi: ServiceAccountApi;
logger: Logger;
- containerMetrics: IAsyncComputed;
}
@observer
class NonInjectedPodDetails extends React.Component {
render() {
- const { object: pod, getDetailsUrl, nodeApi, logger, containerMetrics } = this.props;
+ const { object: pod, getDetailsUrl, nodeApi, logger } = this.props;
if (!pod) {
return null;
@@ -68,8 +63,6 @@ class NonInjectedPodDetails extends React.Component
- {initContainers.length > 0 && (
- <>
- Init Containers
- {initContainers.map(container => (
-
- ))}
- >
- )}
+
- Containers
- {containers.map(container => (
-
- ))}
+
@@ -207,6 +181,5 @@ export const PodDetails = withInjectables(NonInje
runtimeClassApi: di.inject(runtimeClassApiInjectable),
serviceAccountApi: di.inject(serviceAccountApiInjectable),
logger: di.inject(loggerInjectable),
- containerMetrics: di.inject(podContainerMetricsInjectable, props.object),
}),
});
diff --git a/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/kube-object-metrics.injectable.tsx b/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/kube-object-metrics.injectable.tsx
index 4a943b571c..aca309c465 100644
--- a/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/kube-object-metrics.injectable.tsx
+++ b/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/kube-object-metrics.injectable.tsx
@@ -17,7 +17,7 @@ const podMetricsInjectable = getInjectable({
const podMetrics = di.injectMany(podDetailsMetricsInjectionToken);
const first = podMetrics[0];
- const Component = first?.Component ?? Empty;
+ const Component = first ?? Empty;
return {
Component,
diff --git a/packages/metrics/index.ts b/packages/metrics/index.ts
index bc9aff8809..22748598d8 100644
--- a/packages/metrics/index.ts
+++ b/packages/metrics/index.ts
@@ -16,11 +16,22 @@ export const clusterOverviewUIBlockInjectionToken = getInjectionToken({
id: "pod-details-metrics-injection-token",
});
+
+export interface PodDetailsContainerMetricsComponentProps {
+ container: any;
+ pod: any;
+}
+export interface PodDetailsContainerMetricsComponent {
+ id: string;
+ Component: React.ComponentType;
+}
+
+export const podDetailsContainerMetricsInjectionToken =
+ getInjectionToken({
+ id: "pod-details-container-metrics-injection-token",
+ });