-
Notifications
You must be signed in to change notification settings - Fork 8.2k
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
Un-revert "Siem query rule - reduce field_caps usage" #186317
Merged
lukasolson
merged 2 commits into
elastic:main
from
lukasolson:redo_siem_field_caps_diet
Jun 18, 2024
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
82 changes: 82 additions & 0 deletions
82
src/plugins/data/common/search/search_source/query_to_fields.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License | ||
* 2.0 and the Server Side Public License, v 1; you may not use this file except | ||
* in compliance with, at your election, the Elastic License 2.0 or the Server | ||
* Side Public License, v 1. | ||
*/ | ||
|
||
import { EsQuerySortValue, queryToFields, SearchRequest, SortDirection } from '../..'; | ||
import { DataViewLazy } from '@kbn/data-views-plugin/common'; | ||
|
||
describe('SearchSource#queryToFields', () => { | ||
it('should include time field', async () => { | ||
const dataView = { | ||
timeFieldName: '@timestamp', | ||
getSourceFiltering: jest.fn(), | ||
getFields: jest.fn().mockResolvedValue({ | ||
getFieldMapSorted: jest.fn(), | ||
}), | ||
}; | ||
const request: SearchRequest = { query: [] }; | ||
await queryToFields({ dataView: dataView as unknown as DataViewLazy, request }); | ||
const { fieldName } = dataView.getFields.mock.calls[0][0]; | ||
expect(fieldName).toEqual(['@timestamp']); | ||
}); | ||
|
||
it('should include sort field', async () => { | ||
const dataView = { | ||
getSourceFiltering: jest.fn(), | ||
getFields: jest.fn().mockResolvedValue({ | ||
getFieldMapSorted: jest.fn(), | ||
}), | ||
}; | ||
const sort: EsQuerySortValue = { bytes: SortDirection.asc }; | ||
const request: SearchRequest = { query: [] }; | ||
await queryToFields({ dataView: dataView as unknown as DataViewLazy, sort, request }); | ||
const { fieldName } = dataView.getFields.mock.calls[0][0]; | ||
expect(fieldName).toEqual(['bytes']); | ||
}); | ||
|
||
it('should include request KQL query fields', async () => { | ||
const dataView = { | ||
timeFieldName: '@timestamp', | ||
getSourceFiltering: jest.fn(), | ||
getFields: jest.fn().mockResolvedValue({ | ||
getFieldMapSorted: jest.fn(), | ||
}), | ||
}; | ||
const request: SearchRequest = { | ||
query: [ | ||
{ | ||
language: 'kuery', | ||
query: 'log.level: debug AND NOT message: unknown', | ||
}, | ||
], | ||
}; | ||
await queryToFields({ dataView: dataView as unknown as DataViewLazy, request }); | ||
const { fieldName } = dataView.getFields.mock.calls[0][0]; | ||
expect(fieldName).toEqual(['@timestamp', 'log.level', 'message']); | ||
}); | ||
|
||
it('should not include request Lucene query fields', async () => { | ||
const dataView = { | ||
timeFieldName: '@timestamp', | ||
getSourceFiltering: jest.fn(), | ||
getFields: jest.fn().mockResolvedValue({ | ||
getFieldMapSorted: jest.fn(), | ||
}), | ||
}; | ||
const request: SearchRequest = { | ||
query: [ | ||
{ | ||
language: 'lucene', | ||
query: 'host: artifacts\\.*', | ||
}, | ||
], | ||
}; | ||
await queryToFields({ dataView: dataView as unknown as DataViewLazy, request }); | ||
const { fieldName } = dataView.getFields.mock.calls[0][0]; | ||
expect(fieldName).toEqual(['@timestamp']); | ||
}); | ||
}); |
58 changes: 58 additions & 0 deletions
58
src/plugins/data/common/search/search_source/query_to_fields.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License | ||
* 2.0 and the Server Side Public License, v 1; you may not use this file except | ||
* in compliance with, at your election, the Elastic License 2.0 or the Server | ||
* Side Public License, v 1. | ||
*/ | ||
|
||
import { DataViewLazy } from '@kbn/data-views-plugin/common'; | ||
import { fromKueryExpression, getKqlFieldNames } from '@kbn/es-query'; | ||
import type { SearchRequest } from './fetch'; | ||
import { EsQuerySortValue } from '../..'; | ||
|
||
export async function queryToFields({ | ||
dataView, | ||
sort, | ||
request, | ||
}: { | ||
dataView: DataViewLazy; | ||
sort?: EsQuerySortValue | EsQuerySortValue[]; | ||
request: SearchRequest; | ||
}) { | ||
let fields = dataView.timeFieldName ? [dataView.timeFieldName] : []; | ||
if (sort) { | ||
const sortArr = Array.isArray(sort) ? sort : [sort]; | ||
fields.push(...sortArr.flatMap((s) => Object.keys(s))); | ||
} | ||
for (const query of request.query) { | ||
if (query.query && query.language === 'kuery') { | ||
const nodes = fromKueryExpression(query.query); | ||
const queryFields = getKqlFieldNames(nodes); | ||
fields = fields.concat(queryFields); | ||
} | ||
} | ||
const filters = request.filters; | ||
if (filters) { | ||
const filtersArr = Array.isArray(filters) ? filters : [filters]; | ||
for (const f of filtersArr) { | ||
// unified search bar filters have meta object and key (regular filters) | ||
// unified search bar "custom" filters ("Edit as query DSL", where meta.key is not present but meta is) | ||
// Any other Elasticsearch query DSL filter that gets passed in by consumers (not coming from unified search, and these probably won't have a meta key at all) | ||
if (f?.meta?.key && f.meta.disabled !== true) { | ||
fields.push(f.meta.key); | ||
} | ||
} | ||
} | ||
|
||
// if source filtering is enabled, we need to fetch all the fields | ||
const fieldName = | ||
dataView.getSourceFiltering() && dataView.getSourceFiltering().excludes.length ? ['*'] : fields; | ||
|
||
if (fieldName.length) { | ||
return (await dataView.getFields({ fieldName })).getFieldMapSorted(); | ||
} | ||
|
||
// no fields needed to be loaded for query | ||
return {}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
...ity_solution/server/lib/detection_engine/rule_types/utils/get_query_filter_load_fields.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License | ||
* 2.0; you may not use this file except in compliance with the Elastic License | ||
* 2.0. | ||
*/ | ||
|
||
import type { Language } from '@kbn/securitysolution-io-ts-alerting-types'; | ||
import type { Filter, EsQueryConfig, DataViewFieldBase } from '@kbn/es-query'; | ||
import { DataView } from '@kbn/data-views-plugin/server'; | ||
import { queryToFields } from '@kbn/data-plugin/common'; | ||
import type { DataViewsContract } from '@kbn/data-views-plugin/common'; | ||
import type { FieldFormatsStartCommon } from '@kbn/field-formats-plugin/common'; | ||
import { buildEsQuery } from '@kbn/es-query'; | ||
import type { ESBoolQuery } from '../../../../../common/typed_json'; | ||
import { getAllFilters } from './get_query_filter'; | ||
import type { | ||
IndexPatternArray, | ||
RuleQuery, | ||
} from '../../../../../common/api/detection_engine/model/rule_schema'; | ||
|
||
export const getQueryFilterLoadFields = | ||
(dataViewsService: DataViewsContract) => | ||
async ({ | ||
query, | ||
language, | ||
filters, | ||
index, | ||
exceptionFilter, | ||
}: { | ||
query: RuleQuery; | ||
language: Language; | ||
filters: unknown; | ||
index: IndexPatternArray; | ||
exceptionFilter: Filter | undefined; | ||
fields?: DataViewFieldBase[]; | ||
}): Promise<ESBoolQuery> => { | ||
const config: EsQueryConfig = { | ||
allowLeadingWildcards: true, | ||
queryStringOptions: { analyze_wildcard: true }, | ||
ignoreFilterIfFieldNotInIndex: false, | ||
dateFormatTZ: 'Zulu', | ||
}; | ||
|
||
const initialQuery = { query, language }; | ||
const allFilters = getAllFilters(filters as Filter[], exceptionFilter); | ||
|
||
const title = (index ?? []).join(); | ||
|
||
const dataViewLazy = await dataViewsService.createDataViewLazy({ title }); | ||
|
||
const flds = await queryToFields({ | ||
dataView: dataViewLazy, | ||
request: { query: [initialQuery], filters: allFilters }, | ||
}); | ||
|
||
const dataViewLimitedFields = new DataView({ | ||
spec: { title }, | ||
fieldFormats: {} as unknown as FieldFormatsStartCommon, | ||
shortDotsEnable: false, | ||
metaFields: [], | ||
}); | ||
|
||
dataViewLimitedFields.fields.replaceAll(Object.values(flds).map((fld) => fld.toSpec())); | ||
|
||
return buildEsQuery(dataViewLimitedFields, initialQuery, allFilters, config); | ||
}; |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: if the
let
usage is only due to theconcat
call at the end, maybe that can be replaced withpush(...queryFields)
and make this aconst
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Although this nit makes sense, I prefer to leave this PR as close to its original counterpart (#184890) as possible