16
16
package com .ibm .javametrics .web ;
17
17
18
18
import java .io .StringReader ;
19
- import java .util .ArrayList ;
20
19
import java .util .HashSet ;
21
20
import java .util .Iterator ;
22
21
import java .util .List ;
22
+ import java .util .Map .Entry ;
23
23
import java .util .Set ;
24
24
25
25
import javax .json .Json ;
28
28
import javax .json .JsonReader ;
29
29
30
30
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 ;
32
34
33
35
/**
34
36
* Registers as a JavametricsListener to receive metrics data, processes the
35
37
* data and sends the output to any registered emitters
36
38
*
37
39
*/
38
- public class DataHandler implements JavametricsListener {
40
+ public class DataHandler extends ApiDataListener {
39
41
40
42
private static DataHandler instance = null ;
41
43
private Set <Emitter > emitters = new HashSet <Emitter >();
@@ -57,7 +59,7 @@ public void addEmitter(Emitter emitter) {
57
59
emitters .add (emitter );
58
60
/*
59
61
* 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
61
63
*/
62
64
Javametrics .getInstance ().addListener (this );
63
65
}
@@ -84,90 +86,94 @@ public void emit(String message) {
84
86
}
85
87
86
88
@ 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 );
103
105
}
106
+ } else {
107
+ emit (jsonObject .toString ());
104
108
}
105
- } catch (JsonException je ) {
106
- // Skip this object, log the exception and keep trying with
107
- // the rest of the list
108
- je .printStackTrace ();
109
109
}
110
+ } catch (JsonException je ) {
111
+ // Skip this object, log the exception and keep trying with
112
+ // the rest of the list
113
+ je .printStackTrace ();
110
114
}
111
- emitHttp ();
112
115
}
116
+ emitHttp ();
113
117
}
114
118
115
119
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
+
118
128
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 ();
122
137
}
123
- httpUrlData = aggregateHttpData .urlDatatoJsonString ();
124
- aggregateHttpData .clear ();
125
- }
126
- emit (httpData .toJsonString ());
127
- emit (httpUrlData );
128
- }
129
138
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 (',' );
155
168
}
156
169
}
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 ();
169
173
}
170
- return strings ;
174
+
175
+ emit (httpData .toString ());
176
+ emit (httpUrlData .toString ());
171
177
}
172
178
173
179
}
0 commit comments