@@ -7,6 +7,7 @@ import {dedupeArray} from 'sentry/utils/dedupeArray';
7
7
import { DiscoverDatasets } from 'sentry/utils/discover/types' ;
8
8
import { MutableSearch } from 'sentry/utils/tokenizeSearch' ;
9
9
import useOrganization from 'sentry/utils/useOrganization' ;
10
+ import type { TimeSeries } from 'sentry/views/dashboards/widgets/common/types' ;
10
11
import {
11
12
useExploreDataset ,
12
13
useExploreFields ,
@@ -37,10 +38,12 @@ export function useTrackAnalytics({
37
38
fields,
38
39
visualizes,
39
40
page_source,
41
+ interval,
40
42
} : {
41
43
aggregatesTableResult : AggregatesTableResult ;
42
44
dataset : DiscoverDatasets ;
43
45
fields : string [ ] ;
46
+ interval : string ;
44
47
page_source : 'explore' | 'compare' ;
45
48
query : string ;
46
49
queryType : 'aggregate' | 'samples' | 'traces' ;
@@ -95,9 +98,11 @@ export function useTrackAnalytics({
95
98
} ) ) ,
96
99
visualizes_count : visualizes . length ,
97
100
title : title || '' ,
101
+ empty_buckets_percentage : computeEmptyBuckets ( visualizes , timeseriesResult . data ) ,
98
102
confidences : computeConfidence ( visualizes , timeseriesResult . data ) ,
99
103
has_exceeded_performance_usage_limit : hasExceededPerformanceUsageLimit ,
100
104
page_source,
105
+ interval,
101
106
} ) ;
102
107
103
108
info (
@@ -135,6 +140,7 @@ export function useTrackAnalytics({
135
140
isLoadingSubscriptionDetails ,
136
141
query_status ,
137
142
page_source ,
143
+ interval ,
138
144
] ) ;
139
145
140
146
useEffect ( ( ) => {
@@ -162,9 +168,11 @@ export function useTrackAnalytics({
162
168
visualizes,
163
169
visualizes_count : visualizes . length ,
164
170
title : title || '' ,
171
+ empty_buckets_percentage : computeEmptyBuckets ( visualizes , timeseriesResult . data ) ,
165
172
confidences : computeConfidence ( visualizes , timeseriesResult . data ) ,
166
173
has_exceeded_performance_usage_limit : hasExceededPerformanceUsageLimit ,
167
174
page_source,
175
+ interval,
168
176
} ) ;
169
177
170
178
info ( fmt `trace.explorer.metadata:
@@ -198,6 +206,7 @@ export function useTrackAnalytics({
198
206
isLoadingSubscriptionDetails ,
199
207
query_status ,
200
208
page_source ,
209
+ interval ,
201
210
] ) ;
202
211
203
212
const tracesTableResultDefined = defined ( tracesTableResult ) ;
@@ -240,9 +249,11 @@ export function useTrackAnalytics({
240
249
visualizes,
241
250
visualizes_count : visualizes . length ,
242
251
title : title || '' ,
252
+ empty_buckets_percentage : computeEmptyBuckets ( visualizes , timeseriesResult . data ) ,
243
253
confidences : computeConfidence ( visualizes , timeseriesResult . data ) ,
244
254
has_exceeded_performance_usage_limit : hasExceededPerformanceUsageLimit ,
245
255
page_source,
256
+ interval,
246
257
} ) ;
247
258
} , [
248
259
organization ,
@@ -262,6 +273,7 @@ export function useTrackAnalytics({
262
273
query_status ,
263
274
page_source ,
264
275
tracesTableResultDefined ,
276
+ interval ,
265
277
] ) ;
266
278
}
267
279
@@ -271,8 +283,10 @@ export function useAnalytics({
271
283
spansTableResult,
272
284
tracesTableResult,
273
285
timeseriesResult,
286
+ interval,
274
287
} : {
275
288
aggregatesTableResult : AggregatesTableResult ;
289
+ interval : string ;
276
290
queryType : 'aggregate' | 'samples' | 'traces' ;
277
291
spansTableResult : SpansTableResult ;
278
292
timeseriesResult : ReturnType < typeof useSortedTimeSeries > ;
@@ -295,6 +309,7 @@ export function useAnalytics({
295
309
query,
296
310
fields,
297
311
visualizes,
312
+ interval,
298
313
page_source : 'explore' ,
299
314
} ) ;
300
315
}
@@ -306,9 +321,11 @@ export function useCompareAnalytics({
306
321
aggregatesTableResult,
307
322
spansTableResult,
308
323
timeseriesResult,
324
+ interval,
309
325
} : {
310
326
aggregatesTableResult : AggregatesTableResult ;
311
327
index : number ;
328
+ interval : string ;
312
329
query : ReadableExploreQueryParts ;
313
330
queryType : 'aggregate' | 'samples' | 'traces' ;
314
331
spansTableResult : SpansTableResult ;
@@ -334,6 +351,7 @@ export function useCompareAnalytics({
334
351
query,
335
352
fields,
336
353
visualizes,
354
+ interval,
337
355
page_source : 'compare' ,
338
356
} ) ;
339
357
}
@@ -348,3 +366,26 @@ function computeConfidence(
348
366
return String ( combineConfidenceForSeries ( series ) ) ;
349
367
} ) ;
350
368
}
369
+
370
+ export function computeEmptyBucketsForSeries ( series : Pick < TimeSeries , 'data' > ) : number {
371
+ let emptyBucketsForSeries = 0 ;
372
+ for ( const item of series . data ) {
373
+ if ( item . value === 0 || item . value === null ) {
374
+ emptyBucketsForSeries += 1 ;
375
+ }
376
+ }
377
+ return Math . floor ( ( emptyBucketsForSeries / series . data . length ) * 100 ) ;
378
+ }
379
+
380
+ function computeEmptyBuckets (
381
+ visualizes : Visualize [ ] ,
382
+ data : ReturnType < typeof useSortedTimeSeries > [ 'data' ]
383
+ ) {
384
+ return visualizes . flatMap ( visualize => {
385
+ const dedupedYAxes = dedupeArray ( visualize . yAxes ) ;
386
+ return dedupedYAxes
387
+ . flatMap ( yAxis => data [ yAxis ] )
388
+ . filter ( defined )
389
+ . map ( computeEmptyBucketsForSeries ) ;
390
+ } ) ;
391
+ }
0 commit comments