Skip to content

Commit d0ab0ce

Browse files
authored
profiling: allow session expanding (#94633)
Enable visualizing more profiler session data by allowing users to increase the time range.
1 parent 90d3d07 commit d0ab0ce

File tree

1 file changed

+55
-2
lines changed

1 file changed

+55
-2
lines changed

static/app/components/profiling/flamegraph/flamegraphToolbar/flamegraphOptionsMenu.tsx

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
import {Fragment, useCallback} from 'react';
1+
import {Fragment, useCallback, useMemo} from 'react';
22

33
import {Button} from 'sentry/components/core/button';
4+
import {LinkButton} from 'sentry/components/core/button/linkButton';
45
import type {SelectOption} from 'sentry/components/core/compactSelect';
56
import {CompactSelect} from 'sentry/components/core/compactSelect';
6-
import {IconSliders} from 'sentry/icons';
7+
import {IconChevron, IconSliders} from 'sentry/icons';
78
import {t} from 'sentry/locale';
89
import type {CanvasPoolManager} from 'sentry/utils/profiling/canvasScheduler';
910
import type {FlamegraphPreferences} from 'sentry/utils/profiling/flamegraph/flamegraphStateProvider/reducers/flamegraphPreferences';
1011
import {useFlamegraphPreferences} from 'sentry/utils/profiling/flamegraph/hooks/useFlamegraphPreferences';
1112
import {useDispatchFlamegraphState} from 'sentry/utils/profiling/flamegraph/hooks/useFlamegraphState';
13+
import {useLocation} from 'sentry/utils/useLocation';
1214

1315
interface FlamegraphOptionsMenuProps {
1416
canvasPoolManager: CanvasPoolManager;
@@ -17,6 +19,7 @@ interface FlamegraphOptionsMenuProps {
1719
function FlamegraphOptionsMenu({
1820
canvasPoolManager,
1921
}: FlamegraphOptionsMenuProps): React.ReactElement {
22+
const location = useLocation();
2023
const {colorCoding} = useFlamegraphPreferences();
2124
const dispatch = useDispatchFlamegraphState();
2225

@@ -34,6 +37,22 @@ function FlamegraphOptionsMenu({
3437
canvasPoolManager.dispatch('reset zoom', []);
3538
}, [canvasPoolManager]);
3639

40+
const continuousLocationDescriptor: {end: string; start: string} | null =
41+
useMemo(() => {
42+
if (
43+
typeof location.query.start !== 'string' ||
44+
typeof location.query.end !== 'string' ||
45+
typeof location.query.profilerId !== 'string'
46+
) {
47+
return null;
48+
}
49+
50+
return {
51+
start: new Date(location.query.start).toISOString(),
52+
end: new Date(location.query.end).toISOString(),
53+
};
54+
}, [location.query]);
55+
3756
return (
3857
<Fragment>
3958
<Button size="xs" onClick={onResetZoom}>
@@ -48,6 +67,40 @@ function FlamegraphOptionsMenu({
4867
closeOnSelect={false}
4968
onChange={onColorChange}
5069
/>
70+
{continuousLocationDescriptor ? (
71+
<LinkButton
72+
to={{
73+
...location,
74+
query: {
75+
...location.query,
76+
start: new Date(
77+
new Date(continuousLocationDescriptor.start).getTime() - 30 * 60 * 1000
78+
).toISOString(),
79+
},
80+
}}
81+
size="xs"
82+
icon={<IconChevron direction="left" />}
83+
aria-label={t('View Previous 30 Minutes')}
84+
title={t('View Previous 30 Minutes')}
85+
/>
86+
) : null}
87+
{continuousLocationDescriptor ? (
88+
<LinkButton
89+
to={{
90+
...location,
91+
query: {
92+
...location.query,
93+
end: new Date(
94+
new Date(continuousLocationDescriptor.end).getTime() + 30 * 60 * 1000
95+
).toISOString(),
96+
},
97+
}}
98+
size="xs"
99+
icon={<IconChevron direction="right" />}
100+
aria-label={t('View Next 30 Minutes')}
101+
title={t('View Next 30 Minutes')}
102+
/>
103+
) : null}
51104
</Fragment>
52105
);
53106
}

0 commit comments

Comments
 (0)