Skip to content

Commit 58b38f8

Browse files
authored
Merge pull request #3 from newrelic-experimental/addAttributes
add traced method attributes and added support for versions 1.114.1 a…
2 parents 47cbfb3 + 2abae98 commit 58b38f8

File tree

17 files changed

+430
-4
lines changed

17 files changed

+430
-4
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ plugins {
2222

2323
project.ext {
2424
group = 'com.newrelic.instrumentation'
25-
javaAgentVersion = '6.0.0'
25+
javaAgentVersion = '6.4.0'
2626

2727
// Aligned with minimum Java major version supported by latest Java Agent
2828
javaVersion = JavaVersion.VERSION_1_8

gcp-pubsub-1.114.1/build.gradle

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
// Build.gradle generated for instrumentation module gcp-pubsub-1.114.1
3+
4+
apply plugin: 'java'
5+
6+
dependencies {
7+
implementation 'com.google.cloud:google-cloud-pubsub:1.114.1'
8+
9+
// New Relic Java Agent dependencies
10+
implementation 'com.newrelic.agent.java:newrelic-agent:6.4.0'
11+
implementation 'com.newrelic.agent.java:newrelic-api:6.4.0'
12+
implementation fileTree(include: ['*.jar'], dir: '../libs')
13+
}
14+
15+
jar {
16+
manifest {
17+
attributes 'Implementation-Title': 'com.newrelic.instrumentation.gcp-pubsub-1.114.1'
18+
attributes 'Implementation-Vendor': 'New Relic'
19+
attributes 'Implementation-Vendor-Id': 'com.newrelic'
20+
attributes 'Implementation-Version': 1.0
21+
}
22+
}
23+
24+
verifyInstrumentation {
25+
passes 'com.google.cloud:google-cloud-pubsub:[1.114.1,)'
26+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.google.cloud.pubsub.v1;
2+
3+
import java.util.HashMap;
4+
5+
import com.google.api.core.ApiFuture;
6+
import com.google.pubsub.v1.PubsubMessage;
7+
import com.newrelic.api.agent.DestinationType;
8+
import com.newrelic.api.agent.MessageProduceParameters;
9+
import com.newrelic.api.agent.NewRelic;
10+
import com.newrelic.api.agent.Trace;
11+
import com.newrelic.api.agent.TransactionNamePriority;
12+
import com.newrelic.api.agent.weaver.Weave;
13+
import com.newrelic.api.agent.weaver.Weaver;
14+
import com.nr.fit.instrumentation.gcp.pubsub.Utils;
15+
16+
@Weave
17+
public abstract class Publisher {
18+
19+
public abstract String getTopicNameString();
20+
21+
@Trace
22+
public ApiFuture<String> publish(PubsubMessage message) {
23+
String topicName = Utils.parseTopic(getTopicNameString()).replace('/', '_');
24+
HashMap<String, Object> attributes = new HashMap<String, Object>();
25+
attributes.put("Topic", topicName);
26+
attributes.put("MessageID", message.getMessageId());
27+
Utils.addMessage(attributes, message);
28+
NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes);
29+
message = Utils.populateHeaders(message);
30+
MessageProduceParameters params = MessageProduceParameters.library("GCP-PubSub").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(null).build();
31+
NewRelic.getAgent().getTracedMethod().reportAsExternal(params);
32+
NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_LOW, false, "GCP-PubSub", "GCP-PubSub","Publish",topicName);
33+
return Weaver.callOriginal();
34+
}
35+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.google.cloud.pubsub.v1;
2+
3+
import com.google.pubsub.v1.ProjectSubscriptionName;
4+
import com.newrelic.api.agent.weaver.Weave;
5+
import com.newrelic.api.agent.weaver.Weaver;
6+
import com.nr.fit.instrumentation.gcp.pubsub.NRMessageReceiver;
7+
import com.nr.fit.instrumentation.gcp.pubsub.Utils;
8+
9+
@Weave
10+
public abstract class Subscriber {
11+
12+
public static Builder newBuilder(String subscription, MessageReceiver receiver) {
13+
ProjectSubscriptionName subName = ProjectSubscriptionName.parse(subscription);
14+
Utils.addProjectName(subName);
15+
NRMessageReceiver wrapper = new NRMessageReceiver(receiver, subscription);
16+
receiver = wrapper;
17+
return Weaver.callOriginal();
18+
}
19+
20+
@Weave
21+
public static final class Builder {
22+
23+
}
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.google.cloud.pubsub.v1;
2+
3+
import com.google.pubsub.v1.DeleteSubscriptionRequest;
4+
import com.google.pubsub.v1.Subscription;
5+
import com.newrelic.api.agent.weaver.Weave;
6+
import com.newrelic.api.agent.weaver.Weaver;
7+
import com.nr.fit.instrumentation.gcp.pubsub.Utils;
8+
9+
@Weave(originalName="com.google.cloud.pubsub.v1.SubscriptionAdminClient")
10+
public abstract class SubscriptionAdminClient_instrumentation {
11+
12+
public Subscription createSubscription(Subscription request) {
13+
Utils.checkSubscription(request);
14+
Subscription response = Weaver.callOriginal();
15+
Utils.checkSubscription(response);
16+
return response;
17+
}
18+
19+
public final void deleteSubscription(DeleteSubscriptionRequest request) {
20+
String subName = request.getSubscription();
21+
Utils.remove(subName);
22+
Weaver.callOriginal();
23+
}
24+
25+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.google.cloud.pubsub.v1;
2+
3+
import java.util.HashMap;
4+
5+
import com.google.pubsub.v1.PublishRequest;
6+
import com.google.pubsub.v1.PublishResponse;
7+
import com.newrelic.api.agent.DestinationType;
8+
import com.newrelic.api.agent.MessageProduceParameters;
9+
import com.newrelic.api.agent.NewRelic;
10+
import com.newrelic.api.agent.Trace;
11+
import com.newrelic.api.agent.weaver.Weave;
12+
import com.newrelic.api.agent.weaver.Weaver;
13+
import com.nr.fit.instrumentation.gcp.pubsub.Utils;
14+
15+
@Weave
16+
public abstract class TopicAdminClient {
17+
18+
@Trace(dispatcher=true)
19+
public PublishResponse publish(PublishRequest request) {
20+
String topicName = request.getTopic();
21+
HashMap<String, Object> attributes = new HashMap<String, Object>();
22+
attributes.put("Topic", topicName);
23+
Utils.addAttribute(attributes, "MessageCount", request.getMessagesCount());
24+
NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes);
25+
if(topicName != null) {
26+
topicName = topicName.replace('/', '_');
27+
MessageProduceParameters params = MessageProduceParameters.library("GPC-PubSub").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(null).build();
28+
NewRelic.getAgent().getTracedMethod().reportAsExternal(params);
29+
}
30+
return Weaver.callOriginal();
31+
}
32+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.nr.fit.instrumentation.gcp.pubsub;
2+
3+
import java.util.Map;
4+
5+
import com.newrelic.api.agent.HeaderType;
6+
import com.newrelic.api.agent.InboundHeaders;
7+
8+
public class InboundWrapper implements InboundHeaders {
9+
10+
Map<String, String> attributes = null;
11+
12+
public InboundWrapper(Map<String, String> attrs) {
13+
attributes = attrs;
14+
}
15+
16+
@Override
17+
public HeaderType getHeaderType() {
18+
return HeaderType.MESSAGE;
19+
}
20+
21+
@Override
22+
public String getHeader(String name) {
23+
return attributes.get(name);
24+
}
25+
26+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.nr.fit.instrumentation.gcp.pubsub;
2+
3+
import java.util.HashMap;
4+
5+
import com.google.cloud.pubsub.v1.AckReplyConsumer;
6+
import com.google.cloud.pubsub.v1.MessageReceiver;
7+
import com.google.pubsub.v1.PubsubMessage;
8+
import com.newrelic.agent.bridge.AgentBridge;
9+
import com.newrelic.api.agent.DestinationType;
10+
import com.newrelic.api.agent.MessageConsumeParameters;
11+
import com.newrelic.api.agent.NewRelic;
12+
import com.newrelic.api.agent.Trace;
13+
14+
public class NRMessageReceiver implements MessageReceiver {
15+
16+
private MessageReceiver delegate = null;
17+
private String subName = null;
18+
private String topicName = null;
19+
20+
private static boolean isTransformed = false;
21+
22+
public NRMessageReceiver(MessageReceiver rec, String sName) {
23+
delegate = rec;
24+
subName = sName;
25+
if(!isTransformed) {
26+
isTransformed = true;
27+
AgentBridge.instrumentation.retransformUninstrumentedClass(getClass());
28+
}
29+
}
30+
31+
@Override
32+
@Trace(dispatcher=true)
33+
public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
34+
HashMap<String, Object> attributes = new HashMap<String, Object>();
35+
Utils.addAttribute(attributes, "TopicName", topicName);
36+
Utils.addAttribute(attributes, "SubName", subName);
37+
Utils.addMessage(attributes, message);
38+
39+
if(topicName == null) {
40+
topicName = Utils.getTopic(subName);
41+
}
42+
String tName = topicName != null ? topicName : subName;
43+
InboundWrapper wrapper = new InboundWrapper(message.getAttributesMap());
44+
MessageConsumeParameters params = MessageConsumeParameters.library("GCP-PubSub").destinationType(DestinationType.NAMED_TOPIC).destinationName(tName).inboundHeaders(wrapper).build();
45+
NewRelic.getAgent().getTracedMethod().reportAsExternal(params);
46+
if(delegate != null) {
47+
delegate.receiveMessage(message, consumer);
48+
}
49+
}
50+
51+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.nr.fit.instrumentation.gcp.pubsub;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import com.newrelic.api.agent.HeaderType;
7+
import com.newrelic.api.agent.OutboundHeaders;
8+
9+
public class OutboundWrapper implements OutboundHeaders {
10+
11+
Map<String, String> attributes = null;
12+
13+
public OutboundWrapper(Map<String, String> attrs) {
14+
attributes = new HashMap<String, String>(attrs);
15+
}
16+
17+
@Override
18+
public HeaderType getHeaderType() {
19+
return HeaderType.MESSAGE;
20+
}
21+
22+
@Override
23+
public void setHeader(String name, String value) {
24+
attributes.put(name, value);
25+
}
26+
27+
public Map<String, String> getCurrent() {
28+
return attributes;
29+
}
30+
}

0 commit comments

Comments
 (0)