Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Change accessor wiring for Thrift plugin #1329

Merged
merged 1 commit into from
Dec 8, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,25 +37,40 @@ private ThriftConstants() {
public static final ServiceType THRIFT_CLIENT = ServiceTypeFactory.of(9100, "THRIFT_CLIENT", RECORD_STATISTICS);
public static final ServiceType THRIFT_SERVER_INTERNAL = ServiceTypeFactory.of(1101, "THRIFT_SERVER_INTERNAL", "THRIFT_SERVER");
public static final ServiceType THRIFT_CLIENT_INTERNAL = ServiceTypeFactory.of(9101, "THRIFT_CLIENT_INTERNAL", "THRIFT_CLIENT");

public static final AnnotationKey THRIFT_URL = AnnotationKeyFactory.of(80, "thrift.url");
public static final AnnotationKey THRIFT_ARGS = AnnotationKeyFactory.of(81, "thrift.args", AnnotationKeyProperty.VIEW_IN_RECORD_SET);
public static final AnnotationKey THRIFT_RESULT = AnnotationKeyFactory.of(82, "thrift.result", AnnotationKeyProperty.VIEW_IN_RECORD_SET);

public static final String UNKNOWN_METHOD_NAME = "unknown";
public static final String UNKNOWN_METHOD_URI = "/" + UNKNOWN_METHOD_NAME;
public static final String UNKNOWN_ADDRESS = "Unknown";

public static final Pattern PROCESSOR_PATTERN = Pattern.compile("\\$Processor");
public static final Pattern ASYNC_PROCESSOR_PATTERN = Pattern.compile("\\$AsyncProcessor");
public static final Pattern CLIENT_PATTERN = Pattern.compile("\\$Client");
public static final Pattern ASYNC_METHOD_CALL_PATTERN = Pattern.compile("\\$AsyncClient\\$");

public static final String ATTRIBUTE_CONFIG = "thriftPluginConfig";

// field names
public static final String T_ASYNC_METHOD_CALL_FIELD_TRANSPORT = "transport";
public static final String FRAME_BUFFER_FIELD_TRANS_ = "trans_";
public static final String FRAME_BUFFER_FIELD_IN_TRANS_ = "inTrans_";


// custom field injector (accessor) FQCN
private static final String FIELD_ACCESSOR_BASE = "com.navercorp.pinpoint.plugin.thrift.field.accessor.";
public static final String FIELD_ACCESSOR_ASYNC_CALL_END_FLAG = FIELD_ACCESSOR_BASE + "AsyncCallEndFlagFieldAccessor";
public static final String FIELD_ACCESSOR_ASYNC_CALL_REMOTE_ADDRESS = FIELD_ACCESSOR_BASE + "AsyncCallRemoteAddressFieldAccessor";
public static final String FIELD_ACCESSOR_ASYNC_MARKER_FLAG = FIELD_ACCESSOR_BASE + "AsyncMarkerFlagFieldAccessor";
public static final String FIELD_ACCESSOR_ASYNC_NEXT_SPAN_ID = FIELD_ACCESSOR_BASE + "AsyncNextSpanIdFieldAccessor";
public static final String FIELD_ACCESSOR_ASYNC_TRACE_ID = FIELD_ACCESSOR_BASE + "AsyncTraceIdFieldAccessor";
public static final String FIELD_ACCESSOR_SERVER_MARKER_FLAG = FIELD_ACCESSOR_BASE + "ServerMarkerFlagFieldAccessor";
public static final String FIELD_ACCESSOR_SOCKET_ADDRESS = FIELD_ACCESSOR_BASE + "SocketAddressFieldAccessor";
public static final String FIELD_ACCESSOR_SOCKET = FIELD_ACCESSOR_BASE + "SocketFieldAccessor";

// field getter FQCN
private static final String FIELD_GETTER_BASE = "com.navercorp.pinpoint.plugin.thrift.field.getter.";
public static final String FIELD_GETTER_T_NON_BLOCKING_TRANSPORT = FIELD_GETTER_BASE + "TNonblockingTransportFieldGetter";
public static final String FIELD_GETTER_T_TRANSPORT = FIELD_GETTER_BASE + "TTransportFieldGetter";
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,6 @@
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplateAware;
import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin;
import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.AsyncCallEndFlagFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.AsyncCallRemoteAddressFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.AsyncMarkerFlagFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.AsyncNextSpanIdFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.AsyncTraceIdFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.ServerMarkerFlagFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.SocketAddressFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.accessor.SocketFieldAccessor;
import com.navercorp.pinpoint.plugin.thrift.field.getter.TNonblockingTransportFieldGetter;
import com.navercorp.pinpoint.plugin.thrift.field.getter.TTransportFieldGetter;

import static com.navercorp.pinpoint.common.util.VarArgs.va;

Expand Down Expand Up @@ -156,13 +146,13 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {

final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
target.addField(SocketAddressFieldAccessor.class.getName());
target.addField(AsyncMarkerFlagFieldAccessor.class.getName());
target.addField(AsyncTraceIdFieldAccessor.class.getName());
target.addField(AsyncNextSpanIdFieldAccessor.class.getName());
target.addField(AsyncCallEndFlagFieldAccessor.class.getName());
target.addField(AsyncCallRemoteAddressFieldAccessor.class.getName());
target.addGetter(TNonblockingTransportFieldGetter.class.getName(), ThriftConstants.T_ASYNC_METHOD_CALL_FIELD_TRANSPORT);
target.addField(ThriftConstants.FIELD_ACCESSOR_SOCKET_ADDRESS);
target.addField(ThriftConstants.FIELD_ACCESSOR_ASYNC_MARKER_FLAG);
target.addField(ThriftConstants.FIELD_ACCESSOR_ASYNC_TRACE_ID);
target.addField(ThriftConstants.FIELD_ACCESSOR_ASYNC_NEXT_SPAN_ID);
target.addField(ThriftConstants.FIELD_ACCESSOR_ASYNC_CALL_END_FLAG);
target.addField(ThriftConstants.FIELD_ACCESSOR_ASYNC_CALL_REMOTE_ADDRESS);
target.addGetter(ThriftConstants.FIELD_GETTER_T_NON_BLOCKING_TRANSPORT, ThriftConstants.T_ASYNC_METHOD_CALL_FIELD_TRANSPORT);

// TAsyncMethodCall(TAsyncClient, TProtocolFactory, TNonblockingTransport, AsyncMethodCallback<T>, boolean)
final InstrumentMethod constructor = target.getConstructor("org.apache.thrift.async.TAsyncClient",
Expand Down Expand Up @@ -275,7 +265,7 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {

final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
target.addField(ServerMarkerFlagFieldAccessor.class.getName());
target.addField(ThriftConstants.FIELD_ACCESSOR_SERVER_MARKER_FLAG);

// ProcessFunction.process(int, TProtocol, TProtocol, I)
final InstrumentMethod process = target.getDeclaredMethod("process", "int", "org.apache.thrift.protocol.TProtocol",
Expand Down Expand Up @@ -306,8 +296,8 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {

final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
target.addField(ServerMarkerFlagFieldAccessor.class.getName());
target.addField(AsyncMarkerFlagFieldAccessor.class.getName());
target.addField(ThriftConstants.FIELD_ACCESSOR_SERVER_MARKER_FLAG);
target.addField(ThriftConstants.FIELD_ACCESSOR_ASYNC_MARKER_FLAG);

// TBaseAsyncProcessor.process(AbstractNonblockingServer$AsyncFrameBuffer)
final InstrumentMethod process = target.getDeclaredMethod("process", "org.apache.thrift.server.AbstractNonblockingServer$AsyncFrameBuffer");
Expand All @@ -328,23 +318,23 @@ private void addInterceptorsForRetrievingSocketAddresses() {
// injector TTranports
// TSocket(Socket), TSocket(String, int, int)
addTTransportEditor("org.apache.thrift.transport.TSocket",
"com.navercorp.pinpoint.plugin.thrift.interceptor.transport.TSocketConstructInterceptor", new String[] { "java.net.Socket" }, new String[] {
"java.lang.String", "int", "int" });
"com.navercorp.pinpoint.plugin.thrift.interceptor.transport.TSocketConstructInterceptor", new String[]{"java.net.Socket"}, new String[]{
"java.lang.String", "int", "int"});

// wrapper TTransports
// TFramedTransport(TTransport), TFramedTransport(TTransport, int)
addTTransportEditor("org.apache.thrift.transport.TFramedTransport",
"com.navercorp.pinpoint.plugin.thrift.interceptor.transport.wrapper.TFramedTransportConstructInterceptor",
new String[] { "org.apache.thrift.transport.TTransport" }, new String[] { "org.apache.thrift.transport.TTransport", "int" });
new String[]{"org.apache.thrift.transport.TTransport"}, new String[]{"org.apache.thrift.transport.TTransport", "int"});
// TFastFramedTransport(TTransport, int, int)
addTTransportEditor("org.apache.thrift.transport.TFastFramedTransport",
"com.navercorp.pinpoint.plugin.thrift.interceptor.transport.wrapper.TFastFramedTransportConstructInterceptor", new String[] {
"org.apache.thrift.transport.TTransport", "int", "int" });
"com.navercorp.pinpoint.plugin.thrift.interceptor.transport.wrapper.TFastFramedTransportConstructInterceptor", new String[]{
"org.apache.thrift.transport.TTransport", "int", "int"});
// TSaslClientTransport(TTransport), TSaslClientTransport(SaslClient, TTransport)
addTTransportEditor("org.apache.thrift.transport.TSaslClientTransport",
"com.navercorp.pinpoint.plugin.thrift.interceptor.transport.wrapper.TSaslTransportConstructInterceptor",
new String[] { "org.apache.thrift.transport.TTransport" }, new String[] { "javax.security.sasl.SaslClient",
"org.apache.thrift.transport.TTransport" });
new String[]{"org.apache.thrift.transport.TTransport"}, new String[]{"javax.security.sasl.SaslClient",
"org.apache.thrift.transport.TTransport"});

// TMemoryInputTransport - simply add socket field
addTTransportEditor("org.apache.thrift.transport.TMemoryInputTransport");
Expand All @@ -368,15 +358,15 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {

final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
target.addField(SocketFieldAccessor.class.getName());
target.addField(ThriftConstants.FIELD_ACCESSOR_SOCKET);
return target.toBytecode();
}

});
}

private void addTTransportEditor(String tTransportClassName, final String tTransportInterceptorFqcn,
final String[]... parameterTypeGroups) {
final String[]... parameterTypeGroups) {
final String targetClassName = tTransportClassName;
transformTemplate.transform(targetClassName, new TransformCallback() {

Expand All @@ -385,7 +375,7 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {

final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
target.addField(SocketFieldAccessor.class.getName());
target.addField(ThriftConstants.FIELD_ACCESSOR_SOCKET);

for (String[] parameterTypeGroup : parameterTypeGroups) {
final InstrumentMethod constructor = target.getConstructor(parameterTypeGroup);
Expand All @@ -409,8 +399,8 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {

final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
target.addField(SocketFieldAccessor.class.getName());
target.addField(SocketAddressFieldAccessor.class.getName());
target.addField(ThriftConstants.FIELD_ACCESSOR_SOCKET);
target.addField(ThriftConstants.FIELD_ACCESSOR_SOCKET_ADDRESS);

// TNonblockingSocket(SocketChannel, int, SocketAddress)
final InstrumentMethod constructor = target.getConstructor("java.nio.channels.SocketChannel", "int", "java.net.SocketAddress");
Expand All @@ -434,12 +424,12 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {

final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
target.addField(SocketFieldAccessor.class.getName());
target.addGetter(TNonblockingTransportFieldGetter.class.getName(), ThriftConstants.FRAME_BUFFER_FIELD_TRANS_);
target.addField(ThriftConstants.FIELD_ACCESSOR_SOCKET);
target.addGetter(ThriftConstants.FIELD_GETTER_T_NON_BLOCKING_TRANSPORT, ThriftConstants.FRAME_BUFFER_FIELD_TRANS_);

// [THRIFT-1972] - 0.9.1 added a field for the wrapper around trans_ field, while getting rid of getInputTransport() method
if (target.hasField(ThriftConstants.FRAME_BUFFER_FIELD_IN_TRANS_)) {
target.addGetter(TTransportFieldGetter.class.getName(), ThriftConstants.FRAME_BUFFER_FIELD_IN_TRANS_);
target.addGetter(ThriftConstants.FIELD_GETTER_T_TRANSPORT, ThriftConstants.FRAME_BUFFER_FIELD_IN_TRANS_);
// AbstractNonblockingServer$FrameBuffer(TNonblockingTransport, SelectionKey, AbstractSelectThread)
final InstrumentMethod constructor = target.getConstructor(
"org.apache.thrift.server.AbstractNonblockingServer", // inner class - implicit reference to outer class instance
Expand Down Expand Up @@ -500,7 +490,7 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin

// processor
if (traceThriftProcessor) {
target.addField(ServerMarkerFlagFieldAccessor.class.getName());
target.addField(ThriftConstants.FIELD_ACCESSOR_SERVER_MARKER_FLAG);
// TProtocol.readFieldBegin()
final InstrumentMethod readFieldBegin = target.getDeclaredMethod("readFieldBegin");
if (readFieldBegin != null) {
Expand All @@ -525,7 +515,7 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin
}

// for async processors
target.addField(AsyncMarkerFlagFieldAccessor.class.getName());
target.addField(ThriftConstants.FIELD_ACCESSOR_ASYNC_MARKER_FLAG);
// TProtocol.readMessageBegin()
final InstrumentMethod readMessageBegin = target.getDeclaredMethod("readMessageBegin");
if (readMessageBegin != null) {
Expand Down