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;