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