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