From 07215363b171ad5d885eb36f03540b908482c3ca Mon Sep 17 00:00:00 2001 From: George Gritsouk <989898+gggritso@users.noreply.github.com> Date: Wed, 15 Apr 2026 15:43:43 -0400 Subject: [PATCH 1/2] ref(project-detail): Use relative period params for previous period queries Replace absolute start/end date computation via parseStatsPeriod with relative statsPeriodStart/statsPeriodEnd params in the velocity and ANR score cards, matching the pattern already used by the stability card. This also removes a stray console.log from the velocity card and an unused parseStatsPeriod import from the apdex card. Co-Authored-By: Claude Opus 4.6 --- .../projectAnrScoreCard.spec.tsx | 6 ++-- .../projectScoreCards/projectAnrScoreCard.tsx | 33 +++++++++++-------- .../projectApdexScoreCard.tsx | 21 +++++------- .../projectVelocityScoreCard.spec.tsx | 5 +-- .../projectVelocityScoreCard.tsx | 19 ++++------- 5 files changed, 40 insertions(+), 44 deletions(-) diff --git a/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.spec.tsx b/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.spec.tsx index 9ea7b8a60c3ed9..55e19ccc62b60f 100644 --- a/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.spec.tsx +++ b/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.spec.tsx @@ -46,7 +46,7 @@ describe('ProjectDetail > ProjectAnr', () => { endpointMockPreviousPeriod = MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/sessions/`, - match: [MockApiClient.matchQuery({start: '2017-10-03T02:41:20.000'})], // setup mocks a constant current date, so this works + match: [MockApiClient.matchQuery({statsPeriodStart: '14d'})], body: { groups: [ { @@ -96,7 +96,6 @@ describe('ProjectDetail > ProjectAnr', () => { `/organizations/${organization.slug}/sessions/`, expect.objectContaining({ query: { - end: '2017-10-10T02:41:20.000', environment: [], field: ['anr_rate()'], includeSeries: '0', @@ -104,7 +103,8 @@ describe('ProjectDetail > ProjectAnr', () => { interval: '1h', project: [1], query: 'release:abc', - start: '2017-10-03T02:41:20.000', + statsPeriodStart: '14d', + statsPeriodEnd: '7d', }, }) ); diff --git a/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.tsx b/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.tsx index acdec825a7ce97..d3d29bd6fa0af3 100644 --- a/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.tsx +++ b/static/app/views/projectDetail/projectScoreCards/projectAnrScoreCard.tsx @@ -8,7 +8,7 @@ import {doSessionsRequest} from 'sentry/actionCreators/sessions'; import {shouldFetchPreviousPeriod} from 'sentry/components/charts/utils'; import {URL_PARAM} from 'sentry/components/pageFilters/constants'; import {normalizeDateTimeParams} from 'sentry/components/pageFilters/parse'; -import {parseStatsPeriod} from 'sentry/components/timeRangeSelector/utils'; +import {DEFAULT_STATS_PERIOD} from 'sentry/constants'; import {t} from 'sentry/locale'; import type {PageFilters} from 'sentry/types/core'; import type {Organization, SessionApiResponse} from 'sentry/types/organization'; @@ -45,6 +45,11 @@ export function ProjectAnrScoreCard({ const {environments, projects, datetime} = selection; const {start, end, period} = datetime; + const doubledPeriod = getPeriod( + {period, start: undefined, end: undefined}, + {shouldDoublePeriod: true} + ).statsPeriod; + const api = useApi(); const [sessionsData, setSessionsData] = useState(null); @@ -96,20 +101,10 @@ export function ProjectAnrScoreCard({ includeSeries: false, }; - const {start: previousStart} = parseStatsPeriod( - getPeriod({period, start: undefined, end: undefined}, {shouldDoublePeriod: true}) - .statsPeriod! - ); - - const {start: previousEnd} = parseStatsPeriod( - getPeriod({period, start: undefined, end: undefined}, {shouldDoublePeriod: false}) - .statsPeriod! - ); - doSessionsRequest(api, { ...requestData, - start: previousStart, - end: previousEnd, + statsPeriodStart: doubledPeriod, + statsPeriodEnd: period ?? DEFAULT_STATS_PERIOD, }).then(([response]) => { if (unmounted) { return; @@ -123,7 +118,17 @@ export function ProjectAnrScoreCard({ return () => { unmounted = true; }; - }, [start, end, period, api, organization.slug, environments, projects, query]); + }, [ + start, + end, + period, + doubledPeriod, + api, + organization.slug, + environments, + projects, + query, + ]); const value = sessionsData?.groups?.[0]?.totals['anr_rate()'] ?? null; const previousValue = previousSessionData?.groups?.[0]?.totals['anr_rate()'] ?? null; diff --git a/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.tsx b/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.tsx index d1f15328eb4618..e12741094669ec 100644 --- a/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.tsx +++ b/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.tsx @@ -3,7 +3,7 @@ import {Container} from '@sentry/scraps/layout'; import {shouldFetchPreviousPeriod} from 'sentry/components/charts/utils'; import {normalizeDateTimeParams} from 'sentry/components/pageFilters/parse'; -import {parseStatsPeriod} from 'sentry/components/timeRangeSelector/utils'; +import {DEFAULT_STATS_PERIOD} from 'sentry/constants'; import {t} from 'sentry/locale'; import type {PageFilters} from 'sentry/types/core'; import type {Organization} from 'sentry/types/organization'; @@ -35,18 +35,13 @@ const useApdex = (props: Props) => { isProjectStabilized && hasTransactions ); - const {projects, environments: environments, datetime} = selection; + const {projects, environments, datetime} = selection; const {period} = datetime; - const {start: previousStart} = parseStatsPeriod( - getPeriod({period, start: undefined, end: undefined}, {shouldDoublePeriod: true}) - .statsPeriod! - ); - - const {start: previousEnd} = parseStatsPeriod( - getPeriod({period, start: undefined, end: undefined}, {shouldDoublePeriod: false}) - .statsPeriod! - ); + const doubledPeriod = getPeriod( + {period, start: undefined, end: undefined}, + {shouldDoublePeriod: true} + ).statsPeriod; const commonQuery = { environment: environments, @@ -84,8 +79,8 @@ const useApdex = (props: Props) => { { query: { ...commonQuery, - start: previousStart, - end: previousEnd, + statsPeriodStart: doubledPeriod, + statsPeriodEnd: period ?? DEFAULT_STATS_PERIOD, }, }, ], diff --git a/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.spec.tsx b/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.spec.tsx index 984718e3d063bc..73ef490e3966db 100644 --- a/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.spec.tsx +++ b/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.spec.tsx @@ -29,6 +29,7 @@ describe('ProjectDetail > ProjectVelocity', () => { version: `0.0.${index + 100}`, })), status: 200, + match: [MockApiClient.matchQuery({statsPeriodStart: '28d'})], }); const currentDataEndpointMock = MockApiClient.addMockResponse({ @@ -73,8 +74,8 @@ describe('ProjectDetail > ProjectVelocity', () => { query: { environment: [], project: 1, - start: '2017-09-19T02:41:20', - end: '2017-10-03T02:41:20', + statsPeriodStart: '28d', + statsPeriodEnd: '14d', }, }) ); diff --git a/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.tsx b/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.tsx index 48172c142561e7..dafe1f441877f2 100644 --- a/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.tsx +++ b/static/app/views/projectDetail/projectScoreCards/projectVelocityScoreCard.tsx @@ -3,7 +3,7 @@ import {Container} from '@sentry/scraps/layout'; import {shouldFetchPreviousPeriod} from 'sentry/components/charts/utils'; import {normalizeDateTimeParams} from 'sentry/components/pageFilters/parse'; -import {parseStatsPeriod} from 'sentry/components/timeRangeSelector/utils'; +import {DEFAULT_STATS_PERIOD} from 'sentry/constants'; import {t} from 'sentry/locale'; import type {PageFilters} from 'sentry/types/core'; import type {Organization} from 'sentry/types/organization'; @@ -28,15 +28,10 @@ const useReleaseCount = (props: Props) => { const {projects, environments, datetime} = selection; const {period} = datetime; - const {start: previousStart} = parseStatsPeriod( - getPeriod({period, start: undefined, end: undefined}, {shouldDoublePeriod: true}) - .statsPeriod! - ); - - const {start: previousEnd} = parseStatsPeriod( - getPeriod({period, start: undefined, end: undefined}, {shouldDoublePeriod: false}) - .statsPeriod! - ); + const doubledPeriod = getPeriod( + {period, start: undefined, end: undefined}, + {shouldDoublePeriod: true} + ).statsPeriod; const commonQuery = { environment: environments, @@ -73,8 +68,8 @@ const useReleaseCount = (props: Props) => { { query: { ...commonQuery, - start: previousStart, - end: previousEnd, + statsPeriodStart: doubledPeriod, + statsPeriodEnd: period ?? DEFAULT_STATS_PERIOD, }, }, ], From d57562c05bfd4cfb8f9ffc811405323b7302a4c9 Mon Sep 17 00:00:00 2001 From: George Gritsouk <989898+gggritso@users.noreply.github.com> Date: Wed, 15 Apr 2026 16:12:26 -0400 Subject: [PATCH 2/2] test(project-detail): Update apdex score card test for relative period params Update mock matchers and assertions to expect statsPeriodStart/statsPeriodEnd instead of absolute start/end dates, matching the implementation change. Co-Authored-By: Claude Opus 4.6 --- .../projectScoreCards/projectApdexScoreCard.spec.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.spec.tsx b/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.spec.tsx index e054905d506e3f..74ee2fd3a9fa64 100644 --- a/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.spec.tsx +++ b/static/app/views/projectDetail/projectScoreCards/projectApdexScoreCard.spec.tsx @@ -35,6 +35,7 @@ describe('ProjectDetail > ProjectApdex', () => { ], }, status: 200, + match: [MockApiClient.matchQuery({statsPeriodStart: '28d'})], }); currentDataEndpointMock = MockApiClient.addMockResponse({ @@ -86,8 +87,8 @@ describe('ProjectDetail > ProjectApdex', () => { field: ['apdex()'], project: ['1'], query: 'event.type:transaction count():>0', - start: '2017-09-19T02:41:20', - end: '2017-10-03T02:41:20', + statsPeriodStart: '28d', + statsPeriodEnd: '14d', }, }) );