}
- actions={
-
- Create detector
-
- }
+ actions={}
/>
);
}
diff --git a/public/pages/Dashboard/Components/EmptyDashboard/__tests__/__snapshots__/EmptyDashboard.test.tsx.snap b/public/pages/Dashboard/Components/EmptyDashboard/__tests__/__snapshots__/EmptyDashboard.test.tsx.snap
index f22dd09b..0a58dcf2 100644
--- a/public/pages/Dashboard/Components/EmptyDashboard/__tests__/__snapshots__/EmptyDashboard.test.tsx.snap
+++ b/public/pages/Dashboard/Components/EmptyDashboard/__tests__/__snapshots__/EmptyDashboard.test.tsx.snap
@@ -22,7 +22,7 @@ exports[` spec Empty results renders component with empty messa
Create detector first to detect anomalies in your data.
- Dashboard will generate insights on the anomalies across all of your detectors
+ Dashboard will generate insights on the anomalies across all of your detectors.
Read about
@@ -55,21 +55,51 @@ exports[` spec Empty results renders component with empty messa
+
`;
diff --git a/public/pages/SampleData/components/SampleDataBox/SampleDataBox.tsx b/public/pages/SampleData/components/SampleDataBox/SampleDataBox.tsx
new file mode 100644
index 00000000..13c7dc1f
--- /dev/null
+++ b/public/pages/SampleData/components/SampleDataBox/SampleDataBox.tsx
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+import ContentPanel from '../../../../components/ContentPanel/ContentPanel';
+import {
+ EuiButton,
+ EuiFlexGroup,
+ EuiFlexItem,
+ EuiTitle,
+ EuiLink,
+} from '@elastic/eui';
+import { PLUGIN_NAME } from '../../../../utils/constants';
+
+interface SampleDataBoxProps {
+ title: string;
+ icon: any;
+ description: string;
+ loadDataButtonDescription: string;
+ onOpenFlyout(): void;
+ onLoadData(): void;
+ isLoadingData: boolean;
+ isDataLoaded: boolean;
+ detectorId: string;
+}
+
+export const SampleDataBox = (props: SampleDataBoxProps) => {
+ return (
+
+`;
+
+exports[` spec Data is loading renders component 1`] = `
+
+
+
+
+
+
+
+
+
+ Sample title
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sample description
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[` spec Data not loaded renders component 1`] = `
+
+
+
+
+
+
+
+
+
+ Sample title
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sample description
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/public/pages/SampleData/components/SampleDataCallout/SampleDataCallout.tsx b/public/pages/SampleData/components/SampleDataCallout/SampleDataCallout.tsx
new file mode 100644
index 00000000..27b11d4d
--- /dev/null
+++ b/public/pages/SampleData/components/SampleDataCallout/SampleDataCallout.tsx
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+import { EuiCallOut, EuiLink } from '@elastic/eui';
+import { APP_PATH, PLUGIN_NAME } from '../../../../utils/constants';
+
+export const SampleDataCallout = () => {
+ return (
+
+
+ Read the{' '}
+
+ documentation
+ {' '}
+ or create a{' '}
+
+ sample detector
+ {' '}
+ to get started.
+
+
+ );
+};
diff --git a/public/pages/SampleData/components/SampleDataCallout/__tests__/SampleDataCallout.test.tsx b/public/pages/SampleData/components/SampleDataCallout/__tests__/SampleDataCallout.test.tsx
new file mode 100644
index 00000000..d28ba781
--- /dev/null
+++ b/public/pages/SampleData/components/SampleDataCallout/__tests__/SampleDataCallout.test.tsx
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its /*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+import { render } from '@testing-library/react';
+import { SampleDataCallout } from '../SampleDataCallout';
+
+describe(' spec', () => {
+ describe('Data not loaded', () => {
+ test('renders component', () => {
+ const { container, getByText } = render();
+ expect(container.firstChild).toMatchSnapshot();
+ getByText('Looking to get more familiar with anomaly detection?');
+ });
+ });
+});
diff --git a/public/pages/SampleData/components/SampleDataCallout/__tests__/__snapshots__/SampleDataCallout.test.tsx.snap b/public/pages/SampleData/components/SampleDataCallout/__tests__/__snapshots__/SampleDataCallout.test.tsx.snap
new file mode 100644
index 00000000..7b77c4cf
--- /dev/null
+++ b/public/pages/SampleData/components/SampleDataCallout/__tests__/__snapshots__/SampleDataCallout.test.tsx.snap
@@ -0,0 +1,55 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[` spec Data not loaded renders component 1`] = `
+
+
+
+
+ Looking to get more familiar with anomaly detection?
+
+
+
+ }
+ initialIsOpen={false}
+ paddingSize="m"
+ >
+
+ Name:
+ {props.sampleData.indexName}
+
+ Log frequency: Every {props.interval} minute(s)
+
+ Log duration: 3 weeks
+
+ Field details:
+
+
+ {getFieldsAndTypesGrid(fieldValues, fieldTypes)}
+
+
+
+ );
+};
diff --git a/public/pages/SampleData/components/SampleIndexDetailsCallout/SampleIndexDetailsCallout.tsx b/public/pages/SampleData/components/SampleIndexDetailsCallout/SampleIndexDetailsCallout.tsx
new file mode 100644
index 00000000..b1efbfd6
--- /dev/null
+++ b/public/pages/SampleData/components/SampleIndexDetailsCallout/SampleIndexDetailsCallout.tsx
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+import { EuiCallOut, EuiLink } from '@elastic/eui';
+import { KIBANA_NAME, KIBANA_PATH } from '../../../../utils/constants';
+
+interface SampleIndexDetailsCalloutProps {
+ indexName: string;
+}
+
+export const SampleIndexDetailsCallout = (
+ props: SampleIndexDetailsCalloutProps
+) => {
+ return (
+
+
+ Check out the{' '}
+
+ Kibana Discover app
+
+ {''} to view the raw data for sample index '{props.indexName}'.
+
+
+ );
+};
diff --git a/public/pages/SampleData/containers/SampleData/SampleData.tsx b/public/pages/SampleData/containers/SampleData/SampleData.tsx
new file mode 100644
index 00000000..2ee4f83e
--- /dev/null
+++ b/public/pages/SampleData/containers/SampleData/SampleData.tsx
@@ -0,0 +1,306 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import {
+ EuiSpacer,
+ EuiPageHeader,
+ EuiTitle,
+ EuiText,
+ EuiFlexItem,
+ EuiFlexGroup,
+} from '@elastic/eui';
+import React, { Fragment, useEffect, useState } from 'react';
+import { useDispatch, useSelector } from 'react-redux';
+//@ts-ignore
+import chrome from 'ui/chrome';
+//@ts-ignore
+import { toastNotifications } from 'ui/notify';
+import { BREADCRUMBS, SAMPLE_TYPE } from '../../../../utils/constants';
+import {
+ GET_SAMPLE_DETECTORS_QUERY_PARAMS,
+ GET_SAMPLE_INDICES_QUERY,
+} from '../../../utils/constants';
+import { AppState } from '../../../../redux/reducers';
+import { getDetectorList } from '../../../../redux/reducers/ad';
+import { createSampleData } from '../../../../redux/reducers/sampleData';
+
+import {
+ getIndices,
+ createIndex,
+} from '../../../../redux/reducers/elasticsearch';
+import { createDetector, startDetector } from '../../../../redux/reducers/ad';
+import {
+ sampleHttpResponses,
+ sampleEcommerce,
+ sampleHostHealth,
+} from '../../utils/constants';
+import {
+ containsSampleIndex,
+ containsSampleDetector,
+ getDetectorId,
+} from '../../utils/helpers';
+import { SampleDataBox } from '../../components/SampleDataBox/SampleDataBox';
+import { SampleDetailsFlyout } from '../../components/SampleDetailsFlyout/SampleDetailsFlyout';
+
+export const SampleData = () => {
+ const dispatch = useDispatch();
+ const visibleIndices = useSelector(
+ (state: AppState) => state.elasticsearch.indices
+ );
+ const allDetectors = Object.values(
+ useSelector((state: AppState) => state.ad.detectorList)
+ );
+
+ const [isLoadingHttpData, setIsLoadingHttpData] = useState(false);
+ const [isLoadingEcommerceData, setIsLoadingEcommerceData] = useState(
+ false
+ );
+ const [isLoadingHostHealthData, setIsLoadingHostHealthData] = useState<
+ boolean
+ >(false);
+ const [
+ showHttpResponseDetailsFlyout,
+ setShowHttpResponseDetailsFlyout,
+ ] = useState(false);
+ const [showEcommerceDetailsFlyout, setShowEcommerceDetailsFlyout] = useState<
+ boolean
+ >(false);
+ const [
+ showHostHealthDetailsFlyout,
+ setShowHostHealthDetailsFlyout,
+ ] = useState(false);
+
+ const getAllSampleDetectors = async () => {
+ await dispatch(getDetectorList(GET_SAMPLE_DETECTORS_QUERY_PARAMS)).catch(
+ (error: any) => {
+ console.error('Error getting all detectors: ', error);
+ }
+ );
+ };
+
+ const getAllSampleIndices = async () => {
+ await dispatch(getIndices(GET_SAMPLE_INDICES_QUERY)).catch((error: any) => {
+ console.error('Error getting all indices: ', error);
+ });
+ };
+
+ // Set breadcrumbs on page initialization
+ useEffect(() => {
+ chrome.breadcrumbs.set([
+ BREADCRUMBS.ANOMALY_DETECTOR,
+ BREADCRUMBS.SAMPLE_DETECTORS,
+ ]);
+ }, []);
+
+ // Getting all initial sample detectors & indices
+ useEffect(() => {
+ getAllSampleDetectors();
+ getAllSampleIndices();
+ }, []);
+
+ // Create and populate sample index, create and start sample detector
+ const handleLoadData = async (
+ sampleType: SAMPLE_TYPE,
+ indexConfig: any,
+ detectorConfig: any,
+ setLoadingState: (isLoading: boolean) => void
+ ) => {
+ setLoadingState(true);
+ let errorDuringAction = false;
+ let errorMessage = '';
+
+ // Create the index (if it doesn't exist yet)
+ if (!containsSampleIndex(visibleIndices, sampleType)) {
+ await dispatch(createIndex(indexConfig)).catch((error: any) => {
+ errorDuringAction = true;
+ errorMessage = 'Error creating sample index.';
+ console.error('Error creating sample index: ', error);
+ });
+ }
+
+ // Get the sample data from the server and bulk insert
+ if (!errorDuringAction) {
+ await dispatch(createSampleData(sampleType)).catch((error: any) => {
+ errorDuringAction = true;
+ errorMessage = error;
+ console.error('Error bulk inserting data: ', error);
+ });
+ }
+
+ // Create the detector
+ if (!errorDuringAction) {
+ await dispatch(createDetector(detectorConfig))
+ .then(function (response: any) {
+ const detectorId = response.data.response.id;
+ // Start the detector
+ dispatch(startDetector(detectorId)).catch((error: any) => {
+ errorDuringAction = true;
+ errorMessage = error.data.message;
+ console.error('Error starting sample detector: ', error);
+ });
+ })
+ .catch((error: any) => {
+ errorDuringAction = true;
+ errorMessage = error;
+ console.error('Error creating sample detector: ', error);
+ });
+ }
+
+ getAllSampleDetectors();
+ getAllSampleIndices();
+ setLoadingState(false);
+ if (!errorDuringAction) {
+ toastNotifications.addSuccess('Successfully loaded sample detector');
+ } else {
+ toastNotifications.addDanger(
+ `Unable to load all sample data, please try again. ${errorMessage}`
+ );
+ }
+ };
+
+ return (
+
+
+
+
Sample detectors
+
+
+
+ Create a detector with streaming sample data to get a deeper
+ understanding of how anomaly detection works. You can create and
+ initialize a detector with configured settings for your selected sample
+ index.
+
+
+
+
+ {
+ setShowHttpResponseDetailsFlyout(true);
+ setShowEcommerceDetailsFlyout(false);
+ setShowHostHealthDetailsFlyout(false);
+ }}
+ onLoadData={() => {
+ handleLoadData(
+ SAMPLE_TYPE.HTTP_RESPONSES,
+ sampleHttpResponses.indexConfig,
+ sampleHttpResponses.detectorConfig,
+ setIsLoadingHttpData
+ );
+ }}
+ isLoadingData={isLoadingHttpData}
+ isDataLoaded={containsSampleDetector(
+ allDetectors,
+ SAMPLE_TYPE.HTTP_RESPONSES
+ )}
+ detectorId={getDetectorId(
+ allDetectors,
+ sampleHttpResponses.detectorName
+ )}
+ />
+
+
+ {
+ setShowHttpResponseDetailsFlyout(false);
+ setShowEcommerceDetailsFlyout(true);
+ setShowHostHealthDetailsFlyout(false);
+ }}
+ onLoadData={() => {
+ handleLoadData(
+ SAMPLE_TYPE.ECOMMERCE,
+ sampleEcommerce.indexConfig,
+ sampleEcommerce.detectorConfig,
+ setIsLoadingEcommerceData
+ );
+ }}
+ isLoadingData={isLoadingEcommerceData}
+ isDataLoaded={containsSampleDetector(
+ allDetectors,
+ SAMPLE_TYPE.ECOMMERCE
+ )}
+ detectorId={getDetectorId(
+ allDetectors,
+ sampleEcommerce.detectorName
+ )}
+ />
+
+
+ {
+ setShowHttpResponseDetailsFlyout(false);
+ setShowEcommerceDetailsFlyout(false);
+ setShowHostHealthDetailsFlyout(true);
+ }}
+ onLoadData={() => {
+ handleLoadData(
+ SAMPLE_TYPE.HOST_HEALTH,
+ sampleHostHealth.indexConfig,
+ sampleHostHealth.detectorConfig,
+ setIsLoadingHostHealthData
+ );
+ }}
+ isLoadingData={isLoadingHostHealthData}
+ isDataLoaded={containsSampleDetector(
+ allDetectors,
+ SAMPLE_TYPE.HOST_HEALTH
+ )}
+ detectorId={getDetectorId(
+ allDetectors,
+ sampleHostHealth.detectorName
+ )}
+ />
+
+
+
+ {showHttpResponseDetailsFlyout ? (
+ setShowHttpResponseDetailsFlyout(false)}
+ />
+ ) : null}
+ {showEcommerceDetailsFlyout ? (
+ setShowEcommerceDetailsFlyout(false)}
+ />
+ ) : null}
+ {showHostHealthDetailsFlyout ? (
+ setShowHostHealthDetailsFlyout(false)}
+ />
+ ) : null}
+
+ );
+};
diff --git a/public/pages/SampleData/containers/SampleData/__tests__/SampleData.test.tsx b/public/pages/SampleData/containers/SampleData/__tests__/SampleData.test.tsx
new file mode 100644
index 00000000..76da8ef4
--- /dev/null
+++ b/public/pages/SampleData/containers/SampleData/__tests__/SampleData.test.tsx
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+import { render, wait } from '@testing-library/react';
+import { SampleData } from '../SampleData';
+import { Provider } from 'react-redux';
+import {
+ MemoryRouter as Router,
+ Redirect,
+ Route,
+ Switch,
+} from 'react-router-dom';
+import { httpClientMock } from '../../../../../../test/mocks';
+import configureStore from '../../../../../redux/configureStore';
+import {
+ Detectors,
+ initialDetectorsState,
+} from '../../../../../redux/reducers/ad';
+import { sampleHttpResponses } from '../../../utils/constants';
+
+const renderWithRouter = (
+ initialAdState: Detectors = initialDetectorsState
+) => ({
+ ...render(
+
+
+
+ } />
+
+
+
+
+ ),
+});
+
+describe(' spec', () => {
+ jest.clearAllMocks();
+ describe('No sample detectors created', () => {
+ test('renders component', async () => {
+ httpClientMock.get = jest.fn().mockResolvedValue({
+ data: { ok: true, response: { detectorList: [], totalDetectors: 0 } },
+ });
+ const { container, getByText, queryByText } = renderWithRouter();
+ expect(container).toMatchSnapshot();
+ getByText('Sample detectors');
+ getByText('Monitor HTTP responses');
+ getByText('Monitor eCommerce orders');
+ getByText('Monitor host health');
+ expect(queryByText('INSTALLED')).toBeNull();
+ expect(queryByText('Detector created')).toBeNull();
+ expect(queryByText('View detector and sample data')).toBeNull();
+ });
+ });
+
+ describe('Some detectors created', () => {
+ jest.clearAllMocks();
+ test('renders component with sample detector', async () => {
+ httpClientMock.get = jest.fn().mockResolvedValue({
+ data: {
+ ok: true,
+ response: {
+ detectorList: [
+ {
+ id: 'sample-detector-id',
+ name: sampleHttpResponses.detectorName,
+ indices: sampleHttpResponses.indexName,
+ totalAnomalies: 0,
+ lastActiveAnomaly: 0,
+ },
+ ],
+ totalDetectors: 1,
+ },
+ },
+ });
+ const { container, getByText, getAllByText } = renderWithRouter();
+ await wait();
+ expect(container).toMatchSnapshot();
+ getByText('Sample detectors');
+ getByText('Monitor HTTP responses');
+ getByText('Monitor eCommerce orders');
+ getByText('Monitor host health');
+ expect(getAllByText('Detector created')).toHaveLength(1);
+ expect(getAllByText('View detector and sample data')).toHaveLength(1);
+ expect(getAllByText('INSTALLED')).toHaveLength(1);
+ });
+ test('renders component with non-sample detector', async () => {
+ httpClientMock.get = jest.fn().mockResolvedValue({
+ data: {
+ ok: true,
+ response: {
+ detectorList: [
+ {
+ id: 'non-sample-detector-id',
+ name: 'non-sample-detector',
+ indices: 'non-sample-index',
+ totalAnomalies: 0,
+ lastActiveAnomaly: 0,
+ },
+ ],
+ totalDetectors: 1,
+ },
+ },
+ });
+ const { container, getByText, queryByText } = renderWithRouter();
+ await wait();
+ expect(container).toMatchSnapshot();
+ getByText('Sample detectors');
+ getByText('Monitor HTTP responses');
+ getByText('Monitor eCommerce orders');
+ getByText('Monitor host health');
+ expect(queryByText('INSTALLED')).toBeNull();
+ expect(queryByText('Detector created')).toBeNull();
+ });
+ });
+});
diff --git a/public/pages/SampleData/containers/SampleData/__tests__/__snapshots__/SampleData.test.tsx.snap b/public/pages/SampleData/containers/SampleData/__tests__/__snapshots__/SampleData.test.tsx.snap
new file mode 100644
index 00000000..2f7e9bd9
--- /dev/null
+++ b/public/pages/SampleData/containers/SampleData/__tests__/__snapshots__/SampleData.test.tsx.snap
@@ -0,0 +1,1247 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[` spec No sample detectors created renders component 1`] = `
+
+
+
+ Sample detectors
+
+
+
+ Create a detector with streaming sample data to get a deeper understanding of how anomaly detection works. You can create and initialize a detector with configured settings for your selected sample index.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Monitor HTTP responses
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detect high numbers of error response codes in an index containing HTTP response data.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Monitor eCommerce orders
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detect any unual increase or decrease of orders in an index containing online order data.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Monitor host health
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detect increases in CPU and memory utilization in an index containing various health metrics from a host.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[` spec Some detectors created renders component with non-sample detector 1`] = `
+
+
+
+ Sample detectors
+
+
+
+ Create a detector with streaming sample data to get a deeper understanding of how anomaly detection works. You can create and initialize a detector with configured settings for your selected sample index.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Monitor HTTP responses
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detect high numbers of error response codes in an index containing HTTP response data.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Monitor eCommerce orders
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detect any unual increase or decrease of orders in an index containing online order data.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Monitor host health
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detect increases in CPU and memory utilization in an index containing various health metrics from a host.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[` spec Some detectors created renders component with sample detector 1`] = `
+
+
+
+ Sample detectors
+
+
+
+ Create a detector with streaming sample data to get a deeper understanding of how anomaly detection works. You can create and initialize a detector with configured settings for your selected sample index.
+
+
+
+
+
+
+
+
+ INSTALLED
+
+
+
+
+
+
+
+
+
+ Monitor HTTP responses
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detect high numbers of error response codes in an index containing HTTP response data.
+