From 47d42e6a5754e28171ab528b25f759358799be76 Mon Sep 17 00:00:00 2001 From: Shaheer Kochai Date: Tue, 10 Sep 2024 17:06:17 +0430 Subject: [PATCH] feat: apply resource filters on coming from service details to traces page (#5827) * feat: apply resource fitlers on coming from service details to traces page * fix: remove value splitting from resourceAttributesToTracesFilterItems * chore: handle 'Not IN' inside resourceAttributesToTracesFilterItems * fix: add resource attributes filter to useGetAPMToTracesQueries * fix: update query on changing resource attributes queries --- .../container/MetricsApplication/Tabs/util.ts | 13 ++++++++- .../MetricsApplication/TopOperationsTable.tsx | 28 ++++++++++--------- .../src/hooks/useResourceAttribute/utils.ts | 16 +++++++++++ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/frontend/src/container/MetricsApplication/Tabs/util.ts b/frontend/src/container/MetricsApplication/Tabs/util.ts index 6832fe9d02..3e4dbeceb4 100644 --- a/frontend/src/container/MetricsApplication/Tabs/util.ts +++ b/frontend/src/container/MetricsApplication/Tabs/util.ts @@ -4,6 +4,8 @@ import ROUTES from 'constants/routes'; import { routeConfig } from 'container/SideNav/config'; import { getQueryString } from 'container/SideNav/helper'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; +import useResourceAttribute from 'hooks/useResourceAttribute'; +import { resourceAttributesToTracesFilterItems } from 'hooks/useResourceAttribute/utils'; import history from 'lib/history'; import { traceFilterKeys } from 'pages/TracesExplorer/Filter/filterUtils'; import { Dispatch, SetStateAction, useMemo } from 'react'; @@ -142,7 +144,12 @@ export function useGetAPMToTracesQueries({ filters?: TagFilterItem[]; }): Query { const { updateAllQueriesOperators } = useQueryBuilder(); + const { queries } = useResourceAttribute(); + const resourceAttributesFilters = useMemo( + () => resourceAttributesToTracesFilterItems(queries), + [queries], + ); const finalFilters: TagFilterItem[] = []; let spanKindFilter: TagFilterItem; let dbCallFilter: TagFilterItem; @@ -185,6 +192,10 @@ export function useGetAPMToTracesQueries({ finalFilters.push(...filters); } + if (resourceAttributesFilters?.length) { + finalFilters.push(...resourceAttributesFilters); + } + return useMemo(() => { const updatedQuery = updateAllQueriesOperators( initialQueriesMap.traces, @@ -199,5 +210,5 @@ export function useGetAPMToTracesQueries({ finalFilters, ); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [servicename, updateAllQueriesOperators]); + }, [servicename, queries, updateAllQueriesOperators]); } diff --git a/frontend/src/container/MetricsApplication/TopOperationsTable.tsx b/frontend/src/container/MetricsApplication/TopOperationsTable.tsx index d897c8a205..da90045b6e 100644 --- a/frontend/src/container/MetricsApplication/TopOperationsTable.tsx +++ b/frontend/src/container/MetricsApplication/TopOperationsTable.tsx @@ -50,19 +50,21 @@ function TopOperationsTable({ const { servicename: encodedServiceName } = params; const servicename = decodeURIComponent(encodedServiceName); - const opFilter: TagFilterItem = { - id: uuid().slice(0, 8), - key: { - key: 'name', - dataType: DataTypes.String, - type: 'tag', - isColumn: true, - isJSON: false, - id: 'name--string--tag--true', + const opFilters: TagFilterItem[] = [ + { + id: uuid().slice(0, 8), + key: { + key: 'name', + dataType: DataTypes.String, + type: 'tag', + isColumn: true, + isJSON: false, + id: 'name--string--tag--true', + }, + op: 'in', + value: [operation], }, - op: 'in', - value: [operation], - }; + ]; const preparedQuery: Query = { ...apmToTraceQuery, @@ -72,7 +74,7 @@ function TopOperationsTable({ ...item, filters: { ...item.filters, - items: [...item.filters.items, opFilter], + items: [...item.filters.items, ...opFilters], }, })), }, diff --git a/frontend/src/hooks/useResourceAttribute/utils.ts b/frontend/src/hooks/useResourceAttribute/utils.ts index 77fdddfbea..4dd8c56563 100644 --- a/frontend/src/hooks/useResourceAttribute/utils.ts +++ b/frontend/src/hooks/useResourceAttribute/utils.ts @@ -93,6 +93,22 @@ export const resourceAttributesToTagFilterItems = ( value: `${res.tagValue}`.split(','), })); }; +/* Convert resource attributes to trace filters items for queryBuilder */ +export const resourceAttributesToTracesFilterItems = ( + queries: IResourceAttribute[], +): TagFilterItem[] => + queries.map((res) => ({ + id: `${res.id}`, + key: { + key: convertMetricKeyToTrace(res.tagKey), + isColumn: false, + type: MetricsType.Resource, + dataType: DataTypes.String, + id: `${convertMetricKeyToTrace(res.tagKey)}--string--resource--true`, + }, + op: `${res.operator === 'Not IN' ? 'nin' : res.operator}`, + value: res.tagValue, + })); export const OperatorSchema: IOption[] = OperatorConversions.map( (operator) => ({