Return-Path: X-Original-To: apmail-activemq-commits-archive@www.apache.org Delivered-To: apmail-activemq-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3CB6618178 for ; Wed, 20 Apr 2016 03:00:53 +0000 (UTC) Received: (qmail 53988 invoked by uid 500); 20 Apr 2016 03:00:53 -0000 Delivered-To: apmail-activemq-commits-archive@activemq.apache.org Received: (qmail 53863 invoked by uid 500); 20 Apr 2016 03:00:53 -0000 Mailing-List: contact commits-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list commits@activemq.apache.org Received: (qmail 53847 invoked by uid 99); 20 Apr 2016 03:00:53 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 20 Apr 2016 03:00:53 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 03A76DFE5F; Wed, 20 Apr 2016 03:00:53 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: clebertsuconic@apache.org To: commits@activemq.apache.org Date: Wed, 20 Apr 2016 03:00:53 -0000 Message-Id: <8980299bc78e4830910858c5e6b01c81@git.apache.org> In-Reply-To: <1096d1adbdc942fabec32485ad08e4f6@git.apache.org> References: <1096d1adbdc942fabec32485ad08e4f6@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] activemq-artemis git commit: ARTEMIS-417 more broker-level JMX attrs ARTEMIS-417 more broker-level JMX attrs Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/9d7a49b3 Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/9d7a49b3 Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/9d7a49b3 Branch: refs/heads/master Commit: 9d7a49b38812d28e7a1e8fe9a5cae62ad1e3b96b Parents: 03b2650 Author: jbertram Authored: Fri Apr 15 18:56:00 2016 -0500 Committer: Clebert Suconic Committed: Tue Apr 19 23:00:32 2016 -0400 ---------------------------------------------------------------------- .../core/management/ActiveMQServerControl.java | 42 +++++ .../impl/ActiveMQServerControlImpl.java | 91 ++++++++++ .../core/remoting/server/RemotingService.java | 2 + .../server/impl/RemotingServiceImpl.java | 9 + .../artemis/core/server/ActiveMQServer.java | 14 ++ .../core/server/impl/ActiveMQServerImpl.java | 59 +++++++ .../management/ActiveMQServerControlTest.java | 175 +++++++++++++++++++ .../ActiveMQServerControlUsingCoreTest.java | 35 ++++ 8 files changed, 427 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java index 53673b2..39b18f2 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java @@ -36,6 +36,36 @@ public interface ActiveMQServerControl { int getConnectionCount(); /** + * Returns the number of clients which have connected to this server since it was started. + */ + @Attribute(desc = "number of clients which have connected to this server since it was started") + long getTotalConnectionCount(); + + /** + * Returns the number of messages in all queues on the server. + */ + @Attribute(desc = "number of messages in all queues on the server") + long getTotalMessageCount(); + + /** + * Returns the number of messages sent to this server since it was started. + */ + @Attribute(desc = "number of messages sent to this server since it was started") + long getTotalMessagesAdded(); + + /** + * Returns the number of messages sent to this server since it was started. + */ + @Attribute(desc = "number of messages acknowledged from all the queues on this server since it was started") + long getTotalMessagesAcknowledged(); + + /** + * Returns the number of messages sent to this server since it was started. + */ + @Attribute(desc = "number of consumers consuming messages from all the queues on this server") + long getTotalConsumerCount(); + + /** * Return whether this server is started. */ @Attribute(desc = "whether this server is started") @@ -354,6 +384,18 @@ public interface ActiveMQServerControl { @Attribute(desc = "names of the queues created on this server") String[] getQueueNames(); + /** + * Returns the uptime of this server. + */ + @Attribute(desc = "uptime of this server") + String getUptime(); + + /** + * Returns the uptime of this server. + */ + @Attribute(desc = "uptime of this server in milliseconds") + long getUptimeMillis(); + // Operations ---------------------------------------------------- /** http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java index ae16891..6e7f4dc 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java @@ -644,6 +644,32 @@ public class ActiveMQServerControlImpl extends AbstractControl implements Active } @Override + public String getUptime() { + checkStarted(); + + clearIO(); + try { + return server.getUptime(); + } + finally { + blockOnIO(); + } + } + + @Override + public long getUptimeMillis() { + checkStarted(); + + clearIO(); + try { + return server.getUptimeMillis(); + } + finally { + blockOnIO(); + } + } + + @Override public String[] getAddressNames() { checkStarted(); @@ -692,6 +718,71 @@ public class ActiveMQServerControlImpl extends AbstractControl implements Active } @Override + public long getTotalConnectionCount() { + checkStarted(); + + clearIO(); + try { + return server.getTotalConnectionCount(); + } + finally { + blockOnIO(); + } + } + + @Override + public long getTotalMessageCount() { + checkStarted(); + + clearIO(); + try { + return server.getTotalMessageCount(); + } + finally { + blockOnIO(); + } + } + + @Override + public long getTotalMessagesAdded() { + checkStarted(); + + clearIO(); + try { + return server.getTotalMessagesAdded(); + } + finally { + blockOnIO(); + } + } + + @Override + public long getTotalMessagesAcknowledged() { + checkStarted(); + + clearIO(); + try { + return server.getTotalMessagesAcknowledged(); + } + finally { + blockOnIO(); + } + } + + @Override + public long getTotalConsumerCount() { + checkStarted(); + + clearIO(); + try { + return server.getTotalConsumerCount(); + } + finally { + blockOnIO(); + } + } + + @Override public void enableMessageCounters() { checkStarted(); http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java index 631a71a..061e5a6 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java @@ -40,6 +40,8 @@ public interface RemotingService { Set getConnections(); + long getTotalConnectionCount(); + ReusableLatch getConnectionCountLatch(); void addIncomingInterceptor(BaseInterceptor interceptor); http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java index 2ed6e3a..93fd4ae 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java @@ -35,6 +35,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import org.apache.activemq.artemis.api.core.ActiveMQBuffer; import org.apache.activemq.artemis.api.core.ActiveMQException; @@ -115,6 +116,8 @@ public class RemotingServiceImpl implements RemotingService, ServerConnectionLif private boolean paused = false; + private AtomicLong totalConnectionCount = new AtomicLong(0); + // Static -------------------------------------------------------- // Constructors -------------------------------------------------- @@ -445,6 +448,11 @@ public class RemotingServiceImpl implements RemotingService, ServerConnectionLif } @Override + public long getTotalConnectionCount() { + return totalConnectionCount.get(); + } + + @Override public synchronized ReusableLatch getConnectionCountLatch() { return connectionCountLatch; } @@ -471,6 +479,7 @@ public class RemotingServiceImpl implements RemotingService, ServerConnectionLif connections.put(connection.getID(), entry); connectionCountLatch.countUp(); + totalConnectionCount.incrementAndGet(); } @Override http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java index b47df20..2b0e322 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java @@ -153,6 +153,16 @@ public interface ActiveMQServer extends ActiveMQComponent { int getConnectionCount(); + long getTotalConnectionCount(); + + long getTotalMessageCount(); + + long getTotalMessagesAdded(); + + long getTotalMessagesAcknowledged(); + + long getTotalConsumerCount(); + PostOffice getPostOffice(); QueueFactory getQueueFactory(); @@ -172,6 +182,10 @@ public interface ActiveMQServer extends ActiveMQComponent { boolean isActive(); + String getUptime(); + + long getUptimeMillis(); + /** * This is the queue creator responsible for JMS Queue creations* * http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java index 96f661a..8914886 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java @@ -1244,6 +1244,63 @@ public class ActiveMQServerImpl implements ActiveMQServer { } @Override + public long getTotalConnectionCount() { + return remotingService.getTotalConnectionCount(); + } + + @Override + public long getTotalMessageCount() { + long total = 0; + + for (Binding binding : postOffice.getAllBindings().values()) { + if (binding.getType() == BindingType.LOCAL_QUEUE) { + total += ((LocalQueueBinding)binding).getQueue().getMessageCount(); + } + } + + return total; + } + + @Override + public long getTotalMessagesAdded() { + long total = 0; + + for (Binding binding : postOffice.getAllBindings().values()) { + if (binding.getType() == BindingType.LOCAL_QUEUE) { + total += ((LocalQueueBinding)binding).getQueue().getMessagesAdded(); + } + } + + return total; + } + + @Override + public long getTotalMessagesAcknowledged() { + long total = 0; + + for (Binding binding : postOffice.getAllBindings().values()) { + if (binding.getType() == BindingType.LOCAL_QUEUE) { + total += ((LocalQueueBinding)binding).getQueue().getMessagesAcknowledged(); + } + } + + return total; + } + + @Override + public long getTotalConsumerCount() { + long total = 0; + + for (Binding binding : postOffice.getAllBindings().values()) { + if (binding.getType() == BindingType.LOCAL_QUEUE) { + total += ((LocalQueueBinding)binding).getQueue().getConsumerCount(); + } + } + + return total; + } + + @Override public PostOffice getPostOffice() { return postOffice; } @@ -2195,6 +2252,7 @@ public class ActiveMQServerImpl implements ActiveMQServer { } } + @Override public String getUptime() { long delta = getUptimeMillis(); @@ -2205,6 +2263,7 @@ public class ActiveMQServerImpl implements ActiveMQServer { return TimeUtils.printDuration(delta); } + @Override public long getUptimeMillis() { if (startDate == null) { return 0; http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java ---------------------------------------------------------------------- diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java index 9c4bd2e..b66636a 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java @@ -880,6 +880,181 @@ public class ActiveMQServerControlTest extends ManagementTestBase { assertFalse(server.isStarted()); } + @Test + public void testTotalMessageCount() throws Exception { + String random1 = RandomUtil.randomString(); + String random2 = RandomUtil.randomString(); + + ActiveMQServerControl serverControl = createManagementControl(); + + ServerLocator locator = createInVMNonHALocator(); + ClientSessionFactory csf = createSessionFactory(locator); + ClientSession session = csf.createSession(); + + session.createQueue(random1, random1); + session.createQueue(random2, random2); + + ClientProducer producer1 = session.createProducer(random1); + ClientProducer producer2 = session.createProducer(random2); + ClientMessage message = session.createMessage(false); + producer1.send(message); + producer2.send(message); + + session.commit(); + + assertEquals(2, serverControl.getTotalMessageCount()); + + session.deleteQueue(random1); + session.deleteQueue(random2); + + session.close(); + + locator.close(); + } + + @Test + public void testTotalConnectionCount() throws Exception { + final int CONNECTION_COUNT = 100; + + ActiveMQServerControl serverControl = createManagementControl(); + + ServerLocator locator = createInVMNonHALocator(); + for (int i = 0; i < CONNECTION_COUNT; i++) { + createSessionFactory(locator).close(); + } + + assertEquals(CONNECTION_COUNT, serverControl.getTotalConnectionCount()); + assertEquals(0, serverControl.getConnectionCount()); + + locator.close(); + } + + @Test + public void testTotalMessagesAdded() throws Exception { + String random1 = RandomUtil.randomString(); + String random2 = RandomUtil.randomString(); + + ActiveMQServerControl serverControl = createManagementControl(); + + ServerLocator locator = createInVMNonHALocator(); + ClientSessionFactory csf = createSessionFactory(locator); + ClientSession session = csf.createSession(); + + session.createQueue(random1, random1); + session.createQueue(random2, random2); + + ClientProducer producer1 = session.createProducer(random1); + ClientProducer producer2 = session.createProducer(random2); + ClientMessage message = session.createMessage(false); + producer1.send(message); + producer2.send(message); + + session.commit(); + + ClientConsumer consumer1 = session.createConsumer(random1); + ClientConsumer consumer2 = session.createConsumer(random2); + + session.start(); + + assertNotNull(consumer1.receive().acknowledge()); + assertNotNull(consumer2.receive().acknowledge()); + + session.commit(); + + assertEquals(2, serverControl.getTotalMessagesAdded()); + assertEquals(0, serverControl.getTotalMessageCount()); + + consumer1.close(); + consumer2.close(); + + session.deleteQueue(random1); + session.deleteQueue(random2); + + session.close(); + + locator.close(); + } + + @Test + public void testTotalMessagesAcknowledged() throws Exception { + String random1 = RandomUtil.randomString(); + String random2 = RandomUtil.randomString(); + + ActiveMQServerControl serverControl = createManagementControl(); + + ServerLocator locator = createInVMNonHALocator(); + ClientSessionFactory csf = createSessionFactory(locator); + ClientSession session = csf.createSession(); + + session.createQueue(random1, random1); + session.createQueue(random2, random2); + + ClientProducer producer1 = session.createProducer(random1); + ClientProducer producer2 = session.createProducer(random2); + ClientMessage message = session.createMessage(false); + producer1.send(message); + producer2.send(message); + + session.commit(); + + ClientConsumer consumer1 = session.createConsumer(random1); + ClientConsumer consumer2 = session.createConsumer(random2); + + session.start(); + + assertNotNull(consumer1.receive().acknowledge()); + assertNotNull(consumer2.receive().acknowledge()); + + session.commit(); + + assertEquals(2, serverControl.getTotalMessagesAcknowledged()); + assertEquals(0, serverControl.getTotalMessageCount()); + + consumer1.close(); + consumer2.close(); + + session.deleteQueue(random1); + session.deleteQueue(random2); + + session.close(); + + locator.close(); + } + + @Test + public void testTotalConsumerCount() throws Exception { + String random1 = RandomUtil.randomString(); + String random2 = RandomUtil.randomString(); + + ActiveMQServerControl serverControl = createManagementControl(); + QueueControl queueControl1 = ManagementControlHelper.createQueueControl(SimpleString.toSimpleString(random1), SimpleString.toSimpleString(random1), mbeanServer); + QueueControl queueControl2 = ManagementControlHelper.createQueueControl(SimpleString.toSimpleString(random2), SimpleString.toSimpleString(random2), mbeanServer); + + ServerLocator locator = createInVMNonHALocator(); + ClientSessionFactory csf = createSessionFactory(locator); + ClientSession session = csf.createSession(); + + session.createQueue(random1, random1); + session.createQueue(random2, random2); + + ClientConsumer consumer1 = session.createConsumer(random1); + ClientConsumer consumer2 = session.createConsumer(random2); + + assertEquals(2, serverControl.getTotalConsumerCount()); + assertEquals(1, queueControl1.getConsumerCount()); + assertEquals(1, queueControl2.getConsumerCount()); + + consumer1.close(); + consumer2.close(); + + session.deleteQueue(random1); + session.deleteQueue(random2); + + session.close(); + + locator.close(); + } + protected void scaleDown(ScaleDownHandler handler) throws Exception { SimpleString address = new SimpleString("testQueue"); HashMap params = new HashMap<>(); http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/9d7a49b3/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java ---------------------------------------------------------------------- diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java index 9ed5433..7fb5a5b 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java @@ -179,6 +179,31 @@ public class ActiveMQServerControlUsingCoreTest extends ActiveMQServerControlTes } @Override + public long getTotalConnectionCount() { + return (Long) proxy.retrieveAttributeValue("totalConnectionCount", Long.class); + } + + @Override + public long getTotalMessageCount() { + return (Long) proxy.retrieveAttributeValue("totalMessageCount", Long.class); + } + + @Override + public long getTotalMessagesAdded() { + return (Long) proxy.retrieveAttributeValue("totalMessagesAdded", Long.class); + } + + @Override + public long getTotalMessagesAcknowledged() { + return (Long) proxy.retrieveAttributeValue("totalMessagesAcknowledged", Long.class); + } + + @Override + public long getTotalConsumerCount() { + return (Long) proxy.retrieveAttributeValue("totalConsumerCount", Long.class); + } + + @Override public long getConnectionTTLOverride() { return (Long) proxy.retrieveAttributeValue("connectionTTLOverride", Long.class); } @@ -204,6 +229,16 @@ public class ActiveMQServerControlUsingCoreTest extends ActiveMQServerControlTes } @Override + public String getUptime() { + return null; + } + + @Override + public long getUptimeMillis() { + return 0; + } + + @Override public int getIDCacheSize() { return (Integer) proxy.retrieveAttributeValue("IDCacheSize"); }