Skip to content

Commit b1e1c47

Browse files
authored
Don't use hashmap for zpage buckets since the keys are constant. (#3649)
1 parent b311d50 commit b1e1c47

File tree

1 file changed

+54
-21
lines changed

1 file changed

+54
-21
lines changed

sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TracezSpanBuckets.java

+54-21
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,20 @@
1010
import io.opentelemetry.sdk.trace.data.StatusData;
1111
import java.util.ArrayList;
1212
import java.util.EnumMap;
13-
import java.util.HashMap;
1413
import java.util.List;
1514
import java.util.Map;
1615

1716
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);
3119

3220
void addToBucket(ReadableSpan span) {
3321
StatusData status = span.toSpanData().getStatus();
3422
if (status.getStatusCode() != StatusCode.ERROR) {
3523
latencyBuckets.get(LatencyBoundary.getBoundary(span.getLatencyNanos())).add(span);
3624
return;
3725
}
38-
errorBuckets.get(status.getStatusCode()).add(span);
26+
errors.add(span);
3927
}
4028

4129
Map<LatencyBoundary, Integer> getLatencyBoundaryToCountMap() {
@@ -48,17 +36,13 @@ Map<LatencyBoundary, Integer> getLatencyBoundaryToCountMap() {
4836

4937
List<ReadableSpan> getOkSpans() {
5038
List<ReadableSpan> okSpans = new ArrayList<>();
51-
for (SpanBucket latencyBucket : latencyBuckets.values()) {
52-
latencyBucket.addTo(okSpans);
53-
}
39+
latencyBuckets.addTo(okSpans);
5440
return okSpans;
5541
}
5642

5743
List<ReadableSpan> getErrorSpans() {
5844
List<ReadableSpan> errorSpans = new ArrayList<>();
59-
for (SpanBucket errorBucket : errorBuckets.values()) {
60-
errorBucket.addTo(errorSpans);
61-
}
45+
errors.addTo(errorSpans);
6246
return errorSpans;
6347
}
6448

@@ -68,4 +52,53 @@ List<ReadableSpan> getSpans() {
6852
spans.addAll(getErrorSpans());
6953
return spans;
7054
}
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+
}
71104
}

0 commit comments

Comments
 (0)