diff --git a/CHANGES.md b/CHANGES.md index a5ad4f55515bc451d7ad31806255f226adedb19e..7da895aadd79a7ac9de201ca35eda6c57fbc4af9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,6 +23,7 @@ Release Notes. * Add an optional agent plugin to support mybatis. * Add `spring-cloud-gateway-3.x` optional plugin. * Add `okhttp-4.x` plugin. +* Fix NPE when thrift field is nested in plugin `thrift` #### OAP-Backend * BugFix: filter invalid Envoy access logs whose socket address is empty. diff --git a/apm-sniffer/apm-sdk-plugin/thrift-plugin/src/main/java/org/apache/skywalking/apm/plugin/thrift/wrapper/ServerInProtocolWrapper.java b/apm-sniffer/apm-sdk-plugin/thrift-plugin/src/main/java/org/apache/skywalking/apm/plugin/thrift/wrapper/ServerInProtocolWrapper.java index 3cde8b4c48743928e0ac8f7580144aacae0b95a9..cf7205788879e461044e01107df6200d7b598437 100644 --- a/apm-sniffer/apm-sdk-plugin/thrift-plugin/src/main/java/org/apache/skywalking/apm/plugin/thrift/wrapper/ServerInProtocolWrapper.java +++ b/apm-sniffer/apm-sdk-plugin/thrift-plugin/src/main/java/org/apache/skywalking/apm/plugin/thrift/wrapper/ServerInProtocolWrapper.java @@ -85,25 +85,29 @@ public class ServerInProtocolWrapper extends AbstractProtocolWrapper { } return readFieldBegin(); } - if (field.type == TType.STOP) { - Boolean haveCreatedSpan = - (Boolean) ContextManager.getRuntimeContext().get(HAVE_CREATED_SPAN); - if (haveCreatedSpan != null && !haveCreatedSpan) { - try { - AbstractSpan span = ContextManager.createEntrySpan( - context.getOperatorName(), createContextCarrier(null)); - span.start(context.startTime); - span.tag(TAG_ARGS, context.getArguments()); - span.setComponent(ComponentsDefine.THRIFT_SERVER); - SpanLayer.asRPCFramework(span); - } catch (Throwable throwable) { - LOGGER.error("Failed to create EntrySpan.", throwable); - } finally { - context = null; - } + + return field; + } + + @Override + public void readMessageEnd() throws TException { + super.readMessageEnd(); + Boolean haveCreatedSpan = + (Boolean) ContextManager.getRuntimeContext().get(HAVE_CREATED_SPAN); + if (haveCreatedSpan != null && !haveCreatedSpan) { + try { + AbstractSpan span = ContextManager.createEntrySpan( + context.getOperatorName(), createContextCarrier(null)); + span.start(context.startTime); + span.tag(TAG_ARGS, context.getArguments()); + span.setComponent(ComponentsDefine.THRIFT_SERVER); + SpanLayer.asRPCFramework(span); + } catch (Throwable throwable) { + LOGGER.error("Failed to create EntrySpan.", throwable); + } finally { + context = null; } } - return field; } private ContextCarrier createContextCarrier(Map header) {