Skip to content

Commit 5684e98

Browse files
wolframhaussigfelixbarny
authored andcommitted
Automatic instrumentation should not override manual results (#752)
1 parent 10ee220 commit 5684e98

File tree

7 files changed

+41
-12
lines changed

7 files changed

+41
-12
lines changed

apm-agent-core/src/main/java/co/elastic/apm/agent/impl/transaction/Transaction.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ protected Labels.Mutable initialValue() {
7373
private final WriterReaderPhaser phaser = new WriterReaderPhaser();
7474

7575
/**
76-
* The result of the transaction. HTTP status code for HTTP-related transactions.
76+
* The result of the transaction. HTTP status code for HTTP-related
77+
* transactions.
7778
*/
7879
@Nullable
7980
private String result;
@@ -155,7 +156,21 @@ public String getResult() {
155156
}
156157

157158
/**
158-
* The result of the transaction. HTTP status code for HTTP-related transactions.
159+
* The result of the transaction. HTTP status code for HTTP-related
160+
* transactions. This sets the result only if it is not already set. should be
161+
* used for instrumentations
162+
*/
163+
public Transaction withResultIfUnset(@Nullable String result) {
164+
if (this.result == null) {
165+
this.result = result;
166+
}
167+
return this;
168+
}
169+
170+
/**
171+
* The result of the transaction. HTTP status code for HTTP-related
172+
* transactions. This sets the result regardless of an already existing value.
173+
* should be used for user defined results
159174
*/
160175
public Transaction withResult(@Nullable String result) {
161176
this.result = result;

apm-agent-plugins/apm-api-plugin/src/test/java/co/elastic/apm/agent/plugin/api/TransactionInstrumentationTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,22 @@ void testResult() {
8181
assertThat(reporter.getFirstTransaction().getResult()).isEqualTo("foo");
8282
}
8383

84+
@Test
85+
void testInstrumentationDoesNotOverrideUserResult() {
86+
transaction.setResult("foo");
87+
endTransaction();
88+
reporter.getFirstTransaction().withResultIfUnset("200");
89+
assertThat(reporter.getFirstTransaction().getResult()).isEqualTo("foo");
90+
}
91+
92+
@Test
93+
void testUserCanOverrideResult() {
94+
transaction.setResult("foo");
95+
transaction.setResult("bar");
96+
endTransaction();
97+
assertThat(reporter.getFirstTransaction().getResult()).isEqualTo("bar");
98+
}
99+
84100
@Test
85101
void testChaining() {
86102
transaction.setType("foo").setName("foo").addLabel("foo", "bar").setUser("foo", "bar", "baz").setResult("foo");

apm-agent-plugins/apm-es-restclient-plugin/apm-es-restclient-plugin-common/src/test/java/co/elastic/apm/agent/es/restclient/AbstractEsClientInstrumentationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void startTransaction() {
7171
Transaction transaction = tracer.startTransaction(TraceContext.asRoot(), null, null).activate();
7272
transaction.withName("ES Transaction");
7373
transaction.withType("request");
74-
transaction.withResult("success");
74+
transaction.withResultIfUnset("success");
7575
}
7676

7777
@After

apm-agent-plugins/apm-jdbc-plugin/src/test/java/co/elastic/apm/agent/jdbc/AbstractJdbcInstrumentationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public abstract class AbstractJdbcInstrumentationTest extends AbstractInstrument
7373
transaction = tracer.startTransaction(TraceContext.asRoot(), null, null).activate();
7474
transaction.withName("transaction");
7575
transaction.withType("request");
76-
transaction.withResult("success");
76+
transaction.withResultIfUnset("success");
7777
signatureParser = new SignatureParser();
7878
}
7979

apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracing/impl/ApmSpanInstrumentation.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,13 @@ private static boolean handleSpecialTransactionTag(Transaction transaction, Stri
213213
transaction.withResult(value.toString());
214214
return true;
215215
} else if ("error".equals(key)) {
216-
if (transaction.getResult() == null && Boolean.FALSE.equals(value)) {
217-
transaction.withResult("error");
216+
if (Boolean.FALSE.equals(value)) {
217+
transaction.withResultIfUnset("error");
218218
}
219219
return true;
220220
} else if ("http.status_code".equals(key) && value instanceof Number) {
221221
transaction.getContext().getResponse().withStatusCode(((Number) value).intValue());
222-
if (transaction.getResult() == null) {
223-
transaction.withResult(ResultUtil.getResultByHttpStatus(((Number) value).intValue()));
224-
}
222+
transaction.withResultIfUnset(ResultUtil.getResultByHttpStatus(((Number) value).intValue()));
225223
transaction.withType(Transaction.TYPE_REQUEST);
226224
return true;
227225
} else if ("http.method".equals(key)) {

apm-agent-plugins/apm-quartz-job-plugin/src/main/java/co/elastic/apm/agent/quartz/job/JobTransactionNameAdvice.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ private static void setTransactionName(@Advice.Argument(value = 0) @Nullable Job
6767
public static void onMethodExitException(@Advice.Argument(value = 0) @Nullable JobExecutionContext context,
6868
@Advice.Local("transaction") @Nullable Transaction transaction, @Advice.Thrown Throwable t) {
6969
if (transaction != null) {
70-
if (transaction.getResult() == null && context != null && context.getResult() != null) {
71-
transaction.withResult(context.getResult().toString());
70+
if (context != null && context.getResult() != null) {
71+
transaction.withResultIfUnset(context.getResult().toString());
7272
}
7373
transaction.captureException(t)
7474
.deactivate()

apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletTransactionHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ private void doOnAfter(Transaction transaction, @Nullable Throwable exception, b
189189
status = 500;
190190
}
191191
fillResponse(transaction.getContext().getResponse(), committed, status);
192-
transaction.withResult(ResultUtil.getResultByHttpStatus(status));
192+
transaction.withResultIfUnset(ResultUtil.getResultByHttpStatus(status));
193193
transaction.withType("request");
194194
applyDefaultTransactionName(method, servletPath, pathInfo, transaction);
195195
if (exception != null) {

0 commit comments

Comments
 (0)