From 0036ea674f52f880bb2fd5677f3d5a27b2c66e26 Mon Sep 17 00:00:00 2001 From: Leon Yang <1395305816@qq.com> Date: Fri, 7 May 2021 13:59:06 +0800 Subject: [PATCH] FIX: NPE when thrift field is nested (#6909) * FIX: NPE when field is nested * ADD: change.md Co-authored-by: Yang Xin --- CHANGES.md | 1 + .../wrapper/ServerInProtocolWrapper.java | 38 ++++++++++--------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index a5ad4f5551..7da895aadd 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 3cde8b4c48..cf72057888 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) { -- GitLab