Skip to content

Commit 991bd7e

Browse files
authored
fix: Round previous period offset to the second (#1421)
Closes HDX-2939 # Summary This PR fixes a bug that caused the previous period to sometimes round to the incorrect second (see `1:34:59` instead of the desired `1:35:00`). <img width="329" height="107" alt="Screenshot 2025-12-01 at 9 43 47 AM" src="https://github.com/user-attachments/assets/e967adca-6a91-48c2-be10-dd54ac15846a" /> This was due to the `getPreviousPeriodOffset` function returning an offset at the millisecond level, which was later not rounded to the second in `getPreviousDateRange`. We now round the offset to the nearest second, to match our time picker's granularity.
1 parent cac4d3d commit 991bd7e

4 files changed

Lines changed: 30 additions & 18 deletions

File tree

‎.changeset/curvy-wasps-sin.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hyperdx/app": patch
3+
---
4+
5+
fix: Round previous period offset to the second

‎packages/app/src/ChartUtils.tsx‎

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -534,15 +534,20 @@ function inferGroupColumns(meta: Array<{ name: string; type: string }>) {
534534
]);
535535
}
536536

537-
export function getPreviousPeriodOffset(dateRange: [Date, Date]): number {
537+
export function getPreviousPeriodOffsetSeconds(
538+
dateRange: [Date, Date],
539+
): number {
538540
const [start, end] = dateRange;
539-
return end.getTime() - start.getTime();
541+
return Math.round((end.getTime() - start.getTime()) / 1000);
540542
}
541543

542544
export function getPreviousDateRange(currentRange: [Date, Date]): [Date, Date] {
543545
const [start, end] = currentRange;
544-
const offset = getPreviousPeriodOffset(currentRange);
545-
return [new Date(start.getTime() - offset), new Date(end.getTime() - offset)];
546+
const offsetSeconds = getPreviousPeriodOffsetSeconds(currentRange);
547+
return [
548+
new Date(start.getTime() - offsetSeconds * 1000),
549+
new Date(end.getTime() - offsetSeconds * 1000),
550+
];
546551
}
547552

548553
export interface LineData {
@@ -633,10 +638,10 @@ function addResponseToFormattedData({
633638
const date = new Date(row[timestampColumn.name]);
634639

635640
// Previous period data needs to be shifted forward to align with current period
636-
const offset = isPreviousPeriod
637-
? getPreviousPeriodOffset(currentPeriodDateRange)
641+
const offsetSeconds = isPreviousPeriod
642+
? getPreviousPeriodOffsetSeconds(currentPeriodDateRange)
638643
: 0;
639-
const ts = Math.round((date.getTime() + offset) / 1000);
644+
const ts = Math.round(date.getTime() / 1000 + offsetSeconds);
640645

641646
for (const valueColumn of valueColumns) {
642647
let tsBucket = tsBucketMap.get(ts);

‎packages/app/src/HDXMultiSeriesTimeChart.tsx‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ export const TooltipItem = memo(
117117

118118
type HDXLineChartTooltipProps = {
119119
lineDataMap: { [keyName: string]: LineData };
120-
previousPeriodOffset?: number;
120+
previousPeriodOffsetSeconds?: number;
121121
numberFormat?: NumberFormat;
122122
} & Record<string, any>;
123123

@@ -129,7 +129,7 @@ const HDXLineChartTooltip = withErrorBoundary(
129129
label,
130130
numberFormat,
131131
lineDataMap,
132-
previousPeriodOffset,
132+
previousPeriodOffsetSeconds,
133133
} = props;
134134
const typedPayload = payload as TooltipPayload[];
135135

@@ -143,10 +143,12 @@ const HDXLineChartTooltip = withErrorBoundary(
143143
<div className={styles.chartTooltip}>
144144
<div className={styles.chartTooltipHeader}>
145145
<FormatTime value={label * 1000} />
146-
{previousPeriodOffset != null && (
146+
{previousPeriodOffsetSeconds != null && (
147147
<>
148148
{' (vs '}
149-
<FormatTime value={label * 1000 - previousPeriodOffset} />
149+
<FormatTime
150+
value={(label - previousPeriodOffsetSeconds) * 1000}
151+
/>
150152
{')'}
151153
</>
152154
)}
@@ -332,7 +334,7 @@ export const MemoChart = memo(function MemoChart({
332334
timestampKey = 'ts_bucket',
333335
onTimeRangeSelect,
334336
showLegend = true,
335-
previousPeriodOffset,
337+
previousPeriodOffsetSeconds,
336338
}: {
337339
graphResults: any[];
338340
setIsClickActive: (v: any) => void;
@@ -347,7 +349,7 @@ export const MemoChart = memo(function MemoChart({
347349
timestampKey?: string;
348350
onTimeRangeSelect?: (start: Date, end: Date) => void;
349351
showLegend?: boolean;
350-
previousPeriodOffset?: number;
352+
previousPeriodOffsetSeconds?: number;
351353
}) {
352354
const _id = useId();
353355
const id = _id.replace(/:/g, '');
@@ -611,7 +613,7 @@ export const MemoChart = memo(function MemoChart({
611613
<HDXLineChartTooltip
612614
numberFormat={numberFormat}
613615
lineDataMap={lineDataMap}
614-
previousPeriodOffset={previousPeriodOffset}
616+
previousPeriodOffsetSeconds={previousPeriodOffsetSeconds}
615617
/>
616618
}
617619
wrapperStyle={{

‎packages/app/src/components/DBTimeChart.tsx‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import {
3434
convertGranularityToSeconds,
3535
formatResponseForTimeChart,
3636
getPreviousDateRange,
37-
getPreviousPeriodOffset,
37+
getPreviousPeriodOffsetSeconds,
3838
PreviousPeriodSuffix,
3939
useTimeChartSettings,
4040
} from '@/ChartUtils';
@@ -251,9 +251,9 @@ function DBTimeChartComponent({
251251
};
252252
}, [queriedConfig, dateRange]);
253253

254-
const previousPeriodOffset = useMemo(() => {
254+
const previousPeriodOffsetSeconds = useMemo(() => {
255255
return config.compareToPreviousPeriod
256-
? getPreviousPeriodOffset(dateRange)
256+
? getPreviousPeriodOffsetSeconds(dateRange)
257257
: undefined;
258258
}, [dateRange, config.compareToPreviousPeriod]);
259259

@@ -649,7 +649,7 @@ function DBTimeChartComponent({
649649
setIsClickActive={setActiveClickPayloadIfSourceAvailable}
650650
showLegend={showLegend}
651651
timestampKey={timestampColumn?.name}
652-
previousPeriodOffset={previousPeriodOffset}
652+
previousPeriodOffsetSeconds={previousPeriodOffsetSeconds}
653653
/>
654654
</div>
655655
</div>

0 commit comments

Comments
 (0)