You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2016/11/30 14:01:22 UTC

[03/16] james-project git commit: JAMES-1868 Add support for IMAP related metrics

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 <bt...@linagora.com>
Authored: Thu Nov 24 11:55:20 2016 +0700
Committer: Benoit Tellier <bt...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org