Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Uptime] Index Status API to Rest #59657

Merged
merged 7 commits into from
Mar 16, 2020
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions x-pack/legacy/plugins/uptime/common/constants/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ export * from './capabilities';
export { PLUGIN } from './plugin';
export { QUERY, STATES } from './query';
export * from './ui';
export * from './rest_api';
9 changes: 9 additions & 0 deletions x-pack/legacy/plugins/uptime/common/constants/rest_api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/*
* 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.
*/

export enum REST_API_URLS {
INDEX_STATUS = '/api/uptime/index_status',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the thinking that we will add all the URL paths here as we touch them? If so it might be good to add a follow-up issue for this so to jumpstart adoption.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}
12 changes: 2 additions & 10 deletions x-pack/legacy/plugins/uptime/common/graphql/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ export interface Query {

/** Fetches the current state of Uptime monitors for the given parameters. */
getMonitorStates?: MonitorSummaryResult | null;
/** Fetches details about the uptime index. */
getStatesIndexStatus: StatesIndexStatus;
}

export interface PingResults {
Expand Down Expand Up @@ -392,7 +390,7 @@ export interface MonitorSummaryResult {
/** The objects representing the state of a series of heartbeat monitors. */
summaries?: MonitorSummary[] | null;
/** The number of summaries. */
totalSummaryCount: DocCount;
totalSummaryCount: number;
}
/** Represents the current state and associated data for an Uptime monitor. */
export interface MonitorSummary {
Expand Down Expand Up @@ -525,13 +523,7 @@ export interface SummaryHistogramPoint {
/** The number of _down_ documents. */
down: number;
}
/** Represents the current status of the uptime index. */
export interface StatesIndexStatus {
/** Flag denoting whether the index exists. */
indexExists: boolean;
/** The number of documents in the index. */
docCount?: DocCount | null;
}


export interface AllPingsQueryArgs {
/** Optional: the direction to sort by. Accepts 'asc' and 'desc'. Defaults to 'desc'. */
Expand Down
6 changes: 6 additions & 0 deletions x-pack/legacy/plugins/uptime/common/runtime_types/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ export const SummaryType = t.partial({
geo: CheckGeoType,
});

export const StatesIndexStatusType = t.type({
indexExists: t.boolean,
docCount: t.number,
});

export type Summary = t.TypeOf<typeof SummaryType>;
export type CheckGeo = t.TypeOf<typeof CheckGeoType>;
export type Location = t.TypeOf<typeof LocationType>;
export type StatesIndexStatus = t.TypeOf<typeof StatesIndexStatusType>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* 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 React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { indexStatusAction } from '../../../state/actions';
import { indexStatusSelector } from '../../../state/selectors';
import { EmptyStateComponent } from '../../functional/empty_state/empty_state';

export const EmptyState: React.FC = ({ children }) => {
const { data, loading, errors } = useSelector(indexStatusSelector);

const dispatch = useDispatch();

useEffect(() => {
dispatch(indexStatusAction.get());
}, [dispatch]);

return (
<EmptyStateComponent
statesIndexStatus={data}
loading={loading}
errors={errors}
children={children as React.ReactElement}
/>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ export { MonitorStatusBar } from './monitor/status_bar_container';
export { MonitorListDrawer } from './monitor/list_drawer_container';
export { MonitorListActionsPopover } from './monitor/drawer_popover_container';
export { DurationChart } from './charts/monitor_duration';
export { EmptyState } from './empty_state/empty_state';
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { selectIndexPattern } from '../../../state/selectors';
import { getIndexPattern } from '../../../state/actions';
import { KueryBarComponent } from '../../functional';

const mapStateToProps = (state: AppState) => ({ indexPattern: selectIndexPattern(state) });
const mapStateToProps = (state: AppState) => ({ ...selectIndexPattern(state) });

const mapDispatchToProps = (dispatch: any) => ({
loadIndexPattern: () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ const mapDispatchToProps = (dispatch: any): DispatchProps => ({
setEsKueryFilters: (esFilters: string) => dispatch(setEsKueryString(esFilters)),
});

const mapStateToProps = (state: AppState) => ({ indexPattern: selectIndexPattern(state) });
const mapStateToProps = (state: AppState) => ({ ...selectIndexPattern(state) });

export const OverviewPage = connect(mapStateToProps, mapDispatchToProps)(OverviewPageComponent);

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,21 @@ import React from 'react';
import { mountWithIntl, shallowWithIntl } from 'test_utils/enzyme_helpers';
import { EmptyStateComponent } from '../empty_state';
import { GraphQLError } from 'graphql';
import { StatesIndexStatus } from '../../../../../common/graphql/types';
import { StatesIndexStatus } from '../../../../../common/runtime_types';

describe('EmptyState component', () => {
let statesIndexStatus: StatesIndexStatus;

beforeEach(() => {
statesIndexStatus = {
indexExists: true,
docCount: {
count: 1,
},
docCount: 1,
};
});

it('renders child components when count is truthy', () => {
const component = shallowWithIntl(
<EmptyStateComponent data={{ statesIndexStatus }} loading={false}>
<EmptyStateComponent statesIndexStatus={statesIndexStatus} loading={false}>
<div>Foo</div>
<div>Bar</div>
<div>Baz</div>
Expand All @@ -33,9 +31,9 @@ describe('EmptyState component', () => {
expect(component).toMatchSnapshot();
});

it(`doesn't render child components when count is falsey`, () => {
it(`doesn't render child components when count is falsy`, () => {
const component = mountWithIntl(
<EmptyStateComponent data={undefined} loading={false}>
<EmptyStateComponent statesIndexStatus={null} loading={false}>
<div>Shouldn&apos;t be rendered</div>
</EmptyStateComponent>
);
Expand All @@ -57,7 +55,7 @@ describe('EmptyState component', () => {
},
];
const component = mountWithIntl(
<EmptyStateComponent data={undefined} errors={errors} loading={false}>
<EmptyStateComponent statesIndexStatus={null} errors={errors} loading={false}>
<div>Shouldn&apos;t appear...</div>
</EmptyStateComponent>
);
Expand All @@ -66,7 +64,7 @@ describe('EmptyState component', () => {

it('renders loading state if no errors or doc count', () => {
const component = mountWithIntl(
<EmptyStateComponent loading={true}>
<EmptyStateComponent loading={true} statesIndexStatus={null}>
<div>Should appear even while loading...</div>
</EmptyStateComponent>
);
Expand All @@ -75,13 +73,11 @@ describe('EmptyState component', () => {

it('does not render empty state with appropriate base path and no docs', () => {
statesIndexStatus = {
docCount: {
count: 0,
},
docCount: 0,
indexExists: true,
};
const component = mountWithIntl(
<EmptyStateComponent data={{ statesIndexStatus }} loading={false}>
<EmptyStateComponent statesIndexStatus={statesIndexStatus} loading={false}>
<div>If this is in the snapshot the test should fail</div>
</EmptyStateComponent>
);
Expand All @@ -91,7 +87,7 @@ describe('EmptyState component', () => {
it('notifies when index does not exist', () => {
statesIndexStatus.indexExists = false;
const component = mountWithIntl(
<EmptyStateComponent data={{ statesIndexStatus }} loading={false}>
<EmptyStateComponent statesIndexStatus={statesIndexStatus} loading={false}>
<div>This text should not render</div>
</EmptyStateComponent>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,29 @@

import React, { Fragment } from 'react';
import { i18n } from '@kbn/i18n';
import { UptimeGraphQLQueryProps, withUptimeGraphQL } from '../../higher_order';
import { docCountQuery } from '../../../queries';
import { EmptyStateError } from './empty_state_error';
import { EmptyStateLoading } from './empty_state_loading';
import { StatesIndexStatus } from '../../../../common/graphql/types';
import { DataMissing } from './data_missing';

interface EmptyStateQueryResult {
statesIndexStatus?: StatesIndexStatus;
}
import { StatesIndexStatus } from '../../../../common/runtime_types';

interface EmptyStateProps {
children: JSX.Element[] | JSX.Element;
statesIndexStatus: StatesIndexStatus | null;
loading: boolean;
errors?: Error[];
}

type Props = UptimeGraphQLQueryProps<EmptyStateQueryResult> & EmptyStateProps;

export const EmptyStateComponent = ({ children, data, errors }: Props) => {
if (errors) {
export const EmptyStateComponent = ({
children,
statesIndexStatus,
loading,
errors,
}: EmptyStateProps) => {
if (errors?.length) {
return <EmptyStateError errors={errors} />;
}
if (data && data.statesIndexStatus) {
const { indexExists, docCount } = data.statesIndexStatus;
if (!loading && statesIndexStatus) {
const { indexExists, docCount } = statesIndexStatus;
if (!indexExists) {
return (
<DataMissing
Expand All @@ -37,7 +37,7 @@ export const EmptyStateComponent = ({ children, data, errors }: Props) => {
})}
/>
);
} else if (indexExists && docCount && docCount.count === 0) {
} else if (indexExists && docCount === 0) {
return (
<DataMissing
headingMessage={i18n.translate('xpack.uptime.emptyState.noDataMessage', {
Expand All @@ -57,8 +57,3 @@ export const EmptyStateComponent = ({ children, data, errors }: Props) => {
}
return <EmptyStateLoading />;
};

export const EmptyState = withUptimeGraphQL<EmptyStateQueryResult, EmptyStateProps>(
EmptyStateComponent,
docCountQuery
);
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
import { EuiEmptyPrompt, EuiPanel, EuiTitle, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import React, { Fragment } from 'react';
import { GraphQLError } from 'graphql';

interface EmptyStateErrorProps {
errors: GraphQLError[];
errors: Error[];
}

export const EmptyStateError = ({ errors }: EmptyStateErrorProps) => {
const unauthorized = errors.find(
(error: GraphQLError) => error.message && error.message.includes('unauthorized')
(error: Error) => error.message && error.message.includes('unauthorized')
);

return (
Expand Down Expand Up @@ -46,7 +45,7 @@ export const EmptyStateError = ({ errors }: EmptyStateErrorProps) => {
body={
<Fragment>
{!unauthorized &&
errors.map((error: GraphQLError) => <p key={error.message}>{error.message}</p>)}
errors.map((error: Error) => <p key={error.message}>{error.message}</p>)}
</Fragment>
}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
*/

export { DonutChart } from './charts/donut_chart';
export { EmptyState } from './empty_state';
export { KueryBarComponent } from './kuery_bar/kuery_bar';
export { MonitorCharts } from './monitor_charts';
export { MonitorList } from './monitor_list';
Expand Down
Loading