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