Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,27 @@
*/

import { useMemo } from 'react';
import type { DataViewSpec, SharedDataViewSelectionState } from '../redux/types';
import { DataViewManagerScopeName } from '../constants';
import { useDataView } from './use_data_view';

export interface UseDataViewSpecResult {
/**
* DataViewSpec object for the current dataView
*/
dataViewSpec: DataViewSpec;
/**
* Status of the dataView (can be the following values: 'pristine' | 'loading' | 'error' | 'ready')
*/
status: SharedDataViewSelectionState['status'];
}

/**
* Returns data view selection for given scopeName
* Returns an object with the dataViewSpec and status values for the given scopeName.
*/
export const useDataViewSpec = (
scopeName: DataViewManagerScopeName = DataViewManagerScopeName.default
) => {
): UseDataViewSpecResult => {
const { dataView, status } = useDataView(scopeName);

return useMemo(() => {
Expand All @@ -30,6 +42,6 @@ export const useDataViewSpec = (
};
}

return { status, dataViewSpec: dataView?.toSpec?.() };
return { dataViewSpec: dataView?.toSpec?.(), status };
}, [dataView, status]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import {
tableDefaults,
TableId,
} from '@kbn/securitysolution-data-table';
import type { RunTimeMappings } from '@kbn/timelines-plugin/common/search_strategy';
import type { DataViewSpec } from '@kbn/data-views-plugin/common';
import { useGroupTakeActionsItems } from '../../../../detections/hooks/alerts_table/use_group_take_action_items';
import { useDataViewSpec } from '../../../../data_view_manager/hooks/use_data_view_spec';
import {
Expand Down Expand Up @@ -262,14 +262,15 @@ const RuleDetailsPageComponent: React.FC<DetectionEngineComponentProps> = ({
const { loading: listsConfigLoading, needsConfiguration: needsListsConfiguration } =
useListsConfig();

const { sourcererDataView: oldSourcererDataView, loading: oldIsLoadingIndexPattern } =
const { sourcererDataView: oldSourcererDataViewSpec, loading: oldIsLoadingIndexPattern } =
useSourcererDataView(SourcererScopeName.detections);

const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled');

const { dataViewSpec, status } = useDataViewSpec(SourcererScopeName.detections);

const sourcererDataView = newDataViewPickerEnabled ? dataViewSpec : oldSourcererDataView;
const { dataViewSpec: experimentalDataViewSpec, status } = useDataViewSpec(
Comment thread
jkelas marked this conversation as resolved.
SourcererScopeName.detections
);
const sourcererDataViewSpec: DataViewSpec = newDataViewPickerEnabled
? experimentalDataViewSpec
: oldSourcererDataViewSpec;
const isLoadingIndexPattern = newDataViewPickerEnabled
? status !== 'ready'
: oldIsLoadingIndexPattern;
Expand Down Expand Up @@ -640,7 +641,7 @@ const RuleDetailsPageComponent: React.FC<DetectionEngineComponentProps> = ({
<SiemSearchBar
id={InputsModelId.global}
pollForSignalIndex={pollForSignalIndex}
sourcererDataView={sourcererDataView}
sourcererDataView={sourcererDataViewSpec}
/>
</FiltersGlobal>
<RuleDetailsContextProvider>
Expand Down Expand Up @@ -810,6 +811,7 @@ const RuleDetailsPageComponent: React.FC<DetectionEngineComponentProps> = ({
<GroupedAlertsTable
accordionButtonContent={defaultGroupTitleRenderers}
accordionExtraActionGroupStats={accordionExtraActionGroupStats}
dataViewSpec={sourcererDataViewSpec}
defaultFilters={alertMergedFilters}
defaultGroupingOptions={defaultGroupingOptions}
from={from}
Expand All @@ -818,8 +820,6 @@ const RuleDetailsPageComponent: React.FC<DetectionEngineComponentProps> = ({
groupTakeActionItems={groupTakeActionItems}
loading={loading}
renderChildComponent={renderGroupedAlertTable}
runtimeMappings={sourcererDataView.runtimeFieldMap as RunTimeMappings}
signalIndexName={signalIndexName}
tableId={TableId.alertsOnRuleDetailsPage}
to={to}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@

import React from 'react';
import { render } from '@testing-library/react';
import type { DataView } from '@kbn/data-views-plugin/common';
import type { DataView, DataViewSpec } from '@kbn/data-views-plugin/common';
import { createStubDataView } from '@kbn/data-views-plugin/common/data_views/data_view.stub';
import { TestProviders } from '../../../../common/mock';
import { GROUPED_TABLE_TEST_ID, TableSection } from './table_section';
import type { PackageListItem } from '@kbn/fleet-plugin/common';
import { installationStatuses } from '@kbn/fleet-plugin/common/constants';

const dataView: DataView = createStubDataView({ spec: {} });
const dataViewSpec: DataViewSpec = { title: '.alerts-security.alerts-default' };
const dataView: DataView = createStubDataView({ spec: dataViewSpec });
const packages: PackageListItem[] = [
{
id: 'splunk',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import { TableSectionContextProvider } from './table_section_context';
import { groupStatsRenderer } from './group_stats_renderers';
import { groupingOptions } from './grouping_options';
import { groupTitleRenderers } from './group_title_renderers';
import type { RunTimeMappings } from '../../../../sourcerer/store/model';
import { useGlobalTime } from '../../../../common/containers/use_global_time';
import { Table } from './table';
import { inputsSelectors } from '../../../../common/store';
Expand All @@ -25,8 +24,6 @@ import type { RuleResponse } from '../../../../../common/api/detection_engine';

export const GROUPED_TABLE_TEST_ID = 'alert-summary-grouped-table';

const runtimeMappings: RunTimeMappings = {};

export interface TableSectionProps {
/**
* DataView created for the alert summary page
Expand Down Expand Up @@ -56,7 +53,7 @@ export interface TableSectionProps {
* This component leverages the GroupedAlertsTable and the ResponseOps AlertsTable also used in the alerts page.
*/
export const TableSection = memo(({ dataView, packages, ruleResponse }: TableSectionProps) => {
const indexNames = useMemo(() => dataView.getIndexPattern(), [dataView]);
const dataViewSpec = useMemo(() => dataView.toSpec(), [dataView]);
const { to, from } = useGlobalTime();

const getGlobalQuerySelector = useMemo(() => inputsSelectors.globalQuerySelector(), []);
Expand Down Expand Up @@ -91,14 +88,13 @@ export const TableSection = memo(({ dataView, packages, ruleResponse }: TableSec
<GroupedAlertsTable
accordionButtonContent={groupTitleRenderers}
accordionExtraActionGroupStats={accordionExtraActionGroupStats}
dataViewSpec={dataViewSpec}
defaultGroupingOptions={groupingOptions}
from={from}
globalFilters={filters}
globalQuery={globalQuery}
loading={false}
renderChildComponent={renderChildComponent}
runtimeMappings={runtimeMappings}
signalIndexName={indexNames}
tableId={TableId.alertsOnAlertSummaryPage}
to={to}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import {
defaultGroupStatsRenderer,
defaultGroupTitleRenderers,
} from './grouping_settings';
import type { DataView, DataViewSpec } from '@kbn/data-views-plugin/common';
import { createStubDataView } from '@kbn/data-views-plugin/common/data_views/data_view.stub';

jest.mock('../../containers/detection_engine/alerts/use_query');
jest.mock('../../../sourcerer/containers');
Expand Down Expand Up @@ -117,13 +119,17 @@ const sourcererDataView = {
};
const renderChildComponent = (groupingFilters: Filter[]) => <p data-test-subj="alerts-table" />;

const dataViewSpec: DataViewSpec = { title: 'test' };
const dataView: DataView = createStubDataView({ spec: dataViewSpec });

const testProps: AlertsTableComponentProps = {
...mockDate,
accordionButtonContent: defaultGroupTitleRenderers,
accordionExtraActionGroupStats: {
aggregations: defaultGroupStatsAggregations,
renderer: defaultGroupStatsRenderer,
},
dataViewSpec: dataView.toSpec(),
defaultFilters: [],
defaultGroupingOptions,
globalFilters: [],
Expand All @@ -133,8 +139,6 @@ const testProps: AlertsTableComponentProps = {
},
loading: false,
renderChildComponent,
runtimeMappings: {},
signalIndexName: 'test',
tableId: TableId.test,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useDispatch } from 'react-redux';
import type { Filter, Query } from '@kbn/es-query';
import type { DataViewSpec } from '@kbn/data-views-plugin/common';
import {
type GroupOption,
type GroupStatsItem,
Expand All @@ -22,20 +23,15 @@ import type { TableIdLiteral } from '@kbn/securitysolution-data-table';
import type { GetGroupStats, GroupingArgs, GroupPanelRenderer } from '@kbn/grouping/src';
import type { GroupTakeActionItems } from './types';
import type { AlertsGroupingAggregation } from './grouping_settings/types';
import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features';
import { groupIdSelector } from '../../../common/store/grouping/selectors';
import { useDeepEqualSelector } from '../../../common/hooks/use_selector';
import { updateGroups } from '../../../common/store/grouping/actions';
import { defaultUnit } from '../../../common/components/toolbar/unit';
import { useSourcererDataView } from '../../../sourcerer/containers';
import type { RunTimeMappings } from '../../../sourcerer/store/model';
import { SourcererScopeName } from '../../../sourcerer/store/model';
import { useKibana } from '../../../common/lib/kibana';
import { GroupedSubLevel } from './alerts_sub_grouping';
import { AlertsEventTypes, track } from '../../../common/lib/telemetry';
import * as i18n from './translations';
import { useDataViewSpec } from '../../../data_view_manager/hooks/use_data_view_spec';
import { useSelectedPatterns } from '../../../data_view_manager/hooks/use_selected_patterns';

export interface AlertsTableComponentProps {
/**
Expand All @@ -59,6 +55,10 @@ export interface AlertsTableComponentProps {
*/
renderer: GetGroupStats<AlertsGroupingAggregation>;
};
/**
* DataViewSpec object to use internally to fetch the data
*/
dataViewSpec: DataViewSpec;
defaultFilters?: Filter[];
/**
* Default values to display in the group selection dropdown.
Expand All @@ -75,8 +75,6 @@ export interface AlertsTableComponentProps {
groupTakeActionItems?: GroupTakeActionItems;
loading: boolean;
renderChildComponent: (groupingFilters: Filter[]) => React.ReactElement;
runtimeMappings: RunTimeMappings;
signalIndexName: string | null;
tableId: TableIdLiteral;
to: string;
}
Expand Down Expand Up @@ -138,20 +136,6 @@ const useStorage = (storage: Storage, tableId: string) =>
const GroupedAlertsTableComponent: React.FC<AlertsTableComponentProps> = (props) => {
const dispatch = useDispatch();

const { sourcererDataView: oldSourcererDataView, selectedPatterns: oldSelectedPatterns } =
useSourcererDataView(SourcererScopeName.detections);

const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled');
const { dataViewSpec: experimentalDataViewSpec } = useDataViewSpec(SourcererScopeName.detections);
const experimentalSelectedPatterns = useSelectedPatterns(SourcererScopeName.detections);

const sourcererDataView = newDataViewPickerEnabled
? experimentalDataViewSpec
: oldSourcererDataView;
const selectedPatterns = newDataViewPickerEnabled
? experimentalSelectedPatterns
: oldSelectedPatterns;

const {
services: { storage, telemetry },
} = useKibana();
Expand Down Expand Up @@ -189,7 +173,10 @@ const GroupedAlertsTableComponent: React.FC<AlertsTableComponentProps> = (props)
[dispatch, props.tableId]
);

const fields = useMemo(() => Object.values(sourcererDataView.fields || {}), [sourcererDataView]);
const fields = useMemo(
() => Object.values(props.dataViewSpec.fields || {}),
[props.dataViewSpec]
);

const groupingOptions = useMemo(
() => props.defaultGroupingOptions || DEFAULT_GROUPING_OPTIONS,
Expand Down Expand Up @@ -349,16 +336,18 @@ const GroupedAlertsTableComponent: React.FC<AlertsTableComponentProps> = (props)
pageSize={pageSize[level] ?? DEFAULT_PAGE_SIZE}
parentGroupingFilter={parentGroupingFilter}
renderChildComponent={rcc}
runtimeMappings={props.dataViewSpec.runtimeFieldMap as RunTimeMappings}
selectedGroup={selectedGroup}
setPageIndex={(newIndex: number) => setPageVar(newIndex, level, 'index')}
setPageSize={(newSize: number) => setPageVar(newSize, level, 'size')}
signalIndexName={props.dataViewSpec.title}
/>
);
},
[getGrouping, groupStatusAggregations, pageIndex, pageSize, props, selectedGroups, setPageVar]
);

if (isEmpty(selectedPatterns)) {
if (isEmpty(props.dataViewSpec.title)) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ interface OwnProps {
selectedGroup: string;
setPageIndex: (newIndex: number) => void;
setPageSize: (newSize: number) => void;
signalIndexName: string | null;
signalIndexName: string | undefined;
tableId: TableIdLiteral;
to: string;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {
import { isEqual } from 'lodash';
import type { FilterGroupHandler } from '@kbn/alerts-ui-shared';
import type { RunTimeMappings } from '@kbn/timelines-plugin/common/search_strategy';
import type { DataViewSpec } from '@kbn/data-views-plugin/common';
import { useGroupTakeActionsItems } from '../../hooks/alerts_table/use_group_take_action_items';
import {
defaultGroupingOptions,
Expand Down Expand Up @@ -159,17 +160,15 @@ const DetectionEnginePageComponent: React.FC<DetectionEngineComponentProps> = ()
FilterGroupHandler | undefined
>();

const { sourcererDataView: oldSourcererDataView, loading: oldIsLoadingIndexPattern } =
const { sourcererDataView: oldSourcererDataViewSpec, loading: oldIsLoadingIndexPattern } =
useSourcererDataView(SourcererScopeName.detections);

const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled');
const { dataViewSpec: experimentalDataViewSpec, status: dataViewSpecStatus } = useDataViewSpec(
SourcererScopeName.detections
);

const sourcererDataView = newDataViewPickerEnabled
const sourcererDataViewSpec: DataViewSpec = newDataViewPickerEnabled
? experimentalDataViewSpec
: oldSourcererDataView;
: oldSourcererDataViewSpec;
const isLoadingIndexPattern = newDataViewPickerEnabled
? dataViewSpecStatus !== 'ready'
: oldIsLoadingIndexPattern;
Expand Down Expand Up @@ -402,7 +401,7 @@ const DetectionEnginePageComponent: React.FC<DetectionEngineComponentProps> = ()
<SiemSearchBar
id={InputsModelId.global}
pollForSignalIndex={pollForSignalIndex}
sourcererDataView={sourcererDataView}
sourcererDataView={sourcererDataViewSpec}
/>
</FiltersGlobal>
<SecuritySolutionPageWrapper
Expand Down Expand Up @@ -438,15 +437,15 @@ const DetectionEnginePageComponent: React.FC<DetectionEngineComponentProps> = ()
query={query}
timeRange={pageFiltersTimerange}
onInit={setDetectionPageFilterHandler}
dataViewSpec={sourcererDataView}
dataViewSpec={sourcererDataViewSpec}
/>
<EuiSpacer size="l" />
<ChartPanels
addFilter={addFilter}
alertsDefaultFilters={alertsDefaultFilters}
isLoadingIndexPattern={isChartPanelLoading}
query={query}
runtimeMappings={sourcererDataView.runtimeFieldMap as RunTimeMappings}
runtimeMappings={sourcererDataViewSpec.runtimeFieldMap as RunTimeMappings}
signalIndexName={signalIndexName}
updateDateRangeCallback={updateDateRangeCallback}
/>
Expand All @@ -455,6 +454,7 @@ const DetectionEnginePageComponent: React.FC<DetectionEngineComponentProps> = ()
<GroupedAlertsTable
accordionButtonContent={defaultGroupTitleRenderers}
accordionExtraActionGroupStats={accordionExtraActionGroupStats}
dataViewSpec={sourcererDataViewSpec}
defaultFilters={alertsTableDefaultFilters}
defaultGroupingOptions={defaultGroupingOptions}
from={from}
Expand All @@ -463,8 +463,6 @@ const DetectionEnginePageComponent: React.FC<DetectionEngineComponentProps> = ()
groupTakeActionItems={groupTakeActionItems}
loading={isAlertTableLoading}
renderChildComponent={renderAlertTable}
runtimeMappings={sourcererDataView.runtimeFieldMap as RunTimeMappings}
signalIndexName={signalIndexName}
tableId={TableId.alertsOnAlertsPage}
to={to}
/>
Expand Down
Loading