Skip to content

Commit ab0268b

Browse files
robbinspgmattcolegate
authored andcommitted
Refactor some common processing into the core agent package (#52)
* Refactor some common processing into the ore agent package * Check in test changes * Add unit tests for HttpDataAggregator and ApiDataListener * Add missing refactor
1 parent f5809ec commit ab0268b

File tree

16 files changed

+512
-336
lines changed

16 files changed

+512
-336
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
.project
44
bin/
55
target/
6+
.DS_Store

dashboard/src/main/java/com/ibm/javametrics/web/DataHandler.java

+80-74
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
package com.ibm.javametrics.web;
1717

1818
import java.io.StringReader;
19-
import java.util.ArrayList;
2019
import java.util.HashSet;
2120
import java.util.Iterator;
2221
import java.util.List;
22+
import java.util.Map.Entry;
2323
import java.util.Set;
2424

2525
import javax.json.Json;
@@ -28,14 +28,16 @@
2828
import javax.json.JsonReader;
2929

3030
import com.ibm.javametrics.Javametrics;
31-
import com.ibm.javametrics.JavametricsListener;
31+
import com.ibm.javametrics.analysis.ApiDataListener;
32+
import com.ibm.javametrics.analysis.HttpDataAggregator;
33+
import com.ibm.javametrics.analysis.HttpDataAggregator.HttpUrlData;
3234

3335
/**
3436
* Registers as a JavametricsListener to receive metrics data, processes the
3537
* data and sends the output to any registered emitters
3638
*
3739
*/
38-
public class DataHandler implements JavametricsListener {
40+
public class DataHandler extends ApiDataListener {
3941

4042
private static DataHandler instance = null;
4143
private Set<Emitter> emitters = new HashSet<Emitter>();
@@ -57,7 +59,7 @@ public void addEmitter(Emitter emitter) {
5759
emitters.add(emitter);
5860
/*
5961
* adding as listener has the side effect of sending history which is
60-
* required for any newly registered emitter to see the Environment daya
62+
* required for any newly registered emitter to see the Environment data
6163
*/
6264
Javametrics.getInstance().addListener(this);
6365
}
@@ -84,90 +86,94 @@ public void emit(String message) {
8486
}
8587

8688
@Override
87-
public void receive(String pluginName, String data) {
88-
if (pluginName.equals("api")) {
89-
List<String> split = splitIntoJSONObjects(data);
90-
for (Iterator<String> iterator = split.iterator(); iterator.hasNext();) {
91-
String jsonStr = iterator.next();
92-
JsonReader jsonReader = Json.createReader(new StringReader(jsonStr));
93-
try {
94-
JsonObject jsonObject = jsonReader.readObject();
95-
String topicName = jsonObject.getString("topic", null);
96-
if (topicName != null) {
97-
if (topicName.equals("http")) {
98-
synchronized (aggregateHttpData) {
99-
aggregateHttpData.aggregate(jsonObject.getJsonObject("payload"));
100-
}
101-
} else {
102-
emit(jsonObject.toString());
89+
public void processData(List<String> jsonData) {
90+
for (Iterator<String> iterator = jsonData.iterator(); iterator.hasNext();) {
91+
String jsonStr = iterator.next();
92+
JsonReader jsonReader = Json.createReader(new StringReader(jsonStr));
93+
try {
94+
JsonObject jsonObject = jsonReader.readObject();
95+
String topicName = jsonObject.getString("topic", null);
96+
if (topicName != null) {
97+
if (topicName.equals("http")) {
98+
JsonObject payload = jsonObject.getJsonObject("payload");
99+
long requestTime = payload.getJsonNumber("time").longValue();
100+
long requestDuration = payload.getJsonNumber("duration").longValue();
101+
String requestUrl = payload.getString("url", "");
102+
103+
synchronized (aggregateHttpData) {
104+
aggregateHttpData.aggregate(requestTime, requestDuration, requestUrl);
103105
}
106+
} else {
107+
emit(jsonObject.toString());
104108
}
105-
} catch (JsonException je) {
106-
// Skip this object, log the exception and keep trying with
107-
// the rest of the list
108-
je.printStackTrace();
109109
}
110+
} catch (JsonException je) {
111+
// Skip this object, log the exception and keep trying with
112+
// the rest of the list
113+
je.printStackTrace();
110114
}
111-
emitHttp();
112115
}
116+
emitHttp();
113117
}
114118

115119
private void emitHttp() {
116-
HttpDataAggregator httpData;
117-
String httpUrlData;
120+
long time;
121+
long total;
122+
long longest;
123+
long average;
124+
String url;
125+
StringBuilder httpUrlData;
126+
StringBuilder httpData;
127+
118128
synchronized (aggregateHttpData) {
119-
httpData = aggregateHttpData.getCurrent();
120-
if (aggregateHttpData.total == 0) {
121-
httpData.time = System.currentTimeMillis();
129+
time = aggregateHttpData.getTime();
130+
total = aggregateHttpData.getTotalHits();
131+
longest = aggregateHttpData.getLongest();
132+
average = aggregateHttpData.getAverage();
133+
url = aggregateHttpData.getUrl();
134+
135+
if (total == 0) {
136+
time = System.currentTimeMillis();
122137
}
123-
httpUrlData = aggregateHttpData.urlDatatoJsonString();
124-
aggregateHttpData.clear();
125-
}
126-
emit(httpData.toJsonString());
127-
emit(httpUrlData);
128-
}
129138

130-
/**
131-
* Split a string of JSON objects into multiple strings
132-
*
133-
* @param data
134-
* @return
135-
*/
136-
private List<String> splitIntoJSONObjects(String data) {
137-
List<String> strings = new ArrayList<String>();
138-
int index = 0;
139-
// Find first opening bracket
140-
while (index < data.length() && data.charAt(index) != '{') {
141-
index++;
142-
}
143-
int closingBracket = index + 1;
144-
int bracketCounter = 1;
145-
while (index < data.length() - 1 && closingBracket < data.length()) {
146-
// Find the matching bracket for the bracket at location 'index'
147-
boolean found = false;
148-
if (data.charAt(closingBracket) == '{') {
149-
bracketCounter++;
150-
} else if (data.charAt(closingBracket) == '}') {
151-
bracketCounter--;
152-
if (bracketCounter == 0) {
153-
// found matching bracket
154-
found = true;
139+
// emit JSON String representing HTTP request data in the
140+
// format expected by the javascript
141+
httpData = new StringBuilder("{\"topic\":\"http\",\"payload\":{\"time\":");
142+
httpData.append(time);
143+
httpData.append(",\"total\":");
144+
httpData.append(total);
145+
httpData.append(",\"longest\":");
146+
httpData.append(longest);
147+
httpData.append(",\"average\":");
148+
httpData.append(average);
149+
httpData.append(",\"url\":\"");
150+
httpData.append(url);
151+
httpData.append("\"}}");
152+
153+
// emit JSON String representing HTTP request data by URL in the
154+
// format expected by the javascript
155+
httpUrlData = new StringBuilder("{\"topic\":\"httpURLs\",\"payload\":[");
156+
Iterator<Entry<String, HttpUrlData>> it = aggregateHttpData.getUrlData().entrySet().iterator();
157+
while (it.hasNext()) {
158+
Entry<String, HttpUrlData> pair = it.next();
159+
httpUrlData.append("{\"url\":\"");
160+
httpUrlData.append(pair.getKey());
161+
httpUrlData.append("\",\"hits\":");
162+
httpUrlData.append(pair.getValue().getHits());
163+
httpUrlData.append(",\"averageResponseTime\":");
164+
httpUrlData.append(pair.getValue().getAverageResponseTime());
165+
httpUrlData.append('}');
166+
if (it.hasNext()) {
167+
httpUrlData.append(',');
155168
}
156169
}
157-
if (found) {
158-
strings.add(data.substring(index, closingBracket + 1));
159-
index = closingBracket + 1;
160-
// Find next opening bracket and reset counters
161-
while (index < data.length() && data.charAt(index) != '{') {
162-
index++;
163-
}
164-
closingBracket = index + 1;
165-
bracketCounter = 1;
166-
} else {
167-
closingBracket++;
168-
}
170+
httpUrlData.append("]}");
171+
172+
aggregateHttpData.resetSummaryData();
169173
}
170-
return strings;
174+
175+
emit(httpData.toString());
176+
emit(httpUrlData.toString());
171177
}
172178

173179
}

dashboard/src/main/java/com/ibm/javametrics/web/HttpDataAggregator.java

-150
This file was deleted.

javaagent/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@
189189
<artifactId>maven-dependency-plugin</artifactId>
190190
<executions>
191191
<execution>
192-
<phase>install</phase>
192+
<phase>package</phase>
193193
<goals>
194194
<goal>copy-dependencies</goal>
195195
</goals>

0 commit comments

Comments
 (0)