summaryrefslogtreecommitdiff
path: root/src/com/p4square/restlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/p4square/restlet')
-rw-r--r--src/com/p4square/restlet/metrics/MetricRouter.java61
-rw-r--r--src/com/p4square/restlet/metrics/MetricsApplication.java43
-rw-r--r--src/com/p4square/restlet/metrics/MetricsResource.java32
3 files changed, 136 insertions, 0 deletions
diff --git a/src/com/p4square/restlet/metrics/MetricRouter.java b/src/com/p4square/restlet/metrics/MetricRouter.java
new file mode 100644
index 0000000..d4da270
--- /dev/null
+++ b/src/com/p4square/restlet/metrics/MetricRouter.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2014 Jesse Morgan
+ */
+
+package com.p4square.restlet.metrics;
+
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.Timer;
+
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.Restlet;
+import org.restlet.routing.TemplateRoute;
+import org.restlet.routing.Router;
+
+/**
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class MetricRouter extends Router {
+
+ private final MetricRegistry mMetricRegistry;
+
+ public MetricRouter(Context context, MetricRegistry metrics) {
+ super(context);
+ mMetricRegistry = metrics;
+ }
+
+ @Override
+ protected void doHandle(Restlet next, Request request, Response response) {
+ String baseName;
+ if (next instanceof TemplateRoute) {
+ TemplateRoute temp = (TemplateRoute) next;
+ baseName = MetricRegistry.name("MetricRouter", temp.getTemplate().getPattern());
+ } else {
+ baseName = MetricRegistry.name("MetricRouter", "unknown");
+ }
+
+ final Timer.Context aggTimer = mMetricRegistry.timer("MetricRouter.time").time();
+ final Timer.Context timer = mMetricRegistry.timer(baseName + ".time").time();
+
+ try {
+ super.doHandle(next, request, response);
+ } finally {
+ timer.stop();
+ aggTimer.stop();
+
+ // Record status code
+ boolean success = !response.getStatus().isError();
+ if (success) {
+ mMetricRegistry.counter("MetricRouter.success").inc();
+ mMetricRegistry.counter(baseName + ".response.success").inc();
+ } else {
+ mMetricRegistry.counter("MetricRouter.failure").inc();
+ mMetricRegistry.counter(baseName + ".response.failure").inc();
+ }
+ }
+ }
+}
diff --git a/src/com/p4square/restlet/metrics/MetricsApplication.java b/src/com/p4square/restlet/metrics/MetricsApplication.java
new file mode 100644
index 0000000..6caf742
--- /dev/null
+++ b/src/com/p4square/restlet/metrics/MetricsApplication.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2014 Jesse Morgan
+ */
+
+package com.p4square.restlet.metrics;
+
+import java.util.concurrent.TimeUnit;
+
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.json.MetricsModule;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.restlet.Application;
+import org.restlet.Restlet;
+import org.restlet.resource.Finder;
+
+/**
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class MetricsApplication extends Application {
+ static final ObjectMapper MAPPER;
+ static {
+ MAPPER = new ObjectMapper();
+ MAPPER.registerModule(new MetricsModule(TimeUnit.SECONDS, TimeUnit.MILLISECONDS, true));
+ }
+
+ private final MetricRegistry mMetricRegistry;
+
+ public MetricsApplication(MetricRegistry metrics) {
+ mMetricRegistry = metrics;
+ }
+
+ public MetricRegistry getMetricRegistry() {
+ return mMetricRegistry;
+ }
+
+ @Override
+ public Restlet createInboundRoot() {
+ return new Finder(getContext(), MetricsResource.class);
+ }
+}
diff --git a/src/com/p4square/restlet/metrics/MetricsResource.java b/src/com/p4square/restlet/metrics/MetricsResource.java
new file mode 100644
index 0000000..e2ab14d
--- /dev/null
+++ b/src/com/p4square/restlet/metrics/MetricsResource.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2014 Jesse Morgan
+ */
+
+package com.p4square.restlet.metrics;
+
+import com.codahale.metrics.MetricRegistry;
+
+import org.restlet.ext.jackson.JacksonRepresentation;
+import org.restlet.representation.Representation;
+import org.restlet.resource.ServerResource;
+
+/**
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class MetricsResource extends ServerResource {
+
+ private MetricRegistry mMetricRegistry;
+
+ @Override
+ public void doInit() {
+ mMetricRegistry = ((MetricsApplication) getApplication()).getMetricRegistry();
+ }
+
+ @Override
+ protected Representation get() {
+ JacksonRepresentation<MetricRegistry> rep = new JacksonRepresentation<>(mMetricRegistry);
+ rep.setObjectMapper(MetricsApplication.MAPPER);
+ return rep;
+ }
+}