JAMES-1962 Enable basic metric collection on WebAdmin

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3dfb05f3
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3dfb05f3
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3dfb05f3

Branch: refs/heads/master
Commit: 3dfb05f3ced89de75e9434c82d22d39a4df7d220
Parents: 1463487
Author: benwa <btell...@linagora.com>
Authored: Fri Mar 10 13:44:05 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Wed Mar 15 09:02:31 2017 +0700

----------------------------------------------------------------------
 server/protocols/webadmin/pom.xml               |  9 +++++
 .../apache/james/webadmin/WebAdminServer.java   | 23 +++++++++--
 .../james/webadmin/metric/MetricPostFilter.java | 37 ++++++++++++++++++
 .../james/webadmin/metric/MetricPreFilter.java  | 41 ++++++++++++++++++++
 .../james/webadmin/routes/DomainRoutesTest.java |  5 ++-
 .../routes/UserMailboxesRoutesTest.java         |  5 ++-
 .../james/webadmin/routes/UsersRoutesTest.java  |  5 ++-
 7 files changed, 119 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3dfb05f3/server/protocols/webadmin/pom.xml
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/pom.xml 
b/server/protocols/webadmin/pom.xml
index da9d076..3703c7a 100644
--- a/server/protocols/webadmin/pom.xml
+++ b/server/protocols/webadmin/pom.xml
@@ -178,6 +178,15 @@
                     <scope>test</scope>
                 </dependency>
                 <dependency>
+                    <groupId>org.apache.james</groupId>
+                    <artifactId>metrics-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.james</groupId>
+                    <artifactId>metrics-logger</artifactId>
+                    <scope>test</scope>
+                </dependency>
+                <dependency>
                     <groupId>com.fasterxml.jackson.core</groupId>
                     <artifactId>jackson-databind</artifactId>
                 </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/3dfb05f3/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/WebAdminServer.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/WebAdminServer.java
 
b/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/WebAdminServer.java
index 9c398b4..e3fb368 100644
--- 
a/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/WebAdminServer.java
+++ 
b/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/WebAdminServer.java
@@ -28,8 +28,12 @@ import javax.inject.Inject;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.lifecycle.api.Configurable;
+import org.apache.james.metrics.api.MetricFactory;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.webadmin.authentication.AuthenticationFilter;
 import org.apache.james.webadmin.authentication.NoAuthenticationFilter;
+import org.apache.james.webadmin.metric.MetricPostFilter;
+import org.apache.james.webadmin.metric.MetricPreFilter;
 import org.apache.james.webadmin.routes.CORSRoute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,6 +41,9 @@ import org.slf4j.LoggerFactory;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 
+import spark.Filter;
+import spark.Request;
+import spark.Response;
 import spark.Service;
 
 public class WebAdminServer implements Configurable {
@@ -49,24 +56,28 @@ public class WebAdminServer implements Configurable {
     private final Set<Routes> routesList;
     private final Service service;
     private final AuthenticationFilter authenticationFilter;
+    private final MetricFactory metricFactory;
 
     // Spark do not allow to retrieve allocated port when using a random port. 
Thus we generate the port.
     @Inject
-    private WebAdminServer(WebAdminConfiguration configuration, Set<Routes> 
routesList, AuthenticationFilter authenticationFilter) {
+    private WebAdminServer(WebAdminConfiguration configuration, Set<Routes> 
routesList, AuthenticationFilter authenticationFilter,
+                           MetricFactory metricFactory) {
         this.configuration = configuration;
         this.routesList = routesList;
         this.authenticationFilter = authenticationFilter;
+        this.metricFactory = metricFactory;
         this.service = Service.ignite();
     }
 
     @VisibleForTesting
-    public WebAdminServer(Routes... routes) throws IOException {
+    public WebAdminServer(MetricFactory metricFactory, Routes... routes) 
throws IOException {
         this(WebAdminConfiguration.builder()
             .enabled()
             .port(new RandomPort())
             .build(),
             ImmutableSet.copyOf(routes),
-            new NoAuthenticationFilter());
+            new NoAuthenticationFilter(),
+            metricFactory);
     }
 
     @Override
@@ -75,12 +86,18 @@ public class WebAdminServer implements Configurable {
             service.port(configuration.getPort().toInt());
             configureHTTPS();
             configureCORS();
+            configureMetrics();
             service.before(authenticationFilter);
             routesList.forEach(routes -> routes.define(service));
             LOGGER.info("Web admin server started");
         }
     }
 
+    private void configureMetrics() {
+        service.before(new MetricPreFilter(metricFactory));
+        service.after(new MetricPostFilter());
+    }
+
     private void configureHTTPS() {
         HttpsConfiguration httpsConfiguration = 
configuration.getHttpsConfiguration();
         if (httpsConfiguration.isEnabled()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/3dfb05f3/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPostFilter.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPostFilter.java
 
b/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPostFilter.java
new file mode 100644
index 0000000..4d9b8b7
--- /dev/null
+++ 
b/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPostFilter.java
@@ -0,0 +1,37 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.webadmin.metric;
+
+import org.apache.james.metrics.api.TimeMetric;
+
+import spark.Filter;
+import spark.Request;
+import spark.Response;
+
+public class MetricPostFilter implements Filter {
+
+    @Override
+    public void handle(Request request, Response response) throws Exception {
+        if (request.attribute(MetricPreFilter.METRICS) instanceof TimeMetric) {
+            TimeMetric timeMetric = request.attribute(MetricPreFilter.METRICS);
+            timeMetric.stopAndPublish();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/3dfb05f3/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPreFilter.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPreFilter.java
 
b/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPreFilter.java
new file mode 100644
index 0000000..1ed9d76
--- /dev/null
+++ 
b/server/protocols/webadmin/src/main/java/org/apache/james/webadmin/metric/MetricPreFilter.java
@@ -0,0 +1,41 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+
+package org.apache.james.webadmin.metric;
+
+import org.apache.james.metrics.api.MetricFactory;
+
+import spark.Filter;
+import spark.Request;
+import spark.Response;
+
+public class MetricPreFilter implements Filter {
+    public static final String METRICS = "metrics";
+    private final MetricFactory metricFactory;
+
+    public MetricPreFilter(MetricFactory metricFactory) {
+        this.metricFactory = metricFactory;
+    }
+
+    @Override
+    public void handle(Request request, Response response) throws Exception {
+        request.attribute(METRICS, metricFactory.timer("webAdmin"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/3dfb05f3/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/DomainRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/DomainRoutesTest.java
 
b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/DomainRoutesTest.java
index 3c316b0..1df89d2 100644
--- 
a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/DomainRoutesTest.java
+++ 
b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/DomainRoutesTest.java
@@ -39,6 +39,7 @@ import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.domainlist.memory.MemoryDomainList;
+import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.junit.After;
@@ -64,7 +65,9 @@ public class DomainRoutesTest {
     private WebAdminServer webAdminServer;
 
     private void createServer(DomainList domainList) throws Exception {
-        webAdminServer = new WebAdminServer(new DomainRoutes(domainList, new 
JsonTransformer()));
+        webAdminServer = new WebAdminServer(
+            new DefaultMetricFactory(),
+            new DomainRoutes(domainList, new JsonTransformer()));
         webAdminServer.configure(NO_CONFIGURATION);
         webAdminServer.await();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3dfb05f3/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
 
b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index 8c9c2db..3db15b1 100644
--- 
a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ 
b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -50,6 +50,7 @@ import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.SimpleMailboxMetaData;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
+import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.service.UserMailboxesService;
@@ -79,7 +80,9 @@ public class UserMailboxesRoutesTest {
         usersRepository = mock(UsersRepository.class);
         when(usersRepository.contains(USERNAME)).thenReturn(true);
 
-        webAdminServer = new WebAdminServer(new UserMailboxesRoutes(new 
UserMailboxesService(mailboxManager, usersRepository), new JsonTransformer()));
+        webAdminServer = new WebAdminServer(
+            new DefaultMetricFactory(),
+            new UserMailboxesRoutes(new UserMailboxesService(mailboxManager, 
usersRepository), new JsonTransformer()));
         webAdminServer.configure(NO_CONFIGURATION);
         webAdminServer.await();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3dfb05f3/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
 
b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
index eec3fda..684ea9b 100644
--- 
a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
+++ 
b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.user.api.model.User;
@@ -60,7 +61,9 @@ public class UsersRoutesTest {
     private WebAdminServer webAdminServer;
 
     private void createServer(UsersRepository usersRepository) throws 
Exception {
-        webAdminServer = new WebAdminServer(new UserRoutes(new 
UserService(usersRepository), new JsonTransformer()));
+        webAdminServer = new WebAdminServer(
+            new DefaultMetricFactory(),
+            new UserRoutes(new UserService(usersRepository), new 
JsonTransformer()));
         webAdminServer.configure(NO_CONFIGURATION);
         webAdminServer.await();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to