-
Notifications
You must be signed in to change notification settings - Fork 1k
/
IndexerClusterHealth.tsx
101 lines (84 loc) · 3.33 KB
/
IndexerClusterHealth.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
92
93
94
95
96
97
98
99
100
101
/*
* Copyright (C) 2020 Graylog, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Server Side Public License, version 1,
* as published by MongoDB, Inc.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* Server Side Public License for more details.
*
* You should have received a copy of the Server Side Public License
* along with this program. If not, see
* <http://www.mongodb.com/licensing/server-side-public-license>.
*/
import React from 'react';
import { useQueries } from 'react-query';
import { Spinner } from 'components/common';
import { Row, Col } from 'components/bootstrap';
import { DocumentationLink, SmallSupportLink } from 'components/support';
import DocsHelper from 'util/DocsHelper';
import { IndexerClusterHealthSummary } from 'components/indexers';
import type FetchError from 'logic/errors/FetchError';
import ApiRoutes from 'routing/ApiRoutes';
import fetch from 'logic/rest/FetchProvider';
import * as URLUtils from 'util/URLUtils';
import IndexerClusterHealthError from './IndexerClusterHealthError';
type Props = {
minimal: boolean,
};
const GET_INDEXER_CLUSTER_HEALTH = 'indexerCluster.health';
const GET_INDEXER_CLUSTER_NAME = 'indexerCluster.name';
const getIndexerClusterHealth = () => {
const url = URLUtils.qualifyUrl(ApiRoutes.IndexerClusterApiController.health().url);
return fetch('GET', url);
};
const getIndexerClusterName = () => {
const url = URLUtils.qualifyUrl(ApiRoutes.IndexerClusterApiController.name().url);
return fetch('GET', url);
};
const useLoadHealthAndName = () => {
const options = { refetchInterval: 5000, retry: 0 };
const [
{ data: healthData, isFetching: healthIsFetching, error: healthError, isSuccess: healthIsSuccess, isRefetching: healthIsRefetching },
{ data: nameData, isFetching: nameIsFetching, error: nameError, isSuccess: nameIsSuccess, isRefetching: nameIsRefetching },
] = useQueries([
{ queryKey: GET_INDEXER_CLUSTER_HEALTH, queryFn: getIndexerClusterHealth, ...options },
{ queryKey: GET_INDEXER_CLUSTER_NAME, queryFn: getIndexerClusterName, ...options },
]);
return ({
health: healthData,
name: nameData,
error: (healthError || nameError) as FetchError,
loading: (healthIsFetching || nameIsFetching) && !healthIsRefetching && !nameIsRefetching,
isSuccess: healthIsSuccess && nameIsSuccess,
});
};
const IndexerClusterHealth = ({ minimal }: Props) => {
const { health, name, loading, error, isSuccess } = useLoadHealthAndName();
const summary = (
<>
{isSuccess && <IndexerClusterHealthSummary health={health} name={name} />}
{loading && <p><Spinner /></p>}
{error && <IndexerClusterHealthError error={error} />}
</>
);
if (minimal) {
return summary;
}
return (
<Row className="content">
<Col md={12}>
<h2>Elasticsearch cluster</h2>
<SmallSupportLink>
The possible Elasticsearch cluster states and more related information is available in the{' '}
<DocumentationLink page={DocsHelper.PAGES.CONFIGURING_ES} text="Graylog documentation" />.
</SmallSupportLink>
{summary}
</Col>
</Row>
);
};
export default IndexerClusterHealth;