8000 modified sample to show outgoing webrequest usage also · Dynatrace/OneAgent-SDK-for-Java@41bb2b1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 41bb2b1

Browse files
committed
modified sample to show outgoing webrequest usage also
1 parent 853e033 commit 41bb2b1

File tree

7 files changed

+296
-108
lines changed

7 files changed

+296
-108
lines changed

README.md

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ This is the official Java implementation of the [Dynatrace OneAgent SDK](https:/
2020
* [Trace incoming and outgoing remote calls](#remoting)
2121
* [In process linking](#inprocess)
2222
* [Add custom request attributes](#scav)
23-
* [Trace incoming web requests](#webrequests)
23+
* [Trace incoming web requests](#inwebrequests)
24+
* [Trace outgoing web requests](#outwebrequests)
2425
* [Further reading](#furtherreading)
2526
* [Help & Support](#help)
2627
* [Release notes](#releasenotes)
@@ -42,6 +43,7 @@ This is the official Java implementation of the [Dynatrace OneAgent SDK](https:/
4243

4344
|OneAgent SDK for Java|Required OneAgent version|
4445
|:--------------------|:------------------------|
46+
|1.4.0 |>=1.151 |
4547
|1.3.0 |>=1.149 |
4648
|1.2.0 |>=1.147 |
4749
|1.1.0 |>=1.143 |
@@ -59,7 +61,7 @@ If you want to integrate the OneAgent SDK into your application, just add the fo
5961
<dependency>
6062
<groupId>com.dynatrace.oneagent.sdk.java</groupId>
6163
<artifactId>oneagent-sdk</artifactId>
62-
<version>1.3.0</version>
64+
<version>1.4.0</version>
6365
<scope>compile</scope>
6466
</dependency>
6567

@@ -130,6 +132,7 @@ A more detailed specification of the features can be found in [Dynatrace OneAgen
130132

131133
|Feature |Required OneAgent SDK for Java version|
132134
|:-----------------------------------------|:-------------------------------------|
135+
|Outgoing webrequests |>=1.4.0 |
133136
|Incoming webrequests |>=1.3.0 |
134137
|Custom request attributes |>=1.2.0 |
135138
|In process linking |>=1.1.0 |
@@ -216,7 +219,7 @@ oneAgentSDK.addCustomRequestAttribute("salesAmount", 2500);
216219

217220
When no service call is being traced, the custom request attributes are dropped.
218221

219-
<a name="webrequests"/>
222+
<a name="inwebrequests"/>
220223

221224
## Trace incoming web requests
222225

@@ -258,6 +261,44 @@ try {
258261
}
259262
```
260263

264+
<a name="outwebrequests"/>
265+
266+
## Trace outgoing web requests
267+
268+
You can use the SDK to trace outgoing web requests. This might be useful if Dynatrace does not support the respective http library or language.
269+
270+
To trace a outgoing web request you need to create a Tracer object. It is important to send the Dynatrace Header. This ensures that tagging with our built-in sensor is working.
271+
272+
```Java
273+
OutgoingWebRequestTracer outgoingWebRequestTracer = oneAgentSdk.traceOutgoingWebRequest(url, "GET");
274+
outgoingWebRequestTracer.start();
275+
try {
276+
yourHttpClient.setUrl(url);
277+
278+
// sending HTTP header OneAgentSDK.DYNATRACE_HTTP_HEADERNAME is necessary for tagging:
279+
yourHttpClient.addRequestHeader(OneAgentSDK.DYNATRACE_HTTP_HEADERNAME, outgoingWebRequestTracer.getDynatraceStringTag());
280+
281+
// provide all request headers to outgoingWebRequestTracer (optional):
282+
for (Entry<String, String> entry : yourHttpClient.getRequestHeaders().entrySet()) {
283+
outgoingWebRequestTracer.addRequestHeader(entry.getKey(), entry.getValue());
284+
}
285+
286+
yourHttpClient.processHttpRequest();
287+
288+
for (Entry<String, List<String>> entry : yourHttpClient.getHeaderFields().entrySet()) {
289+
for (String value : entry.getValue()) {
290+
outgoingWebRequestTracer.addResponseHeader(entry.getKey(), value);
291+
}
292+
}
293+
outgoingWebRequestTracer.setStatusCode(yourHttpClient.getResponseCode());
294+
295+
} catch (Exception e) {
296+
outgoingWebRequestTracer.error(e);
297+
} finally {
298+
outgoingWebRequestTracer.end();
299+
}
300+
```
301+
261302
<a name="furtherreading" />
262303

263304
## Further readings
@@ -297,6 +338,7 @@ see also https://github.com/Dynatrace/OneAgent-SDK-for-Java/releases
297338

298339
|Version|Description |Links |
299340
|:------|:--------------------------------------|:----------------------------------------|
341+
|1.4.0 |Added support for outgoing webrequests |[binary](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.4.0/oneagent-sdk-1.4.0.jar) [source](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.4.0/oneagent-sdk-1.4.0-sources.jar) [javadoc](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.4.0/oneagent-sdk-1.4.0-javadoc.jar)|
300342
|1.3.0 |Added support for incoming webrequests |[binary](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.3.0/oneagent-sdk-1.3.0.jar) [source](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.3.0/oneagent-sdk-1.3.0-sources.jar) [javadoc](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.3.0/oneagent-sdk-1.3.0-javadoc.jar)|
301343
|1.2.0 |Added support for in-process-linking |[binary](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.2.0/oneagent-sdk-1.2.0.jar) [source](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.2.0/oneagent-sdk-1.2.0-sources.jar) [javadoc](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.2.0/oneagent-sdk-1.2.0-javadoc.jar)|
302344
|1.1.0 |Added support for in-process-linking |[binary](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.1.0/oneagent-sdk-1.1.0.jar) [source](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.1.0/oneagent-sdk-1.1.0-sources.jar) [javadoc](https://search.maven.org/remotecontent?filepath=com/dynatrace/oneagent/sdk/java/oneagent-sdk/1.1.0/oneagent-sdk-1.1.0-javadoc.jar)|

samples/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Check your Dynatrace environment for newly created services like that:
3434
![in-process-linking-service](img/in-process-linking-service.png)
3535

3636
### Run WebRequest sample application
37-
This Application shows how to trace incoming webrequests. To run this sample you just go into the sample directory and run the sample by typing:
37+
This Application shows how to trace outgoing- and incoming webrequests. To run this sample you just go into the sample directory and run the sample by typing:
3838

3939
- run sample: `mvn exec:exec`
4040

samples/webrequest/pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,20 @@
66

77
<groupId>com.dynatrace.oneagent.sdk.samples.webrequest</groupId>
88
<artifactId>webrequest-sample</artifactId>
9-
<version>1.3.0</version>
9+
<version>1.4.0</version>
1010
<packaging>jar</packaging>
1111

1212
<dependencies>
1313
<dependency>
1414
<groupId>com.dynatrace.oneagent.sdk.java</groupId>
1515
<artifactId>oneagent-sdk</artifactId>
16-
<version>1.3.0</version>
16+
<version>1.4.0</version>
1717
<scope>compile</scope>
1818
</dependency>
1919
</dependencies>
2020

2121
<url>https://github.com/Dynatrace/OneAgent-SDK-Java</url>
22-
<name>Dynatrace OneAgent SDK Java In-Process-Linking sample</name>
22+
<name>Dynatrace OneAgent SDK Java WebRequest sample</name>
2323
<organization>
2424
<name>Dynatrace</name>
2525
<url>http://www.dynatrace.com</url>
@@ -52,7 +52,7 @@
5252
<archive>
5353
<manifest>
5454
<addClasspath>true</addClasspath>
55-
<mainClass>com.dynatrace.oneagent.sdk.samples.webrequest.IncomingWebRequestApp</mainClass>
55+
<mainClass>com.dynatrace.oneagent.sdk.samples.webrequest.WebRequestApp</mainClass>
5656
</manifest>
5757
</archive>
5858
</configuration>
@@ -74,7 +74,7 @@
7474
<argument>${agent.agentpath}</argument>
7575
<argument>-classpath</argument>
7676
<classpath/>
77-
<mainClass>com.dynatrace.oneagent.sdk.samples.webrequest.IncomingWebRequestApp</mainClass>
77+
<mainClass>com.dynatrace.oneagent.sdk.samples.webrequest.WebRequestApp</mainClass>
7878
</arguments>
7979
</configuration>
8080
</plugin>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.dynatrace.oneagent.sdk.samples.webrequest;
2+
3+
import java.net.InetAddress;
4+
import java.net.MalformedURLException;
5+
import java.net.URL;
6+
import java.net.UnknownHostException;
7+
import java.util.ArrayList;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
import com.dynatrace.oneagent.sdk.samples.webrequest.FakedWebserver.HttpRequest;
13+
import com.dynatrace.oneagent.sdk.samples.webrequest.FakedWebserver.HttpResponse;
14+
15+
public class FakedHttpClient implements HttpResponse {
16+
17+
// REQUEST
18+
private URL url;
19+
private String method;
20+
private Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>();
21+
22+
// RESPONSE
23+
private int statusCode;
24+
private Map<String, List<String>> responseHeaders = new HashMap<String, List<String>>();
25+
26+
public FakedHttpClient(String url, String method) throws MalformedURLException {
27+
this.method = method;
28+
this.url = new URL(url);
29+
}
30+
31+
public void addRequestHeader(String requestHeader, String value) {
32+
List<String> values = requestHeaders.get(requestHeader);
33+
if (values == null) {
34+
values = new ArrayList<String>();
35+
requestHeaders.put(requestHeader, values);
36+
}
37+
values.add(value);
38+
}
39+
40+
public void addResponseHeader(String headerField, String value) {
41+
List<String> values = responseHeaders.get(headerField);
42+
if (values == null) {
43+
values = new ArrayList<String>();
44+
responseHeaders.put(headerField, values);
45+
}
46+
values.add(value);
47+
}
48+
49+
public void executeRequest() {
50+
// a normal HTTP client should open plain tcp socket and send the request now ...
51+
// ... but we are putting them into non-blocking queue:
52+
53+
// build the request object, as a standard web container would provide it ...
54+
HttpRequest httpRequest;
55+
String clientIp;
56+
try {
57+
clientIp = InetAddress.getLocalHost().getHostAddress();
58+
} catch (UnknownHostException e) {
59+
clientIp = "192.168.4.5"; // fake IP
60+
}
61+
httpRequest = new HttpRequest(url.getPath() + "?" + url.getQuery(), method, clientIp);
62+
63+
// ... and queue it for processing:
64+
WebRequestApp.instance.webServer.enqeueHttpRequestForProcessing(httpRequest, this);
65+
}
66+
67+
public Map<String, List<String>> getRequestHeaders() {
68+
return requestHeaders;
69+
}
70+
71+
public Map<String, List<String>> getResponseHeaders() {
72+
return responseHeaders;
73+
}
74+
75+
public int getStatusCode() {
76+
return statusCode;
77+
}
78+
79+
public void setResponseHeaders(Map<String, List<String>> responseHeaders) {
80+
this.responseHeaders = responseHeaders;
81+
}
82+
83+
@Override
84+
public void setStatusCode(int statusCode) {
85+
this.statusCode = statusCode;
86+
}
87+
88+
@Override
89+
public void setContent(byte[] content) {
90+
// ignore the content we got from server
91+
}
92+
93+
}

samples/webrequest/src/main/java/com/dynatrace/oneagent/sdk/samples/webrequest/FakedWebserver.java

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import java.util.List;
55
import java.util.Map;
66
import java.util.Map.Entry;
7+
import java.util.concurrent.ArrayBlockingQueue;
8+
import java.util.concurrent.BlockingQueue;
79

810
import com.dynatrace.oneagent.sdk.api.IncomingWebRequestTracer;
911
import com.dynatrace.oneagent.sdk.api.OneAgentSDK;
@@ -14,23 +16,67 @@ public class FakedWebserver {
1416
private final OneAgentSDK oneAgentSDK;
1517
private final WebApplicationInfo webAppInfo;
1618

19+
private final BlockingQueue<Pair> requestQueue = new ArrayBlockingQueue<Pair>(10);
20+
1721
public FakedWebserver(OneAgentSDK oneAgentSDK) {
1822
this.oneAgentSDK = oneAgentSDK;
1923
webAppInfo = oneAgentSDK.createWebApplicationInfo("servername", "BillingService", "/billing");
24+
new RequestProcessor().start();
2025
}
2126

22-
public static class HttpResponse {
23-
24-
public void setStatus(int i) {
25-
27+
private class RequestProcessor extends Thread {
28+
private RequestProcessor() {
29+
super("Webserver-Worker");
30+
setDaemon(true);
2631
}
2732

33+
@Override
34+
public void run() {
35+
while (true) {
36+
Pair incomingRequest;
37+
try {
38+
incomingRequest = requestQueue.take();
39+
} catch (InterruptedException e) {
40+
e.printStackTrace();
41+
return;
42+
}
43+
serve(incomingRequest.httpRequest, incomingRequest.httpResponse);
44+
}
45+
}
46+
}
47+
48+
private class Pair {
49+
public HttpRequest httpRequest;
50+
public HttpResponse httpResponse;
51+
52+
public Pair(HttpRequest httpRequest, HttpResponse httpResponse) {
53+
this.httpRequest = httpRequest;
54+
this.httpResponse = httpResponse;
55+
}
56+
}
57+
58+
public void enqeueHttpRequestForProcessing(HttpRequest httpRequest, HttpResponse httpResponse) {
59+
try {
60+
requestQueue.put(new Pair(httpRequest,httpResponse));
61+
} catch (InterruptedException e) {
62+
e.printStackTrace();
63+
}
64+
}
65+
66+
public static interface HttpResponse {
67+
68+
public void setStatusCode(int statusCode);
69+
70+
public void addResponseHeader(String headerField, String value);
71+
72+
public void setContent(byte[] content);
2873
}
2974

3075
public static class HttpRequest {
3176
private final String remoteIpAddress;
3277
private final String uri;
3378
private final String method;
79+
Map<String, String> requestHeaders = new HashMap<String, String>();
3480

3581
public HttpRequest(String uri, String method, String remoteIpAddress) {
3682
this.uri = uri;
@@ -47,9 +93,7 @@ public String getMethod() {
4793
}
4894

4995
public Map<String, String> getHeaders() {
50-
Map<String, String> receivedHeaders = new HashMap<String, String>();
51-
// receivedHeaders.put("x-Dynatrace", "");
52-
return receivedHeaders;
96+
return requestHeaders;
5397
}
5498

5599
public Map<String, List<String>> getParameters() {
@@ -59,33 +103,30 @@ public Map<String, List<String>> getParameters() {
59103
public String getRemoteIpAddress() {
60104
return remoteIpAddress;
61105
}
62-
63-
64106
}
65107

66108
/** faked http request handling. shows usage of OneAgent SDK's incoming webrequest API */
67-
public HttpResponse serve(HttpRequest session) {
68-
String url = session.getUri();
69-
70-
IncomingWebRequestTracer incomingWebrequestTracer = oneAgentSDK.traceIncomingWebRequest(webAppInfo, url, session.getMethod());
109+
private void serve(HttpRequest request, HttpResponse response) {
110+
String url = request.getUri();
111+
System.out.println("[Server] serve " + url);
112+
IncomingWebRequestTracer incomingWebrequestTracer = oneAgentSDK.traceIncomingWebRequest(webAppInfo, url, request.getMethod());
71113

72114
// add request header, parameter and remote address before start:
73-
for (Entry<String, String> headerField : session.getHeaders().entrySet()) {
115+
for (Entry<String, String> headerField : request.getHeaders().entrySet()) {
74116
incomingWebrequestTracer.addRequestHeader(headerField.getKey(), headerField.getValue());
75117
}
76-
for (Entry<String, List<String>> headerField : session.getParameters().entrySet()) {
118+
for (Entry<String, List<String>> headerField : request.getParameters().entrySet()) {
77119
for (String value : headerField.getValue()) {
78120
incomingWebrequestTracer.addParameter(headerField.getKey(), value);
79121
}
80122
}
81-
incomingWebrequestTracer.setRemoteAddress(session.getRemoteIpAddress());
123+
incomingWebrequestTracer.setRemoteAddress(request.getRemoteIpAddress());
82124

83125
incomingWebrequestTracer.start();
84-
HttpResponse response = new HttpResponse();
85126
try {
86-
response.setStatus(200);
127+
response.setContent("Hello world!".getBytes());
128+
response.setStatusCode(200);
87129
incomingWebrequestTracer.setStatusCode(200);
88-
return response;
89130
} catch (Exception e) {
90131
// we assume, container is sending http 500 in case of exception is thrown while serving an request:
91132
incomingWebrequestTracer.error(e);

0 commit comments

Comments
 (0)
0