Skip to content

Commit 44f3b70

Browse files
authored
Null check return advices (#1601)
* @nullable return value on api-plugin * @nullable return value on dubbo-plugin * @nullable return value on grpc-plugin * @nullable return value on jdbc-plugin * @nullable return value on httpclient-plugin * @nullable return value on {kafka,jms}-plugin * @nullable return value on process-plugin + fix NPE * @nullable return value on servlet-plugin + fix NPE * @nullable rv & thrown live-template exit advice * update changelog
1 parent b5b070e commit 44f3b70

File tree

24 files changed

+95
-62
lines changed

24 files changed

+95
-62
lines changed

CHANGELOG.asciidoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ endif::[]
4343
* Serialize all stack trace frames when setting `stack_trace_limit=-1` instead of none - {pull}1571[#1571]
4444
* Fix `UnsupportedOperationException` when calling `ServletContext.getClassLoader()` - {pull}1576[#1576]
4545
* Fix improper request body capturing - {pull}1579[#1579]
46+
* avoid `NullPointerException` due to null return values instrumentation advices - {pull}1601[#1601]
4647
4748
[float]
4849
===== Refactors

CONTRIBUTING.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ These live templates can be pasted in Preferences > Editor > Live Templates > ot
8181

8282
**`enter`**
8383
```xml
84-
<template name="enter" value="@Advice.OnMethodEnter(suppress = Throwable.class, inline = false)&#10;public static void onEnter() {&#10; $END$&#10;}" description="Adds @OnMethodEnter advice" toReformat="false" toShortenFQNames="true">
84+
<template name="enter" value="@Advice.OnMethodEnter(suppress = Throwable.class, inline = false)&#10;public static void onEnter() {&#10; $END$&#10;}" description="Adds @OnMethodEnter advice" toReformat="true" toShortenFQNames="true">
8585
<context>
8686
<option name="JAVA_DECLARATION" value="true" />
8787
</context>
@@ -91,17 +91,17 @@ These live templates can be pasted in Preferences > Editor > Live Templates > ot
9191
**`exit`**
9292

9393
```xml
94-
<template name="exit" value="@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class, inline = false)&#10;public static void onExit(@Advice.Thrown Throwable thrown) {&#10; $END$&#10;}" description="Adds @OnMethodExit advice" toReformat="false" toShortenFQNames="true">
95-
<context>
96-
<option name="JAVA_DECLARATION" value="true" />
97-
</context>
94+
<template name="exit" value="@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class, inline = false)&#10;public static void onExit(@Advice.Thrown @Nullable Throwable thrown, @Advice.Return @Nullable Object returnValue) {&#10; $END$&#10;}" description="Adds @OnMethodExit advice" toReformat="true" toShortenFQNames="true">
95+
<context>
96+
<option name="JAVA_DECLARATION" value="true" />
97+
</context>
9898
</template>
9999
```
100100

101101

102102
**`logger`**
103103
```xml
104-
<template name="logger" value="private static final Logger logger = LoggerFactory.getLogger($CLASS_NAME$.class);" description="" toReformat="false" toShortenFQNames="true">
104+
<template name="logger" value="private static final Logger logger = LoggerFactory.getLogger($CLASS_NAME$.class);" description="" toReformat="true" toShortenFQNames="true">
105105
<variable name="CLASS_NAME" expression="className()" defaultValue="" alwaysStopAt="true" />
106106
<context>
107107
<option name="JAVA_DECLARATION" value="true" />
@@ -121,7 +121,7 @@ These live templates can be pasted in Preferences > Editor > Live Templates > ot
121121

122122
**`at`**
123123
```xml
124-
<template name="at" value="assertThat($EXPR$)$END$;" description="assertJ assert expression" toReformat="false" toShortenFQNames="true" useStaticImport="true">
124+
<template name="at" value="assertThat($EXPR$)$END$;" description="assertJ assert expression" toReformat="true" toShortenFQNames="true" useStaticImport="true">
125125
<variable name="EXPR" expression="" defaultValue="" alwaysStopAt="true" />
126126
<context>
127127
<option name="JAVA_STATEMENT" value="true" />

apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/AbstractSpanInstrumentation.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public CaptureExceptionInstrumentation() {
183183
@Advice.OnMethodExit(suppress = Throwable.class, inline = false)
184184
public static String captureException(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object context,
185185
@Advice.Argument(0) Throwable t,
186-
@Advice.Return String returnValue) {
186+
@Advice.Return @Nullable String returnValue) {
187187
if (context instanceof AbstractSpan<?>) {
188188
return ((AbstractSpan<?>) context).captureExceptionAndGetErrorId(t);
189189
} else {
@@ -217,10 +217,11 @@ public GetIdInstrumentation() {
217217
super(named("getId").and(takesArguments(0)));
218218
}
219219

220+
@Nullable
220221
@AssignTo.Return
221222
@Advice.OnMethodExit(suppress = Throwable.class, inline = false)
222223
public static String getId(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object context,
223-
@Advice.Return String returnValue) {
224+
@Advice.Return @Nullable String returnValue) {
224225
if (context instanceof AbstractSpan<?>) {
225226
return ((AbstractSpan<?>) context).getTraceContext().getId().toString();
226227
} else {
@@ -234,10 +235,11 @@ public GetTraceIdInstrumentation() {
234235
super(named("getTraceId").and(takesArguments(0)));
235236
}
236237

238+
@Nullable
237239
@AssignTo.Return
238240
@Advice.OnMethodExit(suppress = Throwable.class, inline = false)
239241
public static String getTraceId(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object context,
240-
@Advice.Return String returnValue) {
242+
@Advice.Return @Nullable String returnValue) {
241243
if (context instanceof AbstractSpan<?>) {
242244
return ((AbstractSpan<?>) context).getTraceContext().getTraceId().toString();
243245
} else {
@@ -253,7 +255,8 @@ public AddStringLabelInstrumentation() {
253255

254256
@Advice.OnMethodEnter(suppress = Throwable.class, inline = false)
255257
public static void addLabel(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object context,
256-
@Advice.Argument(0) String key, @Nullable @Advice.Argument(1) String value) {
258+
@Advice.Argument(0) String key,
259+
@Advice.Argument(1) @Nullable String value) {
257260
if (value != null && context instanceof AbstractSpan) {
258261
((AbstractSpan<?>) context).addLabel(key, value);
259262
}
@@ -267,7 +270,8 @@ public AddNumberLabelInstrumentation() {
267270

268271
@Advice.OnMethodEnter(suppress = Throwable.class, inline = false)
269272
public static void addLabel(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object context,
270-
@Advice.Argument(0) String key, @Nullable @Advice.Argument(1) Number value) {
273+
@Advice.Argument(0) String key,
274+
@Advice.Argument(1) @Nullable Number value) {
271275
if (value != null && context instanceof AbstractSpan) {
272276
((AbstractSpan<?>) context).addLabel(key, value);
273277
}
@@ -281,7 +285,8 @@ public AddBooleanLabelInstrumentation() {
281285

282286
@Advice.OnMethodEnter(suppress = Throwable.class, inline = false)
283287
public static void addLabel(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object context,
284-
@Advice.Argument(0) String key, @Nullable @Advice.Argument(1) Boolean value) {
288+
@Advice.Argument(0) String key,
289+
@Advice.Argument(1) @Nullable Boolean value) {
285290
if (value != null && context instanceof AbstractSpan) {
286291
((AbstractSpan<?>) context).addLabel(key, value);
287292
}

apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/LegacySpanInstrumentation.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,11 @@ public GetIdInstrumentation() {
151151
super(named("getId").and(takesArguments(0)));
152152
}
153153

154+
@Nullable
154155
@AssignTo.Return
155156
@Advice.OnMethodExit(inline = false)
156157
public static String getId(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object span,
157-
@Advice.Return String returnValue) {
158+
@Advice.Return @Nullable String returnValue) {
158159
if (span instanceof Span) {
159160
return ((Span) span).getTraceContext().getId().toString();
160161
} else {
@@ -168,10 +169,11 @@ public GetTraceIdInstrumentation() {
168169
super(named("getTraceId").and(takesArguments(0)));
169170
}
170171

172+
@Nullable
171173
@AssignTo.Return
172174
@Advice.OnMethodExit(inline = false)
173175
public static String getTraceId(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object span,
174-
@Advice.Return String returnValue) {
176+
@Advice.Return @Nullable String returnValue) {
175177
if (span instanceof Span) {
176178
return ((Span) span).getTraceContext().getTraceId().toString();
177179
} else {

apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/TransactionInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,11 @@ public EnsureParentIdInstrumentation() {
7878
super(named("ensureParentId"));
7979
}
8080

81+
@Nullable
8182
@AssignTo.Return
8283
@Advice.OnMethodExit(suppress = Throwable.class, inline = false)
8384
public static String ensureParentId(@Advice.FieldValue(value = "span", typing = Assigner.Typing.DYNAMIC) Object transaction,
84-
@Advice.Return String returnValue) {
85+
@Advice.Return @Nullable String returnValue) {
8586
if (transaction instanceof Transaction) {
8687
final TraceContext traceContext = ((Transaction) transaction).getTraceContext();
8788
Id parentId = traceContext.getParentId();

apm-agent-plugins/apm-dubbo-plugin/src/main/java/co/elastic/apm/agent/dubbo/advice/AlibabaMonitorFilterAdvice.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,21 @@ public static void onEnterFilterInvoke(@Advice.Argument(1) Invocation invocation
8787

8888
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
8989
public static void onExitFilterInvoke(@Advice.Argument(1) Invocation invocation,
90-
@Advice.Return Result result,
91-
@Nullable @Advice.Local("span") Span span,
92-
@Nullable @Advice.Thrown Throwable t,
93-
@Nullable @Advice.Local("transaction") Transaction transaction) {
90+
@Advice.Return @Nullable Result result,
91+
@Advice.Local("span") @Nullable Span span,
92+
@Advice.Thrown @Nullable Throwable t,
93+
@Advice.Local("transaction") @Nullable Transaction transaction) {
9494
AbstractSpan<?> actualSpan = span != null ? span : transaction;
9595
if (actualSpan == null) {
9696
return;
9797
}
98-
actualSpan.captureException(t)
99-
.captureException(result.getException())
100-
.deactivate();
98+
actualSpan.captureException(t);
99+
100+
if (result != null) { // will be null in case of thrown exception
101+
actualSpan.captureException(result.getException());
102+
}
103+
actualSpan.deactivate();
104+
101105
if (!(RpcContext.getContext().getFuture() instanceof FutureAdapter)) {
102106
actualSpan.end();
103107
}

apm-agent-plugins/apm-dubbo-plugin/src/main/java/co/elastic/apm/agent/dubbo/advice/ApacheMonitorFilterAdvice.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ public static void onEnterFilterInvoke(@Advice.Argument(1) Invocation invocation
9292

9393
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
9494
public static void onExitFilterInvoke(@Advice.Argument(1) Invocation invocation,
95-
@Advice.Return Result result,
96-
@Nullable @Advice.Local("span") final Span span,
97-
@Advice.Thrown Throwable t,
98-
@Nullable @Advice.Local("transaction") Transaction transaction) {
95+
@Advice.Return @Nullable Result result,
96+
@Advice.Local("span") @Nullable final Span span,
97+
@Advice.Thrown @Nullable Throwable t,
98+
@Advice.Local("transaction") @Nullable Transaction transaction) {
9999

100100
RpcContext context = RpcContext.getContext();
101101
AbstractSpan<?> actualSpan = span != null ? span : transaction;

apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/main/java/co/elastic/apm/agent/grpc/ServerCallHandlerInstrumentation.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ public static Object onEnter(@Advice.Origin Class<?> clazz,
6565

6666
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class, inline = false)
6767
public static void onExit(@Advice.Thrown @Nullable Throwable thrown,
68-
@Advice.Argument(0) ServerCall<?, ?> serverCall,
69-
@Advice.Return ServerCall.Listener<?> listener,
70-
@Advice.Enter @Nullable Object enterTransaction) {
68+
@Advice.Argument(0) ServerCall<?, ?> serverCall,
69+
@Advice.Return @Nullable ServerCall.Listener<?> listener,
70+
@Advice.Enter @Nullable Object enterTransaction) {
7171

7272
if (!(enterTransaction instanceof Transaction)) {
7373
return;
@@ -79,7 +79,11 @@ public static void onExit(@Advice.Thrown @Nullable Throwable thrown,
7979
return;
8080
}
8181

82-
helper.registerTransaction(serverCall, listener, transaction);
82+
if (listener != null) {
83+
helper.registerTransaction(serverCall, listener, transaction);
84+
}
85+
86+
8387
}
8488

8589
}

apm-agent-plugins/apm-grpc/apm-grpc-test-1.6.1/src/test/java/co/elastic/apm/agent/grpc/v1_6_1/testapp/generated/HelloGrpc.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* #%L
33
* Elastic APM Java agent
44
* %%
5-
* Copyright (C) 2018 - 2020 Elastic and contributors
5+
* Copyright (C) 2018 - 2021 Elastic and contributors
66
* %%
77
* Licensed to Elasticsearch B.V. under one or more contributor
88
* license agreements. See the NOTICE file distributed with

apm-agent-plugins/apm-grpc/apm-grpc-test-1.6.1/src/test/java/co/elastic/apm/agent/grpc/v1_6_1/testapp/generated/HelloReply.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* #%L
33
* Elastic APM Java agent
44
* %%
5-
* Copyright (C) 2018 - 2020 Elastic and contributors
5+
* Copyright (C) 2018 - 2021 Elastic and contributors
66
* %%
77
* Licensed to Elasticsearch B.V. under one or more contributor
88
* license agreements. See the NOTICE file distributed with

0 commit comments

Comments
 (0)