Skip to content

Commit 2159b0e

Browse files
committed
more perf
1 parent 47aae74 commit 2159b0e

File tree

2 files changed

+42
-13
lines changed

2 files changed

+42
-13
lines changed

sdk/common/src/main/java/io/opentelemetry/sdk/internal/StackTraceRenderer.java

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,15 @@ String render() {
4040
}
4141

4242
private void appendStackTrace() {
43-
if (appendLine(throwable.toString())) {
43+
builder.append(throwable).append(System.lineSeparator());
44+
if (isOverLimit()) {
4445
return;
4546
}
4647

4748
StackTraceElement[] stackTraceElements = throwable.getStackTrace();
4849
for (StackTraceElement stackTraceElement : stackTraceElements) {
49-
if (appendLine("\tat " + stackTraceElement)) {
50+
builder.append("\tat ").append(stackTraceElement).append(System.lineSeparator());
51+
if (isOverLimit()) {
5052
return;
5153
}
5254
}
@@ -75,7 +77,13 @@ private boolean appendInnerStacktrace(
7577
String caption,
7678
Set<Throwable> seen) {
7779
if (seen.contains(innerThrowable)) {
78-
appendLine(prefix + caption + "[CIRCULAR REFERENCE: " + innerThrowable + "]");
80+
builder
81+
.append(prefix)
82+
.append(caption)
83+
.append("[CIRCULAR REFERENCE: ")
84+
.append(innerThrowable)
85+
.append("]")
86+
.append(System.lineSeparator());
7987
return true;
8088
}
8189
seen.add(innerThrowable);
@@ -96,20 +104,32 @@ private boolean appendInnerStacktrace(
96104
lastSharedFrameIndex--;
97105
}
98106

99-
if (appendLine(prefix + caption + innerThrowable)) {
107+
builder.append(prefix).append(caption).append(innerThrowable).append(System.lineSeparator());
108+
if (isOverLimit()) {
100109
return true;
101110
}
102111

103112
for (int i = 0; i <= lastSharedFrameIndex; i++) {
104113
StackTraceElement stackTraceElement = currentElements[i];
105-
if (appendLine(prefix + "\tat " + stackTraceElement)) {
114+
builder
115+
.append(prefix)
116+
.append("\tat ")
117+
.append(stackTraceElement)
118+
.append(System.lineSeparator());
119+
if (isOverLimit()) {
106120
return true;
107121
}
108122
}
109123

110124
int duplicateFrames = currentElements.length - 1 - lastSharedFrameIndex;
111125
if (duplicateFrames != 0) {
112-
if (appendLine(prefix + "\t... " + duplicateFrames + " more")) {
126+
builder
127+
.append(prefix)
128+
.append("\t... ")
129+
.append(duplicateFrames)
130+
.append(" more")
131+
.append(System.lineSeparator());
132+
if (isOverLimit()) {
113133
return true;
114134
}
115135
}
@@ -128,12 +148,7 @@ private boolean appendInnerStacktrace(
128148
return false;
129149
}
130150

131-
/**
132-
* Append the string as a new line on {@link #builder}, returning {@code true} if the builder now
133-
* exceeds the length limit.
134-
*/
135-
private boolean appendLine(String s) {
136-
builder.append(s).append(System.lineSeparator());
151+
private boolean isOverLimit() {
137152
return builder.length() >= lengthLimit;
138153
}
139154
}

sdk/common/src/test/java/io/opentelemetry/sdk/internal/StackTraceRendererTest.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,30 @@
99

1010
import java.io.PrintWriter;
1111
import java.io.StringWriter;
12+
import java.util.Random;
1213
import java.util.stream.Stream;
1314
import org.junit.jupiter.params.ParameterizedTest;
1415
import org.junit.jupiter.params.provider.Arguments;
1516
import org.junit.jupiter.params.provider.MethodSource;
1617

1718
class StackTraceRendererTest {
1819

20+
private static final Random random = new Random();
21+
22+
@ParameterizedTest
23+
@MethodSource("renderStacktraceArgs")
24+
void renderStacktrace_randomLength(Throwable throwable) {
25+
// Test equal stacktrace for random lengths to test edges
26+
for (int i = 0; i < 100; i++) {
27+
int length = random.nextInt(10_000);
28+
assertThat(new StackTraceRenderer(throwable, length).render())
29+
.isEqualTo(jdkStackTrace(throwable, length));
30+
}
31+
}
32+
1933
@ParameterizedTest
2034
@MethodSource("renderStacktraceArgs")
21-
void renderStacktrace(Throwable throwable) {
35+
void renderStacktrace_fixedLengths(Throwable throwable) {
2236
assertThat(new StackTraceRenderer(throwable, 10).render())
2337
.isEqualTo(jdkStackTrace(throwable, 10));
2438
assertThat(new StackTraceRenderer(throwable, 100).render())

0 commit comments

Comments
 (0)