Compare commits

...

2 Commits

Author SHA1 Message Date
aks07
df154380c9 fix(quickfiltertypes): drop trace_id from default traces quick filters 2026-10-19 16:29:34 +05:30
aks07
b6a2e06ec6 fix(quick-filters): hide trace_id and span_id from quick filters
Every trace and span ID is unique, so a value list has nothing to pick from.
The filter matches on name, so every field context is hidden.
Saved configs drop them on read, so no migration is needed.
2026-10-19 16:29:29 +05:30
5 changed files with 83 additions and 4 deletions

View File

@@ -3,7 +3,10 @@ import { Button, Skeleton } from 'antd';
import { TelemetrytypesSourceDTO } from 'api/generated/services/sigNoz.schemas';
import { FieldKeysConfig } from 'api/querySuggestions/types';
import OverlayScrollbar from 'components/OverlayScrollbar/OverlayScrollbar';
import { SIGNAL_DATA_SOURCE_MAP } from 'components/QuickFilters/QuickFiltersSettings/constants';
import {
EXCLUDED_QUICK_FILTER_NAMES,
SIGNAL_DATA_SOURCE_MAP,
} from 'components/QuickFilters/QuickFiltersSettings/constants';
import { SignalType } from 'components/QuickFilters/types';
import { buildCompositeKey } from 'container/OptionsMenu/utils';
import { useFieldKeysSuggestion } from 'hooks/querySuggestions/useFieldKeysSuggestion';
@@ -80,7 +83,11 @@ function OtherFilters({
buildCompositeKey(filter.name, filter.fieldContext, filter.fieldDataType),
),
);
return suggestions.filter((attr) => !addedKeys.has(attr.key as string));
return suggestions.filter(
(attr) =>
!addedKeys.has(attr.key as string) &&
!EXCLUDED_QUICK_FILTER_NAMES.has(attr.name),
);
}, [fetchedKeys, addedFilters]);
const handleAddFilter = (filter: TelemetryFieldKey): void => {

View File

@@ -9,3 +9,8 @@ export const SIGNAL_DATA_SOURCE_MAP = {
[SignalType.METER_EXPLORER]: DataSource.METRICS,
[SignalType.AI_OBSERVABILITY]: DataSource.TRACES,
};
export const EXCLUDED_QUICK_FILTER_NAMES: ReadonlySet<string> = new Set([
'trace_id',
'span_id',
]);

View File

@@ -1,5 +1,6 @@
import { useMemo } from 'react';
import { useGetQuickFilters } from 'api/generated/services/quick-filter';
import { EXCLUDED_QUICK_FILTER_NAMES } from 'components/QuickFilters/QuickFiltersSettings/constants';
import { TelemetryFieldKey } from 'types/api/v5/queryRange';
import { IQuickFiltersConfig, SignalType } from '../types';
@@ -31,7 +32,10 @@ const useFilterConfig = ({
);
const customFilters = useMemo<TelemetryFieldKey[]>(
() => (data?.data?.filters ?? []) as TelemetryFieldKey[],
() =>
((data?.data?.filters ?? []) as TelemetryFieldKey[]).filter(
(filter) => !EXCLUDED_QUICK_FILTER_NAMES.has(filter.name),
),
[data],
);

View File

@@ -395,6 +395,70 @@ describe('Quick Filters with custom filters', () => {
});
});
it('hides trace_id and span_id from saved and suggested filters', async () => {
const user = userEvent.setup({ pointerEventsCheck: 0 });
server.use(
rest.get(quickFiltersListURL, (_req, res, ctx) =>
res(
ctx.status(200),
ctx.json({
...quickFiltersListResponse,
data: {
...quickFiltersListResponse.data,
filters: [
...quickFiltersListResponse.data.filters,
{ name: 'trace_id', fieldDataType: 'string', fieldContext: 'span' },
],
},
}),
),
),
rest.get(quickFiltersSuggestionsURL, (_req, res, ctx) =>
res(
ctx.status(200),
ctx.json({
status: 'success',
data: {
complete: true,
keys: {
[FILTER_K8S_DEPLOYMENT_NAME]: [
{
name: FILTER_K8S_DEPLOYMENT_NAME,
fieldContext: 'resource',
fieldDataType: 'string',
},
],
trace_id: [
{ name: 'trace_id', fieldContext: 'log', fieldDataType: 'string' },
{
name: 'trace_id',
fieldContext: 'attribute',
fieldDataType: 'string',
},
],
span_id: [
{ name: 'span_id', fieldContext: 'log', fieldDataType: 'string' },
],
},
},
}),
),
),
);
render(<TestQuickFilters signal={SIGNAL} />);
await screen.findByText(FILTER_SERVICE_NAME);
expect(screen.queryByText('Trace Id')).not.toBeInTheDocument();
const icon = await screen.findByTestId(SETTINGS_ICON_TEST_ID);
const settingsButton = icon.closest('button') ?? icon;
await user.click(settingsButton);
await screen.findByText(FILTER_K8S_DEPLOYMENT_NAME);
expect(screen.queryByText('trace_id')).not.toBeInTheDocument();
expect(screen.queryByText('span_id')).not.toBeInTheDocument();
});
it('adds a filter from OTHER FILTERS to ADDED FILTERS when clicked', async () => {
const user = userEvent.setup({ pointerEventsCheck: 0 });

View File

@@ -184,7 +184,6 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) {
{Name: "http.method", FieldContext: telemetrytypes.FieldContextAttribute, FieldDataType: telemetrytypes.FieldDataTypeString},
{Name: "http.route", FieldContext: telemetrytypes.FieldContextAttribute, FieldDataType: telemetrytypes.FieldDataTypeString},
{Name: "http_url", FieldContext: telemetrytypes.FieldContextSpan, FieldDataType: telemetrytypes.FieldDataTypeString},
{Name: "trace_id", FieldContext: telemetrytypes.FieldContextSpan, FieldDataType: telemetrytypes.FieldDataTypeString},
}
logsFilters := []telemetrytypes.TelemetryFieldKey{