Skip to content

Commit fad580c

Browse files
Zylphrexandrewshie-sentry
authored andcommitted
feat(logs): Swap logs to query params context for group by readonly (#97497)
This swaps the read side of the group by to use logs query params context. Does not handle the write parts yet as that'll be coupled with the writes for visualize through aggregate fields.
1 parent 9dc81c5 commit fad580c

17 files changed

+170
-124
lines changed

static/app/views/explore/contexts/logs/logsPageParams.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,6 @@ export function useLogsAggregate() {
373373
return `${aggregateFn}(${aggregateParam})`;
374374
}
375375

376-
export function useLogsGroupBy() {
377-
const {groupBy} = useLogsPageParams();
378-
return groupBy;
379-
}
380-
381376
export function useLogsLimitToTraceId() {
382377
const {limitToTraceId} = useLogsPageParams();
383378
return limitToTraceId;

static/app/views/explore/logs/logsGraph.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@ import {defined} from 'sentry/utils';
88
import {determineSeriesSampleCountAndIsSampled} from 'sentry/views/alerts/rules/metric/utils/determineSeriesSampleCount';
99
import {Widget} from 'sentry/views/dashboards/widgets/widget/widget';
1010
import {ChartVisualization} from 'sentry/views/explore/components/chart/chartVisualization';
11-
import {
12-
useLogsAggregate,
13-
useLogsGroupBy,
14-
} from 'sentry/views/explore/contexts/logs/logsPageParams';
11+
import {useLogsAggregate} from 'sentry/views/explore/contexts/logs/logsPageParams';
1512
import {
1613
ChartIntervalUnspecifiedStrategy,
1714
useChartInterval,
1815
} from 'sentry/views/explore/hooks/useChartInterval';
1916
import {TOP_EVENTS_LIMIT} from 'sentry/views/explore/hooks/useTopEvents';
2017
import {ConfidenceFooter} from 'sentry/views/explore/logs/confidenceFooter';
18+
import {useQueryParamsTopEventsLimit} from 'sentry/views/explore/queryParams/context';
2119
import {EXPLORE_CHART_TYPE_OPTIONS} from 'sentry/views/explore/spans/charts';
2220
import {
2321
combineConfidenceForSeries,
@@ -32,7 +30,7 @@ interface LogsGraphProps {
3230

3331
export function LogsGraph({timeseriesResult}: LogsGraphProps) {
3432
const aggregate = useLogsAggregate();
35-
const groupBy = useLogsGroupBy();
33+
const topEventsLimit = useQueryParamsTopEventsLimit();
3634

3735
const [chartType, setChartType] = useState<ChartType>(ChartType.BAR);
3836
const [interval, setInterval, intervalOptions] = useChartInterval({
@@ -41,7 +39,7 @@ export function LogsGraph({timeseriesResult}: LogsGraphProps) {
4139

4240
const chartInfo = useMemo(() => {
4341
const series = timeseriesResult.data[aggregate] ?? [];
44-
const isTopEvents = defined(groupBy);
42+
const isTopEvents = defined(topEventsLimit);
4543
const samplingMeta = determineSeriesSampleCountAndIsSampled(series, isTopEvents);
4644
return {
4745
chartType,
@@ -55,7 +53,7 @@ export function LogsGraph({timeseriesResult}: LogsGraphProps) {
5553
samplingMode: undefined,
5654
topEvents: isTopEvents ? TOP_EVENTS_LIMIT : undefined,
5755
};
58-
}, [chartType, timeseriesResult, aggregate, groupBy]);
56+
}, [chartType, timeseriesResult, aggregate, topEventsLimit]);
5957

6058
const Title = (
6159
<Widget.WidgetTitle title={prettifyAggregation(aggregate) ?? aggregate} />

static/app/views/explore/logs/logsTab.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import {
3333
useLogsAggregateFunction,
3434
useLogsAggregateSortBys,
3535
useLogsFields,
36-
useLogsGroupBy,
3736
useLogsSearch,
3837
useSetLogsFields,
3938
} from 'sentry/views/explore/contexts/logs/logsPageParams';
@@ -45,7 +44,6 @@ import {
4544
ChartIntervalUnspecifiedStrategy,
4645
useChartInterval,
4746
} from 'sentry/views/explore/hooks/useChartInterval';
48-
import {TOP_EVENTS_LIMIT} from 'sentry/views/explore/hooks/useTopEvents';
4947
import {
5048
HiddenColumnEditorLogFields,
5149
HiddenLogSearchFields,
@@ -82,7 +80,9 @@ import {useSaveAsItems} from 'sentry/views/explore/logs/useSaveAsItems';
8280
import {useStreamingTimeseriesResult} from 'sentry/views/explore/logs/useStreamingTimeseriesResult';
8381
import {calculateAverageLogsPerSecond} from 'sentry/views/explore/logs/utils';
8482
import {
83+
useQueryParamsGroupBys,
8584
useQueryParamsMode,
85+
useQueryParamsTopEventsLimit,
8686
useSetQueryParamsMode,
8787
} from 'sentry/views/explore/queryParams/context';
8888
import {ColumnEditorModal} from 'sentry/views/explore/tables/columnEditorModal';
@@ -100,8 +100,9 @@ export function LogsTabContent({
100100
const pageFilters = usePageFilters();
101101
const logsSearch = useLogsSearch();
102102
const fields = useLogsFields();
103-
const groupBy = useLogsGroupBy();
103+
const groupBys = useQueryParamsGroupBys();
104104
const mode = useQueryParamsMode();
105+
const topEventsLimit = useQueryParamsTopEventsLimit();
105106
const queryClient = useQueryClient();
106107
const sortBys = useLogsAggregateSortBys();
107108
const setMode = useSetQueryParamsMode();
@@ -130,7 +131,10 @@ export function LogsTabContent({
130131
}, [sortBys]);
131132

132133
const [sidebarOpen, setSidebarOpen] = useState(
133-
!!((aggregateFunction && aggregateFunction !== 'count') || groupBy)
134+
!!(
135+
(aggregateFunction && aggregateFunction !== 'count') ||
136+
groupBys.filter(Boolean).length
137+
)
134138
);
135139

136140
useEffect(() => {
@@ -154,8 +158,8 @@ export function LogsTabContent({
154158
search,
155159
yAxis: [aggregate],
156160
interval,
157-
fields: [...(groupBy ? [groupBy] : []), aggregate],
158-
topEvents: groupBy ? TOP_EVENTS_LIMIT : undefined,
161+
fields: [...groupBys.filter(Boolean), aggregate],
162+
topEvents: topEventsLimit,
159163
orderby,
160164
},
161165
'explore.ourlogs.main-chart',
@@ -249,7 +253,7 @@ export function LogsTabContent({
249253

250254
const saveAsItems = useSaveAsItems({
251255
aggregate,
252-
groupBy,
256+
groupBys,
253257
interval,
254258
mode,
255259
search: logsSearch,

static/app/views/explore/logs/logsToolbar.tsx

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import {AggregationKey, prettifyTagKey} from 'sentry/utils/fields';
99
import {
1010
useLogsAggregateFunction,
1111
useLogsAggregateParam,
12-
useLogsGroupBy,
1312
useSetLogsPageParams,
1413
} from 'sentry/views/explore/contexts/logs/logsPageParams';
1514
import type {OurLogsAggregate} from 'sentry/views/explore/logs/types';
15+
import {useQueryParamsGroupBys} from 'sentry/views/explore/queryParams/context';
1616

1717
export const LOG_AGGREGATES = [
1818
{
@@ -69,7 +69,7 @@ interface LogsToolbarProps {
6969
export function LogsToolbar({stringTags, numberTags}: LogsToolbarProps) {
7070
const aggregateFunction = useLogsAggregateFunction();
7171
let aggregateParam = useLogsAggregateParam();
72-
const groupBy = useLogsGroupBy();
72+
const groupBys = useQueryParamsGroupBys();
7373
const setLogsPageParams = useSetLogsPageParams();
7474
const functionArgRef = useRef<HTMLDivElement>(null);
7575

@@ -129,25 +129,31 @@ export function LogsToolbar({stringTags, numberTags}: LogsToolbarProps) {
129129
<SectionHeader>
130130
<Label>{t('Group By')}</Label>
131131
</SectionHeader>
132-
<Select
133-
options={[
134-
{
135-
label: '\u2014',
136-
value: '',
137-
textValue: '\u2014',
138-
},
139-
...Object.keys(stringTags ?? {}).map(key => ({
140-
label: key,
141-
value: key,
142-
})),
143-
]}
144-
onChange={val =>
145-
setLogsPageParams({groupBy: val.value ? (val.value as string) : null})
146-
}
147-
value={groupBy ?? ''}
148-
searchable
149-
triggerProps={{style: {width: '100%'}}}
150-
/>
132+
{groupBys.map((groupBy, index) => {
133+
return (
134+
<Select
135+
key={index}
136+
options={[
137+
{
138+
label: '\u2014',
139+
value: '',
140+
textValue: '\u2014',
141+
},
142+
...Object.keys(stringTags ?? {}).map(key => ({
143+
label: key,
144+
value: key,
145+
})),
146+
]}
147+
onChange={val =>
148+
// TODO: save the group bys separately
149+
setLogsPageParams({groupBy: val.value ? (val.value as string) : null})
150+
}
151+
value={groupBy}
152+
searchable
153+
triggerProps={{style: {width: '100%'}}}
154+
/>
155+
);
156+
})}
151157
</ToolbarItem>
152158
</Container>
153159
);

static/app/views/explore/logs/tables/logsAggregateTable.spec.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
LogsPageParamsProvider,
1414
} from 'sentry/views/explore/contexts/logs/logsPageParams';
1515
import {LOGS_AGGREGATE_SORT_BYS_KEY} from 'sentry/views/explore/contexts/logs/sortBys';
16+
import {LogsQueryParamsProvider} from 'sentry/views/explore/logs/logsQueryParamsProvider';
1617
import * as useLogsQueryModule from 'sentry/views/explore/logs/useLogsQuery';
1718

1819
import {LogsAggregateTable} from './logsAggregateTable';
@@ -27,9 +28,13 @@ describe('LogsAggregateTable', () => {
2728
});
2829
function LogsAggregateTableWithParamsProvider() {
2930
return (
30-
<LogsPageParamsProvider analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}>
31-
<LogsAggregateTable />
32-
</LogsPageParamsProvider>
31+
<LogsQueryParamsProvider source="location">
32+
<LogsPageParamsProvider
33+
analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}
34+
>
35+
<LogsAggregateTable />
36+
</LogsPageParamsProvider>
37+
</LogsQueryParamsProvider>
3338
);
3439
}
3540

static/app/views/explore/logs/tables/logsAggregateTable.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
LOGS_AGGREGATE_CURSOR_KEY,
1414
useLogsAggregate,
1515
useLogsAggregateSortBys,
16-
useLogsGroupBy,
1716
useSetLogsPageParams,
1817
} from 'sentry/views/explore/contexts/logs/logsPageParams';
1918
import {LOGS_AGGREGATE_SORT_BYS_KEY} from 'sentry/views/explore/contexts/logs/sortBys';
@@ -22,24 +21,23 @@ import {LogFieldRenderer} from 'sentry/views/explore/logs/fieldRenderers';
2221
import {getLogColors} from 'sentry/views/explore/logs/styles';
2322
import {useLogsAggregatesQuery} from 'sentry/views/explore/logs/useLogsQuery';
2423
import {SeverityLevel} from 'sentry/views/explore/logs/utils';
24+
import {useQueryParamsGroupBys} from 'sentry/views/explore/queryParams/context';
2525

2626
export function LogsAggregateTable() {
2727
const {data, pageLinks, isLoading, error} = useLogsAggregatesQuery({
2828
limit: 50,
2929
});
3030

3131
const setLogsPageParams = useSetLogsPageParams();
32-
const groupBy = useLogsGroupBy();
32+
const groupBys = useQueryParamsGroupBys();
3333
const aggregate = useLogsAggregate();
3434
const aggregateSortBys = useLogsAggregateSortBys();
3535
const location = useLocation();
3636
const theme = useTheme();
3737
const organization = useOrganization();
3838

3939
const fields: string[] = [];
40-
if (groupBy) {
41-
fields.push(groupBy);
42-
}
40+
fields.push(...groupBys.filter(Boolean));
4341
fields.push(aggregate);
4442

4543
return (

static/app/views/explore/logs/tables/logsInfiniteTable.spec.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
} from 'sentry/views/explore/contexts/logs/logsPageParams';
2525
import {LOGS_SORT_BYS_KEY} from 'sentry/views/explore/contexts/logs/sortBys';
2626
import {DEFAULT_TRACE_ITEM_HOVER_TIMEOUT} from 'sentry/views/explore/logs/constants';
27+
import {LogsQueryParamsProvider} from 'sentry/views/explore/logs/logsQueryParamsProvider';
2728
import {LogsInfiniteTable} from 'sentry/views/explore/logs/tables/logsInfiniteTable';
2829
import {OurLogKnownFieldKey} from 'sentry/views/explore/logs/types';
2930
import {OrganizationContext} from 'sentry/views/organizationContext';
@@ -198,11 +199,13 @@ describe('LogsInfiniteTable', function () {
198199
const renderWithProviders = (children: React.ReactNode) => {
199200
return render(
200201
<OrganizationContext.Provider value={organization}>
201-
<LogsPageParamsProvider
202-
analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}
203-
>
204-
<LogsPageDataProvider>{children}</LogsPageDataProvider>
205-
</LogsPageParamsProvider>
202+
<LogsQueryParamsProvider source="location">
203+
<LogsPageParamsProvider
204+
analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}
205+
>
206+
<LogsPageDataProvider>{children}</LogsPageDataProvider>
207+
</LogsPageParamsProvider>
208+
</LogsQueryParamsProvider>
206209
</OrganizationContext.Provider>
207210
);
208211
};

static/app/views/explore/logs/tables/logsTable.spec.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
LogsPageParamsProvider,
1515
} from 'sentry/views/explore/contexts/logs/logsPageParams';
1616
import {LOGS_SORT_BYS_KEY} from 'sentry/views/explore/contexts/logs/sortBys';
17+
import {LogsQueryParamsProvider} from 'sentry/views/explore/logs/logsQueryParamsProvider';
1718
import {LogsTable} from 'sentry/views/explore/logs/tables/logsTable';
1819
import {OurLogKnownFieldKey} from 'sentry/views/explore/logs/types';
1920
import type {UseLogsQueryResult} from 'sentry/views/explore/logs/useLogsQuery';
@@ -145,11 +146,13 @@ describe('LogsTable', function () {
145146
function ProviderWrapper({children}: {children: React.ReactNode}) {
146147
return (
147148
<OrganizationContext.Provider value={organization}>
148-
<LogsPageParamsProvider
149-
analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}
150-
>
151-
<LogsPageDataProvider>{children}</LogsPageDataProvider>
152-
</LogsPageParamsProvider>
149+
<LogsQueryParamsProvider source="location">
150+
<LogsPageParamsProvider
151+
analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}
152+
>
153+
<LogsPageDataProvider>{children}</LogsPageDataProvider>
154+
</LogsPageParamsProvider>
155+
</LogsQueryParamsProvider>
153156
</OrganizationContext.Provider>
154157
);
155158
}

static/app/views/explore/logs/tables/logsTableRow.spec.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,19 @@ import {
1616
import {LOGS_SORT_BYS_KEY} from 'sentry/views/explore/contexts/logs/sortBys';
1717
import {type TraceItemResponseAttribute} from 'sentry/views/explore/hooks/useTraceItemDetails';
1818
import {DEFAULT_TRACE_ITEM_HOVER_TIMEOUT} from 'sentry/views/explore/logs/constants';
19+
import {LogsQueryParamsProvider} from 'sentry/views/explore/logs/logsQueryParamsProvider';
1920
import {LogRowContent} from 'sentry/views/explore/logs/tables/logsTableRow';
2021
import {OurLogKnownFieldKey} from 'sentry/views/explore/logs/types';
2122

2223
function ProviderWrapper({children}: {children?: React.ReactNode}) {
2324
return (
24-
<LogsPageParamsProvider analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}>
25-
<table>
26-
<tbody>{children}</tbody>
27-
</table>
28-
</LogsPageParamsProvider>
25+
<LogsQueryParamsProvider source="location">
26+
<LogsPageParamsProvider analyticsPageSource={LogsAnalyticsPageSource.EXPLORE_LOGS}>
27+
<table>
28+
<tbody>{children}</tbody>
29+
</table>
30+
</LogsPageParamsProvider>
31+
</LogsQueryParamsProvider>
2932
);
3033
}
3134

0 commit comments

Comments
 (0)