Skip to content

Commit d0fc71a

Browse files
Linas Zvirblisjknack
authored andcommitted
Metrics: collect metrics after the response is complete (#1104)
1 parent e0e5a68 commit d0fc71a

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

modules/jooby-metrics/src/main/java/org/jooby/metrics/InstrumentedHandler.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@
206206
import org.jooby.Request;
207207
import org.jooby.Response;
208208
import org.jooby.Route;
209-
import org.jooby.Route.Chain;
210209
import org.jooby.Status;
211210

212211
import com.codahale.metrics.Counter;
@@ -220,22 +219,22 @@
220219
* @author edgar
221220
* @since 0.13.0
222221
*/
223-
public class InstrumentedHandler implements Route.Filter {
222+
public class InstrumentedHandler implements Route.Handler {
224223

225224
@Override
226-
public void handle(final Request req, final Response rsp, final Chain chain) throws Throwable {
225+
public void handle(final Request req, final Response rsp) throws Throwable {
227226
MetricRegistry registry = req.require(MetricRegistry.class);
228227
Counter counter = registry.counter("request.actives");
229228
Timer.Context timer = registry.timer("request").time();
230-
try {
231-
counter.inc();
232-
chain.next(req, rsp);
233-
} finally {
229+
230+
counter.inc();
231+
232+
rsp.complete((ereq, ersp, x) -> {
234233
timer.stop();
235234
counter.dec();
236235
Meter meter = registry.meter("responses." + rsp.status().orElse(Status.OK).value());
237236
meter.mark();
238-
}
237+
});
239238
}
240239

241240
}

modules/jooby-metrics/src/test/java/org/jooby/metrics/InstrumentedHandlerTest.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@
2222

2323
public class InstrumentedHandlerTest {
2424

25+
private Block capture = unit -> {
26+
Response rsp = unit.get(Response.class);
27+
rsp.complete(unit.capture(Route.Complete.class));
28+
};
29+
30+
private Block onComplete = unit -> {
31+
unit.captured(Route.Complete.class).iterator().next()
32+
.handle(unit.get(Request.class), unit.get(Response.class), Optional.empty());
33+
};
34+
2535
private Block registry = unit -> {
2636
Request request = unit.get(Request.class);
2737
expect(request.require(MetricRegistry.class))
@@ -80,12 +90,13 @@ public void instrument() throws Exception {
8090
.expect(registry)
8191
.expect(counter)
8292
.expect(timer)
93+
.expect(capture)
8394
.expect(meter)
8495
.expect(next)
8596
.run(unit -> {
8697
new InstrumentedHandler().handle(unit.get(Request.class), unit.get(Response.class),
8798
unit.get(Route.Chain.class));
88-
});
99+
}, onComplete);
89100
}
90101

91102
@Test(expected = IOException.class)
@@ -94,12 +105,13 @@ public void instrumentWithErr() throws Exception {
94105
.expect(registry)
95106
.expect(counter)
96107
.expect(timer)
108+
.expect(capture)
97109
.expect(meter)
98110
.expect(nextErr)
99111
.run(unit -> {
100112
new InstrumentedHandler().handle(unit.get(Request.class), unit.get(Response.class),
101113
unit.get(Route.Chain.class));
102-
});
114+
}, onComplete);
103115
}
104116

105117
}

0 commit comments

Comments
 (0)