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
2 changes: 1 addition & 1 deletion Vertx-EventBus-4.3.2/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jar {
}

verifyInstrumentation {
passes ('io.vertx:vertx-core:[4.3.2,)' ) {
passes ('io.vertx:vertx-core:[4.3.2,4.5.0)' ) {
compile('com.newrelic.agent.java:newrelic-agent:6.4.0')
}
excludeRegex '.*SNAPSHOT'
Expand Down
39 changes: 39 additions & 0 deletions Vertx-EventBus-4.5/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@

// Build.gradle generated for instrumentation module Vertx-EventBus-4.2.2

apply plugin: 'java'

dependencies {
implementation 'io.vertx:vertx-core:4.5.0'

// New Relic Java Agent dependencies
implementation 'com.newrelic.agent.java:newrelic-agent:6.4.0'
implementation 'com.newrelic.agent.java:newrelic-api:6.4.0'
implementation fileTree(include: ['*.jar'], dir: '../libs')

testImplementation 'junit:junit:4.12'
testImplementation 'org.nanohttpd:nanohttpd:2.3.1'
testImplementation 'io.vertx:vertx-hazelcast:3.6.0'
testImplementation fileTree(include: ['*.jar'], dir: '../test-lib')

}

jar {
manifest {
attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.Vertx-EventBus-4.5'
attributes 'Implementation-Vendor': 'New Relic Labs'
attributes 'Implementation-Vendor-Id': 'com.newrelic.labs'
attributes 'Implementation-Version': 1.0
}
}

verifyInstrumentation {
passes ('io.vertx:vertx-core:[4.5.0,)' ) {
compile('com.newrelic.agent.java:newrelic-agent:6.5.0')
}
excludeRegex '.*SNAPSHOT'
excludeRegex '.*milestone.*'
excludeRegex '.*Beta.*'
excludeRegex '.*CR[0-9].*'

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

import java.util.Collection;
import java.util.Collections;

import com.newrelic.api.agent.HeaderType;
import com.newrelic.api.agent.Headers;

import io.vertx.core.MultiMap;
import io.vertx.core.eventbus.DeliveryOptions;

public class DeliveryOptionsHeaders implements Headers {

private DeliveryOptions options = null;;

public DeliveryOptionsHeaders(DeliveryOptions o) {
options = o;
}

@Override
public HeaderType getHeaderType() {
return HeaderType.MESSAGE;
}

@Override
public String getHeader(String name) {
MultiMap headers = options.getHeaders();
if(headers == null) return null;

return headers.get(name);
}

@Override
public Collection<String> getHeaders(String name) {
MultiMap headers = options.getHeaders();
if(headers == null) return Collections.emptyList();
return headers.getAll(name);
}

@Override
public void setHeader(String name, String value) {
options.addHeader(name, value);
}

@Override
public void addHeader(String name, String value) {
options.addHeader(name, value);
}

@Override
public Collection<String> getHeaderNames() {
MultiMap headers = options.getHeaders();
if(headers == null) return Collections.emptyList();
return headers.names();
}

@Override
public boolean containsHeader(String name) {
MultiMap headers = options.getHeaders();
if(headers == null) return false;
return headers.contains(name);
}

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

import com.newrelic.agent.bridge.AgentBridge;
import com.newrelic.api.agent.NewRelic;
import com.newrelic.api.agent.Trace;
import com.newrelic.api.agent.Transaction;

import io.vertx.core.Handler;
import io.vertx.core.http.HttpServerRequest;

public class HttpRequestWrapper implements Handler<HttpServerRequest> {

private static boolean isTransformed = false;
private Handler<HttpServerRequest> delegate = null;

public HttpRequestWrapper(Handler<HttpServerRequest> h) {
delegate = h;
if (!isTransformed) {
isTransformed = true;
AgentBridge.instrumentation.retransformUninstrumentedClass(getClass());
}
}

@Trace(dispatcher = true)
public void handle(HttpServerRequest event) {
Transaction transaction = NewRelic.getAgent().getTransaction();
if (!transaction.isWebTransaction()) {
transaction.convertToWebTransaction();
NRVertxExtendedRequest req = new NRVertxExtendedRequest(event);
transaction.setWebRequest(req);
}
if (this.delegate != null)
this.delegate.handle(event);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.newrelic.instrumentation.labs.vertx;

import com.newrelic.api.agent.HeaderType;
import com.newrelic.api.agent.InboundHeaders;

import io.vertx.core.http.HttpClientResponse;

public class InboundWrapper implements InboundHeaders {

private final HttpClientResponse response;

public InboundWrapper(HttpClientResponse response) {
this.response = response;
}

@Override
public HeaderType getHeaderType() {
return HeaderType.HTTP;
}

@Override
public String getHeader(String name) {
return response.getHeader(name);
}


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

import java.util.Collection;

import com.newrelic.api.agent.HeaderType;
import com.newrelic.api.agent.Headers;

import io.vertx.core.MultiMap;
import io.vertx.core.http.impl.headers.HeadersMultiMap;

public class MessageHeaders implements Headers {

MultiMap headers = null;

public MessageHeaders(MultiMap h) {
headers = h;
}

@Override
public HeaderType getHeaderType() {
return HeaderType.MESSAGE;
}

@Override
public String getHeader(String name) {
return headers.get(name);
}

@Override
public Collection<String> getHeaders(String name) {
return headers.getAll(name);
}

@Override
public void setHeader(String name, String value) {
if(headers != null) {
headers = headers.set(name, value);
} else {
headers = new HeadersMultiMap();
headers.add(name, value);
}
}

@Override
public void addHeader(String name, String value) {
headers = headers.add(name, value);
}

@Override
public Collection<String> getHeaderNames() {
return headers.names();
}

@Override
public boolean containsHeader(String name) {
return headers.contains(name);
}

public MultiMap getMultimap() {
return headers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.newrelic.instrumentation.labs.vertx;

import com.newrelic.api.agent.NewRelic;
import com.newrelic.api.agent.Segment;

import io.vertx.core.impl.future.Listener;

public class NRCompletionListener<T> implements Listener<T> {

private Segment segment = null;

public NRCompletionListener(Segment s) {
segment = s;
}


@Override
public void onSuccess(T value) {
NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","NRCompletionListener","onSuccess"});
if(segment != null) {
segment.end();
segment = null;
}
}


@Override
public void onFailure(Throwable failure) {
NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","NRCompletionListener","onFailure"});
if(segment != null) {
segment.end();
segment = null;
}
}

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

import com.newrelic.api.agent.NewRelic;
import com.newrelic.api.agent.Token;
import com.newrelic.api.agent.Trace;

import io.vertx.core.Handler;
import io.vertx.core.Promise;

public class NRFutureWrapper<T> implements Handler<Promise<T>> {

private Handler<Promise<T>> delegate = null;

private Token token = null;

public NRFutureWrapper(Handler<Promise<T>> h,Token t) {
delegate = h;
token = t;
}

@Override
@Trace(async=true)
public void handle(Promise<T> event) {
NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","FutureHandler","handle"});
if(token != null) {
token.linkAndExpire();
token = null;
}
delegate.handle(event);
}

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

import com.newrelic.agent.bridge.AgentBridge;
import com.newrelic.api.agent.NewRelic;
import com.newrelic.api.agent.Trace;
import com.newrelic.api.agent.TransportType;

import io.vertx.core.Handler;
import io.vertx.core.MultiMap;
import io.vertx.core.eventbus.Message;

public class NRMessageHandlerWrapper<T> implements Handler<Message<T>> {

private Handler<Message<T>> delegate = null;

private static boolean isTransformed = false;


public NRMessageHandlerWrapper(Handler<Message<T>> d) {
delegate = d;
if(!isTransformed) {
isTransformed = true;
AgentBridge.instrumentation.retransformUninstrumentedClass(getClass());
}
}

@Override
@Trace(dispatcher=true)
public void handle(Message<T> event) {
NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","MessageHandler","handle"});
if(event != null) {
MultiMap headers = event.headers();
if(headers != null) {
MessageHeaders msgHeaders = new MessageHeaders(headers);
NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, msgHeaders);
}
}
if(delegate != null) {
delegate.handle(event);
}
}

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

import com.newrelic.api.agent.Token;
import com.newrelic.api.agent.Trace;

public class NRRunnableWrapper implements Runnable {
private Runnable delegate;

private Token token = null;

public Runnable getDelegate() {
return this.delegate;
}

public Token getToken() {
return this.token;
}

public void setToken(Token token) {
this.token = token;
}

public NRRunnableWrapper(Runnable d, Token t) {
this.delegate = d;
this.token = t;
}

@Trace(async = true)
public void run() {
if (this.token != null) {
this.token.linkAndExpire();
this.token = null;
}
this.delegate.run();
}

public Token getAndRemoveToken() {
Token t = this.token;
this.token = null;
return t;
}
}
Loading