forked from elastic/kibana
-
Notifications
You must be signed in to change notification settings - Fork 0
/
with_metrics.tsx
91 lines (85 loc) · 2.29 KB
/
with_metrics.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { ApolloError } from 'apollo-client';
import React from 'react';
import { Query } from 'react-apollo';
import { i18n } from '@kbn/i18n';
import {
InfraMetric,
InfraMetricData,
InfraNodeType,
MetricsQuery,
InfraTimerangeInput,
} from '../../../graphql/types';
import { metricsQuery } from './metrics.gql_query';
import { InventoryMetric, InventoryMetricRT } from '../../../../common/inventory_models/types';
interface WithMetricsArgs {
metrics: InfraMetricData[];
error?: ApolloError | undefined;
loading: boolean;
refetch: () => void;
}
interface WithMetricsProps {
children: (args: WithMetricsArgs) => React.ReactNode;
requiredMetrics: InventoryMetric[];
nodeType: InfraNodeType;
nodeId: string;
cloudId: string;
sourceId: string;
timerange: InfraTimerangeInput;
}
const isInfraMetrics = (subject: any[]): subject is InfraMetric[] => {
return subject.every(s => InventoryMetricRT.is(s));
};
export const WithMetrics = ({
children,
requiredMetrics,
sourceId,
timerange,
nodeType,
nodeId,
cloudId,
}: WithMetricsProps) => {
if (!isInfraMetrics(requiredMetrics)) {
throw new Error(
i18n.translate('xpack.infra.invalidInventoryMetricsError', {
defaultMessage: 'One of the InfraMetric is invalid',
})
);
}
return (
<Query<MetricsQuery.Query, MetricsQuery.Variables>
query={metricsQuery}
fetchPolicy="no-cache"
notifyOnNetworkStatusChange
variables={{
sourceId,
metrics: requiredMetrics,
nodeType,
nodeId,
cloudId,
timerange,
}}
>
{({ data, error, loading, refetch }) => {
return children({
metrics: filterOnlyInfraMetricData(data && data.source && data.source.metrics),
error,
loading,
refetch,
});
}}
</Query>
);
};
const filterOnlyInfraMetricData = (
metrics: Array<MetricsQuery.Metrics | null> | undefined
): InfraMetricData[] => {
if (!metrics) {
return [];
}
return metrics.filter(m => m !== null).map(m => m as InfraMetricData);
};