Skip to content
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
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava1;
package com.newrelic.agent.instrumentation.labs.rxjava1;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava1;
package com.newrelic.agent.instrumentation.labs.rxjava1;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.newrelic.agent.instrumentation.labs.rxjava1;

import com.newrelic.agent.instrumentation.classmatchers.ClassAndMethodMatcher;
import com.newrelic.agent.instrumentation.classmatchers.ClassMatcher;
import com.newrelic.agent.instrumentation.methodmatchers.MethodMatcher;

public class RxJava1ClassAndMethodMatcher implements ClassAndMethodMatcher {

private ClassMatcher classMatcher = null;
private MethodMatcher methodMatcher = null;

public RxJava1ClassAndMethodMatcher() {
classMatcher = new RxJava1ClassMatcher();
methodMatcher = new RxJava1ReturnMethodMatcher();
}

@Override
public ClassMatcher getClassMatcher() {
return classMatcher;
}

@Override
public MethodMatcher getMethodMatcher() {
return methodMatcher;
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava1;
package com.newrelic.agent.instrumentation.labs.rxjava1;

import java.util.Collection;
import java.util.Collections;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.newrelic.agent.instrumentation.labs.rxjava1;

import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
import java.util.HashMap;
import java.util.Map;

import com.newrelic.agent.deps.org.objectweb.asm.commons.Method;
import com.newrelic.agent.instrumentation.InstrumentationType;
import com.newrelic.agent.instrumentation.classmatchers.ClassAndMethodMatcher;
import com.newrelic.agent.instrumentation.classmatchers.OptimizedClassMatcher.Match;
import com.newrelic.agent.instrumentation.classmatchers.OptimizedClassMatcherBuilder;
import com.newrelic.agent.instrumentation.context.ClassMatchVisitorFactory;
import com.newrelic.agent.instrumentation.context.ContextClassTransformer;
import com.newrelic.agent.instrumentation.context.InstrumentationContext;
import com.newrelic.agent.instrumentation.context.InstrumentationContextManager;
import com.newrelic.agent.instrumentation.methodmatchers.MethodMatcher;
import com.newrelic.agent.instrumentation.tracing.TraceDetailsBuilder;

public class RxJava1ClassTransformer implements ContextClassTransformer {

private final InstrumentationContextManager contextManager;
private final Map<String, ClassMatchVisitorFactory> matchers = new HashMap<String, ClassMatchVisitorFactory>();

public RxJava1ClassTransformer(InstrumentationContextManager mgr) {
contextManager = mgr;
}

protected void addMatcher(ClassAndMethodMatcher matcher) {
OptimizedClassMatcherBuilder builder = OptimizedClassMatcherBuilder.newBuilder();
builder.addClassMethodMatcher(matcher);
ClassMatchVisitorFactory matchVisitor = builder.build();
matchers.put(matcher.getClass().getSimpleName(), matchVisitor);
contextManager.addContextClassTransformer(matchVisitor, this);
}

protected void removeMatcher(ClassAndMethodMatcher matcher) {
ClassMatchVisitorFactory matchVisitor = matchers.get(matcher.getClass().getSimpleName());
if(matchVisitor != null) {
contextManager.removeMatchVisitor(matchVisitor);
}
}


@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer, InstrumentationContext context, Match match)
throws IllegalClassFormatException {
for (Method method : match.getMethods()) {
for (ClassAndMethodMatcher matcher : match.getClassMatches().keySet()) {
if (matcher.getMethodMatcher().matches(MethodMatcher.UNSPECIFIED_ACCESS, method.getName(),
method.getDescriptor(), match.getMethodAnnotations(method))) {
context.putTraceAnnotation(method, TraceDetailsBuilder.newBuilder().setTracerFactoryName(RxJava1PreMain.TRACER_FACTORY)
.setInstrumentationSourceName("New Relic Labs").setInstrumentationType(InstrumentationType.TraceAnnotation).setDispatcher(false).build());
}

}
}
return null;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.newrelic.agent.instrumentation.labs.rxjava1;

import com.newrelic.agent.Transaction;
import com.newrelic.agent.tracers.AbstractTracerFactory;
import com.newrelic.agent.tracers.ClassMethodSignature;
import com.newrelic.agent.tracers.DefaultTracer;
import com.newrelic.agent.tracers.Tracer;
import com.newrelic.agent.tracers.TracerFlags;
import com.newrelic.agent.tracers.metricname.MetricNameFormat;
import com.newrelic.agent.tracers.metricname.SimpleMetricNameFormat;

public class RxJava1Factory extends AbstractTracerFactory {

@Override
public Tracer doGetTracer(Transaction transaction, ClassMethodSignature sig, Object object, Object[] args) {
String classname = sig.getClassName();
String methodName = sig.getMethodName();

int flags = DefaultTracer.DEFAULT_TRACER_FLAGS | TracerFlags.DISPATCHER;

MetricNameFormat metricName = new SimpleMetricNameFormat("Custom/RxJava1/RxJava1Method/"+classname+"/"+methodName);
DefaultTracer tracer = new DefaultTracer(transaction, sig, object, metricName, flags);
return tracer;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.newrelic.agent.instrumentation.labs.rxjava1;

import java.lang.instrument.Instrumentation;
import java.util.concurrent.Executors;

import com.newrelic.agent.InstrumentationProxy;
import com.newrelic.agent.TracerService;
import com.newrelic.agent.core.CoreService;
import com.newrelic.agent.instrumentation.ClassTransformerService;
import com.newrelic.agent.instrumentation.classmatchers.ClassAndMethodMatcher;
import com.newrelic.agent.instrumentation.context.InstrumentationContextManager;
import com.newrelic.agent.service.ServiceFactory;

public class RxJava1PreMain {

protected static final String TRACER_FACTORY = "RXJava1_Returning";

public static void premain(String s, Instrumentation inst) {

}

public static void initialize() {
boolean done = setup();
if(!done) {
Executors.newSingleThreadExecutor().submit(new SetupProcess());
}
}

private static boolean setup() {
TracerService tracerService = ServiceFactory.getTracerService();
ClassTransformerService classTransformerService = ServiceFactory.getClassTransformerService();
CoreService coreService = ServiceFactory.getCoreService();
if(classTransformerService != null && coreService != null && tracerService != null) {
tracerService.registerTracerFactory(TRACER_FACTORY, new RxJava1Factory());

InstrumentationContextManager contextMgr = classTransformerService.getContextManager();
InstrumentationProxy proxy = coreService.getInstrumentation();

if(contextMgr != null && proxy != null) {
RxJava1ClassTransformer transformer = new RxJava1ClassTransformer(contextMgr);
ClassAndMethodMatcher matcher = new RxJava1ClassAndMethodMatcher();
transformer.addMatcher(matcher);
return true;
}
}
return false;
}

private static class SetupProcess implements Runnable {



@Override
public void run() {
boolean setupComplete = false;

while(!setupComplete) {
setupComplete = setup();
if(!setupComplete) {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
}
}
}

}

}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava1;
package com.newrelic.agent.instrumentation.labs.rxjava1;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava1;
package com.newrelic.agent.instrumentation.labs.rxjava1;

import java.util.Set;

Expand Down

This file was deleted.

This file was deleted.

2 changes: 0 additions & 2 deletions rxjava2-2.0/src/main/java/io/reactivex/NRSingleWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import com.newrelic.api.agent.NewRelic;
import com.newrelic.api.agent.Trace;

import io.reactivex.SingleObserver;

public class NRSingleWrapper<T> extends Single<T> {

private Single<T> delegate = null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava2;
package com.newrelic.agent.instrumentation.labs.rxjava2.finder;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava2;
package com.newrelic.agent.instrumentation.labs.rxjava2.finder;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava2;
package com.newrelic.agent.instrumentation.labs.rxjava2.finder;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.newrelic.agent.instrumentation.pointcuts.frameworks.rxjava2;
package com.newrelic.agent.instrumentation.labs.rxjava2.finder;

import java.util.Set;

Expand Down
Loading
Loading