This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 09685c80a5 ARTEMIS-5320 expose session count metrics
09685c80a5 is described below

commit 09685c80a5c50eaed6d2e7d997d9093c58b94e90
Author: Justin Bertram <[email protected]>
AuthorDate: Fri Feb 21 14:33:56 2025 -0600

    ARTEMIS-5320 expose session count metrics
---
 .../apache/activemq/artemis/logs/AuditLogger.java  | 14 ++++++++-
 .../api/core/management/ActiveMQServerControl.java | 18 ++++++++++--
 .../management/impl/ActiveMQServerControlImpl.java | 30 ++++++++++++++++++++
 .../artemis/core/server/ActiveMQServer.java        |  4 +++
 .../core/server/impl/ActiveMQServerImpl.java       | 14 +++++++++
 .../management/impl/ManagementServiceImpl.java     |  2 ++
 .../core/server/metrics/BrokerMetricNames.java     |  2 ++
 .../management/ActiveMQServerControlTest.java      | 33 +++++++++++++++++++++-
 .../ActiveMQServerControlUsingCoreTest.java        | 10 +++++++
 .../integration/plugin/MetricsPluginTest.java      |  2 ++
 10 files changed, 125 insertions(+), 4 deletions(-)

diff --git 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
index a6daeb4da1..32b1600add 100644
--- 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
@@ -2839,7 +2839,6 @@ public interface AuditLogger {
    @LogMessage(id = 601794, value = "User {} is getting prefetchPageMessages 
on target resource: {}", level = LogMessage.Level.INFO)
    void getPrefetchPageMessages(String user, Object source);
 
-
    static void getPrefetchPageBytes(Object source) {
       BASE_LOGGER.getPrefetchPageBytes(getCaller(), source);
    }
@@ -2847,4 +2846,17 @@ public interface AuditLogger {
    @LogMessage(id = 601795, value = "User {} is getting prefetchPageBytes on 
target resource: {}", level = LogMessage.Level.INFO)
    void getPrefetchPageBytes(String user, Object source);
 
+   static void getSessionCount(Object source, Object... args) {
+      BASE_LOGGER.getSessionCount(getCaller(), source, parametersList(args));
+   }
+
+   @LogMessage(id = 601796, value = "User {} is getting session count on 
target resource: {} {}", level = LogMessage.Level.INFO)
+   void getSessionCount(String user, Object source, String args);
+
+   static void getTotalSessionCount(Object source) {
+      BASE_LOGGER.getTotalSessionCount(getCaller(), source);
+   }
+
+   @LogMessage(id = 601797, value = "User {} is getting total session count on 
target resource: {}", level = LogMessage.Level.INFO)
+   void getTotalSessionCount(String user, Object source);
 }
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 9f6387675f..3b41e6b2ed 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
@@ -27,7 +27,9 @@ import 
org.apache.activemq.artemis.api.core.ActiveMQAddressDoesNotExistException
  */
 public interface ActiveMQServerControl {
    String CONNECTION_COUNT_DESCRIPTION = "Number of clients connected to this 
server";
-   String TOTAL_CONNECTION_COUNT_DESCRIPTION = "Number of clients which have 
connected to this server since it was started";
+   String TOTAL_CONNECTION_COUNT_DESCRIPTION = "Total number of clients which 
have connected to this server since it was started";
+   String SESSION_COUNT_DESCRIPTION = "Number of sessions on this server";
+   String TOTAL_SESSION_COUNT_DESCRIPTION = "Total number of sessions created 
on this server since it was started";
    String ADDRESS_MEMORY_USAGE_DESCRIPTION = "Memory used by all the addresses 
on broker for in-memory messages";
    String ADDRESS_MEMORY_USAGE_PERCENTAGE_DESCRIPTION = "Memory used by all 
the addresses on broker as a percentage of the global-max-size";
    String DISK_STORE_USAGE_DESCRIPTION = "Fraction of total disk store used";
@@ -64,11 +66,23 @@ public interface ActiveMQServerControl {
    int getConnectionCount();
 
    /**
-    * {@return the number of clients which have connected to this server since 
it was started.}
+    * {@return the total number of clients which have connected to this server 
since it was started.}
     */
    @Attribute(desc = TOTAL_CONNECTION_COUNT_DESCRIPTION)
    long getTotalConnectionCount();
 
+   /**
+    * Returns the number of sessions on this server.
+    */
+   @Attribute(desc = SESSION_COUNT_DESCRIPTION)
+   int getSessionCount();
+
+   /**
+    * Returns the total number of sessions created on this server since it was 
started.
+    */
+   @Attribute(desc = TOTAL_SESSION_COUNT_DESCRIPTION)
+   long getTotalSessionCount();
+
    /**
     * {@return the number of messages in all queues currently on the server.}
     */
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 94e451f1a6..50532aecde 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
@@ -1731,6 +1731,36 @@ public class ActiveMQServerControlImpl extends 
AbstractControl implements Active
       }
    }
 
+   @Override
+   public int getSessionCount() {
+      if (AuditLogger.isBaseLoggingEnabled()) {
+         AuditLogger.getSessionCount(this.server);
+      }
+      checkStarted();
+
+      clearIO();
+      try {
+         return server.getSessionCount();
+      } finally {
+         blockOnIO();
+      }
+   }
+
+   @Override
+   public long getTotalSessionCount() {
+      if (AuditLogger.isBaseLoggingEnabled()) {
+         AuditLogger.getTotalSessionCount(this.server);
+      }
+      checkStarted();
+
+      clearIO();
+      try {
+         return server.getTotalSessionCount();
+      } finally {
+         blockOnIO();
+      }
+   }
+
    @Override
    public long getTotalMessageCount() {
       if (AuditLogger.isBaseLoggingEnabled()) {
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 8eda29c73c..dc6dd68332 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
@@ -420,6 +420,10 @@ public interface ActiveMQServer extends ServiceComponent {
 
    long getTotalConnectionCount();
 
+   int getSessionCount();
+
+   long getTotalSessionCount();
+
    long getTotalMessageCount();
 
    long getTotalMessagesAdded();
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 8803bb1253..aeb1a88981 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
@@ -52,6 +52,7 @@ import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
@@ -349,6 +350,8 @@ public class ActiveMQServerImpl implements ActiveMQServer {
 
    private final ConcurrentMap<String, ServerSession> sessions = new 
ConcurrentHashMap<>();
 
+   private AtomicLong totalSessionCount = new AtomicLong(0);
+
    private final Semaphore activationLock = new Semaphore(1);
    /**
     * This class here has the same principle of CountDownLatch but you can 
reuse the counters.
@@ -1866,6 +1869,7 @@ public class ActiveMQServerImpl implements ActiveMQServer 
{
       ServerSessionImpl session = new ServerSessionImpl(name, username, 
password, validatedUser, minLargeMessageSize, autoCommitSends, autoCommitAcks, 
preAcknowledge, configuration.isPersistDeliveryCountBeforeDelivery(), xa, 
connection, storageManager, postOffice, resourceManager, securityStore, 
managementService, this, configuration.getManagementAddress(), defaultAddress 
== null ? null : SimpleString.of(defaultAddress), callback, context, 
pagingManager, prefixes, securityDomain, isLegac [...]
 
       sessions.put(name, session);
+      totalSessionCount.incrementAndGet();
 
       if (hasBrokerSessionPlugins()) {
          callBrokerSessionPlugins(plugin -> 
plugin.afterCreateSession(session));
@@ -1942,6 +1946,16 @@ public class ActiveMQServerImpl implements 
ActiveMQServer {
       return remotingService.getTotalConnectionCount();
    }
 
+   @Override
+   public int getSessionCount() {
+      return sessions.size();
+   }
+
+   @Override
+   public long getTotalSessionCount() {
+      return totalSessionCount.get();
+   }
+
    @Override
    public long getTotalMessageCount() {
       long total = 0;
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index 7144e5eef5..f6e8f168f8 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -248,6 +248,8 @@ public class ManagementServiceImpl implements 
ManagementService {
          metricsManager.registerBrokerGauge(builder -> {
             builder.build(BrokerMetricNames.CONNECTION_COUNT, messagingServer, 
metrics -> (double) messagingServer.getConnectionCount(), 
ActiveMQServerControl.CONNECTION_COUNT_DESCRIPTION, Collections.emptyList());
             builder.build(BrokerMetricNames.TOTAL_CONNECTION_COUNT, 
messagingServer, metrics -> (double) messagingServer.getTotalConnectionCount(), 
ActiveMQServerControl.TOTAL_CONNECTION_COUNT_DESCRIPTION, 
Collections.emptyList());
+            builder.build(BrokerMetricNames.SESSION_COUNT, messagingServer, 
metrics -> (double) messagingServer.getSessionCount(), 
ActiveMQServerControl.SESSION_COUNT_DESCRIPTION, Collections.emptyList());
+            builder.build(BrokerMetricNames.TOTAL_SESSION_COUNT, 
messagingServer, metrics -> (double) messagingServer.getTotalSessionCount(), 
ActiveMQServerControl.TOTAL_SESSION_COUNT_DESCRIPTION, Collections.emptyList());
             builder.build(BrokerMetricNames.ADDRESS_MEMORY_USAGE, 
messagingServer, metrics -> (double) 
messagingServerControl.getAddressMemoryUsage(), 
ActiveMQServerControl.ADDRESS_MEMORY_USAGE_DESCRIPTION, 
Collections.emptyList());
             builder.build(BrokerMetricNames.ADDRESS_MEMORY_USAGE_PERCENTAGE, 
messagingServer, metrics -> (double) 
messagingServerControl.getAddressMemoryUsagePercentage(), 
ActiveMQServerControl.ADDRESS_MEMORY_USAGE_PERCENTAGE_DESCRIPTION, 
Collections.emptyList());
             builder.build(BrokerMetricNames.DISK_STORE_USAGE, messagingServer, 
metrics -> messagingServer.getDiskStoreUsage(), 
ActiveMQServerControl.DISK_STORE_USAGE_DESCRIPTION, Collections.emptyList());
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/BrokerMetricNames.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/BrokerMetricNames.java
index 930729f09a..dc31fce2c6 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/BrokerMetricNames.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/BrokerMetricNames.java
@@ -20,6 +20,8 @@ public class BrokerMetricNames {
 
    public static final String CONNECTION_COUNT = "connection.count";
    public static final String TOTAL_CONNECTION_COUNT = 
"total.connection.count";
+   public static final String SESSION_COUNT = "session.count";
+   public static final String TOTAL_SESSION_COUNT = "total.session.count";
    public static final String ADDRESS_MEMORY_USAGE = "address.memory.usage";
    public static final String ADDRESS_MEMORY_USAGE_PERCENTAGE = 
"address.memory.usage.percentage";
    public static final String DISK_STORE_USAGE = "disk.store.usage";
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 b4a6f9daab..cbca87d0be 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
@@ -2520,7 +2520,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
    }
 
    @TestTemplate
-   public void testTotalConnectionCount() throws Exception {
+   public void testConnectionCounts() throws Exception {
       final int CONNECTION_COUNT = 100;
 
       ActiveMQServerControl serverControl = createManagementControl();
@@ -2536,6 +2536,37 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       locator.close();
    }
 
+   @TestTemplate
+   public void testSessionCounts() throws Exception {
+      // don't test this with management messages as it completely throws off 
the session counts
+      assumeFalse(usingCore());
+      final int SESSION_COUNT = 100;
+
+      ActiveMQServerControl serverControl = createManagementControl();
+      ServerLocator locator = createInVMNonHALocator();
+      ClientSessionFactory csf = createSessionFactory(locator);
+      List<ClientSession> sessions = new ArrayList<>(SESSION_COUNT);
+
+      assertEquals(0, serverControl.getSessionCount());
+
+      for (int i = 1; i <= SESSION_COUNT; i++) {
+         sessions.add(csf.createSession());
+         assertEquals(i, serverControl.getSessionCount());
+      }
+
+      assertEquals(SESSION_COUNT, serverControl.getTotalSessionCount());
+
+      for (int i = 1; i <= SESSION_COUNT; i++) {
+         sessions.get(i - 1).close();
+         assertEquals(SESSION_COUNT - i, serverControl.getSessionCount());
+      }
+
+      assertEquals(SESSION_COUNT, serverControl.getTotalSessionCount());
+      assertEquals(0, serverControl.getSessionCount());
+
+      locator.close();
+   }
+
    @TestTemplate
    public void testTotalMessagesAdded() throws Exception {
       String random1 = RandomUtil.randomUUIDString();
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 fdc3c216cb..1260cd7bb0 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
@@ -401,6 +401,16 @@ public class ActiveMQServerControlUsingCoreTest extends 
ActiveMQServerControlTes
             return (Long) proxy.retrieveAttributeValue("totalConnectionCount", 
Long.class);
          }
 
+         @Override
+         public int getSessionCount() {
+            return (Integer) proxy.retrieveAttributeValue("sessionCount", 
Integer.class);
+         }
+
+         @Override
+         public long getTotalSessionCount() {
+            return (Long) proxy.retrieveAttributeValue("totalSessionCount", 
Long.class);
+         }
+
          @Override
          public long getTotalMessageCount() {
             return (Long) proxy.retrieveAttributeValue("totalMessageCount", 
Long.class);
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
index feac1ef201..795d272a99 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
@@ -140,6 +140,8 @@ public class MetricsPluginTest extends ActiveMQTestBase {
               new Metric("artemis.address.memory.usage.percentage", 0.0, 
Arrays.asList(Tag.of("broker", "localhost"))),
               new Metric("artemis.connection.count", 1.0, 
Arrays.asList(Tag.of("broker", "localhost"))),
               new Metric("artemis.total.connection.count", 1.0, 
Arrays.asList(Tag.of("broker", "localhost"))),
+              new Metric("artemis.session.count", 1.0, 
Arrays.asList(Tag.of("broker", "localhost"))),
+              new Metric("artemis.total.session.count", 1.0, 
Arrays.asList(Tag.of("broker", "localhost"))),
               new Metric("artemis.active", 1.0, Arrays.asList(Tag.of("broker", 
"localhost"))),
               new Metric("artemis.replica.sync", 0.0, 
Arrays.asList(Tag.of("broker", "localhost"))),
               new Metric("artemis.disk.store.usage", 0.0, 
Arrays.asList(Tag.of("broker", "localhost"))),


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to