diff --git a/src/app/Shared/Services/Api.service.tsx b/src/app/Shared/Services/Api.service.tsx
index 120efe45e..d20af36a3 100644
--- a/src/app/Shared/Services/Api.service.tsx
+++ b/src/app/Shared/Services/Api.service.tsx
@@ -1646,6 +1646,7 @@ export interface MBeanMetrics {
daemonThreadCount?: number;
};
os?: {
+ name?: string;
arch?: string;
availableProcessors?: number;
version?: string;
@@ -1654,6 +1655,7 @@ export interface MBeanMetrics {
processCpuLoad?: number;
totalPhysicalMemorySize?: number;
freePhysicalMemorySize?: number;
+ totalSwapSpaceSize?: number;
};
memory?: {
heapMemoryUsage?: MemoryUsage;
@@ -1670,7 +1672,7 @@ export interface MBeanMetrics {
specName?: string;
specVendor?: string;
startTime?: number;
- // systemProperties?: Object
+ systemProperties?: object;
uptime?: number;
vmName?: string;
vmVendor?: string;
diff --git a/src/app/Topology/Shared/Entity/EntityDetails.tsx b/src/app/Topology/Shared/Entity/EntityDetails.tsx
index a311911da..44be03392 100644
--- a/src/app/Topology/Shared/Entity/EntityDetails.tsx
+++ b/src/app/Topology/Shared/Entity/EntityDetails.tsx
@@ -21,7 +21,7 @@ import { ServiceContext } from '@app/Shared/Services/Services';
import { ActionDropdown, NodeAction } from '@app/Topology/Actions/NodeActions';
import useDayjs from '@app/utils/useDayjs';
import { useSubscriptions } from '@app/utils/useSubscriptions';
-import { hashCode, portalRoot, splitWordsOnUppercase } from '@app/utils/utils';
+import { formatBytes, hashCode, portalRoot, splitWordsOnUppercase } from '@app/utils/utils';
import {
Alert,
AlertActionCloseButton,
@@ -55,7 +55,7 @@ import { EnvironmentNode, isTargetNode, TargetNode } from '../../typings';
import { EmptyText } from '../EmptyText';
import { actionFactory, getStatusTargetNode, ListElement, nodeTypeToAbbr, StatusExtra } from '../utils';
import { EntityAnnotations } from './EntityAnnotations';
-import { EntityLabels } from './EntityLabels';
+import { EntityKeyValues, keyValueEntryTransformer } from './EntityKeyValues';
import { EntityTitle } from './EntityTitle';
import {
DescriptionConfig,
@@ -213,7 +213,7 @@ export const TargetDetails: React.FC<{
'Target',
['labels'],
),
- content: ,
+ content: ,
},
{
key: 'Annotations',
@@ -270,11 +270,18 @@ const MBeanDetails: React.FC<{
startTime
vmVendor
vmVersion
+ classPath
+ libraryPath
+ inputArguments
+ systemProperties
}
os {
+ name
version
arch
availableProcessors
+ totalPhysicalMemorySize
+ totalSwapSpaceSize
}
}
}
@@ -320,6 +327,13 @@ const MBeanDetails: React.FC<{
helperDescription: 'The vendor who supplied this JVM',
content: mbeanMetrics.runtime?.vmVendor || ,
},
+ {
+ key: 'Operating System Name',
+ title: 'Operating System Name',
+ helperTitle: 'Operating System Name',
+ helperDescription: 'The name of the host system.',
+ content: mbeanMetrics.os?.name || ,
+ },
{
key: 'Operating System Architecture',
title: 'Operating System Architecture',
@@ -341,6 +355,56 @@ const MBeanDetails: React.FC<{
helperDescription: 'The count of total processors available to the JVM process on its host.',
content: mbeanMetrics.os?.availableProcessors || ,
},
+ {
+ key: 'Total Physical Memory',
+ title: 'Total Physical Memory',
+ helperTitle: 'Total Physical Memory',
+ helperDescription: 'The total amount of physical memory of the host operating system.',
+ content: mbeanMetrics.os?.totalPhysicalMemorySize ? (
+ formatBytes(mbeanMetrics.os?.totalPhysicalMemorySize)
+ ) : (
+
+ ),
+ },
+ {
+ key: 'Total Swap Space',
+ title: 'Total Swap Space',
+ helperTitle: 'Total Swap Space',
+ helperDescription: 'The total amount of swap space of the host operating system.',
+ content: mbeanMetrics.os?.totalSwapSpaceSize ? (
+ formatBytes(mbeanMetrics.os?.totalSwapSpaceSize)
+ ) : (
+
+ ),
+ },
+ {
+ key: 'Class Path',
+ title: 'Class Path',
+ helperTitle: 'JVM Class Path',
+ helperDescription: 'The list of class path locations for this JVM',
+ content: ,
+ },
+ {
+ key: 'Library Paths',
+ title: 'Library Paths',
+ helperTitle: 'JVM Library Paths',
+ helperDescription: 'The list of library path locations for this JVM',
+ content: ,
+ },
+ {
+ key: 'Input Arguments',
+ title: 'Input Arguments',
+ helperTitle: 'JVM Input Arguments',
+ helperDescription: 'The arguments passed to this JVM on startup',
+ content: ,
+ },
+ {
+ key: 'System Properties',
+ title: 'System Properties',
+ helperTitle: 'JVM System Properties',
+ helperDescription: 'The current system properties of this JVM',
+ content: ,
+ },
];
}, [mbeanMetrics, dayjs, dateTimeFormat.timeZone.full]);
@@ -365,7 +429,7 @@ export const GroupDetails: React.FC<{
title: 'Labels',
helperTitle: 'Labels',
helperDescription: 'Map of string keys and values that can be used to organize and categorize targets.',
- content: ,
+ content: ,
},
];
}, [envNode]);
diff --git a/src/app/Topology/Shared/Entity/EntityLabels.tsx b/src/app/Topology/Shared/Entity/EntityKeyValues.tsx
similarity index 57%
rename from src/app/Topology/Shared/Entity/EntityLabels.tsx
rename to src/app/Topology/Shared/Entity/EntityKeyValues.tsx
index c2aea145a..164fe1cc3 100644
--- a/src/app/Topology/Shared/Entity/EntityLabels.tsx
+++ b/src/app/Topology/Shared/Entity/EntityKeyValues.tsx
@@ -17,15 +17,22 @@ import { Label, LabelGroup } from '@patternfly/react-core';
import * as React from 'react';
import { EmptyText } from '../EmptyText';
-export const EntityLabels: React.FC<{ labels?: object; maxDisplay?: number }> = ({ labels, maxDisplay, ...props }) => {
- const _transformedLabels = React.useMemo(() => {
- return labels ? Object.keys(labels).map((k) => `${k}=${labels[k]}`) : [];
- }, [labels]);
+export function keyValueEntryTransformer(kv: object): string[] {
+ return Object.entries(kv).map(([k, v]) => `${k}=${v}`);
+}
- return _transformedLabels.length ? (
-
+export const valuesEntryTransformer: (kv: string[] | object) => string[] = Object.values;
+
+export const EntityKeyValues: React.FC<{
+ kv?: string[] | object;
+ maxDisplay?: number;
+ transformer?: (o: object) => string[];
+}> = ({ kv, maxDisplay, transformer = valuesEntryTransformer, ...props }) => {
+ const _transformedKv = React.useMemo(() => (kv ? transformer(kv) : []), [kv, transformer]);
+ return _transformedKv.length ? (
+
- {_transformedLabels.map((l) => (
+ {_transformedKv.map((l) => (
@@ -33,6 +40,6 @@ export const EntityLabels: React.FC<{ labels?: object; maxDisplay?: number }> =
) : (
-
+
);
};
diff --git a/src/app/Topology/styles/base.css b/src/app/Topology/styles/base.css
index 9bb0d7cb7..39af2a3ea 100644
--- a/src/app/Topology/styles/base.css
+++ b/src/app/Topology/styles/base.css
@@ -141,7 +141,7 @@ Below CSS rules only apply to Topology components
color: var(--pf-global--palette--blue-400);
}
-.entity-overview__displayed-labels-wrapper {
+.entity-overview__displayed-keyvalues-wrapper {
border: 1px solid var(--pf-global--palette--black-200);
padding: 4px;
width: fit-content;