Skip to content

Commit c251b1a

Browse files
committed
#12 - Add RequestTimingListener ... for per request timing callback
1 parent c69190f commit c251b1a

File tree

5 files changed

+94
-9
lines changed

5 files changed

+94
-9
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.avaje.metric.report;
2+
3+
import org.avaje.metric.RequestTiming;
4+
5+
import java.util.Collections;
6+
import java.util.List;
7+
8+
/**
9+
* Combines a RequestTimingReporter with a list of RequestTimingListener.
10+
*/
11+
public class BaseRequestTimingReporter implements RequestTimingReporter {
12+
13+
final RequestTimingReporter reporter;
14+
15+
final List<RequestTimingListener> listeners;
16+
17+
public BaseRequestTimingReporter(RequestTimingReporter reporter, List<RequestTimingListener> listeners) {
18+
this.reporter = reporter;
19+
this.listeners = (listeners != null) ? listeners : Collections.EMPTY_LIST;
20+
}
21+
22+
@Override
23+
public void report(List<RequestTiming> requestTimings) {
24+
if (reporter != null) {
25+
reporter.report(requestTimings);
26+
}
27+
if (!listeners.isEmpty()) {
28+
// notify all the listeners
29+
for (int t = 0; t <requestTimings.size(); t++) {
30+
RequestTiming requestTiming = requestTimings.get(t);
31+
for (int l = 0; l < listeners.size(); l++) {
32+
listeners.get(l).onRequestTiming(requestTiming);
33+
}
34+
}
35+
}
36+
}
37+
38+
@Override
39+
public void cleanup() {
40+
if (reporter != null) {
41+
reporter.cleanup();
42+
}
43+
}
44+
}

src/main/java/org/avaje/metric/report/BasicRequestTimingWriter.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void write(Writer writer, List<RequestTiming> requestTimings) throws IOEx
5151
/**
5252
* Write the RequestTiming to the writer.
5353
*/
54-
protected void writeEntry(Writer writer, RequestTiming requestTiming) throws IOException {
54+
public void writeEntry(Writer writer, RequestTiming requestTiming) throws IOException {
5555

5656
// note that the entries are in reverse order
5757
List<RequestTimingEntry> entries = requestTiming.getEntries();
@@ -73,14 +73,14 @@ protected void writeEntry(Writer writer, RequestTiming requestTiming) throws IOE
7373
/**
7474
* Write the footer content to the writer.
7575
*/
76-
private void writeFooter(Writer writer) throws IOException {
76+
protected void writeFooter(Writer writer) throws IOException {
7777
writer.write("\n");
7878
}
7979

8080
/**
8181
* Write the header content to the writer.
8282
*/
83-
private void writeHeader(Writer writer, RequestTimingEntry headerEntry, RequestTiming requestTiming, long totalExeNanos) throws IOException {
83+
protected void writeHeader(Writer writer, RequestTimingEntry headerEntry, RequestTiming requestTiming, long totalExeNanos) throws IOException {
8484

8585
Date reportTime = new Date(requestTiming.getReportTime());
8686

@@ -104,7 +104,7 @@ private void writeHeader(Writer writer, RequestTimingEntry headerEntry, RequestT
104104
/**
105105
* Write the detail entry to the writer.
106106
*/
107-
private void writeDetail(Writer writer, RequestTimingEntry entry, long totalExeNanos) throws IOException {
107+
protected void writeDetail(Writer writer, RequestTimingEntry entry, long totalExeNanos) throws IOException {
108108

109109
long executionNanos = entry.getExecutionNanos();
110110
long percentage = percentage(totalExeNanos, executionNanos);
@@ -134,7 +134,7 @@ private void writeDetail(Writer writer, RequestTimingEntry entry, long totalExeN
134134
/**
135135
* Write the value padding with spaces out to padToWidth.
136136
*/
137-
private void pad(Writer writer, int padToWidth, long value) throws IOException {
137+
protected void pad(Writer writer, int padToWidth, long value) throws IOException {
138138
String s = String.valueOf(value);
139139
writer.write(s);
140140
for (int i=0; i<padToWidth-s.length(); i++) {
@@ -145,22 +145,22 @@ private void pad(Writer writer, int padToWidth, long value) throws IOException {
145145
/**
146146
* Return the percentage of execution time as a value from 0 to 100.
147147
*/
148-
private long percentage(long totalExeNanos, long executionNanos) {
148+
protected long percentage(long totalExeNanos, long executionNanos) {
149149
return (100 * executionNanos) / totalExeNanos;
150150
}
151151

152152

153153
/**
154154
* Return the nanos as milliseconds.
155155
*/
156-
long toMillis(long nanos) {
156+
protected long toMillis(long nanos) {
157157
return TimeUnit.NANOSECONDS.toMillis(nanos);
158158
}
159159

160160
/**
161161
* Return the nanos as microseconds.
162162
*/
163-
long toMicros(long nanos) {
163+
protected long toMicros(long nanos) {
164164
return TimeUnit.NANOSECONDS.toMicros(nanos);
165165
}
166166
}

src/main/java/org/avaje/metric/report/MetricReportConfig.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.avaje.metric.report;
22

3+
import java.util.ArrayList;
4+
import java.util.List;
35
import java.util.concurrent.ScheduledExecutorService;
46

57
/**
@@ -29,6 +31,8 @@ public class MetricReportConfig {
2931

3032
ScheduledExecutorService executor;
3133

34+
List<RequestTimingListener> requestTimingListeners = new ArrayList<>();
35+
3236
/**
3337
* Return the HeaderInfo which identifies this application instance.
3438
* <p/>
@@ -204,4 +208,25 @@ public RequestTimingReporter getRequestTimingReporter() {
204208
public void setRequestTimingReporter(RequestTimingReporter requestTimingReporter) {
205209
this.requestTimingReporter = requestTimingReporter;
206210
}
211+
212+
/**
213+
* Add a RequestTimingListener.
214+
*/
215+
public void addRequestTimingListener(RequestTimingListener listener) {
216+
this.requestTimingListeners.add(listener);
217+
}
218+
219+
/**
220+
* Return the list of RequestTimingListener's.
221+
*/
222+
public List<RequestTimingListener> getRequestTimingListeners() {
223+
return requestTimingListeners;
224+
}
225+
226+
/**
227+
* Set the list of RequestTimingListener's.
228+
*/
229+
public void setRequestTimingListeners(List<RequestTimingListener> requestTimingListeners) {
230+
this.requestTimingListeners = requestTimingListeners;
231+
}
207232
}

src/main/java/org/avaje/metric/report/MetricReportManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ protected RequestTimingReporter defaultReqReporter(MetricReportConfig config) {
8989
return config.getRequestTimingReporter();
9090
}
9191
// just use the default implementation based on config
92-
return new RequestFileReporter(config);
92+
RequestTimingReporter fileReporter = new RequestFileReporter(config);
93+
return new BaseRequestTimingReporter(fileReporter, config.getRequestTimingListeners());
9394
}
9495

9596
/**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.avaje.metric.report;
2+
3+
import org.avaje.metric.RequestTiming;
4+
5+
/**
6+
* Listener that can be notified when a RequestTiming is reported.
7+
*/
8+
public interface RequestTimingListener {
9+
10+
/**
11+
* Listener notified for each RequestTiming that has been reported.
12+
*/
13+
void onRequestTiming(RequestTiming requestTiming);
14+
15+
}

0 commit comments

Comments
 (0)