Skip to content

Commit 1ef63d4

Browse files
authored
feat(traces): Use new slice quantization from backend (#72034)
### Summary This uses the quantization from the backend when provided (trace breakdowns), but still uses time for the spans since they don't have quantization. |![Screenshot 2024-06-04 at 2 47 54 PM](https://github.com/getsentry/sentry/assets/6111995/90359c0d-7020-4f7a-91f5-50ef582f8f3a)| | |--|--|
1 parent 4acd201 commit 1ef63d4

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

static/app/views/performance/traces/content.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import usePageFilters from 'sentry/utils/usePageFilters';
3434

3535
import {type Field, FIELDS, SORTS} from './data';
3636
import {
37+
BREAKDOWN_SLICES,
3738
ProjectRenderer,
3839
SpanBreakdownSliceRenderer,
3940
SpanDescriptionRenderer,
@@ -420,6 +421,7 @@ export interface TraceResult<F extends string> {
420421
numOccurrences: number;
421422
numSpans: number;
422423
project: string | null;
424+
slices: number;
423425
spans: SpanResult<F>[];
424426
start: number;
425427
trace: string;
@@ -430,6 +432,9 @@ interface TraceBreakdownBase {
430432
end: number;
431433
opCategory: string | null;
432434
sdkName: string | null;
435+
sliceEnd: number;
436+
sliceStart: number;
437+
sliceWidth: number;
433438
start: number;
434439
}
435440

@@ -494,8 +499,7 @@ function useTraces<F extends string>({
494499
suggestedQuery,
495500
sort,
496501
per_page: limit,
497-
breakdownSlices: 40,
498-
minBreakdownPercentage: 1 / 40,
502+
breakdownSlices: BREAKDOWN_SLICES,
499503
maxSpansPerTrace: 10,
500504
mri,
501505
metricsMax,

static/app/views/performance/traces/fieldRenderers.tsx

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ export function TraceBreakdownRenderer({
128128
sliceEnd={breakdown.end}
129129
sliceDurationReal={breakdown.duration}
130130
sliceSecondaryName={breakdown.sdkName}
131+
sliceNumberStart={breakdown.sliceStart}
132+
sliceNumberWidth={breakdown.sliceWidth}
131133
trace={trace}
132134
theme={theme}
133135
offset={index}
@@ -146,16 +148,22 @@ export function TraceBreakdownRenderer({
146148
);
147149
}
148150

149-
const BREAKDOWN_BAR_SIZE = 200;
150-
const BREAKDOWN_QUANTIZE_STEP = 1;
151-
const BREAKDOWN_NUM_SLICES = BREAKDOWN_BAR_SIZE / BREAKDOWN_QUANTIZE_STEP; // 200
151+
const BREAKDOWN_SIZE_PX = 200;
152+
export const BREAKDOWN_SLICES = 40;
152153

154+
/**
155+
* This renders slices in two different ways;
156+
* - Slices in the breakdown for the trace. These have slice numbers returned for quantization from the backend.
157+
* - Slices derived from span timings. Spans aren't quantized into slices.
158+
*/
153159
export function SpanBreakdownSliceRenderer({
154160
trace,
155161
theme,
156162
sliceName,
157163
sliceStart,
158164
sliceEnd,
165+
sliceNumberStart,
166+
sliceNumberWidth,
159167
sliceDurationReal,
160168
sliceSecondaryName,
161169
onMouseEnter,
@@ -170,26 +178,34 @@ export function SpanBreakdownSliceRenderer({
170178
trace: TraceResult<Field>;
171179
offset?: number;
172180
sliceDurationReal?: number;
181+
sliceNumberStart?: number;
182+
sliceNumberWidth?: number;
173183
}) {
174-
const traceSliceSize = (trace.end - trace.start) / BREAKDOWN_NUM_SLICES;
175-
const traceDuration = BREAKDOWN_NUM_SLICES * traceSliceSize;
184+
const traceDuration = trace.end - trace.start;
176185

177186
const sliceDuration = sliceEnd - sliceStart;
178187

179-
if (sliceDuration <= 0) {
188+
if (sliceNumberWidth === 0 && sliceNumberWidth === undefined && sliceDuration <= 0) {
189+
// No slice width or no duration width if it's a regular span.
180190
return null;
181191
}
182192

193+
const pixelsPerSlice = BREAKDOWN_SIZE_PX / BREAKDOWN_SLICES;
194+
const relativeSliceStart = sliceStart - trace.start;
195+
183196
const stylingSliceName = getStylingSliceName(sliceName, sliceSecondaryName);
184197
const sliceColor = stylingSliceName ? pickBarColor(stylingSliceName) : theme.gray100;
185198

186199
const sliceWidth =
187-
BREAKDOWN_QUANTIZE_STEP *
188-
Math.ceil(BREAKDOWN_NUM_SLICES * (sliceDuration / traceDuration));
189-
const relativeSliceStart = sliceStart - trace.start;
200+
sliceNumberWidth !== undefined
201+
? pixelsPerSlice * sliceNumberWidth
202+
: pixelsPerSlice * Math.ceil(BREAKDOWN_SLICES * (sliceDuration / traceDuration));
190203
const sliceOffset =
191-
BREAKDOWN_QUANTIZE_STEP *
192-
Math.floor((BREAKDOWN_NUM_SLICES * relativeSliceStart) / traceDuration);
204+
sliceNumberStart !== undefined
205+
? pixelsPerSlice * sliceNumberStart
206+
: pixelsPerSlice *
207+
Math.floor((BREAKDOWN_SLICES * relativeSliceStart) / traceDuration);
208+
193209
return (
194210
<BreakdownSlice
195211
sliceName={sliceName}

0 commit comments

Comments
 (0)