From 2de1eb5c79384de12b34a570a053a73a76b21d54 Mon Sep 17 00:00:00 2001 From: Jan Heise Date: Thu, 26 Sep 2024 15:55:51 +0200 Subject: [PATCH 01/26] User list endpoint returns current user only instead of error when permission is missing (#20558) * in case the user lacks the permission to list all users, return only a list containing that user. * code improvements * adding changelog * improve changelog Co-authored-by: Dennis Oelkers --------- Co-authored-by: Dennis Oelkers --- changelog/unreleased/pr-20558.toml | 5 +++++ .../rest/resources/users/UsersResource.java | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 changelog/unreleased/pr-20558.toml diff --git a/changelog/unreleased/pr-20558.toml b/changelog/unreleased/pr-20558.toml new file mode 100644 index 000000000000..66d13d5e600a --- /dev/null +++ b/changelog/unreleased/pr-20558.toml @@ -0,0 +1,5 @@ +type = "c" # One of: a(dded), c(hanged), d(eprecated), r(emoved), f(ixed), s(ecurity) +message = "API endpoint for listing users will not return an error anymore when user is lacking permission, but return current user only instead." + +issues = [] +pulls = ["20558"] diff --git a/graylog2-server/src/main/java/org/graylog2/rest/resources/users/UsersResource.java b/graylog2-server/src/main/java/org/graylog2/rest/resources/users/UsersResource.java index aa5e1d9fe986..c3b6c11bfc7f 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/resources/users/UsersResource.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/resources/users/UsersResource.java @@ -34,6 +34,7 @@ import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; +import org.graylog.plugins.views.search.permissions.SearchUser; import org.graylog.security.UserContext; import org.graylog.security.authservice.AuthServiceBackendDTO; import org.graylog.security.authservice.GlobalAuthServiceConfig; @@ -233,17 +234,23 @@ private UserSummary returnSummary(UserContext userContext, User user) { */ @GET @Deprecated - @RequiresPermissions(RestPermissions.USERS_LIST) @ApiOperation(value = "List all users", notes = "Permissions and session data included by default") public UserList listUsers( @ApiParam(name = "include_permissions") @QueryParam("include_permissions") @DefaultValue("true") boolean includePermissions, - @ApiParam(name = "include_sessions") @QueryParam("include_sessions") @DefaultValue("true") boolean includeSessions) { - return listUsersSelective(includePermissions, includeSessions); + @ApiParam(name = "include_sessions") @QueryParam("include_sessions") @DefaultValue("true") boolean includeSessions, + @Context SearchUser searchUser) { + final Optional optSessions = includeSessions ? Optional.of(AllUserSessions.create(sessionService)) : Optional.empty(); + return searchUser.isPermitted(RestPermissions.USERS_LIST) ? + listUsersSelective(includePermissions, optSessions) : + listForLoggedInUser(searchUser, includePermissions, optSessions); } - private UserList listUsersSelective(boolean includePermissions, boolean includeSessions) { + private UserList listForLoggedInUser(final SearchUser searchUser, final boolean includePermissions, Optional optSessions) { + return UserList.create(List.of(toUserResponse(searchUser.getUser(), includePermissions, optSessions))); + } + + private UserList listUsersSelective(final boolean includePermissions, final Optional optSessions) { final List users = userManagementService.loadAll(); - final Optional optSessions = includeSessions ? Optional.of(AllUserSessions.create(sessionService)) : Optional.empty(); final List resultUsers = Lists.newArrayListWithCapacity(users.size() + 1); userManagementService.getRootUser().ifPresent(adminUser -> From fb95754a01c50e5d68a773ce0251f433f0cd7822 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:14:44 +0200 Subject: [PATCH 02/26] Bump @types/react in /graylog2-web-interface/packages/graylog-web-plugin (#20540) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.3.8 to 18.3.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- graylog2-web-interface/packages/graylog-web-plugin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graylog2-web-interface/packages/graylog-web-plugin/package.json b/graylog2-web-interface/packages/graylog-web-plugin/package.json index 3af79a8e4623..fe28f4c0695e 100644 --- a/graylog2-web-interface/packages/graylog-web-plugin/package.json +++ b/graylog2-web-interface/packages/graylog-web-plugin/package.json @@ -33,7 +33,7 @@ "@tanstack/react-query": "4.36.1", "@types/create-react-class": "15.6.8", "@types/jquery": "3.5.31", - "@types/react": "18.3.8", + "@types/react": "18.3.9", "babel-preset-graylog": "file:../babel-preset-graylog", "create-react-class": "15.7.0", "eslint-config-graylog": "file:../eslint-config-graylog", From fe22fa38e39047d0df4a1d145c03be711657c190 Mon Sep 17 00:00:00 2001 From: maxiadlovskii Date: Thu, 26 Sep 2024 16:36:06 +0200 Subject: [PATCH 03/26] Do not render table row when showMessageRow is false (#20545) --- .../src/views/components/messagelist/MessagePreview.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/graylog2-web-interface/src/views/components/messagelist/MessagePreview.tsx b/graylog2-web-interface/src/views/components/messagelist/MessagePreview.tsx index 76ea2461e4b8..82db5b9eda20 100644 --- a/graylog2-web-interface/src/views/components/messagelist/MessagePreview.tsx +++ b/graylog2-web-interface/src/views/components/messagelist/MessagePreview.tsx @@ -54,15 +54,15 @@ type Props = { const MessagePreview = ({ onRowClick, colSpanFixup, message, messageFieldType, showMessageRow, config }: Props) => { const MessageRowOverride = usePluginEntities('views.components.widgets.messageTable.messageRowOverride')?.[0]; - return ( + return showMessageRow && ( - {showMessageRow && !!MessageRowOverride && ( + {!!MessageRowOverride && ( renderMessageFieldRow(message, messageFieldType)} /> )} - {(showMessageRow && !MessageRowOverride) && renderMessageFieldRow(message, messageFieldType)} + {(!MessageRowOverride) && renderMessageFieldRow(message, messageFieldType)} ); From 72f7085993d337f27e54b64d36cc831c7fa77778 Mon Sep 17 00:00:00 2001 From: Ezequiel Lopez <105670363+zeeklop@users.noreply.github.com> Date: Thu, 26 Sep 2024 14:06:58 -0300 Subject: [PATCH 04/26] feat: Include stream categories in Query.filter (#20549) --- .../AggregationForm.tsx | 1 + .../src/components/events/events/types.ts | 1 + .../views/hooks/BindSearchParamsFromQuery.ts | 17 +++-- .../views/hooks/SyncWithQueryParameters.ts | 9 +-- .../NormalizeSearchURLQueryParams.test.ts | 65 +++++++++++++++++++ .../logic/NormalizeSearchURLQueryParams.ts | 32 ++++++++- .../src/views/logic/queries/Query.ts | 53 +++++++-------- .../src/views/logic/queries/QueryGenerator.ts | 13 +++- .../views/logic/views/UseCreateSavedSearch.ts | 4 +- .../logic/views/UseCreateViewForEvent.ts | 28 +++++--- .../views/UseCreateViewForEventDefinition.ts | 3 +- .../src/views/logic/views/ViewGenerator.ts | 4 +- .../views/logic/views/ViewStateGenerator.ts | 32 +++++++-- .../src/views/pages/NewSearchPage.test.tsx | 1 + .../src/views/pages/NewSearchPage.tsx | 10 ++- .../createEventDefinitionFromValue.ts | 2 +- .../mocking/EventAndEventDefinitions_mock.ts | 18 ++++- 17 files changed, 226 insertions(+), 67 deletions(-) diff --git a/graylog2-web-interface/src/components/event-definitions/event-definition-types/AggregationForm.tsx b/graylog2-web-interface/src/components/event-definitions/event-definition-types/AggregationForm.tsx index 25c6443d6789..94372efb499b 100644 --- a/graylog2-web-interface/src/components/event-definitions/event-definition-types/AggregationForm.tsx +++ b/graylog2-web-interface/src/components/event-definitions/event-definition-types/AggregationForm.tsx @@ -37,6 +37,7 @@ import commonStyles from '../common/commonStyles.css'; type EventDefinitionConfig = { group_by: Array, streams: Array, + stream_categories?: Array, }; type EventDefinition = { diff --git a/graylog2-web-interface/src/components/events/events/types.ts b/graylog2-web-interface/src/components/events/events/types.ts index 47822dbf4e93..485e460d779f 100644 --- a/graylog2-web-interface/src/components/events/events/types.ts +++ b/graylog2-web-interface/src/components/events/events/types.ts @@ -20,6 +20,7 @@ export type EventReplayInfo = { timerange_end: string, query: string, streams: string[], + stream_categories?: string[], }; export type Event = { diff --git a/graylog2-web-interface/src/views/hooks/BindSearchParamsFromQuery.ts b/graylog2-web-interface/src/views/hooks/BindSearchParamsFromQuery.ts index 566854387719..0ddf98b738f6 100644 --- a/graylog2-web-interface/src/views/hooks/BindSearchParamsFromQuery.ts +++ b/graylog2-web-interface/src/views/hooks/BindSearchParamsFromQuery.ts @@ -14,6 +14,8 @@ * along with this program. If not, see * . */ +import * as Immutable from 'immutable'; + import isDeepEqual from 'stores/isDeepEqual'; import type { ViewHook, ViewHookArguments } from 'views/logic/hooks/ViewHook'; import View from 'views/logic/views/View'; @@ -25,9 +27,9 @@ const bindSearchParamsFromQuery: ViewHook = async ({ query, view, executionState return [view, executionState]; } - const { queryString, timeRange, streamsFilter } = normalizeSearchURLQueryParams(query); + const { queryString, timeRange, streamsFilter, streamCategoriesFilter } = normalizeSearchURLQueryParams(query); - if (!queryString && !timeRange && !streamsFilter) { + if (!queryString && !timeRange && !streamsFilter && !streamCategoriesFilter) { return [view, executionState]; } @@ -48,8 +50,15 @@ const bindSearchParamsFromQuery: ViewHook = async ({ query, view, executionState queryBuilder = queryBuilder.timerange(timeRange); } - if (streamsFilter) { - queryBuilder = queryBuilder.filter(streamsFilter); + const combinedFilters = streamsFilter && streamCategoriesFilter + ? Immutable.Map({ + type: 'or', + filters: Immutable.List.of(streamsFilter, streamCategoriesFilter), + }) + : streamsFilter || streamCategoriesFilter; + + if (combinedFilters) { + queryBuilder = queryBuilder.filter(combinedFilters); } const newQuery = queryBuilder.build(); diff --git a/graylog2-web-interface/src/views/hooks/SyncWithQueryParameters.ts b/graylog2-web-interface/src/views/hooks/SyncWithQueryParameters.ts index 4eb2833bb3c8..1bf1effb0fbc 100644 --- a/graylog2-web-interface/src/views/hooks/SyncWithQueryParameters.ts +++ b/graylog2-web-interface/src/views/hooks/SyncWithQueryParameters.ts @@ -71,16 +71,17 @@ export const syncWithQueryParameters = (viewType: ViewType, query: string, searc .reduce((prev, [key, value]) => prev.setSearch(key, String(value)), baseUri); const currentStreams = filtersToStreamSet(filter); const currentStreamCategories = filtersToStreamCategorySet(filter); + const uriWithStreams = currentStreams.isEmpty() ? uriWithTimerange.removeSearch('streams') : uriWithTimerange.setSearch('streams', currentStreams.join(',')); const uri = currentStreamCategories.isEmpty() - ? uriWithStreams.removeSearch('stream_categories').toString() - : uriWithStreams.setSearch('stream_categories', currentStreamCategories.join(',')).toString(); + ? uriWithStreams.removeSearch('stream_categories') + : uriWithStreams.setSearch('stream_categories', currentStreamCategories.join(',')); - if (query !== uri) { - action(uri); + if (query !== uri.toString()) { + action(uri.toString()); } } }; diff --git a/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.test.ts b/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.test.ts index e9c0ca555579..082995d71428 100644 --- a/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.test.ts +++ b/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.test.ts @@ -25,6 +25,7 @@ describe('NormalizeSearchURLQueryParams', () => { expect(result).toEqual({ queryString: undefined, streamsFilter: null, + streamCategoriesFilter: null, timeRange: { type: 'relative', range: 600 }, }); }); @@ -35,6 +36,7 @@ describe('NormalizeSearchURLQueryParams', () => { expect(result).toEqual({ queryString: undefined, streamsFilter: null, + streamCategoriesFilter: null, timeRange: { type: 'relative', from: 600 }, }); }); @@ -45,6 +47,7 @@ describe('NormalizeSearchURLQueryParams', () => { expect(result).toEqual({ queryString: undefined, streamsFilter: null, + streamCategoriesFilter: null, timeRange: { type: 'relative', from: 600, to: 300 }, }); }); @@ -59,6 +62,7 @@ describe('NormalizeSearchURLQueryParams', () => { expect(result).toEqual({ queryString: undefined, streamsFilter: null, + streamCategoriesFilter: null, timeRange: { type: 'absolute', from: '2020-01-01T10:00:00.850Z', to: '2020-01-02T10:00:00.000Z' }, }); }); @@ -69,6 +73,7 @@ describe('NormalizeSearchURLQueryParams', () => { expect(result).toEqual({ queryString: undefined, streamsFilter: null, + streamCategoriesFilter: null, timeRange: { type: 'keyword', keyword: 'yesterday' }, }); }); @@ -82,6 +87,7 @@ describe('NormalizeSearchURLQueryParams', () => { type: 'elasticsearch', }, streamsFilter: null, + streamCategoriesFilter: null, timeRange: undefined, }); }); @@ -104,6 +110,65 @@ describe('NormalizeSearchURLQueryParams', () => { }), ]), }), + streamCategoriesFilter: null, + timeRange: undefined, + }); + }); + + it('should normalize stream categories filter', async () => { + const result = normalizeSearchURLQueryParams({ stream_categories: 'firewall,graylog' }); + + expect(result).toEqual({ + queryString: undefined, + streamsFilter: null, + streamCategoriesFilter: Immutable.Map({ + type: 'or', + filters: Immutable.List([ + Immutable.Map({ + type: 'stream_category', + category: 'firewall', + }), + Immutable.Map({ + type: 'stream_category', + category: 'graylog', + }), + ]), + }), + timeRange: undefined, + }); + }); + + it('should normalize streams and stream categories filter', async () => { + const result = normalizeSearchURLQueryParams({ streams: 'stream-id-1,stream-id-2', stream_categories: 'firewall,graylog' }); + + expect(result).toEqual({ + queryString: undefined, + streamsFilter: Immutable.Map({ + type: 'or', + filters: Immutable.List([ + Immutable.Map({ + type: 'stream', + id: 'stream-id-1', + }), + Immutable.Map({ + type: 'stream', + id: 'stream-id-2', + }), + ]), + }), + streamCategoriesFilter: Immutable.Map({ + type: 'or', + filters: Immutable.List([ + Immutable.Map({ + type: 'stream_category', + category: 'firewall', + }), + Immutable.Map({ + type: 'stream_category', + category: 'graylog', + }), + ]), + }), timeRange: undefined, }); }); diff --git a/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.ts b/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.ts index 2c8580571db6..d3dd9003f00d 100644 --- a/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.ts +++ b/graylog2-web-interface/src/views/logic/NormalizeSearchURLQueryParams.ts @@ -23,8 +23,10 @@ import type { } from 'views/logic/queries/Query'; import { filtersForQuery, + categoryFiltersForQuery, createElasticsearchQueryString, filtersToStreamSet, + filtersToStreamCategorySet, } from 'views/logic/queries/Query'; import type { TimeRangeQueryParameter } from 'views/logic/TimeRange'; import { timeRangeFromQueryParameter } from 'views/logic/TimeRange'; @@ -35,7 +37,11 @@ type StreamsQuery = { streams?: string, }; -export type RawQuery = (TimeRangeQueryParameter | { relative?: string }) & StreamsQuery & { q?: string }; +type StreamCategoryQuery = { + stream_categories?: string, +}; + +export type RawQuery = (TimeRangeQueryParameter | { relative?: string }) & StreamsQuery & StreamCategoryQuery & { q?: string }; // eslint-disable-next-line no-nested-ternary const normalizeTimeRange = (query: {} | TimeRangeQueryParameter): TimeRange | undefined => (query && 'rangetype' in query @@ -56,9 +62,22 @@ const normalizeStreams = (query: StreamsQuery = {}): Array => { .filter((stream) => stream !== ''); }; +const normalizeStreamCategories = (query: StreamCategoryQuery = {}): Array => { + const rawCategories = query.stream_categories; + + if (rawCategories === undefined || rawCategories === null) { + return []; + } + + return String(rawCategories).split(',') + .map((category) => category.trim()) + .filter((category) => category !== ''); +}; + type NormalizedSearchURLQueryParams = { timeRange: TimeRange | undefined, streamsFilter: FilterType | undefined, + streamCategoriesFilter: FilterType | undefined, queryString: ElasticsearchQueryString | undefined } @@ -66,10 +85,12 @@ const normalizeSearchURLQueryParams = (query: RawQuery): NormalizedSearchURLQuer const { q: queryString } = query ?? {}; const timeRange = normalizeTimeRange(query); const streamsFilter = filtersForQuery(normalizeStreams(query)); + const streamCategoriesFilter = categoryFiltersForQuery(normalizeStreamCategories(query)); return { timeRange, streamsFilter, + streamCategoriesFilter, queryString: queryString ? createElasticsearchQueryString(queryString) : undefined, }; }; @@ -78,9 +99,14 @@ export const useSearchURLQueryParams = () => { const query = useQuery(); return useMemo(() => { - const { timeRange, queryString, streamsFilter } = normalizeSearchURLQueryParams(query); + const { timeRange, queryString, streamsFilter, streamCategoriesFilter } = normalizeSearchURLQueryParams(query); - return { timeRange, queryString, streams: filtersToStreamSet(streamsFilter).toArray() }; + return { + timeRange, + queryString, + streams: filtersToStreamSet(streamsFilter).toArray(), + streamCategories: filtersToStreamCategorySet(streamCategoriesFilter).toArray(), + }; }, [query]); }; diff --git a/graylog2-web-interface/src/views/logic/queries/Query.ts b/graylog2-web-interface/src/views/logic/queries/Query.ts index 5a27783fcfc3..33ea487bd851 100644 --- a/graylog2-web-interface/src/views/logic/queries/Query.ts +++ b/graylog2-web-interface/src/views/logic/queries/Query.ts @@ -58,7 +58,8 @@ export const createElasticsearchQueryString = (query = ''): ElasticsearchQuerySt query_string: query, }); -const _streamFilters = (selectedStreams: Array) => Immutable.List(selectedStreams.map((stream) => Immutable.Map({ type: 'stream', id: stream }))); +const _streamFilters = (selectedStreams: Array) => Immutable.List(selectedStreams?.map((stream) => Immutable.Map({ type: 'stream', id: stream }))); +const _streamCategoryFilters = (selectedCategories: Array) => Immutable.List(selectedCategories?.map((category) => Immutable.Map({ type: 'stream_category', category: category }))); export const filtersForQuery = (streams: Array | null | undefined): FilterType | null | undefined => { if (!streams || streams.length === 0) { @@ -73,28 +74,6 @@ export const filtersForQuery = (streams: Array | null | undefined): Filt }); }; -export const filtersToStreamSet = (filter: Immutable.Map | null | undefined): Immutable.Set => { - if (!filter) { - return Immutable.Set(); - } - - const type = filter.get('type'); - - if (type === 'stream') { - return Immutable.Set([filter.get('id')]); - } - - if (type === 'stream_category') { - return Immutable.Set(); - } - - const filters = filter.get('filters', Immutable.List()); - - return filters.map(filtersToStreamSet).reduce((prev, cur) => prev.merge(cur), Immutable.Set()); -}; - -const _streamCategoryFilters = (selectedCategories: Array) => Immutable.List(selectedCategories.map((category) => Immutable.Map({ type: 'stream_category', category: category }))); - export const categoryFiltersForQuery = (categories: Array | null | undefined): FilterType | null | undefined => { if (!categories || categories.length === 0) { return null; @@ -109,19 +88,33 @@ export const categoryFiltersForQuery = (categories: Array | null | undef }; export const newFiltersForQuery = (streams: Array | null | undefined, categories: Array | null | undefined): FilterType | null | undefined => { - const streamFilter: FilterType = filtersForQuery(streams); - const categoryFilter: FilterType = categoryFiltersForQuery(categories); - - if (streamFilter && categoryFilter) { - const combinedFilter = Immutable.List.of(streamFilter, categoryFilter); + const streamFilter: Immutable.List = _streamFilters(streams); + const categoryFilter: Immutable.List = _streamCategoryFilters(categories); + if (streamFilter.size > 0 && categoryFilter.size > 0) { return Immutable.Map({ type: 'or', - filters: combinedFilter, + filters: Immutable.List([...streamFilter.toArray(), ...categoryFilter.toArray()].map((filter: FilterType) => filter)), }); } - return streamFilter || categoryFilter; + return filtersForQuery(streams) || categoryFiltersForQuery(categories); +}; + +export const filtersToStreamSet = (filter: Immutable.Map | null | undefined): Immutable.Set => { + if (!filter) { + return Immutable.Set(); + } + + const type = filter.get('type'); + + if (type === 'stream') { + return Immutable.Set([filter.get('id')]); + } + + const filters = filter.get('filters', Immutable.List()); + + return filters.map(filtersToStreamSet).reduce((prev, cur) => prev.merge(cur), Immutable.Set()); }; export const filtersToStreamCategorySet = (filter: Immutable.Map | null | undefined): Immutable.Set => { diff --git a/graylog2-web-interface/src/views/logic/queries/QueryGenerator.ts b/graylog2-web-interface/src/views/logic/queries/QueryGenerator.ts index b10fe47fd91a..f6a05df8e40f 100644 --- a/graylog2-web-interface/src/views/logic/queries/QueryGenerator.ts +++ b/graylog2-web-interface/src/views/logic/queries/QueryGenerator.ts @@ -19,12 +19,13 @@ import { v4 as uuidv4 } from 'uuid'; import { DEFAULT_TIMERANGE } from 'views/Constants'; import type { TimeRange, ElasticsearchQueryString, QueryId, FilterType } from 'views/logic/queries/Query'; -import Query, { createElasticsearchQueryString, filtersForQuery } from 'views/logic/queries/Query'; +import Query, { createElasticsearchQueryString, newFiltersForQuery } from 'views/logic/queries/Query'; import generateId from 'logic/generateId'; import type { SearchFilter } from 'components/event-definitions/event-definitions-types'; export default ( streamId?: string | string[], + streamCategory?: string | string[], // eslint-disable-next-line default-param-last id: QueryId | undefined = generateId(), timeRange?: TimeRange, @@ -37,7 +38,13 @@ export default ( ? streamId : [streamId] : null; - const streamFilter = filtersForQuery(streamIds); + // eslint-disable-next-line no-nested-ternary + const streamCategories = streamCategory + ? streamCategory instanceof Array + ? streamCategory + : [streamCategory] + : null; + const queryFilter = newFiltersForQuery(streamIds, streamCategories); const searchFiltersMap: FilterType = searchFilters ? OrderedMap(searchFilters?.map((filter) => [filter.id || uuidv4(), filter])) : OrderedMap(); @@ -47,5 +54,5 @@ export default ( .timerange(timeRange ?? DEFAULT_TIMERANGE) .filters(searchFiltersMap.toList()); - return streamFilter ? builder.filter(streamFilter).build() : builder.build(); + return queryFilter ? builder.filter(queryFilter).build() : builder.build(); }; diff --git a/graylog2-web-interface/src/views/logic/views/UseCreateSavedSearch.ts b/graylog2-web-interface/src/views/logic/views/UseCreateSavedSearch.ts index 95a7705ed66f..57ab09a9872b 100644 --- a/graylog2-web-interface/src/views/logic/views/UseCreateSavedSearch.ts +++ b/graylog2-web-interface/src/views/logic/views/UseCreateSavedSearch.ts @@ -23,16 +23,18 @@ import type Parameter from 'views/logic/parameters/Parameter'; const useCreateSavedSearch = ({ streamId, + streamCategory, timeRange, queryString, parameters, }:{ streamId?: string | string[], + streamCategory?: string | string[], timeRange?: TimeRange, queryString?: ElasticsearchQueryString, parameters?: Array, }) => useMemo( - () => ViewGenerator({ type: View.Type.Search, streamId, timeRange, queryString, parameters }), + () => ViewGenerator({ type: View.Type.Search, streamId, streamCategory, timeRange, queryString, parameters }), // eslint-disable-next-line react-hooks/exhaustive-deps [], ); diff --git a/graylog2-web-interface/src/views/logic/views/UseCreateViewForEvent.ts b/graylog2-web-interface/src/views/logic/views/UseCreateViewForEvent.ts index b34ed9a2bbc4..b2327673b06a 100644 --- a/graylog2-web-interface/src/views/logic/views/UseCreateViewForEvent.ts +++ b/graylog2-web-interface/src/views/logic/views/UseCreateViewForEvent.ts @@ -24,7 +24,7 @@ import type { Event } from 'components/events/events/types'; import type { EventDefinition, SearchFilter } from 'components/event-definitions/event-definitions-types'; import QueryGenerator from 'views/logic/queries/QueryGenerator'; import Search from 'views/logic/search/Search'; -import { matchesDecoratorStream } from 'views/logic/views/ViewStateGenerator'; +import { matchesDecoratorStream, matchesDecoratorStreamCategories } from 'views/logic/views/ViewStateGenerator'; import UpdateSearchForWidgets from 'views/logic/views/UpdateSearchForWidgets'; import ViewState from 'views/logic/views/ViewState'; import { allMessagesTable, resultHistogram } from 'views/logic/Widgets'; @@ -112,12 +112,20 @@ const getSummaryAggregation = ({ aggregations, groupBy }) => { }); }; -export const WidgetsGenerator = async ({ streams, aggregations, groupBy }) => { +export const WidgetsGenerator = async ({ streams, streamCategories, aggregations, groupBy }) => { const decorators = await DecoratorsActions.list(); const byStreamId = matchesDecoratorStream(streams); + const byStreamCategory = matchesDecoratorStreamCategories(streamCategories); const streamDecorators = decorators?.length ? decorators.filter(byStreamId) : []; + const streamCategoryDecorators = decorators?.length ? decorators.filter(byStreamCategory) : []; + // eslint-disable-next-line no-nested-ternary + const allDecorators = streamDecorators.length && streamCategoryDecorators.length + ? [...streamDecorators, ...streamCategoryDecorators] + : streamDecorators.length + ? streamDecorators + : streamCategoryDecorators; const histogram = resultHistogram(); - const messageTable = allMessagesTable(undefined, streamDecorators); + const messageTable = allMessagesTable(undefined, allDecorators); const needsSummaryAggregations = aggregations.length > 1; const SUMMARY_ROW_DELTA = needsSummaryAggregations ? AGGREGATION_WIDGET_HEIGHT : 0; const { aggregationWidgets, aggregationTitles, aggregationPositions } = aggregations.reduce((res, { field, value, expr, fnSeries }, index) => { @@ -159,8 +167,8 @@ export const WidgetsGenerator = async ({ streams, aggregations, groupBy }) => { return { titles, widgets, positions }; }; -export const ViewStateGenerator = async ({ streams, aggregations, groupBy }: {groupBy: Array, streams: string | string[] | undefined, aggregations: Array}) => { - const { titles, widgets, positions } = await WidgetsGenerator({ streams, aggregations, groupBy }); +export const ViewStateGenerator = async ({ streams, streamCategories, aggregations, groupBy }: {groupBy: Array, streams: string | string[] | undefined, streamCategories: string | string[] | undefined, aggregations: Array}) => { + const { titles, widgets, positions } = await WidgetsGenerator({ streams, streamCategories, aggregations, groupBy }); const highlightRules = aggregations?.map(({ fnSeries, value, expr }) => HighlightingRule.create(fnSeries, value, exprToConditionMapper[expr] || 'equal', randomColor())); @@ -175,6 +183,7 @@ export const ViewStateGenerator = async ({ streams, aggregations, groupBy }: {gr export const ViewGenerator = async ({ streams, + streamCategories, timeRange, queryString, aggregations, @@ -183,6 +192,7 @@ export const ViewGenerator = async ({ searchFilters, }: { streams: string | string[] | undefined | null, + streamCategories: string | string[] | undefined | null, timeRange: AbsoluteTimeRange | RelativeTimeRangeStartOnly, queryString: ElasticsearchQueryString, aggregations: Array @@ -190,10 +200,10 @@ export const ViewGenerator = async ({ queryParameters: Array, searchFilters?: Array, }) => { - const query = QueryGenerator(streams, undefined, timeRange, queryString, (searchFilters || [])); + const query = QueryGenerator(streams, streamCategories, undefined, timeRange, queryString, (searchFilters || [])); const search = Search.create().toBuilder().queries([query]).parameters(queryParameters.map((param) => Parameter.fromJSON(param))) .build(); - const viewState = await ViewStateGenerator({ streams, aggregations, groupBy }); + const viewState = await ViewStateGenerator({ streams, streamCategories, aggregations, groupBy }); const view = View.create() .toBuilder() @@ -211,7 +221,7 @@ export const UseCreateViewForEvent = ( ) => { const queryStringFromGrouping = concatQueryStrings(Object.entries(eventData.group_by_fields).map(([field, value]) => `${field}:${escape(value)}`), { withBrackets: false }); const eventQueryString = eventData?.replay_info?.query || ''; - const { streams } = eventData.replay_info; + const { streams, stream_categories: streamCategories } = eventData.replay_info; const timeRange: AbsoluteTimeRange = { type: 'absolute', from: eventData?.replay_info?.timerange_start, @@ -229,7 +239,7 @@ export const UseCreateViewForEvent = ( const searchFilters = eventDefinition.config?.filters; return useMemo( - () => ViewGenerator({ streams, timeRange, queryString, aggregations, groupBy, queryParameters, searchFilters }), + () => ViewGenerator({ streams, streamCategories, timeRange, queryString, aggregations, groupBy, queryParameters, searchFilters }), // eslint-disable-next-line react-hooks/exhaustive-deps [], ); diff --git a/graylog2-web-interface/src/views/logic/views/UseCreateViewForEventDefinition.ts b/graylog2-web-interface/src/views/logic/views/UseCreateViewForEventDefinition.ts index 1f73714cbfa3..cdc10f9355e3 100644 --- a/graylog2-web-interface/src/views/logic/views/UseCreateViewForEventDefinition.ts +++ b/graylog2-web-interface/src/views/logic/views/UseCreateViewForEventDefinition.ts @@ -29,6 +29,7 @@ const useCreateViewForEventDefinition = ( }: { eventDefinition: EventDefinition, aggregations: Array }, ) => { const streams = eventDefinition?.config?.streams ?? []; + const streamCategories = eventDefinition?.config?.stream_categories ?? []; const timeRange: RelativeTimeRangeStartOnly = { type: 'relative', range: (eventDefinition?.config?.search_within_ms ?? 0) / 1000, @@ -45,7 +46,7 @@ const useCreateViewForEventDefinition = ( const searchFilters = eventDefinition?.config?.filters ?? []; return useMemo( - () => ViewGenerator({ streams, timeRange, queryString, aggregations, groupBy, queryParameters, searchFilters }), + () => ViewGenerator({ streams, streamCategories, timeRange, queryString, aggregations, groupBy, queryParameters, searchFilters }), // eslint-disable-next-line react-hooks/exhaustive-deps [], ); diff --git a/graylog2-web-interface/src/views/logic/views/ViewGenerator.ts b/graylog2-web-interface/src/views/logic/views/ViewGenerator.ts index eaca2980b0fb..c5f5aff7193f 100644 --- a/graylog2-web-interface/src/views/logic/views/ViewGenerator.ts +++ b/graylog2-web-interface/src/views/logic/views/ViewGenerator.ts @@ -28,18 +28,20 @@ import QueryGenerator from '../queries/QueryGenerator'; export default async ({ type, streamId, + streamCategory, timeRange, queryString, parameters, }: { type: ViewType, streamId?: string | string[], + streamCategory?: string | string[], timeRange?: TimeRange, queryString?: ElasticsearchQueryString, parameters?: Array, }, ) => { - const query = QueryGenerator(streamId, undefined, timeRange, queryString); + const query = QueryGenerator(streamId, streamCategory, undefined, timeRange, queryString); const search = Search.create().toBuilder().queries([query]).parameters(parameters) .build(); const viewState = await ViewStateGenerator(type, streamId); diff --git a/graylog2-web-interface/src/views/logic/views/ViewStateGenerator.ts b/graylog2-web-interface/src/views/logic/views/ViewStateGenerator.ts index caccab81a59e..ffc69cf1f894 100644 --- a/graylog2-web-interface/src/views/logic/views/ViewStateGenerator.ts +++ b/graylog2-web-interface/src/views/logic/views/ViewStateGenerator.ts @@ -32,10 +32,10 @@ type Result = { positions: { [key: string]: WidgetPosition }, }; -type ViewCreator = (streamId: string | string[] | undefined | null) => Promise; +type ViewCreator = (streamId: string | string[] | undefined | null, streamCategory: string | string[] | undefined | null) => Promise; type DefaultWidgets = Record; -type Decorator = { stream: string | null }; +type Decorator = { stream: string | null, category: string | null }; export const matchesDecoratorStream = (streamId: string | string[] | undefined | null) => { if (!streamId) { @@ -49,13 +49,33 @@ export const matchesDecoratorStream = (streamId: string | string[] | undefined | return ({ stream }: Decorator) => stream === streamId; }; +export const matchesDecoratorStreamCategories = (streamCategory: string | string[] | undefined | null) => { + if (!streamCategory) { + return ({ category }: Decorator) => category === null; + } + + if (streamCategory instanceof Array) { + return ({ category }: Decorator) => streamCategory.includes(category); + } + + return ({ category }: Decorator) => category === streamCategory; +}; + const _defaultWidgets: DefaultWidgets = { - [View.Type.Search]: async (streamId: string | string[] | undefined | null) => { + [View.Type.Search]: async (streamId: string | string[] | undefined | null, streamCategory: string | string[] | undefined | null) => { const decorators = await DecoratorsActions.list(); const byStreamId = matchesDecoratorStream(streamId); + const byStreamCategory = matchesDecoratorStreamCategories(streamCategory); const streamDecorators = decorators ? decorators.filter(byStreamId) : []; + const streamCategoryDecorators = decorators?.length ? decorators.filter(byStreamCategory) : []; + // eslint-disable-next-line no-nested-ternary + const allDecorators = streamDecorators.length && streamCategoryDecorators.length + ? [...streamDecorators, ...streamCategoryDecorators] + : streamDecorators.length + ? streamDecorators + : streamCategoryDecorators; const histogram = resultHistogram(); - const messageTable = allMessagesTable(undefined, streamDecorators); + const messageTable = allMessagesTable(undefined, allDecorators); const widgets = [ histogram, messageTable, @@ -85,8 +105,8 @@ const _defaultWidgets: DefaultWidgets = { }, }; -export default async (type: ViewType, streamId?: string | string[] | undefined) => { - const { titles, widgets, positions } = await _defaultWidgets[type](streamId); +export default async (type: ViewType, streamId?: string | string[] | undefined, streamCategory?: string | string[] | undefined) => { + const { titles, widgets, positions } = await _defaultWidgets[type](streamId, streamCategory); return ViewState.create() .toBuilder() diff --git a/graylog2-web-interface/src/views/pages/NewSearchPage.test.tsx b/graylog2-web-interface/src/views/pages/NewSearchPage.test.tsx index f8a8828b29ff..31c705578d26 100644 --- a/graylog2-web-interface/src/views/pages/NewSearchPage.test.tsx +++ b/graylog2-web-interface/src/views/pages/NewSearchPage.test.tsx @@ -90,6 +90,7 @@ describe('NewSearchPage', () => { parameters: undefined, queryString: undefined, streamId: [], + streamCategory: [], timeRange: undefined, })); }); diff --git a/graylog2-web-interface/src/views/pages/NewSearchPage.tsx b/graylog2-web-interface/src/views/pages/NewSearchPage.tsx index 6b2d20586ced..29a05b414de5 100644 --- a/graylog2-web-interface/src/views/pages/NewSearchPage.tsx +++ b/graylog2-web-interface/src/views/pages/NewSearchPage.tsx @@ -56,8 +56,14 @@ const useParametersFromStore = () => { const NewSearchPage = () => { const { parameters, parameterBindings } = useParametersFromStore(); - const { timeRange, queryString, streams } = useSearchURLQueryParams(); - const viewPromise = useCreateSavedSearch({ streamId: streams, timeRange, queryString, parameters }); + const { timeRange, queryString, streams, streamCategories } = useSearchURLQueryParams(); + const viewPromise = useCreateSavedSearch({ + streamId: streams, + streamCategory: streamCategories, + timeRange, + queryString, + parameters, + }); const view = useCreateSearch(viewPromise); return ; diff --git a/graylog2-web-interface/test/fixtures/createEventDefinitionFromValue.ts b/graylog2-web-interface/test/fixtures/createEventDefinitionFromValue.ts index 6438a86e78a5..61f22737aea5 100644 --- a/graylog2-web-interface/test/fixtures/createEventDefinitionFromValue.ts +++ b/graylog2-web-interface/test/fixtures/createEventDefinitionFromValue.ts @@ -122,7 +122,7 @@ export const negationSearchFilter: SearchFilter = { queryString: 'action: login', negation: true, }; -const query = QueryGenerator([], 'query-id', { +const query = QueryGenerator([], [], 'query-id', { type: 'relative', from: 300, diff --git a/graylog2-web-interface/test/helpers/mocking/EventAndEventDefinitions_mock.ts b/graylog2-web-interface/test/helpers/mocking/EventAndEventDefinitions_mock.ts index 354601fa331e..48aa8a2ac859 100644 --- a/graylog2-web-interface/test/helpers/mocking/EventAndEventDefinitions_mock.ts +++ b/graylog2-web-interface/test/helpers/mocking/EventAndEventDefinitions_mock.ts @@ -50,6 +50,9 @@ export const mockEventData = { streams: [ '002', ], + stream_categories: [ + 'firewall', + ], source_streams: [ '001', ], @@ -66,6 +69,9 @@ export const mockEventData = { streams: [ '001', ], + stream_categories: [ + 'firewall', + ], }, group_by_fields: { field4: 'value4' }, @@ -89,6 +95,9 @@ export const mockEventDefinitionTwoAggregations:EventDefinition = { streams: [ '001', ], + stream_categories: [ + 'firewall', + ], group_by: [ 'field1', 'field2', @@ -214,7 +223,7 @@ export const mockedMappedAggregationNoField: Array = }, ]; const eventData = mockEventData.event; -const query = QueryGenerator(eventData.replay_info.streams, 'query-id', { +const query = QueryGenerator(eventData.replay_info.streams, eventData.replay_info.stream_categories, 'query-id', { type: 'absolute', from: eventData?.replay_info?.timerange_start, to: eventData?.replay_info?.timerange_end, @@ -308,6 +317,11 @@ const searchTwoAggregations = Search.create().toBuilder().id('search-id').querie .toBuilder() .searchTypes(Array(5).fill({ filters: [], + id: undefined, + query: undefined, + stream_categories: undefined, + streams: undefined, + timerange: undefined, type: 'AGGREGATION', typeDefinition: {}, })).build()]) @@ -416,7 +430,7 @@ export const mockedViewWithOneAggregationNoField = View.create() .search(searchOneAggregation) .build(); -const queryED = QueryGenerator(eventData.replay_info.streams, 'query-id', { +const queryED = QueryGenerator(eventData.replay_info.streams, eventData.replay_info.stream_categories, 'query-id', { type: 'relative', range: 60, }, { From 61a7bd7706dad9be3d1e5c5481651a63b4df7297 Mon Sep 17 00:00:00 2001 From: Maxwell <98284293+kodjo-anipah@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:03:48 +0200 Subject: [PATCH 05/26] Register GracefullShutdownHook for BatchedFilteredMessageOutput (#20494) * Register gracefull shutdown hook for BatchedMessageFilterOutputTest.java --- .../outputs/BatchedMessageFilterOutput.java | 20 +++++++++++++++++-- .../BatchedMessageFilterOutputTest.java | 4 ++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/graylog2-server/src/main/java/org/graylog2/outputs/BatchedMessageFilterOutput.java b/graylog2-server/src/main/java/org/graylog2/outputs/BatchedMessageFilterOutput.java index 82f601b758b9..bff29ff53791 100644 --- a/graylog2-server/src/main/java/org/graylog2/outputs/BatchedMessageFilterOutput.java +++ b/graylog2-server/src/main/java/org/graylog2/outputs/BatchedMessageFilterOutput.java @@ -32,6 +32,8 @@ import org.graylog2.plugin.outputs.FilteredMessageOutput; import org.graylog2.plugin.outputs.MessageOutput; import org.graylog2.shared.messageq.MessageQueueAcknowledger; +import org.graylog2.system.shutdown.GracefulShutdownHook; +import org.graylog2.system.shutdown.GracefulShutdownService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +56,7 @@ * registered {@link FilteredMessageOutput} outputs. */ @Singleton -public class BatchedMessageFilterOutput implements MessageOutput { +public class BatchedMessageFilterOutput implements MessageOutput, GracefulShutdownHook { private static final Logger LOG = LoggerFactory.getLogger(BatchedMessageFilterOutput.class); private final Map outputs; @@ -72,8 +74,9 @@ public class BatchedMessageFilterOutput implements MessageOutput { private final MessageQueueAcknowledger acknowledger; private final Meter outputWriteFailures; private final Timer processTime; - private ScheduledFuture flushTask; + private final GracefulShutdownService gracefulShutdownService; private final IndexSetAwareMessageOutputBuffer buffer; + private ScheduledFuture flushTask; @Inject public BatchedMessageFilterOutput(Map outputs, @@ -82,6 +85,7 @@ public BatchedMessageFilterOutput(Map outputs, Cluster cluster, MessageQueueAcknowledger acknowledger, IndexSetAwareMessageOutputBuffer indexSetAwareMessageOutputBuffer, + GracefulShutdownService gracefulShutdownService, @Named("output_flush_interval") int outputFlushInterval, @Named("shutdown_timeout") int shutdownTimeoutMs, @Named("daemonScheduler") ScheduledExecutorService daemonScheduler) { @@ -105,6 +109,7 @@ public BatchedMessageFilterOutput(Map outputs, this.bufferFlushesRequested = metricRegistry.meter(name(this.getClass(), "bufferFlushesRequested")); this.processTime = metricRegistry.timer(name(this.getClass(), "processTime")); this.outputWriteFailures = metricRegistry.meter(name(this.getClass(), "outputWriteFailures")); + this.gracefulShutdownService = gracefulShutdownService; } @Override @@ -119,6 +124,7 @@ public void initialize() throws Exception { LOG.error("Caught exception while trying to flush outputs", e); } }, outputFlushInterval.toMillis(), outputFlushInterval.toMillis(), TimeUnit.MILLISECONDS); + gracefulShutdownService.register(this); } @VisibleForTesting @@ -211,6 +217,16 @@ void cancelFlushTask() { @Override public void stop() { LOG.debug("Stopping output filter"); + doGracefulShutdown(); + try { + gracefulShutdownService.unregister(this); + } catch (IllegalStateException e) { + LOG.debug("Couldn't unregister from graceful shutdown service: {}", e.getMessage()); + } + } + + @Override + public void doGracefulShutdown() { cancelFlushTask(); if (cluster.isConnected() && cluster.isDeflectorHealthy()) { diff --git a/graylog2-server/src/test/java/org/graylog2/outputs/BatchedMessageFilterOutputTest.java b/graylog2-server/src/test/java/org/graylog2/outputs/BatchedMessageFilterOutputTest.java index d420e90154f4..42619f0ce970 100644 --- a/graylog2-server/src/test/java/org/graylog2/outputs/BatchedMessageFilterOutputTest.java +++ b/graylog2-server/src/test/java/org/graylog2/outputs/BatchedMessageFilterOutputTest.java @@ -36,6 +36,7 @@ import org.graylog2.shared.SuppressForbidden; import org.graylog2.shared.bindings.providers.ObjectMapperProvider; import org.graylog2.shared.messageq.MessageQueueAcknowledger; +import org.graylog2.system.shutdown.GracefulShutdownService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -75,6 +76,8 @@ class BatchedMessageFilterOutputTest { private IndexSet indexSet; @Mock(extraInterfaces = MessageOutput.class) private FilteredMessageOutput targetOutput1; + @Mock + private GracefulShutdownService gracefulShutdownService; private static final int MESSAGES_PER_BATCH = 3; @@ -129,6 +132,7 @@ void setUp() { cluster, acknowledger, buffer, + gracefulShutdownService, outputFlushInterval, shutdownTimeoutMs, Executors.newSingleThreadScheduledExecutor() From e50960659d19a071cb0da4a8e0c5cfe356e18ab7 Mon Sep 17 00:00:00 2001 From: maxiadlovskii Date: Fri, 27 Sep 2024 09:40:17 +0200 Subject: [PATCH 06/26] Add specific labels for sizes (#20547) --- .../views/components/TypeSpecificValue.tsx | 5 ++-- .../units/FieldUnitPopover.tsx | 3 ++- ...seChartDataSettingsWithCustomUnits.test.ts | 2 +- .../__tests__/chartLayoutGenerators.test.ts | 12 ++++----- .../utils/__tests__/fixtures.ts | 8 +++--- .../utils/chartLayoutGenerators.ts | 5 ++-- .../utils/formatValueWithUnitLabel.ts | 23 ++++++++++++++++ .../visualizations/utils/getUnitTextLabel.ts | 26 +++++++++++++++++++ 8 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 graylog2-web-interface/src/views/components/visualizations/utils/formatValueWithUnitLabel.ts create mode 100644 graylog2-web-interface/src/views/components/visualizations/utils/getUnitTextLabel.ts diff --git a/graylog2-web-interface/src/views/components/TypeSpecificValue.tsx b/graylog2-web-interface/src/views/components/TypeSpecificValue.tsx index 9bb73bcd44a6..c8e69da191bb 100644 --- a/graylog2-web-interface/src/views/components/TypeSpecificValue.tsx +++ b/graylog2-web-interface/src/views/components/TypeSpecificValue.tsx @@ -28,9 +28,10 @@ import StreamsField from 'views/components/fieldtypes/StreamsField'; import PercentageField from 'views/components/fieldtypes/PercentageField'; import { getPrettifiedValue } from 'views/components/visualizations/utils/unitConverters'; import type FieldUnit from 'views/logic/aggregationbuilder/FieldUnit'; -import { DECIMAL_PLACES, UNIT_FEATURE_FLAG } from 'views/components/visualizations/Constants'; +import { UNIT_FEATURE_FLAG } from 'views/components/visualizations/Constants'; import useFeature from 'hooks/useFeature'; import { MISSING_BUCKET_NAME } from 'views/Constants'; +import formatValueWithUnitLabel from 'views/components/visualizations/utils/formatValueWithUnitLabel'; import EmptyValue from './EmptyValue'; import CustomPropTypes from './CustomPropTypes'; @@ -60,7 +61,7 @@ type TypeSpecificValueProps = { const ValueWithUnitRenderer = ({ value, unit }: { value: number, unit: FieldUnit}) => { const prettified = getPrettifiedValue(value, { abbrev: unit.abbrev, unitType: unit.unitType }); - return {`${Number(prettified?.value).toFixed(DECIMAL_PLACES)} ${prettified.unit.abbrev}`}; + return {formatValueWithUnitLabel(prettified?.value, prettified.unit.abbrev)}; }; const FormattedValue = ({ field, value, truncate, render, unit, type }: TypeSpecificValueProps) => { diff --git a/graylog2-web-interface/src/views/components/aggregationwizard/units/FieldUnitPopover.tsx b/graylog2-web-interface/src/views/components/aggregationwizard/units/FieldUnitPopover.tsx index 172d66dfdb01..ae0f5c9921c5 100644 --- a/graylog2-web-interface/src/views/components/aggregationwizard/units/FieldUnitPopover.tsx +++ b/graylog2-web-interface/src/views/components/aggregationwizard/units/FieldUnitPopover.tsx @@ -27,6 +27,7 @@ import type { Unit } from 'views/components/visualizations/utils/unitConverters' import { mappedUnitsFromJSON as units } from 'views/components/visualizations/utils/unitConverters'; import type { FieldUnitsFormValues } from 'views/types'; import type FieldUnit from 'views/logic/aggregationbuilder/FieldUnit'; +import getUnitTextLabel from 'views/components/visualizations/utils/getUnitTextLabel'; const Container = styled.div` display: flex; @@ -76,7 +77,7 @@ const FieldUnitPopover = ({ field, predefinedUnit }: { field: string, predefined const badgeLabel = useMemo(() => { const curUnit = values?.units?.[field]?.abbrev; - return curUnit || '...'; + return getUnitTextLabel(curUnit) || '...'; }, [field, values?.units]); const predefinedInfo = useMemo(() => { diff --git a/graylog2-web-interface/src/views/components/visualizations/hooks/useChartDataSettingsWithCustomUnits.test.ts b/graylog2-web-interface/src/views/components/visualizations/hooks/useChartDataSettingsWithCustomUnits.test.ts index 75ab81e19e6b..069be0dd14d2 100644 --- a/graylog2-web-interface/src/views/components/visualizations/hooks/useChartDataSettingsWithCustomUnits.test.ts +++ b/graylog2-web-interface/src/views/components/visualizations/hooks/useChartDataSettingsWithCustomUnits.test.ts @@ -97,7 +97,7 @@ describe('useChartDataSettingsWithCustomUnits', () => { fullPath: 'Name2', hovertemplate: '%{text}
%{meta}', meta: 'Name2', - text: ['1.0 Mb', '2.0 Mb', '3.0 Mb'], + text: ['1.0 MB', '2.0 MB', '3.0 MB'], y: [1000000, 2000000, 3000000], yaxis: 'y2', }); diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts index 0439040d1e9d..4b52cf2c8959 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts @@ -212,9 +212,9 @@ describe('Chart Layout Generators', () => { hovertemplate: '%{text}
%{meta}', meta: 'Name2', text: [ - '10.0 b', - '20.0 b', - '30.0 b', + '10.0 B', + '20.0 B', + '30.0 B', ], }); }); @@ -272,9 +272,9 @@ describe('Chart Layout Generators', () => { textinfo: 'percent', meta: 'Name2', text: [ - '10.0 b', - '20.0 b', - '30.0 b', + '10.0 B', + '20.0 B', + '30.0 B', ], }); }); diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts index ce63c09e8a42..bf785bbe4acb 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts @@ -423,10 +423,10 @@ export const layoutsFor4axis = { size: 16, }, ticktext: [ - '130.3 b', - '260.5 b', - '390.8 b', - '521.0 b', + '130.3 B', + '260.5 B', + '390.8 B', + '521.0 B', ], tickvals: [ 130.25, diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts index 5190a65d042e..06c550035f2c 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts @@ -43,6 +43,7 @@ import type { PieHoverTemplateSettings, } from 'views/components/visualizations/hooks/usePieChartDataSettingsWithCustomUnits'; import getDefaultPlotYLayoutSettings from 'views/components/visualizations/utils/getDefaultPlotYLayoutSettings'; +import formatValueWithUnitLabel from 'views/components/visualizations/utils/formatValueWithUnitLabel'; type DefaultAxisKey = 'withoutUnit'; @@ -93,7 +94,7 @@ const getFormatSettingsWithCustomTickVals = (values: Array, fieldType: Fiel const timeBaseUnit = getBaseUnit(fieldType); const prettyValues = tickvals.map((value) => getPrettifiedValue(value, { abbrev: timeBaseUnit.abbrev, unitType: timeBaseUnit.unitType })); - const ticktext = prettyValues.map((prettified) => `${Number(prettified?.value).toFixed(DECIMAL_PLACES)} ${prettified.unit.abbrev}`); + const ticktext = prettyValues.map((prettified) => formatValueWithUnitLabel(prettified?.value, prettified.unit.abbrev)); return ({ tickvals, @@ -317,7 +318,7 @@ const getHoverTexts = ({ convertedValues, unit }: { convertedValues: Array, if (!prettified) return value; - return `${Number(prettified?.value).toFixed(DECIMAL_PLACES)} ${prettified.unit.abbrev}`; + return formatValueWithUnitLabel(prettified?.value, prettified.unit.abbrev); }); export const getHoverTemplateSettings = ({ convertedValues, unit, name }: { diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/formatValueWithUnitLabel.ts b/graylog2-web-interface/src/views/components/visualizations/utils/formatValueWithUnitLabel.ts new file mode 100644 index 000000000000..e45e81d51cad --- /dev/null +++ b/graylog2-web-interface/src/views/components/visualizations/utils/formatValueWithUnitLabel.ts @@ -0,0 +1,23 @@ +/* + * 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 + * . + */ + +import { DECIMAL_PLACES } from 'views/components/visualizations/Constants'; +import getUnitTextLabel from 'views/components/visualizations/utils/getUnitTextLabel'; + +const formatValueWithUnitLabel = (value: number | string, abbrev: string) => `${Number(value).toFixed(DECIMAL_PLACES)} ${getUnitTextLabel(abbrev)}`; + +export default formatValueWithUnitLabel; diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/getUnitTextLabel.ts b/graylog2-web-interface/src/views/components/visualizations/utils/getUnitTextLabel.ts new file mode 100644 index 000000000000..64cd785f0b06 --- /dev/null +++ b/graylog2-web-interface/src/views/components/visualizations/utils/getUnitTextLabel.ts @@ -0,0 +1,26 @@ +/* + * 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 + * . + */ +const labelMapper = { + b: 'B', + kb: 'kB', + Mb: 'MB', + Gb: 'GB', +}; + +const getUnitTextLabel = (abbrev: string) => labelMapper[abbrev] ?? abbrev; + +export default getUnitTextLabel; From 1e0c3e9e2d8a393e0aace1e3a1c59fdf8413f869 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:46:12 +0200 Subject: [PATCH 07/26] Bump org.apache.maven.plugins:maven-archetype-plugin from 3.2.1 to 3.3.0 (#20574) Bumps [org.apache.maven.plugins:maven-archetype-plugin](https://github.com/apache/maven-archetype) from 3.2.1 to 3.3.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.2.1...maven-archetype-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-archetype-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- graylog-plugin-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graylog-plugin-archetype/pom.xml b/graylog-plugin-archetype/pom.xml index 00bc46eecfc8..275f61c36695 100644 --- a/graylog-plugin-archetype/pom.xml +++ b/graylog-plugin-archetype/pom.xml @@ -84,7 +84,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.2.1 + 3.3.0 org.apache.maven.plugins From 842c264c8cec88efa2be2e5bacd7a292fa654ece Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:47:20 +0200 Subject: [PATCH 08/26] Bump byte-buddy.version from 1.15.2 to 1.15.3 (#20573) Bumps `byte-buddy.version` from 1.15.2 to 1.15.3. Updates `net.bytebuddy:byte-buddy` from 1.15.2 to 1.15.3 - [Release notes](https://github.com/raphw/byte-buddy/releases) - [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md) - [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.15.2...byte-buddy-1.15.3) Updates `net.bytebuddy:byte-buddy-agent` from 1.15.2 to 1.15.3 - [Release notes](https://github.com/raphw/byte-buddy/releases) - [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md) - [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.15.2...byte-buddy-1.15.3) --- updated-dependencies: - dependency-name: net.bytebuddy:byte-buddy dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: net.bytebuddy:byte-buddy-agent dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b0297c64b4b6..6a87611e1754 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ 2.6.0 2.2.0 1.78.1 - 1.15.2 + 1.15.3 3.1.8 0.0.1.10 4.8.176 From 91d45b7e6086392cf6ac550183998d73eccafacf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:48:03 +0200 Subject: [PATCH 09/26] Bump org.apache.maven.archetype:archetype-packaging from 3.2.1 to 3.3.0 (#20572) Bumps [org.apache.maven.archetype:archetype-packaging](https://github.com/apache/maven-archetype) from 3.2.1 to 3.3.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.2.1...maven-archetype-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.archetype:archetype-packaging dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- graylog-plugin-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graylog-plugin-archetype/pom.xml b/graylog-plugin-archetype/pom.xml index 275f61c36695..384daf990a09 100644 --- a/graylog-plugin-archetype/pom.xml +++ b/graylog-plugin-archetype/pom.xml @@ -46,7 +46,7 @@ org.apache.maven.archetype archetype-packaging - 3.2.1 + 3.3.0 From 475c89ed2bb9f83e272f50f9035c9dcbfe08bde6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:50:35 +0200 Subject: [PATCH 10/26] Bump nl.jqno.equalsverifier:equalsverifier from 3.16.2 to 3.17 (#20539) Bumps [nl.jqno.equalsverifier:equalsverifier](https://github.com/jqno/equalsverifier) from 3.16.2 to 3.17. - [Release notes](https://github.com/jqno/equalsverifier/releases) - [Changelog](https://github.com/jqno/equalsverifier/blob/main/CHANGELOG.md) - [Commits](https://github.com/jqno/equalsverifier/compare/equalsverifier-3.16.2...equalsverifier-3.17) --- updated-dependencies: - dependency-name: nl.jqno.equalsverifier:equalsverifier dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bernd Ahlers --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a87611e1754..70c88c337528 100644 --- a/pom.xml +++ b/pom.xml @@ -191,7 +191,7 @@ 3.26.3 2.2.0 4.2.2 - 3.16.2 + 3.17 1.5 4.13.2 5.11.1 From 058ed1d2a7b06b7e56bea55d486402deb50ef77a Mon Sep 17 00:00:00 2001 From: Linus Pahl <46300478+linuspahl@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:57:58 +0200 Subject: [PATCH 11/26] Use provided with for heatmap visualization container. (#20559) --- .../visualizations/heatmap/HeatmapVisualization.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/graylog2-web-interface/src/views/components/visualizations/heatmap/HeatmapVisualization.tsx b/graylog2-web-interface/src/views/components/visualizations/heatmap/HeatmapVisualization.tsx index 1cf7577efd1a..3ecc5f6f14f3 100644 --- a/graylog2-web-interface/src/views/components/visualizations/heatmap/HeatmapVisualization.tsx +++ b/graylog2-web-interface/src/views/components/visualizations/heatmap/HeatmapVisualization.tsx @@ -34,8 +34,9 @@ import useMapKeys from 'views/components/visualizations/useMapKeys'; import type { ChartDefinition, ExtractedSeries, ValuesBySeries, Generator } from '../ChartData'; import GenericPlot from '../GenericPlot'; -const Container = styled.div<{ $height: number }>(({ $height }) => css` +const Container = styled.div<{ $height: number, $width: number }>(({ $height, $width }) => css` height: ${$height ? `${$height}px` : '100%'}; + width: ${$width ? `${$width}px` : '100%'}; `); const _generateSeriesTitles = (config, x, y) => { @@ -156,7 +157,7 @@ const _chartLayout = (heatmapData: ChartDefinition[]) => { const _leafSourceMatcher = ({ source }: { source: string }) => source.endsWith('leaf') && source !== 'row-leaf'; -const HeatmapVisualization = makeVisualization(({ config, data, height }: VisualizationComponentProps) => { +const HeatmapVisualization = makeVisualization(({ config, data, height, width }: VisualizationComponentProps) => { const theme = useTheme(); const visualizationConfig = (config.visualizationConfig ?? HeatmapVisualizationConfig.empty()) as HeatmapVisualizationConfig; const rows = retrieveChartData(data); @@ -171,7 +172,7 @@ const HeatmapVisualization = makeVisualization(({ config, data, height }: Visual const layout = _chartLayout(heatmapData); return ( - + ); From 9588bed3bac2a4fe684eddea2b3c81c70ac06f05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 14:00:31 +0200 Subject: [PATCH 12/26] Bump mongodb-driver.version from 5.1.4 to 5.2.0 (#20538) Bumps `mongodb-driver.version` from 5.1.4 to 5.2.0. Updates `org.mongodb:mongodb-driver-sync` from 5.1.4 to 5.2.0 - [Release notes](https://github.com/mongodb/mongo-java-driver/releases) - [Commits](https://github.com/mongodb/mongo-java-driver/compare/r5.1.4...r5.2.0) Updates `org.mongodb:mongodb-driver-legacy` from 5.1.4 to 5.2.0 - [Release notes](https://github.com/mongodb/mongo-java-driver/releases) - [Commits](https://github.com/mongodb/mongo-java-driver/compare/r5.1.4...r5.2.0) --- updated-dependencies: - dependency-name: org.mongodb:mongodb-driver-sync dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.mongodb:mongodb-driver-legacy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bernd Ahlers --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 70c88c337528..1d4ca89ede3f 100644 --- a/pom.xml +++ b/pom.xml @@ -151,7 +151,7 @@ 2.24.0 9.11.1 4.2.27 - 5.1.4 + 5.2.0 4.11.0 0.13 4.1.113.Final From 0980755bb84b50855603083c6033e2581757f4eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:23:08 +0200 Subject: [PATCH 13/26] Bump @types/react in /graylog2-web-interface/packages/graylog-web-plugin (#20583) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.3.9 to 18.3.10. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- graylog2-web-interface/packages/graylog-web-plugin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graylog2-web-interface/packages/graylog-web-plugin/package.json b/graylog2-web-interface/packages/graylog-web-plugin/package.json index fe28f4c0695e..c50e28cc0740 100644 --- a/graylog2-web-interface/packages/graylog-web-plugin/package.json +++ b/graylog2-web-interface/packages/graylog-web-plugin/package.json @@ -33,7 +33,7 @@ "@tanstack/react-query": "4.36.1", "@types/create-react-class": "15.6.8", "@types/jquery": "3.5.31", - "@types/react": "18.3.9", + "@types/react": "18.3.10", "babel-preset-graylog": "file:../babel-preset-graylog", "create-react-class": "15.7.0", "eslint-config-graylog": "file:../eslint-config-graylog", From 7ece1673c844267cb423a1bd53ea8e183c754ab1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:23:18 +0200 Subject: [PATCH 14/26] Bump eslint-plugin-react (#20584) Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.36.1 to 7.37.0. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.36.1...v7.37.0) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../packages/eslint-config-graylog/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graylog2-web-interface/packages/eslint-config-graylog/package.json b/graylog2-web-interface/packages/eslint-config-graylog/package.json index 7a357e9c06e3..c4a75dc13227 100644 --- a/graylog2-web-interface/packages/eslint-config-graylog/package.json +++ b/graylog2-web-interface/packages/eslint-config-graylog/package.json @@ -27,7 +27,7 @@ "eslint-plugin-jest-dom": "5.4.0", "eslint-plugin-jest-formatting": "3.1.0", "eslint-plugin-jsx-a11y": "6.10.0", - "eslint-plugin-react": "7.36.1", + "eslint-plugin-react": "7.37.0", "eslint-plugin-react-hooks": "4.6.2", "eslint-plugin-testing-library": "6.3.0" } From a90d18828135706a757e3e43c66db1e8572258c7 Mon Sep 17 00:00:00 2001 From: maxiadlovskii Date: Mon, 30 Sep 2024 08:24:58 +0200 Subject: [PATCH 15/26] Do not use retry in use-query on 4xx failure statuses (#20534) * Do not use retry in use-query on 4xx failure statuses * Do not use retry in use-query on 4xx failure statuses * Add requested changes --- .../src/contexts/DefaultQueryClientProvider.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/graylog2-web-interface/src/contexts/DefaultQueryClientProvider.tsx b/graylog2-web-interface/src/contexts/DefaultQueryClientProvider.tsx index 01c0a029c83d..f944630e4320 100644 --- a/graylog2-web-interface/src/contexts/DefaultQueryClientProvider.tsx +++ b/graylog2-web-interface/src/contexts/DefaultQueryClientProvider.tsx @@ -30,6 +30,11 @@ const defaultOptions = { queries: { refetchOnWindowFocus: false, networkMode: 'always' as const, + retry: (failureCount, error) => { + if (error.status >= 400 && error.status < 500) return false; + + return failureCount < 4; + }, }, }, }; From 206c6b34d67a28d91fa77f68d0df56b5d6140046 Mon Sep 17 00:00:00 2001 From: Linus Pahl <46300478+linuspahl@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:25:36 +0200 Subject: [PATCH 16/26] Fix documentation link target for search query errors. (#20563) * Fix documentation link target for search query errors. * Improve changelog. --- changelog/unreleased/issue-13822.toml | 9 ++++++++ graylog2-web-interface/src/util/DocsHelper.ts | 7 +------ .../queryvalidation/QueryValidation.test.tsx | 2 +- .../queryvalidation/QueryValidation.tsx | 21 +++---------------- 4 files changed, 14 insertions(+), 25 deletions(-) create mode 100644 changelog/unreleased/issue-13822.toml diff --git a/changelog/unreleased/issue-13822.toml b/changelog/unreleased/issue-13822.toml new file mode 100644 index 000000000000..f08c6cd742a6 --- /dev/null +++ b/changelog/unreleased/issue-13822.toml @@ -0,0 +1,9 @@ +type = "fixed" +message = "Fix link target for search query error documentation links." + +issues = ["13822"] +pulls = ["20563"] + +details.user = """ +The documentation link now points to the error types section again, instead of just the search query page. +""" diff --git a/graylog2-web-interface/src/util/DocsHelper.ts b/graylog2-web-interface/src/util/DocsHelper.ts index 1ca7073de119..39b03e56224e 100644 --- a/graylog2-web-interface/src/util/DocsHelper.ts +++ b/graylog2-web-interface/src/util/DocsHelper.ts @@ -50,12 +50,7 @@ const docsHelper = { PIPELINES: 'pipelines', REPORTING: 'reporting', ROLLING_ES_UPGRADE: 'rolling-es-upgrade', - SEARCH_QUERY_ERRORS: { - UNKNOWN_FIELD: 'query-language#unknown-field', - QUERY_PARSING_ERROR: 'query-language#parse-exception', - INVALID_OPERATOR: 'query-language#invalid-operator', - UNDECLARED_PARAMETER: 'query-language#undeclared-parameter', - }, + SEARCH_QUERY_ERRORS: 'query-language#ErrorTypes', SEARCH_QUERY_LANGUAGE: 'query-language', STREAMS: 'streams', STREAM_PROCESSING_RUNTIME_LIMITS: 'streams#stream-processing-runtime-limits', diff --git a/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.test.tsx b/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.test.tsx index 7300b2ac78b0..7ec570c9c1f7 100644 --- a/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.test.tsx +++ b/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.test.tsx @@ -86,7 +86,7 @@ describe('QueryValidation', () => { await openExplanation(); await screen.findByText('Parse Exception'); - await screen.findByTitle('Parse Exception documentation'); + await screen.findByTitle('Query error documentation'); }); it('renders pluggable validation explanation', async () => { diff --git a/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.tsx b/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.tsx index eba568b6ce5a..c8f7e00d8c0b 100644 --- a/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.tsx +++ b/graylog2-web-interface/src/views/components/searchbar/queryvalidation/QueryValidation.tsx @@ -146,21 +146,6 @@ const useTriggerIfErrorsPersist = (trigger: () => void) => { return [showExplanation, toggleShow] as const; }; -const getErrorDocumentationLink = (errorType: string) => { - switch (errorType) { - case 'UNKNOWN_FIELD': - return DocsHelper.PAGES.SEARCH_QUERY_ERRORS.UNKNOWN_FIELD; - case 'QUERY_PARSING_ERROR': - return DocsHelper.PAGES.SEARCH_QUERY_ERRORS.QUERY_PARSING_ERROR; - case 'INVALID_OPERATOR': - return DocsHelper.PAGES.SEARCH_QUERY_ERRORS.INVALID_OPERATOR; - case 'UNDECLARED_PARAMETER': - return DocsHelper.PAGES.SEARCH_QUERY_ERRORS.UNDECLARED_PARAMETER; - default: - return DocsHelper.PAGES.SEARCH_QUERY_LANGUAGE; - } -}; - type QueryForm = { queryString: QueryValidationState, }; @@ -230,9 +215,9 @@ const QueryValidation = () => { {errorTitle}: {errorMessage} {errorType && ( - } /> + } /> )} ))} From b3249acf87e97694d1a3362a0ffee4bfd5fb6b80 Mon Sep 17 00:00:00 2001 From: maxiadlovskii Date: Mon, 30 Sep 2024 08:26:38 +0200 Subject: [PATCH 17/26] Add ticklabelposition parameter to the 4th axis (#20565) * Add ticklabelposition parameter to the 4th axis * fix tests --- .../visualizations/utils/__tests__/fixtures.ts | 1 + .../utils/chartLayoutGenerators.ts | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts index bf785bbe4acb..255c44104348 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/fixtures.ts @@ -480,6 +480,7 @@ export const layoutsFor4axis = { size: 16, }, tickformat: ',~r', + ticklabelposition: 'inside', title: { font: { color: '#fff', diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts index 06c550035f2c..258ae204d17f 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts @@ -65,17 +65,20 @@ const getYAxisSide = (axisCount: number) => { return 'left'; }; +const getTicklabelPositionSettings = (axisCount: number) => { + switch (axisCount) { + case 4: + return ({ ticklabelposition: 'inside' }); + default: + return ({}); + } +}; + const getYAxisPositioningSettings = (axisCount: number) => ({ position: getYAxisPosition(axisCount), side: getYAxisSide(axisCount), overlaying: axisCount > 1 ? 'y' : undefined, - // ticklabelposition: 'outside left', - /* - standoff: 20, - tickson: 'boundaries', - tickangle: -45, - - */ + ...getTicklabelPositionSettings(axisCount), }); const defaultSettings = { From 8d986d8e0d5117f12bc9639c62d31fe85208aa59 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:49:40 +0200 Subject: [PATCH 18/26] Running lint --fix (#20517) Co-authored-by: Dr. Lint-a-lot --- graylog2-web-interface/src/components/search/MessageShow.jsx | 2 -- .../src/views/components/visualizations/PlotLegend.tsx | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/graylog2-web-interface/src/components/search/MessageShow.jsx b/graylog2-web-interface/src/components/search/MessageShow.jsx index 063bb7d3869c..036343ae982f 100644 --- a/graylog2-web-interface/src/components/search/MessageShow.jsx +++ b/graylog2-web-interface/src/components/search/MessageShow.jsx @@ -51,8 +51,6 @@ class MessageShow extends React.Component { this.setState(getImmutableProps(nextProps)); } - // eslint-disable-next-line class-methods-use-this - renderForDisplay = (fieldName) => { // No highlighting for the message details view. const { message } = this.props; diff --git a/graylog2-web-interface/src/views/components/visualizations/PlotLegend.tsx b/graylog2-web-interface/src/views/components/visualizations/PlotLegend.tsx index 8b3c19cfa5e4..1b0a3954c600 100644 --- a/graylog2-web-interface/src/views/components/visualizations/PlotLegend.tsx +++ b/graylog2-web-interface/src/views/components/visualizations/PlotLegend.tsx @@ -57,8 +57,7 @@ const VariableContainer = styled.div<{ $height: number, $width: number }>(({ $he width: ${$width}px; grid-template-columns: ${$width}px; grid-template-rows: ${$height}px auto; - grid-column-gap: 0; - grid-row-gap: 0; + grid-gap: 0; justify-content: center; `); From f5f99de30a1a4ccead6b5a73330a5094fd97d45c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:50:10 +0200 Subject: [PATCH 19/26] Updating yarn lockfile (#20504) Co-authored-by: Gary Bot --- graylog2-web-interface/yarn.lock | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/graylog2-web-interface/yarn.lock b/graylog2-web-interface/yarn.lock index be429c58dbb2..b9beca2c21ff 100644 --- a/graylog2-web-interface/yarn.lock +++ b/graylog2-web-interface/yarn.lock @@ -3485,10 +3485,10 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/jquery@3.5.30": - version "3.5.30" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.30.tgz#888d584cbf844d3df56834b69925085038fd80f7" - integrity sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A== +"@types/jquery@3.5.31": + version "3.5.31" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.31.tgz#3605df86427f6c4e6b5b5a470ba180f74107cffa" + integrity sha512-rf/iB+cPJ/YZfMwr+FVuQbm7IaWC4y3FVYfVDxRGqmUCFjjPII0HWaP0vTPJGp6m4o13AXySCcMbWfrWtBFAKw== dependencies: "@types/sizzle" "*" @@ -3719,7 +3719,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@18.0.28", "@types/react@18.3.7", "@types/react@^16", "@types/react@^16.9.11", "@types/react@^16.9.9": +"@types/react@*", "@types/react@18.0.28", "@types/react@18.3.9", "@types/react@^16", "@types/react@^16.9.11", "@types/react@^16.9.9": version "18.0.28" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== @@ -7541,7 +7541,7 @@ eslint-config-airbnb@19.0.4: eslint-config-airbnb "19.0.4" eslint-import-resolver-webpack "0.13.9" eslint-plugin-compat "4.2.0" - eslint-plugin-graylog "file:packages/eslint-plugin-graylog" + eslint-plugin-graylog "file:../../../../.cache/yarn/v6/npm-eslint-config-graylog-1.3.0-f81c3c5d-7cbe-4321-a8cf-584c166f59fe-1727656130875/node_modules/eslint-plugin-graylog" eslint-plugin-import "2.25.3" eslint-plugin-jest "28.8.3" eslint-plugin-jest-dom "5.4.0" @@ -9025,15 +9025,15 @@ graphemer@^1.4.0: "@graylog/sawmill" "2.0.23" "@tanstack/react-query" "4.36.1" "@types/create-react-class" "15.6.8" - "@types/jquery" "3.5.30" - "@types/react" "18.3.7" - babel-preset-graylog "file:packages/babel-preset-graylog" + "@types/jquery" "3.5.31" + "@types/react" "18.3.9" + babel-preset-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-6.1.0-SNAPSHOT-2e663193-caa1-469c-b2ae-f4881ee53cf8-1727656130702/node_modules/babel-preset-graylog" create-react-class "15.7.0" - eslint-config-graylog "file:packages/eslint-config-graylog" + eslint-config-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-6.1.0-SNAPSHOT-2e663193-caa1-469c-b2ae-f4881ee53cf8-1727656130702/node_modules/eslint-config-graylog" formik "2.4.6" history "^5.3.0" html-webpack-plugin "^5.5.0" - jest-preset-graylog "file:packages/jest-preset-graylog" + jest-preset-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-6.1.0-SNAPSHOT-2e663193-caa1-469c-b2ae-f4881ee53cf8-1727656130702/node_modules/jest-preset-graylog" jquery "3.7.1" moment "2.30.1" moment-timezone "0.5.45" @@ -9046,7 +9046,7 @@ graphemer@^1.4.0: styled-components "6.1.1" typescript "5.6.2" use-query-params "^2.2.0" - webpack "5.94.0" + webpack "5.95.0" webpack-cli "5.1.4" webpack-merge "4.2.2" @@ -16695,10 +16695,10 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.94.0: - version "5.94.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== +webpack@5.95.0: + version "5.95.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" + integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== dependencies: "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" From 01e6563faa9225bb1fe1be83ae74edbd7bb6a61b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 09:24:15 +0200 Subject: [PATCH 20/26] Bump the typescript-eslint group across 1 directory with 2 updates (#20520) Bumps the typescript-eslint group with 2 updates in the /graylog2-web-interface/packages/eslint-config-graylog directory: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser). Updates `@typescript-eslint/eslint-plugin` from 7.16.1 to 8.7.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.7.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 7.16.1 to 8.7.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.7.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:production update-type: version-update:semver-major dependency-group: typescript-eslint - dependency-name: "@typescript-eslint/parser" dependency-type: direct:production update-type: version-update:semver-major dependency-group: typescript-eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../packages/eslint-config-graylog/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graylog2-web-interface/packages/eslint-config-graylog/package.json b/graylog2-web-interface/packages/eslint-config-graylog/package.json index c4a75dc13227..14bc810cb556 100644 --- a/graylog2-web-interface/packages/eslint-config-graylog/package.json +++ b/graylog2-web-interface/packages/eslint-config-graylog/package.json @@ -15,8 +15,8 @@ "dependencies": { "@babel/eslint-parser": "7.16.5", "@tanstack/eslint-plugin-query": "4.36.1", - "@typescript-eslint/eslint-plugin": "7.16.1", - "@typescript-eslint/parser": "7.16.1", + "@typescript-eslint/eslint-plugin": "8.7.0", + "@typescript-eslint/parser": "8.7.0", "eslint": "8.57.0", "eslint-config-airbnb": "19.0.4", "eslint-import-resolver-webpack": "0.13.9", From f5114593b6126f4c119f6208911747f1f796d5e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:00:56 +0200 Subject: [PATCH 21/26] Bump com.mebigfatguy.fb-contrib:fb-contrib from 7.6.4 to 7.6.5 (#20582) Bumps [com.mebigfatguy.fb-contrib:fb-contrib](https://github.com/mebigfatguy/fb-contrib) from 7.6.4 to 7.6.5. - [Commits](https://github.com/mebigfatguy/fb-contrib/compare/v7.6.4...v7.6.5) --- updated-dependencies: - dependency-name: com.mebigfatguy.fb-contrib:fb-contrib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- graylog-project-parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graylog-project-parent/pom.xml b/graylog-project-parent/pom.xml index 2b55cd648d99..3169bb086ab0 100644 --- a/graylog-project-parent/pom.xml +++ b/graylog-project-parent/pom.xml @@ -614,7 +614,7 @@ com.mebigfatguy.fb-contrib fb-contrib - 7.6.4 + 7.6.5 From 7ba035b83c8ca42f1b51c801b7aca18076b6082f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:02:29 +0200 Subject: [PATCH 22/26] Bump com.github.oshi:oshi-core from 6.6.4 to 6.6.5 (#20580) Bumps [com.github.oshi:oshi-core](https://github.com/oshi/oshi) from 6.6.4 to 6.6.5. - [Release notes](https://github.com/oshi/oshi/releases) - [Changelog](https://github.com/oshi/oshi/blob/master/CHANGELOG.md) - [Commits](https://github.com/oshi/oshi/compare/oshi-parent-6.6.4...oshi-parent-6.6.5) --- updated-dependencies: - dependency-name: com.github.oshi:oshi-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d4ca89ede3f..a4bc2ff665ae 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,7 @@ 2.0.1 2.3 1.1.10.7 - 6.6.4 + 6.6.5 1.5.2 2.0.16 0.8.3 From 0f00a8483188b8f553063012c85e40c00e7c48cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:03:24 +0200 Subject: [PATCH 23/26] Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.6 to 3.2.7 (#20579) Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.6 to 3.2.7. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.6...maven-gpg-plugin-3.2.7) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4bc2ff665ae..c51df729e5c3 100644 --- a/pom.xml +++ b/pom.xml @@ -594,7 +594,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.2.6 + 3.2.7 org.apache.maven.plugins From 1a1d7f4c68810abea963fd5e5b51ec65f12b1c1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:04:14 +0200 Subject: [PATCH 24/26] Bump org.apache.logging.log4j:log4j-bom from 2.24.0 to 2.24.1 (#20578) Bumps [org.apache.logging.log4j:log4j-bom](https://github.com/apache/logging-log4j2) from 2.24.0 to 2.24.1. - [Release notes](https://github.com/apache/logging-log4j2/releases) - [Changelog](https://github.com/apache/logging-log4j2/blob/2.x/RELEASE-NOTES.adoc) - [Commits](https://github.com/apache/logging-log4j2/compare/rel/2.24.0...rel/2.24.1) --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c51df729e5c3..ec7fc65d4dc7 100644 --- a/pom.xml +++ b/pom.xml @@ -148,7 +148,7 @@ 2.9.0 3.8.0 0.9.0.1-7 - 2.24.0 + 2.24.1 9.11.1 4.2.27 5.2.0 From a3be42bb53fd12d6b373b4e47fad6131ecb5f458 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:05:50 +0200 Subject: [PATCH 25/26] Bump org.mockito:mockito-bom from 5.13.0 to 5.14.0 (#20576) Bumps [org.mockito:mockito-bom](https://github.com/mockito/mockito) from 5.13.0 to 5.14.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.13.0...v5.14.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ec7fc65d4dc7..77d18f14e487 100644 --- a/pom.xml +++ b/pom.xml @@ -195,7 +195,7 @@ 1.5 4.13.2 5.11.1 - 5.13.0 + 5.14.0 5.5.0 1.19.0 1.20.1 From 8e00cd1594b13d43ba235bb45d752197c49e571f Mon Sep 17 00:00:00 2001 From: Jan Heise Date: Mon, 30 Sep 2024 11:19:01 +0200 Subject: [PATCH 26/26] Setting the log level to warn for the given class as it's to chatty for our log on info level (#20585) --- graylog2-server/src/main/resources/log4j2.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/graylog2-server/src/main/resources/log4j2.xml b/graylog2-server/src/main/resources/log4j2.xml index bd20c13bb3e9..779fcc58b929 100644 --- a/graylog2-server/src/main/resources/log4j2.xml +++ b/graylog2-server/src/main/resources/log4j2.xml @@ -38,6 +38,7 @@ +