10
10
import io .opentelemetry .sdk .trace .data .StatusData ;
11
11
import java .util .ArrayList ;
12
12
import java .util .EnumMap ;
13
- import java .util .HashMap ;
14
13
import java .util .List ;
15
14
import java .util .Map ;
16
15
17
16
final class TracezSpanBuckets {
18
- private final Map <LatencyBoundary , SpanBucket > latencyBuckets = new HashMap <>();
19
- private final Map <StatusCode , SpanBucket > errorBuckets = new HashMap <>();
20
-
21
- TracezSpanBuckets () {
22
- for (LatencyBoundary bucket : LatencyBoundary .values ()) {
23
- latencyBuckets .put (bucket , new SpanBucket (/* isLatencyBucket= */ true ));
24
- }
25
- for (StatusCode code : StatusCode .values ()) {
26
- if (code == StatusCode .ERROR ) {
27
- errorBuckets .put (code , new SpanBucket (/* isLatencyBucket= */ false ));
28
- }
29
- }
30
- }
17
+ private final LatencyBuckets latencyBuckets = new LatencyBuckets ();
18
+ private final SpanBucket errors = new SpanBucket (/* isLatencyBucket= */ false );
31
19
32
20
void addToBucket (ReadableSpan span ) {
33
21
StatusData status = span .toSpanData ().getStatus ();
34
22
if (status .getStatusCode () != StatusCode .ERROR ) {
35
23
latencyBuckets .get (LatencyBoundary .getBoundary (span .getLatencyNanos ())).add (span );
36
24
return ;
37
25
}
38
- errorBuckets . get ( status . getStatusCode ()) .add (span );
26
+ errors .add (span );
39
27
}
40
28
41
29
Map <LatencyBoundary , Integer > getLatencyBoundaryToCountMap () {
@@ -48,17 +36,13 @@ Map<LatencyBoundary, Integer> getLatencyBoundaryToCountMap() {
48
36
49
37
List <ReadableSpan > getOkSpans () {
50
38
List <ReadableSpan > okSpans = new ArrayList <>();
51
- for (SpanBucket latencyBucket : latencyBuckets .values ()) {
52
- latencyBucket .addTo (okSpans );
53
- }
39
+ latencyBuckets .addTo (okSpans );
54
40
return okSpans ;
55
41
}
56
42
57
43
List <ReadableSpan > getErrorSpans () {
58
44
List <ReadableSpan > errorSpans = new ArrayList <>();
59
- for (SpanBucket errorBucket : errorBuckets .values ()) {
60
- errorBucket .addTo (errorSpans );
61
- }
45
+ errors .addTo (errorSpans );
62
46
return errorSpans ;
63
47
}
64
48
@@ -68,4 +52,53 @@ List<ReadableSpan> getSpans() {
68
52
spans .addAll (getErrorSpans ());
69
53
return spans ;
70
54
}
55
+
56
+ private static class LatencyBuckets {
57
+ final SpanBucket zeroToTenMicros = new SpanBucket (/* isLatencyBucket= */ true );
58
+ final SpanBucket tenMicrosToHundredMicros = new SpanBucket (/* isLatencyBucket= */ true );
59
+ final SpanBucket hundredMicrosToOneMilli = new SpanBucket (/* isLatencyBucket= */ true );
60
+ final SpanBucket oneMilliToTenMillis = new SpanBucket (/* isLatencyBucket= */ true );
61
+ final SpanBucket tenMillisToHundredMillis = new SpanBucket (/* isLatencyBucket= */ true );
62
+ final SpanBucket hundredMillisToOneSecond = new SpanBucket (/* isLatencyBucket= */ true );
63
+ final SpanBucket oneSecondToTenSeconds = new SpanBucket (/* isLatencyBucket= */ true );
64
+ final SpanBucket tenSecondsToHundredSeconds = new SpanBucket (/* isLatencyBucket= */ true );
65
+ final SpanBucket hundredSecondsToMax = new SpanBucket (/* isLatencyBucket= */ true );
66
+
67
+ void addTo (List <ReadableSpan > spans ) {
68
+ zeroToTenMicros .addTo (spans );
69
+ tenMicrosToHundredMicros .addTo (spans );
70
+ hundredMicrosToOneMilli .addTo (spans );
71
+ oneMilliToTenMillis .addTo (spans );
72
+ tenMillisToHundredMillis .addTo (spans );
73
+ hundredMillisToOneSecond .addTo (spans );
74
+ oneSecondToTenSeconds .addTo (spans );
75
+ tenSecondsToHundredSeconds .addTo (spans );
76
+ hundredSecondsToMax .addTo (spans );
77
+ }
78
+
79
+ SpanBucket get (LatencyBoundary boundary ) {
80
+ switch (boundary ) {
81
+ case ZERO_MICROSx10 :
82
+ return zeroToTenMicros ;
83
+ case MICROSx10_MICROSx100 :
84
+ return tenMicrosToHundredMicros ;
85
+ case MICROSx100_MILLIx1 :
86
+ return hundredMicrosToOneMilli ;
87
+ case MILLIx1_MILLIx10 :
88
+ return oneMilliToTenMillis ;
89
+ case MILLIx10_MILLIx100 :
90
+ return tenMillisToHundredMillis ;
91
+ case MILLIx100_SECONDx1 :
92
+ return hundredMillisToOneSecond ;
93
+ case SECONDx1_SECONDx10 :
94
+ return oneSecondToTenSeconds ;
95
+ case SECONDx10_SECONDx100 :
96
+ return tenSecondsToHundredSeconds ;
97
+ case SECONDx100_MAX :
98
+ return hundredSecondsToMax ;
99
+ }
100
+ // Can't happen with aligned versions, just pick an arbitrary one to compile.
101
+ return hundredSecondsToMax ;
102
+ }
103
+ }
71
104
}
0 commit comments