Skip to content

Commit bd516ff

Browse files
authored
[Infra] Add OTel metric charts to Hosts View (#229488)
closes [#226333](#226333) ## Summary This PR adds Otel system metrics Lens formulas and enables them on the hosts view **ecs:** <img width="900" height="645" alt="image" src="https://github.com/user-attachments/assets/e79ac886-f398-41d4-99a3-eaeeeb598596" /> <img width="900" height="615" alt="image" src="https://github.com/user-attachments/assets/586a6793-d536-4f0e-8ed5-6a9cc801e1ca" /> <img width="900" height="501" alt="image" src="https://github.com/user-attachments/assets/fc52ea34-62e2-4c31-89b2-e1e2185849c8" /> <img width="900" height="176" alt="image" src="https://github.com/user-attachments/assets/45e95934-400a-4f0f-b46d-656011affea8" /> **semconv:** <img width="900" height="650" alt="image" src="https://github.com/user-attachments/assets/6b4fb7f3-f81b-4e24-afab-a1efb7581d4b" /> <img width="900" height="635" alt="image" src="https://github.com/user-attachments/assets/1ed5d709-d129-4737-883f-4b4b0518b5c1" /> <img width="900" height="501" alt="image" src="https://github.com/user-attachments/assets/83eac473-f8f3-4fd8-8244-f9abca55ee07" /> <img width="900" height="177" alt="image" src="https://github.com/user-attachments/assets/6985b0c6-de80-41eb-8ee4-60cf0ca861f4" /> >[!NOTE] >Disk Space Available metric value is not the same between otel and semconv, and that is because of the difference in how the `filesystem` scrapper collects the same data Here is the data broken down by mount point to help understand what happens | otel | beats | |------|-----| |<img width="861" height="496" alt="image" src="https://github.com/user-attachments/assets/62a7e073-e661-40fa-8a0b-45d70edce714" />|<img width="1178" height="520" alt="image" src="https://github.com/user-attachments/assets/d968f3f3-0cde-41c1-8984-424fbfa69df5" />| ### How to test: - Clone: https://github.com/crespocarlos/elastic-stack-docker-compose/tree/inframetricsreceiver-removal-test-env - Spin up the docker containers - Connect your local kibana to the elasticsearch container - Set the `xpack.infra.featureFlags.hostOtelEnabled: true` - Navigate to Infrastructure > Hosts
1 parent c0a4d95 commit bd516ff

File tree

29 files changed

+778
-606
lines changed

29 files changed

+778
-606
lines changed

x-pack/platform/plugins/private/translations/translations/fr-FR.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25897,7 +25897,6 @@
2589725897
"xpack.metricsData.assetDetails.metrics.label.diskReadIOPS": "Entrées et sorties par seconde en lecture sur le disque",
2589825898
"xpack.metricsData.assetDetails.metrics.label.diskReadThroughput": "Rendement de lecture du disque",
2589925899
"xpack.metricsData.assetDetails.metrics.label.diskSpaceAvailable": "Espace disque disponible",
25900-
"xpack.metricsData.assetDetails.metrics.label.diskSpaceAvailablity": "Disponibilité de l'espace disque",
2590125900
"xpack.metricsData.assetDetails.metrics.label.diskThroughput": "Rendement du disque",
2590225901
"xpack.metricsData.assetDetails.metrics.label.diskUsage": "Utilisation du disque",
2590325902
"xpack.metricsData.assetDetails.metrics.label.diskUsageAverage": "Utilisation moyenne du disque",

x-pack/platform/plugins/private/translations/translations/ja-JP.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25928,7 +25928,6 @@
2592825928
"xpack.metricsData.assetDetails.metrics.label.diskReadIOPS": "ディスク読み取りIOPS",
2592925929
"xpack.metricsData.assetDetails.metrics.label.diskReadThroughput": "ディスク読み取りスループット",
2593025930
"xpack.metricsData.assetDetails.metrics.label.diskSpaceAvailable": "空きディスク容量",
25931-
"xpack.metricsData.assetDetails.metrics.label.diskSpaceAvailablity": "空きディスク容量",
2593225931
"xpack.metricsData.assetDetails.metrics.label.diskThroughput": "Disk Throughput",
2593325932
"xpack.metricsData.assetDetails.metrics.label.diskUsage": "ディスク使用量",
2593425933
"xpack.metricsData.assetDetails.metrics.label.diskUsageAverage": "ディスク使用量(平均)",

x-pack/platform/plugins/private/translations/translations/zh-CN.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25918,7 +25918,6 @@
2591825918
"xpack.metricsData.assetDetails.metrics.label.diskReadIOPS": "磁盘读取 IOPS",
2591925919
"xpack.metricsData.assetDetails.metrics.label.diskReadThroughput": "磁盘读取吞吐量",
2592025920
"xpack.metricsData.assetDetails.metrics.label.diskSpaceAvailable": "可用磁盘空间",
25921-
"xpack.metricsData.assetDetails.metrics.label.diskSpaceAvailablity": "磁盘空间可用性",
2592225921
"xpack.metricsData.assetDetails.metrics.label.diskThroughput": "磁盘吞吐量",
2592325922
"xpack.metricsData.assetDetails.metrics.label.diskUsage": "磁盘使用率",
2592425923
"xpack.metricsData.assetDetails.metrics.label.diskUsageAverage": "磁盘使用率平均值",

x-pack/solutions/observability/plugins/infra/public/components/asset_details/components/kpis/host_kpi_charts.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import React from 'react';
99
import { EuiFlexItem } from '@elastic/eui';
1010
import type { DataView } from '@kbn/data-views-plugin/public';
1111
import type { Filter, Query, TimeRange } from '@kbn/es-query';
12+
import type { DataSchemaFormat } from '@kbn/metrics-data-access-plugin/common';
1213
import { Kpi } from './kpi';
1314
import { useHostKpiCharts } from '../../hooks/use_host_metrics_charts';
1415

@@ -20,6 +21,8 @@ export interface HostKpiChartsProps {
2021
lastReloadRequestTime?: number;
2122
getSubtitle?: (formulaValue: string) => string;
2223
loading?: boolean;
24+
25+
schema?: DataSchemaFormat | null;
2326
}
2427

2528
export const HostKpiCharts = ({
@@ -30,10 +33,12 @@ export const HostKpiCharts = ({
3033
query,
3134
lastReloadRequestTime,
3235
loading = false,
36+
schema,
3337
}: HostKpiChartsProps) => {
3438
const charts = useHostKpiCharts({
3539
dataViewId: dataView?.id,
3640
getSubtitle,
41+
schema,
3742
});
3843

3944
return (

x-pack/solutions/observability/plugins/infra/public/components/asset_details/hooks/use_host_metrics_charts.ts

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
*/
77

88
import { i18n } from '@kbn/i18n';
9-
import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common';
10-
import { useMemo } from 'react';
9+
import { DataSchemaFormat, findInventoryModel } from '@kbn/metrics-data-access-plugin/common';
1110
import useAsync from 'react-use/lib/useAsync';
1211
import type { HostMetricTypes } from '../charts/types';
1312
import { useChartSeriesColor } from './use_chart_series_color';
@@ -16,13 +15,20 @@ export const useHostCharts = ({
1615
metric,
1716
dataViewId,
1817
overview,
18+
schema,
1919
}: {
2020
metric: HostMetricTypes;
2121
dataViewId?: string;
2222
overview?: boolean;
23+
schema?: DataSchemaFormat | null;
2324
}) => {
2425
const { value: charts = [], error } = useAsync(async () => {
25-
const hostCharts = await getHostsCharts({ metric, overview });
26+
const hostCharts = await getHostsCharts({
27+
metric,
28+
overview,
29+
schema: schema ?? DataSchemaFormat.ECS,
30+
});
31+
2632
return hostCharts.map((chart) => ({
2733
...chart,
2834
...(dataViewId && {
@@ -31,30 +37,38 @@ export const useHostCharts = ({
3137
},
3238
}),
3339
}));
34-
}, [dataViewId, metric, overview]);
40+
}, [dataViewId, metric, overview, schema]);
3541

3642
return { charts, error };
3743
};
3844

3945
export const useKubernetesCharts = ({
4046
dataViewId,
4147
overview,
48+
schema,
4249
}: {
4350
dataViewId?: string;
4451
overview?: boolean;
52+
schema?: DataSchemaFormat | null;
4553
}) => {
46-
const model = useMemo(() => findInventoryModel('host'), []);
54+
const model = findInventoryModel('host');
4755

4856
const { value: charts = [], error } = useAsync(async () => {
49-
const { kibernetesNode } = await model.metrics.getCharts();
57+
const { kubernetesNode } = await model.metrics.getCharts({
58+
schema: schema ?? DataSchemaFormat.ECS,
59+
});
60+
61+
if (!kubernetesNode) {
62+
return [];
63+
}
5064

5165
const items = overview
52-
? [kibernetesNode.xy.nodeCpuCapacity, kibernetesNode.xy.nodeMemoryCapacity]
66+
? [kubernetesNode.xy.nodeCpuCapacity, kubernetesNode.xy.nodeMemoryCapacity]
5367
: [
54-
kibernetesNode.xy.nodeCpuCapacity,
55-
kibernetesNode.xy.nodeMemoryCapacity,
56-
kibernetesNode.xy.nodeDiskCapacity,
57-
kibernetesNode.xy.nodePodCapacity,
68+
kubernetesNode.xy.nodeCpuCapacity,
69+
kubernetesNode.xy.nodeMemoryCapacity,
70+
kubernetesNode.xy.nodeDiskCapacity,
71+
kubernetesNode.xy.nodePodCapacity,
5872
];
5973

6074
return items.map((chart) => {
@@ -67,7 +81,7 @@ export const useKubernetesCharts = ({
6781
}),
6882
};
6983
});
70-
}, [dataViewId, overview, model.metrics]);
84+
}, [model.metrics, schema, overview, dataViewId]);
7185

7286
return { charts, error };
7387
};
@@ -83,16 +97,20 @@ export const useHostKpiCharts = ({
8397
dataViewId,
8498
seriesColor,
8599
getSubtitle,
100+
schema,
86101
}: {
87102
dataViewId?: string;
88103
seriesColor?: string;
89104
getSubtitle?: (formulaValue: string) => string;
105+
schema?: DataSchemaFormat | null;
90106
}) => {
91107
seriesColor = useChartSeriesColor(seriesColor);
92108

93109
const { value: charts = [] } = useAsync(async () => {
94110
const model = findInventoryModel('host');
95-
const { cpu, memory, disk } = await model.metrics.getCharts();
111+
const { cpu, memory, disk } = await model.metrics.getCharts({
112+
schema: schema ?? DataSchemaFormat.ECS,
113+
});
96114

97115
return [
98116
cpu.metric.cpuUsage,
@@ -110,20 +128,25 @@ export const useHostKpiCharts = ({
110128
},
111129
}),
112130
}));
113-
}, [dataViewId, seriesColor, getSubtitle]);
131+
}, [dataViewId, seriesColor, getSubtitle, schema]);
114132

115133
return charts;
116134
};
117135

118136
const getHostsCharts = async ({
119137
metric,
120138
overview,
139+
schema,
121140
}: {
122141
metric: HostMetricTypes;
123142
overview?: boolean;
143+
schema?: DataSchemaFormat | null;
124144
}) => {
125145
const model = findInventoryModel('host');
126-
const { cpu, memory, network, disk, logs } = await model.metrics.getCharts();
146+
147+
const { cpu, memory, network, disk, logs } = await model.metrics.getCharts({
148+
schema: schema ?? DataSchemaFormat.ECS,
149+
});
127150

128151
switch (metric) {
129152
case 'cpu':

x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi_charts.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export const KpiCharts = () => {
8080
lastReloadRequestTime={afterLoadedState.reloadRequestTime}
8181
getSubtitle={afterLoadedState.getSubtitle}
8282
loading={loading}
83+
schema={searchCriteria.preferredSchema}
8384
/>
8485
);
8586
};

x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@ import { Chart } from './chart';
1212
import { Popover } from '../../common/popover';
1313
import { useMetricsDataViewContext } from '../../../../../../containers/metrics_source';
1414
import { useMetricsCharts } from '../../../hooks/use_metrics_charts';
15+
import { useUnifiedSearchContext } from '../../../hooks/use_unified_search';
1516

1617
export const MetricsGrid = () => {
1718
const { metricsView } = useMetricsDataViewContext();
18-
const charts = useMetricsCharts({ dataViewId: metricsView?.dataViewReference.id });
19+
const { searchCriteria } = useUnifiedSearchContext();
20+
const charts = useMetricsCharts({
21+
dataViewId: metricsView?.dataViewReference.id,
22+
schema: searchCriteria.preferredSchema,
23+
});
1924

2025
return (
2126
<>

x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import useAsync from 'react-use/lib/useAsync';
1717
import { isEqual } from 'lodash';
1818
import { isNumber } from 'lodash/fp';
1919
import type { CloudProvider } from '@kbn/custom-icons';
20-
import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common';
20+
import { DataSchemaFormat, findInventoryModel } from '@kbn/metrics-data-access-plugin/common';
2121
import { EuiToolTip } from '@elastic/eui';
2222
import { EuiBadge } from '@elastic/eui';
2323
import { FormattedMessage } from '@kbn/i18n-react';
@@ -42,6 +42,7 @@ import { TABLE_COLUMN_LABEL, TABLE_CONTENT_LABEL } from '../translations';
4242
import { METRICS_TOOLTIP } from '../../../../common/visualizations';
4343
import { buildCombinedAssetFilter } from '../../../../utils/filters/build';
4444
import { AddDataTroubleshootingPopover } from '../components/table/add_data_troubleshooting_popover';
45+
import { useUnifiedSearchContext } from './use_unified_search';
4546

4647
/**
4748
* Columns and items types
@@ -153,11 +154,18 @@ export const useHostsTable = () => {
153154
const inventoryModel = findInventoryModel('host');
154155
const [selectedItems, setSelectedItems] = useState<HostNodeRow[]>([]);
155156
const { hostNodes } = useHostsViewContext();
157+
const { searchCriteria } = useUnifiedSearchContext();
156158

157159
const displayAlerts = hostNodes.some((item) => 'alertsCount' in item);
158160
const showApmHostTroubleshooting = hostNodes.some((item) => !item.hasSystemMetrics);
159161

160-
const { value: formulas } = useAsync(() => inventoryModel.metrics.getFormulas());
162+
const { value: formulas } = useAsync(
163+
() =>
164+
inventoryModel.metrics.getFormulas({
165+
schema: searchCriteria.preferredSchema ?? DataSchemaFormat.ECS,
166+
}),
167+
[inventoryModel.metrics, searchCriteria.preferredSchema]
168+
);
161169

162170
const [{ detailsItemId, pagination, sorting }, setProperties] = useHostsTableUrlState();
163171
const {
@@ -496,6 +504,7 @@ export const useHostsTable = () => {
496504
align: 'right',
497505
},
498506
],
507+
499508
[
500509
displayAlerts,
501510
showApmHostTroubleshooting,

x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/hooks/use_metrics_charts.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,22 @@
77

88
import useAsync from 'react-use/lib/useAsync';
99
import type { LensBreakdownConfig } from '@kbn/lens-embeddable-utils/config_builder';
10+
import { DataSchemaFormat } from '@kbn/metrics-data-access-plugin/common';
1011
import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common';
1112
import { PAGE_SIZE_OPTIONS } from '../constants';
1213

13-
export const useMetricsCharts = ({ dataViewId }: { dataViewId?: string }) => {
14+
export const useMetricsCharts = ({
15+
dataViewId,
16+
schema,
17+
}: {
18+
dataViewId?: string;
19+
schema?: DataSchemaFormat | null;
20+
}) => {
1421
const { value: charts = [] } = useAsync(async () => {
1522
const model = findInventoryModel('host');
16-
const { cpu, disk, memory, network } = await model.metrics.getCharts();
23+
const { cpu, disk, memory, network } = await model.metrics.getCharts({
24+
schema: schema ?? DataSchemaFormat.ECS,
25+
});
1726

1827
return [
1928
cpu.xy.cpuUsage,
@@ -47,7 +56,7 @@ export const useMetricsCharts = ({ dataViewId }: { dataViewId?: string }) => {
4756
},
4857
}),
4958
}));
50-
}, [dataViewId]);
59+
}, [schema, dataViewId]);
5160

5261
return charts;
5362
};

0 commit comments

Comments
 (0)