Skip to content

Commit bc9bd6e

Browse files
committed
added messaging sample
1 parent 5944bfd commit bc9bd6e

File tree

8 files changed

+385
-2
lines changed

8 files changed

+385
-2
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.project
22
.settings
33
.classpath
4+
target

samples/README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Sample applications showing how to use Dynatrace OneAgent SDK for Java to create
66

77
- `remotecall`: shows usage of remote call API. Allows you to tag remote calls in the same or between different JVMs.
88
- `in-process-linking`: shows usage of in-process-linking API. Allows you to tag eg. asynchronous execution inside the same process.
9+
- `webrequest`: shows usage of outging- and incoming webrequests.
10+
- `messaging`: shows usage of messaging
911

1012
## Build and prepare running sample applications
1113

@@ -38,5 +40,8 @@ This Application shows how to trace outgoing- and incoming webrequests. To run t
3840

3941
- run sample: `mvn exec:exec`
4042

41-
Check your Dynatrace environment for newly created services like that:
42-
![webrequest-service](img/webrequest-service.png)
43+
### Run Messaging sample application
44+
This Application shows how to trace outgoing, receiving and processing of incoming messages. To run this sample you just go into the sample directory and run the sample by typing:
45+
46+
- run sample: `mvn exec:exec`
47+

samples/messaging/pom.xml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0"
2+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
4+
http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>com.dynatrace.oneagent.sdk.samples.messaging</groupId>
8+
<artifactId>messaging-sample</artifactId>
9+
<version>1.5.0</version>
10+
<packaging>jar</packaging>
11+
12+
<dependencies>
13+
<dependency>
14+
<groupId>com.dynatrace.oneagent.sdk.java</groupId>
15+
<artifactId>oneagent-sdk</artifactId>
16+
<version>1.5.0</version>
17+
<scope>compile</scope>
18+
</dependency>
19+
</dependencies>
20+
21+
<url>https://github.com/Dynatrace/OneAgent-SDK-Java</url>
22+
<name>Dynatrace OneAgent SDK Java WebRequest sample</name>
23+
<organization>
24+
<name>Dynatrace</name>
25+
<url>http://www.dynatrace.com</url>
26+
</organization>
27+
28+
<properties>
29+
<maven.compiler.source>1.6</maven.compiler.source>
30+
<maven.compiler.target>1.6</maven.compiler.target>
31+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
32+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
33+
34+
<!-- uncomment and replace url/tenant/token in case of manual agent injection -->
35+
<!--
36+
<agent.lib>path_to_installed_one_agent\agent\lib64\oneagentjava.dll</agent.lib>
37+
<agent.server>https://url.to.tenant.com:443</agent.server>
38+
<agent.tenant>tenantUUID</agent.tenant>
39+
<agent.tenantToken>tenantToken</agent.tenantToken>
40+
<agent.options>,debugOneAgentSdkJava=true</agent.options>
41+
<agent.agentpath>-agentpath:"${agent.lib}=name=SdkSample,server=${agent.server}"${agent.options},tenant=${agent.tenant},tenantToken=${agent.tenantToken}</agent.agentpath>
42+
-->
43+
</properties>
44+
45+
<build>
46+
<plugins>
47+
<plugin>
48+
<groupId>org.apache.maven.plugins</groupId>
49+
<artifactId>maven-jar-plugin</artifactId>
50+
<version>2.4</version>
51+
<configuration>
52+
<archive>
53+
<manifest>
54+
<addClasspath>true</addClasspath>
55+
<mainClass>com.dynatrace.oneagent.sdk.samples.messaging.MessagingApp</mainClass>
56+
</manifest>
57+
</archive>
58+
</configuration>
59+
</plugin>
60+
<plugin>
61+
<groupId>org.codehaus.mojo</groupId>
62+
<artifactId>exec-maven-plugin</artifactId>
63+
<version>1.6.0</version>
64+
<executions>
65+
<execution>
66+
<goals>
67+
<goal>exec</goal>
68+
</goals>
69+
</execution>
70+
</executions>
71+
<configuration>
72+
<executable>java</executable>
73+
<arguments>
74+
<argument>${agent.agentpath}</argument>
75+
<argument>-classpath</argument>
76+
<classpath/>
77+
<mainClass>com.dynatrace.oneagent.sdk.samples.messaging.MessagingApp</mainClass>
78+
</arguments>
79+
</configuration>
80+
</plugin>
81+
</plugins>
82+
</build>
83+
84+
</project>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.dynatrace.oneagent.sdk.samples.messaging;
2+
3+
import java.util.concurrent.ArrayBlockingQueue;
4+
import java.util.concurrent.BlockingQueue;
5+
6+
public class FakedQueueManager {
7+
8+
private BlockingQueue<Message> queue = new ArrayBlockingQueue<Message>(10);
9+
private MessageListener messageListener;
10+
11+
public FakedQueueManager() {
12+
}
13+
14+
private class QueueManagerThread extends Thread {
15+
private QueueManagerThread() {
16+
super("QueueManager");
17+
setDaemon(true);
18+
}
19+
20+
@Override
21+
public void run() {
22+
while (true) {
23+
Message incomingMessage;
24+
try {
25+
incomingMessage = queue.take();
26+
messageListener.onMessage(incomingMessage);
27+
} catch (InterruptedException e) {
28+
e.printStackTrace();
29+
return;
30+
}
31+
}
32+
}
33+
}
34+
35+
public void registerMessageListener(MessageListener listener) {
36+
this.messageListener = listener;
37+
new QueueManagerThread().start();
38+
}
39+
40+
41+
public void send(String queueName, Message message) {
42+
try {
43+
queue.put(message);
44+
} catch (InterruptedException e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
49+
public Message receive(String queueName) {
50+
try {
51+
return queue.take();
52+
} catch (InterruptedException e) {
53+
e.printStackTrace();
54+
return null;
55+
}
56+
}
57+
58+
59+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.dynatrace.oneagent.sdk.samples.messaging;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class Message {
7+
8+
private Map<String, String> properties = new HashMap<String, String>();
9+
private String vendorMessageId = null;
10+
private String correlationId = null;
11+
12+
public void addProperty(String propertyName, String propertyValue) {
13+
properties.put(propertyName, propertyValue);
14+
}
15+
16+
public String getProperty(String propertyName) {
17+
return properties.get(propertyName);
18+
}
19+
20+
public String getVendorMessageId() {
21+
return vendorMessageId;
22+
}
23+
24+
public void setVendorMessageId(String vendorMessageId) {
25+
this.vendorMessageId = vendorMessageId;
26+
}
27+
28+
public String getCorrelationId() {
29+
return correlationId;
30+
}
31+
32+
public void setCorrelationId(String correlationId) {
33+
this.correlationId = correlationId;
34+
}
35+
36+
37+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.dynatrace.oneagent.sdk.samples.messaging;
2+
3+
public interface MessageListener {
4+
5+
public void onMessage(Message message);
6+
7+
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package com.dynatrace.oneagent.sdk.samples.messaging;
2+
3+
import com.dynatrace.oneagent.sdk.OneAgentSDKFactory;
4+
import com.dynatrace.oneagent.sdk.api.IncomingMessageProcessTracer;
5+
import com.dynatrace.oneagent.sdk.api.IncomingMessageReceiveTracer;
6+
import com.dynatrace.oneagent.sdk.api.OneAgentSDK;
7+
import com.dynatrace.oneagent.sdk.api.OutgoingMessageTracer;
8+
import com.dynatrace.oneagent.sdk.api.enums.ChannelType;
9+
import com.dynatrace.oneagent.sdk.api.enums.MessageDestinationType;
10+
import com.dynatrace.oneagent.sdk.api.infos.MessagingSystemInfo;
11+
12+
/**
13+
* Sample application shows how incoming/outgoing messages should be traced.
14+
*
15+
* @author Alram.Lechner
16+
*
17+
*/
18+
public class MessagingApp {
19+
20+
private final OneAgentSDK oneAgentSdk;
21+
final FakedQueueManager queueManager;
22+
23+
static MessagingApp instance;
24+
25+
26+
private MessagingApp() {
27+
oneAgentSdk = OneAgentSDKFactory.createInstance();
28+
oneAgentSdk.setLoggingCallback(new StdErrLoggingCallback());
29+
switch (oneAgentSdk.getCurrentState()) {
30+
case ACTIVE:
31+
System.out.println("SDK is active and capturing.");
32+
break;
33+
case PERMANENTLY_INACTIVE:
34+
System.err.println(
35+
"SDK is PERMANENTLY_INACTIVE; Probably no OneAgent injected or OneAgent is incompatible with SDK.");
36+
break;
37+
case TEMPORARILY_INACTIVE:
38+
System.err.println(
39+
"SDK is TEMPORARILY_INACTIVE; OneAgent has been deactivated - check OneAgent configuration.");
40+
break;
41+
default:
42+
System.err.println("SDK is in unknown state.");
43+
break;
44+
}
45+
queueManager = new FakedQueueManager();
46+
instance = this;
47+
}
48+
49+
public static void main(String args[]) {
50+
System.out.println("*************************************************************");
51+
System.out.println("** Running messaging sample **");
52+
System.out.println("*************************************************************");
53+
try {
54+
MessagingApp app = new MessagingApp();
55+
56+
// sending and blocking receive ...
57+
app.sendMessage();
58+
app.receiveMessage();
59+
60+
// or sending and event based receive:
61+
app.registerMessageListener();
62+
app.sendMessage();
63+
64+
System.out.println("sample application stopped. sleeping a while, so OneAgent is able to send data to server ...");
65+
Thread.sleep(15000 * 3); // we have to wait - so OneAgent is able to send data to server
66+
} catch (Exception e) {
67+
System.err.println("messaging sample failed: " + e.getMessage());
68+
e.printStackTrace();
69+
System.exit(-1);
70+
}
71+
}
72+
73+
private void registerMessageListener() {
74+
queueManager.registerMessageListener(new MessageListener() {
75+
@Override
76+
public void onMessage(Message message) {
77+
MessagingSystemInfo messagingSystemInfo = oneAgentSdk.createMessagingSystemInfo("DynatraceSample", "theQueue", MessageDestinationType.QUEUE, ChannelType.IN_PROCESS, null);
78+
IncomingMessageProcessTracer incomingMessageProcessTracer = oneAgentSdk.traceIncomingMessageProcess(messagingSystemInfo);
79+
// store incoming tag to tracer:
80+
incomingMessageProcessTracer.setDynatraceStringTag(message.getProperty(OneAgentSDK.DYNATRACE_MESSAGE_PROPERTYNAME));
81+
incomingMessageProcessTracer.setVendorMessageId(message.getVendorMessageId());
82+
incomingMessageProcessTracer.start();
83+
try {
84+
// do something with the message ...
85+
System.out.println("Message received: " + message.toString());
86+
} catch (Exception e) {
87+
incomingMessageProcessTracer.error(e);
88+
} finally {
89+
incomingMessageProcessTracer.end();
90+
}
91+
}
92+
});
93+
94+
}
95+
96+
private void sendMessage() {
97+
MessagingSystemInfo messagingSystemInfo = oneAgentSdk.createMessagingSystemInfo("DynatraceSample", "theQueue", MessageDestinationType.QUEUE, ChannelType.IN_PROCESS, null);
98+
OutgoingMessageTracer outgoingMessageTracer = oneAgentSdk.traceOutgoingMessage(messagingSystemInfo);
99+
100+
outgoingMessageTracer.start();
101+
try {
102+
Message messageToSend = new Message();
103+
104+
// add dynatrace tag as property to message ...
105+
messageToSend.addProperty(OneAgentSDK.DYNATRACE_MESSAGE_PROPERTYNAME, outgoingMessageTracer.getDynatraceStringTag());
106+
107+
queueManager.send("theQueue", messageToSend);
108+
109+
// in case queueManager provided messageId:
110+
if (messageToSend.getVendorMessageId() != null) {
111+
outgoingMessageTracer.setVendorMessageId(messageToSend.getVendorMessageId());
112+
}
113+
114+
} catch (Exception e) {
115+
outgoingMessageTracer.error(e);
116+
} finally {
117+
outgoingMessageTracer.end();
118+
}
119+
}
120+
121+
/** shows how to trace a blocking receive of a message */
122+
private void receiveMessage() {
123+
MessagingSystemInfo messagingSystemInfo = oneAgentSdk.createMessagingSystemInfo("DynatraceSample", "theQueue", MessageDestinationType.QUEUE, ChannelType.IN_PROCESS, null);
124+
IncomingMessageReceiveTracer incomingMessageReceiveTracer = oneAgentSdk.traceIncomingMessageReceive(messagingSystemInfo);
125+
incomingMessageReceiveTracer.start();
126+
try {
127+
Message msg = queueManager.receive("theQeue");
128+
if (msg == null) {
129+
return; // no message received
130+
}
131+
IncomingMessageProcessTracer incomingMessageProcessTracer = oneAgentSdk.traceIncomingMessageProcess(messagingSystemInfo);
132+
// store incoming tag to tracer:
133+
incomingMessageProcessTracer.setDynatraceStringTag(msg.getProperty(OneAgentSDK.DYNATRACE_MESSAGE_PROPERTYNAME));
134+
incomingMessageProcessTracer.setVendorMessageId(msg.getVendorMessageId());
135+
incomingMessageProcessTracer.start();
136+
try {
137+
// do something with the message ...
138+
System.out.println("Message received: " + msg.toString());
139+
} catch (Exception e) {
140+
incomingMessageProcessTracer.error(e);
141+
} finally {
142+
incomingMessageProcessTracer.end();
143+
}
144+
145+
146+
} catch (Exception e) {
147+
incomingMessageReceiveTracer.error(e);
148+
} finally {
149+
incomingMessageReceiveTracer.end();
150+
}
151+
}
152+
153+
}

0 commit comments

Comments
 (0)