JAMES-1868 Add support for IMAP related metrics
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8e52e76a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8e52e76a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8e52e76a Branch: refs/heads/master Commit: 8e52e76a37c913b7c17ff25c740429193bcc7760 Parents: 0254c43 Author: Benoit Tellier <btell...@linagora.com> Authored: Thu Nov 24 11:55:20 2016 +0700 Committer: Benoit Tellier <btell...@linagora.com> Committed: Wed Nov 30 16:29:32 2016 +0700 ---------------------------------------------------------------------- server/protocols/protocols-imap4/pom.xml | 5 ++- .../james/imapserver/netty/IMAPServer.java | 26 ++++-------- .../imapserver/netty/IMAPServerFactory.java | 36 ++++++---------- .../netty/ImapChannelUpstreamHandler.java | 20 +++++++-- .../james/imapserver/netty/ImapMetrics.java | 44 ++++++++++++++++++++ .../james/imapserver/netty/OioIMAPServer.java | 8 ++++ .../imapserver/netty/OioIMAPServerFactory.java | 15 ++++++- .../META-INF/spring/imapserver-context.xml | 9 ++-- 8 files changed, 112 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/pom.xml ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/pom.xml b/server/protocols/protocols-imap4/pom.xml index d6d11c0..92f2cb6 100644 --- a/server/protocols/protocols-imap4/pom.xml +++ b/server/protocols/protocols-imap4/pom.xml @@ -41,7 +41,10 @@ <groupId>org.apache.james</groupId> <artifactId>james-server-filesystem-api</artifactId> </dependency> - + <dependency> + <groupId>org.apache.james</groupId> + <artifactId>james-server-metrics-api</artifactId> + </dependency> <dependency> <groupId>org.apache.james.protocols</groupId> <artifactId>protocols-imap</artifactId> http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java index da4d907..0d592c4 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java @@ -22,7 +22,6 @@ import static org.jboss.netty.channel.Channels.pipeline; import java.util.concurrent.TimeUnit; -import javax.inject.Inject; import javax.net.ssl.SSLEngine; import org.apache.commons.configuration.ConfigurationException; @@ -55,9 +54,10 @@ public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapC private static final String softwaretype = "JAMES " + VERSION + " Server "; - private ImapProcessor processor; - private ImapEncoder encoder; - private ImapDecoder decoder; + private final ImapProcessor processor; + private final ImapEncoder encoder; + private final ImapDecoder decoder; + private final ImapMetrics imapMetrics; private String hello; private boolean compress; @@ -72,19 +72,11 @@ public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapC public final static int DEFAULT_TIMEOUT = 30 * 60; // default timeout is 30 seconds public final static int DEFAULT_LITERAL_SIZE_LIMIT = 0; - @Inject - public void setImapProcessor(ImapProcessor processor) { + public IMAPServer(ImapDecoder decoder, ImapEncoder encoder, ImapProcessor processor, ImapMetrics imapMetrics) { this.processor = processor; - } - - @Inject - public void setImapDecoder(ImapDecoder decoder) { - this.decoder = decoder; - } - - @Inject - public void setImapEncoder(ImapEncoder encoder) { this.encoder = encoder; + this.decoder = decoder; + this.imapMetrics = imapMetrics; } @Override @@ -186,9 +178,9 @@ public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapC ImapChannelUpstreamHandler coreHandler; Encryption secure = getEncryption(); if (secure!= null && secure.isStartTLS()) { - coreHandler = new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress, plainAuthDisallowed, secure.getContext(), getEnabledCipherSuites()); + coreHandler = new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress, plainAuthDisallowed, secure.getContext(), getEnabledCipherSuites(), imapMetrics); } else { - coreHandler = new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress, plainAuthDisallowed); + coreHandler = new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress, plainAuthDisallowed, imapMetrics); } return coreHandler; } http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java index d29a8e1..cb92875 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java @@ -28,44 +28,35 @@ import org.apache.james.filesystem.api.FileSystem; import org.apache.james.imap.api.process.ImapProcessor; import org.apache.james.imap.decode.ImapDecoder; import org.apache.james.imap.encode.ImapEncoder; +import org.apache.james.metrics.api.Metric; +import org.apache.james.metrics.api.MetricFactory; import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer; import org.apache.james.protocols.lib.netty.AbstractServerFactory; import org.slf4j.Logger; public class IMAPServerFactory extends AbstractServerFactory { - private FileSystem fileSystem; - private ImapDecoder decoder; - private ImapEncoder encoder; - private ImapProcessor processor; - - @Inject - public final void setFileSystem(FileSystem filesystem) { - this.fileSystem = filesystem; - } + protected final FileSystem fileSystem; + protected final ImapDecoder decoder; + protected final ImapEncoder encoder; + protected final ImapProcessor processor; + protected final ImapMetrics imapMetrics; @Inject - public void setImapProcessor(ImapProcessor processor) { - this.processor = processor; - } - - @Inject - public void setImapDecoder(ImapDecoder decoder) { + public IMAPServerFactory(FileSystem fileSystem, ImapDecoder decoder, ImapEncoder encoder, ImapProcessor processor, MetricFactory metricFactory) { + this.fileSystem = fileSystem; this.decoder = decoder; - } - - @Inject - public void setImapEncoder(ImapEncoder encoder) { this.encoder = encoder; + this.processor = processor; + this.imapMetrics = new ImapMetrics(metricFactory); } protected IMAPServer createServer() { - return new IMAPServer(); + return new IMAPServer(decoder, encoder, processor, imapMetrics); } @Override protected List<AbstractConfigurableAsyncServer> createServers(Logger log, HierarchicalConfiguration config) throws Exception { - List<AbstractConfigurableAsyncServer> servers = new ArrayList<AbstractConfigurableAsyncServer>(); List<HierarchicalConfiguration> configs = config.configurationsAt("imapserver"); @@ -73,9 +64,6 @@ public class IMAPServerFactory extends AbstractServerFactory { IMAPServer server = createServer(); server.setLog(log); server.setFileSystem(fileSystem); - server.setImapDecoder(decoder); - server.setImapEncoder(encoder); - server.setImapProcessor(processor); server.configure(serverConfig); servers.add(server); } http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java index cc24c20..50114ec 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java @@ -32,6 +32,7 @@ import org.apache.james.imap.encode.ImapEncoder; import org.apache.james.imap.encode.ImapResponseComposer; import org.apache.james.imap.encode.base.ImapResponseComposerImpl; import org.apache.james.imap.main.ResponseEncoder; +import org.apache.james.metrics.api.Metric; import org.apache.james.protocols.api.logger.ProtocolLoggerAdapter; import org.apache.james.protocols.api.logger.ProtocolSessionLogger; import org.apache.james.protocols.lib.Slf4jLoggerAdapter; @@ -70,12 +71,18 @@ public class ImapChannelUpstreamHandler extends SimpleChannelUpstreamHandler imp private final ImapHeartbeatHandler heartbeatHandler = new ImapHeartbeatHandler(); private final boolean plainAuthDisallowed; + + private final Metric imapConnectionsMetric; + private final Metric imapCommandsMetric; - public ImapChannelUpstreamHandler(String hello, ImapProcessor processor, ImapEncoder encoder, Logger logger, boolean compress, boolean plainAuthDisallowed) { - this(hello, processor, encoder, logger, compress, plainAuthDisallowed, null, null); + public ImapChannelUpstreamHandler(String hello, ImapProcessor processor, ImapEncoder encoder, Logger logger, boolean compress, + boolean plainAuthDisallowed, ImapMetrics imapMetrics) { + this(hello, processor, encoder, logger, compress, plainAuthDisallowed, null, null, imapMetrics); } - public ImapChannelUpstreamHandler(String hello, ImapProcessor processor, ImapEncoder encoder, Logger logger, boolean compress, boolean plainAuthDisallowed, SSLContext context, String[] enabledCipherSuites) { + public ImapChannelUpstreamHandler(String hello, ImapProcessor processor, ImapEncoder encoder, Logger logger, boolean compress, + boolean plainAuthDisallowed, SSLContext context, String[] enabledCipherSuites, + ImapMetrics imapMetrics) { this.logger = logger; this.hello = hello; this.processor = processor; @@ -84,6 +91,8 @@ public class ImapChannelUpstreamHandler extends SimpleChannelUpstreamHandler imp this.enabledCipherSuites = enabledCipherSuites; this.compress = compress; this.plainAuthDisallowed = plainAuthDisallowed; + this.imapConnectionsMetric = imapMetrics.getConnectionsMetric(); + this.imapCommandsMetric = imapMetrics.getCommandsMetric(); } private Logger getLogger(Channel channel) { @@ -108,6 +117,7 @@ public class ImapChannelUpstreamHandler extends SimpleChannelUpstreamHandler imp ImapSession imapSession = (ImapSession) attributes.remove(ctx.getChannel()); if (imapSession != null) imapSession.logout(); + imapConnectionsMetric.decrement(); super.channelClosed(ctx, e); } @@ -117,6 +127,7 @@ public class ImapChannelUpstreamHandler extends SimpleChannelUpstreamHandler imp InetSocketAddress address = (InetSocketAddress) ctx.getChannel().getRemoteAddress(); getLogger(ctx.getChannel()).info("Connection established from " + address.getAddress().getHostAddress()); + imapConnectionsMetric.increment(); ImapResponseComposer response = new ImapResponseComposerImpl(new ChannelImapResponseWriter(ctx.getChannel())); ctx.setAttachment(response); @@ -171,7 +182,8 @@ public class ImapChannelUpstreamHandler extends SimpleChannelUpstreamHandler imp @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { - + + imapCommandsMetric.increment(); ImapSession session = (ImapSession) attributes.get(ctx.getChannel()); ImapResponseComposer response = (ImapResponseComposer) ctx.getAttachment(); ImapMessage message = (ImapMessage) e.getMessage(); http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapMetrics.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapMetrics.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapMetrics.java new file mode 100644 index 0000000..f199816 --- /dev/null +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapMetrics.java @@ -0,0 +1,44 @@ +/**************************************************************** + * 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.imapserver.netty; + +import org.apache.james.metrics.api.Metric; +import org.apache.james.metrics.api.MetricFactory; + +public class ImapMetrics { + private static final String IMAP_COMMANDS = "imapCommands"; + private static final String IMAP_CONNECTIONS = "imapConnections"; + + private final Metric commandsMetric; + private final Metric connectionsMetric; + + public ImapMetrics(MetricFactory metricFactory) { + commandsMetric = metricFactory.generate(IMAP_COMMANDS); + connectionsMetric = metricFactory.generate(IMAP_CONNECTIONS); + } + + public Metric getCommandsMetric() { + return commandsMetric; + } + + public Metric getConnectionsMetric() { + return connectionsMetric; + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java index 2e5368a..c3ce882 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java @@ -18,6 +18,10 @@ ****************************************************************/ package org.apache.james.imapserver.netty; +import org.apache.james.imap.api.process.ImapProcessor; +import org.apache.james.imap.decode.ImapDecoder; +import org.apache.james.imap.encode.ImapEncoder; +import org.apache.james.metrics.api.Metric; import org.jboss.netty.channel.socket.ServerSocketChannelFactory; import org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory; import org.jboss.netty.handler.execution.ExecutionHandler; @@ -28,6 +32,10 @@ import org.jboss.netty.handler.execution.ExecutionHandler; */ public class OioIMAPServer extends IMAPServer { + public OioIMAPServer(ImapDecoder decoder, ImapEncoder encoder, ImapProcessor processor, ImapMetrics imapMetrics) { + super(decoder, encoder, processor, imapMetrics); + } + @Override protected ServerSocketChannelFactory createSocketChannelFactory() { return new OioServerSocketChannelFactory(createBossExecutor(), createWorkerExecutor()); http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServerFactory.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServerFactory.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServerFactory.java index 5743f2a..5b6a12a 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServerFactory.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServerFactory.java @@ -18,11 +18,24 @@ ****************************************************************/ package org.apache.james.imapserver.netty; +import javax.inject.Inject; + +import org.apache.james.filesystem.api.FileSystem; +import org.apache.james.imap.api.process.ImapProcessor; +import org.apache.james.imap.decode.ImapDecoder; +import org.apache.james.imap.encode.ImapEncoder; +import org.apache.james.metrics.api.MetricFactory; + public class OioIMAPServerFactory extends IMAPServerFactory { + @Inject + public OioIMAPServerFactory(FileSystem fileSystem, ImapDecoder decoder, ImapEncoder encoder, ImapProcessor processor, MetricFactory metricFactory) { + super(fileSystem, decoder, encoder, processor, metricFactory); + } + @Override protected IMAPServer createServer() { - return new OioIMAPServer(); + return new OioIMAPServer(decoder, encoder, processor, imapMetrics); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/8e52e76a/server/protocols/protocols-imap4/src/main/resources/META-INF/spring/imapserver-context.xml ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-imap4/src/main/resources/META-INF/spring/imapserver-context.xml b/server/protocols/protocols-imap4/src/main/resources/META-INF/spring/imapserver-context.xml index 7ae7156..b48e89e 100644 --- a/server/protocols/protocols-imap4/src/main/resources/META-INF/spring/imapserver-context.xml +++ b/server/protocols/protocols-imap4/src/main/resources/META-INF/spring/imapserver-context.xml @@ -20,10 +20,11 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="imapserver" class="org.apache.james.imapserver.netty.IMAPServerFactory"> - <property name="imapProcessor" ref="imapProcessor"/> - <property name="imapEncoder" ref="imapEncoder"/> - <property name="imapDecoder" ref="imapDecoder"/> - <property name="fileSystem" ref="filesystem"/> + <constructor-arg index="0" ref="filesystem" /> + <constructor-arg index="1" ref="imapDecoder" /> + <constructor-arg index="2" ref="imapEncoder" /> + <constructor-arg index="3" ref="imapProcessor" /> + <constructor-arg index="4" ref="metricFactory" /> </bean> <!-- The imapProcessor configuration will be reviewed when IMAP will be integrated into Protocols project --> --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org