You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2020/07/07 12:18:38 UTC
[activemq-artemis] branch master updated (74698f0 -> 00e226c)
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git.
from 74698f0 This closes #3213
new 26091f1 ARTEMIS-2825 wrong calc for DiskStoreUsagePercentage
new ac8ffed ARTEMIS-2827 add addressMemoryUsagePercentage as metric
new 73c4e39 NO-JIRA clarify diskStoreUsage description
new cb7cd72 ARTEMIS-2828 add addressSize metric
new fd207e7 ARTEMIS-2829 wrong return type for getDiskStoreUsage
new f5d5710 ARTEMIS-2834 leaking meters
new 00e226c This closes #3205
The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../artemis/cli/commands/check/NodeCheck.java | 2 +-
.../api/core/management/ActiveMQServerControl.java | 19 ++---
.../api/core/management/AddressControl.java | 7 +-
.../management/impl/ActiveMQServerControlImpl.java | 35 +--------
.../core/management/impl/AddressControlImpl.java | 5 +-
.../core/postoffice/impl/SimpleAddressManager.java | 14 +---
.../postoffice/impl/WildcardAddressManager.java | 1 -
.../artemis/core/server/ActiveMQServer.java | 2 +
.../core/server/impl/ActiveMQServerImpl.java | 35 ++-------
.../artemis/core/server/impl/AddressInfo.java | 19 -----
.../artemis/core/server/impl/QueueImpl.java | 46 +----------
.../core/server/management/ManagementService.java | 3 +
.../management/impl/ManagementServiceImpl.java | 76 ++++++++++++++++++
.../core/server/metrics/AddressMetricNames.java | 1 +
.../core/server/metrics/BrokerMetricNames.java | 1 +
.../core/server/metrics/MetricsManager.java | 38 +++++----
.../server/group/impl/ClusteredResetMockTest.java | 6 ++
.../failover/SharedStoreMetricsLeakTest.java | 89 ++++++++++++++++++++++
.../ActiveMQServerControlUsingCoreTest.java | 14 +---
.../management/AddressControlUsingCoreTest.java | 2 +-
.../integration/plugin/MetricsPluginTest.java | 11 ++-
21 files changed, 233 insertions(+), 193 deletions(-)
create mode 100755 tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/SharedStoreMetricsLeakTest.java
[activemq-artemis] 03/07: NO-JIRA clarify diskStoreUsage description
Posted by cl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit 73c4e399d9c2e8401f2034ffb0c5e42b4a70b053
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Fri Jun 26 13:36:14 2020 -0500
NO-JIRA clarify diskStoreUsage description
---
.../activemq/artemis/api/core/management/ActiveMQServerControl.java | 2 +-
.../activemq/artemis/tests/integration/plugin/MetricsPluginTest.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
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 c795835..90cd759 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
@@ -29,7 +29,7 @@ public interface ActiveMQServerControl {
String TOTAL_CONNECTION_COUNT_DESCRIPTION = "Number of clients which have connected to 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 = "Memory used by the disk store";
+ String DISK_STORE_USAGE_DESCRIPTION = "Percentage of total disk store used";
/**
* Returns this server's version.
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 6001451..4801dcb 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
@@ -149,7 +149,7 @@ public class MetricsPluginTest extends ActiveMQTestBase {
new Metric("artemis.delivering.durable.persistent.size", "persistent size of durable messages that this queue is currently delivering to its consumers", 0.0),
new Metric("artemis.delivering.message.count", "number of messages that this queue is currently delivering to its consumers", 0.0),
new Metric("artemis.delivering.persistent_size", "persistent size of messages that this queue is currently delivering to its consumers", 0.0),
- new Metric("artemis.disk.store.usage", "Memory used by the disk store", 0.0),
+ new Metric("artemis.disk.store.usage", "Percentage of total disk store used", 0.0),
new Metric("artemis.durable.message.count", "number of durable messages currently in this queue (includes scheduled, paged, and in-delivery messages)", 0.0),
new Metric("artemis.durable.persistent.size", "persistent size of durable messages currently in this queue (includes scheduled, paged, and in-delivery messages)", 0.0),
new Metric("artemis.message.count", "number of messages currently in this queue (includes scheduled, paged, and in-delivery messages)", 0.0),
[activemq-artemis] 01/07: ARTEMIS-2825 wrong calc for
DiskStoreUsagePercentage
Posted by cl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit 26091f1907dce5a1a9dd9f0d6a5ca976166a5c41
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Fri Jun 26 13:17:38 2020 -0500
ARTEMIS-2825 wrong calc for DiskStoreUsagePercentage
The calculation used by
ActiveMQServerControlImpl.getDiskStoreUsagePercentage() is incorrect. It
uses disk space info with global-max-size which is for address memory.
Also, the existing getDiskStoreUsage() method *already* returns a
percentage of total disk store usage so this method seems redundant.
---
.../artemis/cli/commands/check/NodeCheck.java | 2 +-
.../api/core/management/ActiveMQServerControl.java | 6 ------
.../management/impl/ActiveMQServerControlImpl.java | 22 ----------------------
.../ActiveMQServerControlUsingCoreTest.java | 10 ----------
4 files changed, 1 insertion(+), 39 deletions(-)
diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/check/NodeCheck.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/check/NodeCheck.java
index c201942..601d254 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/check/NodeCheck.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/check/NodeCheck.java
@@ -191,7 +191,7 @@ public class NodeCheck extends CheckAbstract {
thresholdValue = diskUsage;
}
- checkNodeUsage(context, "getDiskStoreUsagePercentage", thresholdValue);
+ checkNodeUsage(context, "getDiskStoreUsage", thresholdValue);
}
private void checkNodeMemoryUsage(final CheckContext context) throws Exception {
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 292d112..b8df6d7 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
@@ -455,12 +455,6 @@ public interface ActiveMQServerControl {
@Attribute(desc = "Memory used by all the addresses on broker as a percentage of global maximum limit")
int getAddressMemoryUsagePercentage();
- /**
- * Returns the storage used by disk store
- */
- @Attribute(desc = "Memory used by the disk store")
- int getDiskStoreUsagePercentage();
-
// Operations ----------------------------------------------------
@Operation(desc = "Isolate the broker", impact = MBeanOperationInfo.ACTION)
boolean freezeReplication();
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 0cd94fd..30aff02 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
@@ -134,8 +134,6 @@ import org.apache.activemq.artemis.utils.SecurityFormatter;
import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.jboss.logging.Logger;
-import static org.apache.activemq.artemis.core.server.files.FileStoreMonitor.calculateUsage;
-
public class ActiveMQServerControlImpl extends AbstractControl implements ActiveMQServerControl, NotificationEmitter, org.apache.activemq.artemis.core.server.management.NotificationListener {
// Constants -----------------------------------------------------
private static final Logger logger = Logger.getLogger(ActiveMQServerControlImpl.class);
@@ -754,26 +752,6 @@ public class ActiveMQServerControlImpl extends AbstractControl implements Active
}
@Override
- public int getDiskStoreUsagePercentage() {
- if (AuditLogger.isEnabled()) {
- AuditLogger.getDiskStoreUsagePercentage(this.server);
- }
- long globalMaxSize = getGlobalMaxSize();
- // no max size set implies 0% used
- if (globalMaxSize <= 0) {
- return 0;
- }
-
- long diskUsed = getDiskStoreUsage();
- if (diskUsed <= 0) {
- return 0;
- }
-
- double result = 100 * calculateUsage(diskUsed, globalMaxSize);
- return (int) result;
- }
-
- @Override
public boolean freezeReplication() {
if (AuditLogger.isEnabled()) {
AuditLogger.freezeReplication(this.server);
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 9e3da08..2c32c25 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
@@ -774,16 +774,6 @@ public class ActiveMQServerControlUsingCoreTest extends ActiveMQServerControlTes
}
@Override
- public int getDiskStoreUsagePercentage() {
- try {
- return (Integer) proxy.invokeOperation(Integer.TYPE, "getDiskUseStorePercentage");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return 0;
- }
-
- @Override
public boolean freezeReplication() {
return false;
[activemq-artemis] 07/07: This closes #3205
Posted by cl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit 00e226c8451d022300296641821cf568007d5c57
Merge: 74698f0 f5d5710
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Tue Jul 7 08:18:28 2020 -0400
This closes #3205
.../artemis/cli/commands/check/NodeCheck.java | 2 +-
.../api/core/management/ActiveMQServerControl.java | 19 ++---
.../api/core/management/AddressControl.java | 7 +-
.../management/impl/ActiveMQServerControlImpl.java | 35 +--------
.../core/management/impl/AddressControlImpl.java | 5 +-
.../core/postoffice/impl/SimpleAddressManager.java | 14 +---
.../postoffice/impl/WildcardAddressManager.java | 1 -
.../artemis/core/server/ActiveMQServer.java | 2 +
.../core/server/impl/ActiveMQServerImpl.java | 35 ++-------
.../artemis/core/server/impl/AddressInfo.java | 19 -----
.../artemis/core/server/impl/QueueImpl.java | 46 +----------
.../core/server/management/ManagementService.java | 3 +
.../management/impl/ManagementServiceImpl.java | 76 ++++++++++++++++++
.../core/server/metrics/AddressMetricNames.java | 1 +
.../core/server/metrics/BrokerMetricNames.java | 1 +
.../core/server/metrics/MetricsManager.java | 38 +++++----
.../server/group/impl/ClusteredResetMockTest.java | 6 ++
.../failover/SharedStoreMetricsLeakTest.java | 89 ++++++++++++++++++++++
.../ActiveMQServerControlUsingCoreTest.java | 14 +---
.../management/AddressControlUsingCoreTest.java | 2 +-
.../integration/plugin/MetricsPluginTest.java | 11 ++-
21 files changed, 233 insertions(+), 193 deletions(-)
[activemq-artemis] 04/07: ARTEMIS-2828 add addressSize metric
Posted by cl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit cb7cd729d7ef4a0bebca8d443300ac38d7a9f873
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Fri Jun 26 14:40:59 2020 -0500
ARTEMIS-2828 add addressSize metric
Adding this metric required moving the meter registration code from the
AddressInfo class to the ManagementService in order to get clean access
to both the AddressInfo and AddressControl classes.
---
.../api/core/management/AddressControl.java | 7 +++---
.../core/management/impl/AddressControlImpl.java | 5 ++++-
.../core/postoffice/impl/SimpleAddressManager.java | 14 ++----------
.../postoffice/impl/WildcardAddressManager.java | 1 -
.../artemis/core/server/impl/AddressInfo.java | 19 ----------------
.../core/server/management/ManagementService.java | 3 +++
.../management/impl/ManagementServiceImpl.java | 25 ++++++++++++++++++++++
.../core/server/metrics/AddressMetricNames.java | 1 +
.../server/group/impl/ClusteredResetMockTest.java | 6 ++++++
.../management/AddressControlUsingCoreTest.java | 2 +-
.../integration/plugin/MetricsPluginTest.java | 7 +++---
11 files changed, 50 insertions(+), 40 deletions(-)
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java
index 23817ed..719a877 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java
@@ -25,6 +25,7 @@ import java.util.Map;
public interface AddressControl {
String ROUTED_MESSAGE_COUNT_DESCRIPTION = "number of messages routed to one or more bindings";
String UNROUTED_MESSAGE_COUNT_DESCRIPTION = "number of messages not routed to any bindings";
+ String ADDRESS_SIZE_DESCRIPTION = "the number of estimated bytes being used by all the queue(s) bound to this address; used to control paging and blocking";
/**
* Returns the managed address.
@@ -60,10 +61,10 @@ public interface AddressControl {
String getRolesAsJSON() throws Exception;
/**
- * Returns the number of estimated bytes being used by the queue(s), used to control paging and blocking.
+ * Returns the number of estimated bytes being used by all the queue(s) bound to this address; used to control paging and blocking.
*/
- @Attribute(desc = "the number of estimated bytes being used by the queue(s), used to control paging and blocking")
- long getAddressSize() throws Exception;
+ @Attribute(desc = ADDRESS_SIZE_DESCRIPTION)
+ long getAddressSize();
/**
* Returns the sum of messages on queue(s), including messages in delivery.
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
index 7760849..9da31ab 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
@@ -263,7 +263,7 @@ public class AddressControlImpl extends AbstractControl implements AddressContro
}
@Override
- public long getAddressSize() throws Exception {
+ public long getAddressSize() {
if (AuditLogger.isEnabled()) {
AuditLogger.getAddressSize(this.addressInfo);
}
@@ -274,6 +274,9 @@ public class AddressControlImpl extends AbstractControl implements AddressContro
return 0;
}
return pagingStore.getAddressSize();
+ } catch (Exception e) {
+ ActiveMQServerLogger.LOGGER.debug("Failed to get address size", e);
+ return -1;
} finally {
blockOnIO();
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java
index 2510a91..35d3e69 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java
@@ -259,11 +259,7 @@ public class SimpleAddressManager implements AddressManager {
@Override
public boolean reloadAddressInfo(AddressInfo addressInfo) {
- boolean added = addressInfoMap.putIfAbsent(addressInfo.getName(), addressInfo) == null;
- if (added) {
- addressInfo.registerMeters(metricsManager);
- }
- return added;
+ return addressInfoMap.putIfAbsent(addressInfo.getName(), addressInfo) == null;
}
@Override
@@ -355,13 +351,7 @@ public class SimpleAddressManager implements AddressManager {
@Override
public AddressInfo removeAddressInfo(SimpleString address) throws Exception {
- final AddressInfo removed = addressInfoMap.remove(CompositeAddress.extractAddressName(address));
-
- if (removed != null) {
- removed.unregisterMeters(metricsManager);
- }
-
- return removed;
+ return addressInfoMap.remove(CompositeAddress.extractAddressName(address));
}
@Override
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/WildcardAddressManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/WildcardAddressManager.java
index c688472..6dc1737 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/WildcardAddressManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/WildcardAddressManager.java
@@ -160,7 +160,6 @@ public class WildcardAddressManager extends SimpleAddressManager {
//Remove from mappings so removeAndUpdateAddressMap processes and cleanup
mappings.remove(address);
removeAndUpdateAddressMap(new AddressImpl(removed.getName(), wildcardConfiguration));
- removed.unregisterMeters(metricsManager);
}
return removed;
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java
index b3ec9cb..8f1a364 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java
@@ -22,8 +22,6 @@ import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.api.core.management.AddressControl;
-import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.persistence.AddressQueueStatus;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.postoffice.Binding;
@@ -31,8 +29,6 @@ import org.apache.activemq.artemis.core.postoffice.Bindings;
import org.apache.activemq.artemis.core.postoffice.PostOffice;
import org.apache.activemq.artemis.core.postoffice.QueueBinding;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.core.server.metrics.AddressMetricNames;
-import org.apache.activemq.artemis.core.server.metrics.MetricsManager;
import org.apache.activemq.artemis.core.settings.HierarchicalRepositoryChangeListener;
import org.apache.activemq.artemis.utils.CompositeAddress;
import org.apache.activemq.artemis.utils.PrefixUtil;
@@ -340,19 +336,4 @@ public class AddressInfo {
this.repositoryChangeListener = repositoryChangeListener;
return this;
}
-
- public void registerMeters(MetricsManager metricsManager) {
- if (metricsManager != null) {
- metricsManager.registerAddressGauge(name.toString(), builder -> {
- builder.register(AddressMetricNames.ROUTED_MESSAGE_COUNT, this, metrics -> Double.valueOf(getRoutedMessageCount()), AddressControl.ROUTED_MESSAGE_COUNT_DESCRIPTION);
- builder.register(AddressMetricNames.UNROUTED_MESSAGE_COUNT, this, metrics -> Double.valueOf(getUnRoutedMessageCount()), AddressControl.UNROUTED_MESSAGE_COUNT_DESCRIPTION);
- });
- }
- }
-
- public void unregisterMeters(MetricsManager metricsManager) {
- if (metricsManager != null) {
- metricsManager.remove(ResourceNames.ADDRESS + name);
- }
- }
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
index 41eb5c8..716a9fb 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
@@ -26,6 +26,7 @@ import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
+import org.apache.activemq.artemis.api.core.management.AddressControl;
import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
@@ -93,6 +94,8 @@ public interface ManagementService extends NotificationService, ActiveMQComponen
void registerAddress(AddressInfo addressInfo) throws Exception;
+ void registerAddressMeters(AddressInfo addressInfo, AddressControl addressControl) throws Exception;
+
void unregisterAddress(SimpleString address) throws Exception;
void registerQueue(Queue queue, SimpleString address, StorageManager storageManager) throws Exception;
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 c6b1f67..207a2da 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
@@ -47,6 +47,7 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.UDPBroadcastEndpointFactory;
import org.apache.activemq.artemis.api.core.management.AcceptorControl;
+import org.apache.activemq.artemis.api.core.management.AddressControl;
import org.apache.activemq.artemis.api.core.management.BaseBroadcastGroupControl;
import org.apache.activemq.artemis.api.core.management.BridgeControl;
import org.apache.activemq.artemis.api.core.management.ClusterConnectionControl;
@@ -93,6 +94,8 @@ import org.apache.activemq.artemis.core.server.impl.CleaningActivateCallback;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.core.server.management.NotificationListener;
+import org.apache.activemq.artemis.core.server.metrics.AddressMetricNames;
+import org.apache.activemq.artemis.core.server.metrics.MetricsManager;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.transaction.ResourceManager;
@@ -232,17 +235,32 @@ public class ManagementServiceImpl implements ManagementService {
registerInRegistry(ResourceNames.ADDRESS + addressInfo.getName(), addressControl);
+ registerAddressMeters(addressInfo, addressControl);
+
if (logger.isDebugEnabled()) {
logger.debug("registered address " + objectName);
}
}
@Override
+ public void registerAddressMeters(AddressInfo addressInfo, AddressControl addressControl) {
+ MetricsManager metricsManager = messagingServer.getMetricsManager();
+ if (metricsManager != null) {
+ metricsManager.registerAddressGauge(addressInfo.getName().toString(), builder -> {
+ builder.register(AddressMetricNames.ROUTED_MESSAGE_COUNT, this, metrics -> Double.valueOf(addressInfo.getRoutedMessageCount()), AddressControl.ROUTED_MESSAGE_COUNT_DESCRIPTION);
+ builder.register(AddressMetricNames.UNROUTED_MESSAGE_COUNT, this, metrics -> Double.valueOf(addressInfo.getUnRoutedMessageCount()), AddressControl.UNROUTED_MESSAGE_COUNT_DESCRIPTION);
+ builder.register(AddressMetricNames.ADDRESS_SIZE, this, metrics -> Double.valueOf(addressControl.getAddressSize()), AddressControl.ADDRESS_SIZE_DESCRIPTION);
+ });
+ }
+ }
+
+ @Override
public synchronized void unregisterAddress(final SimpleString address) throws Exception {
ObjectName objectName = objectNameBuilder.getAddressObjectName(address);
unregisterFromJMX(objectName);
unregisterFromRegistry(ResourceNames.ADDRESS + address);
+ unregisterAddressMeters(address.toString());
}
public synchronized void registerQueue(final Queue queue,
@@ -542,6 +560,13 @@ public class ManagementServiceImpl implements ManagementService {
}
}
+ public void unregisterAddressMeters(String address) {
+ MetricsManager metricsManager = messagingServer.getMetricsManager();
+ if (metricsManager != null) {
+ metricsManager.remove(ResourceNames.ADDRESS + address);
+ }
+ }
+
@Override
public void addNotificationListener(final NotificationListener listener) {
listeners.add(listener);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/AddressMetricNames.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/AddressMetricNames.java
index 902c6a0..64522c4 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/AddressMetricNames.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/AddressMetricNames.java
@@ -21,5 +21,6 @@ public class AddressMetricNames {
public static final String ROUTED_MESSAGE_COUNT = "routed.message.count";
public static final String UNROUTED_MESSAGE_COUNT = "unrouted.message.count";
+ public static final String ADDRESS_SIZE = "address.size";
}
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
index d464c5e..2d2509e 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
@@ -28,6 +28,7 @@ import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
+import org.apache.activemq.artemis.api.core.management.AddressControl;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
@@ -252,6 +253,11 @@ public class ClusteredResetMockTest extends ActiveMQTestBase {
}
@Override
+ public void registerAddressMeters(AddressInfo addressInfo, AddressControl addressControl) throws Exception {
+
+ }
+
+ @Override
public void unregisterAddress(SimpleString address) throws Exception {
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java
index faf41aa..25f3f31 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java
@@ -64,7 +64,7 @@ public class AddressControlUsingCoreTest extends AddressControlTest {
}
@Override
- public long getAddressSize() throws Exception {
+ public long getAddressSize() {
return (long) proxy.retrieveAttributeValue("addressSize");
}
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 4801dcb..5d30b00 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
@@ -40,12 +40,11 @@ import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.config.MetricsConfiguration;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.metrics.plugins.SimpleMetricsPlugin;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
-import org.apache.activemq.artemis.tests.util.Wait;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.activemq.artemis.tests.util.Wait;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -166,7 +165,9 @@ public class MetricsPluginTest extends ActiveMQTestBase {
new Metric("artemis.scheduled.persistent.size", "persistent size of scheduled messages in this queue", 0.0),
new Metric("artemis.total.connection.count", "Number of clients which have connected to this server since it was started", 1.0),
new Metric("artemis.unrouted.message.count", "number of messages not routed to any bindings", 0.0),
- new Metric("artemis.unrouted.message.count", "number of messages not routed to any bindings", 2.0)
+ new Metric("artemis.unrouted.message.count", "number of messages not routed to any bindings", 2.0),
+ new Metric("artemis.address.size", "the number of estimated bytes being used by all the queue(s) bound to this address; used to control paging and blocking", 0.0),
+ new Metric("artemis.address.size", "the number of estimated bytes being used by all the queue(s) bound to this address; used to control paging and blocking", 0.0)
));
}
[activemq-artemis] 02/07: ARTEMIS-2827 add
addressMemoryUsagePercentage as metric
Posted by cl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit ac8ffedf668f2733dbfb4eb1305a50bbd263e5d3
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Fri Jun 26 13:35:04 2020 -0500
ARTEMIS-2827 add addressMemoryUsagePercentage as metric
---
.../artemis/api/core/management/ActiveMQServerControl.java | 7 ++++---
.../activemq/artemis/core/server/impl/ActiveMQServerImpl.java | 3 ++-
.../activemq/artemis/core/server/metrics/BrokerMetricNames.java | 1 +
.../artemis/tests/integration/plugin/MetricsPluginTest.java | 4 +++-
4 files changed, 10 insertions(+), 5 deletions(-)
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 b8df6d7..c795835 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,8 @@ 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 ADDRESS_MEMORY_USAGE_DESCRIPTION = "Bytes used by all the addresses on broker for in-memory messages";
+ 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 = "Memory used by the disk store";
/**
@@ -450,9 +451,9 @@ public interface ActiveMQServerControl {
long getDiskStoreUsage();
/**
- * Returns the memory used by all the addresses on broker as a percentage of global maximum limit
+ * Returns the memory used by all the addresses on broker as a percentage of the global-max-size
*/
- @Attribute(desc = "Memory used by all the addresses on broker as a percentage of global maximum limit")
+ @Attribute(desc = ADDRESS_MEMORY_USAGE_PERCENTAGE_DESCRIPTION)
int getAddressMemoryUsagePercentage();
// Operations ----------------------------------------------------
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 722e74f..6d78f16 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
@@ -3084,7 +3084,8 @@ public class ActiveMQServerImpl implements ActiveMQServer {
metricsManager.registerBrokerGauge(builder -> {
builder.register(BrokerMetricNames.CONNECTION_COUNT, this, metrics -> Double.valueOf(getConnectionCount()), ActiveMQServerControl.CONNECTION_COUNT_DESCRIPTION);
builder.register(BrokerMetricNames.TOTAL_CONNECTION_COUNT, this, metrics -> Double.valueOf(getTotalConnectionCount()), ActiveMQServerControl.TOTAL_CONNECTION_COUNT_DESCRIPTION);
- builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE, this, metrics -> Double.valueOf(getPagingManager().getGlobalSize()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_DESCRIPTION);
+ builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_DESCRIPTION);
+ builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE_PERCENTAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsagePercentage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_PERCENTAGE_DESCRIPTION);
builder.register(BrokerMetricNames.DISK_STORE_USAGE, this, metrics -> Double.valueOf(calculateDiskStoreUsage()), ActiveMQServerControl.DISK_STORE_USAGE_DESCRIPTION);
});
}
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 47ef5cf..a3c4904 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
@@ -22,5 +22,6 @@ 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 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/plugin/MetricsPluginTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
index e661754..6001451 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
@@ -40,6 +40,7 @@ import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.config.MetricsConfiguration;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.metrics.plugins.SimpleMetricsPlugin;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
@@ -140,7 +141,8 @@ public class MetricsPluginTest extends ActiveMQTestBase {
assertThat(artemisMetrics, containsInAnyOrder(
// artemis.(un)routed.message.count is present twice, because of activemq.notifications address
- new Metric("artemis.address.memory.usage", "Bytes used by all the addresses on broker for in-memory messages", 0.0),
+ new Metric("artemis.address.memory.usage", "Memory used by all the addresses on broker for in-memory messages", 0.0),
+ new Metric("artemis.address.memory.usage.percentage", "Memory used by all the addresses on broker as a percentage of the global-max-size", 0.0),
new Metric("artemis.connection.count", "Number of clients connected to this server", 1.0),
new Metric("artemis.consumer.count", "number of consumers consuming messages from this queue", 0.0),
new Metric("artemis.delivering.durable.message.count", "number of durable messages that this queue is currently delivering to its consumers", 0.0),
[activemq-artemis] 05/07: ARTEMIS-2829 wrong return type for
getDiskStoreUsage
Posted by cl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit fd207e75b0bb94005d953bfc780e7b8ee7c166c8
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Mon Jun 29 09:12:09 2020 -0500
ARTEMIS-2829 wrong return type for getDiskStoreUsage
Since getDiskStoreUsage on the ActiveMQServerControl is converting a
double to a long the value is always 0 in the management API. It should
return a double instead.
---
.../artemis/api/core/management/ActiveMQServerControl.java | 4 ++--
.../core/management/impl/ActiveMQServerControlImpl.java | 13 ++-----------
.../apache/activemq/artemis/core/server/ActiveMQServer.java | 2 ++
.../artemis/core/server/impl/ActiveMQServerImpl.java | 13 ++++++++-----
.../management/ActiveMQServerControlUsingCoreTest.java | 4 ++--
5 files changed, 16 insertions(+), 20 deletions(-)
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 90cd759..c1f6e1d 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
@@ -445,10 +445,10 @@ public interface ActiveMQServerControl {
long getAddressMemoryUsage();
/**
- * Returns the bytes used by the disk store
+ * Returns the percentage of total disk store use
*/
@Attribute(desc = DISK_STORE_USAGE_DESCRIPTION)
- long getDiskStoreUsage();
+ double getDiskStoreUsage();
/**
* Returns the memory used by all the addresses on broker as a percentage of the global-max-size
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 30aff02..4b75a72 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
@@ -109,7 +109,6 @@ import org.apache.activemq.artemis.core.server.cluster.ha.HAPolicy;
import org.apache.activemq.artemis.core.server.cluster.ha.LiveOnlyPolicy;
import org.apache.activemq.artemis.core.server.cluster.ha.ScaleDownPolicy;
import org.apache.activemq.artemis.core.server.cluster.ha.SharedStoreSlavePolicy;
-import org.apache.activemq.artemis.core.server.files.FileStoreMonitor;
import org.apache.activemq.artemis.core.server.group.GroupingHandler;
import org.apache.activemq.artemis.core.server.impl.Activation;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
@@ -711,22 +710,14 @@ public class ActiveMQServerControlImpl extends AbstractControl implements Active
}
@Override
- public long getDiskStoreUsage() {
+ public double getDiskStoreUsage() {
if (AuditLogger.isEnabled()) {
AuditLogger.getDiskStoreUsage(this.server);
}
checkStarted();
clearIO();
try {
- //this should not happen but if it does, return -1 to highlight it is not working
- if (server.getPagingManager() == null) {
- return -1L;
- }
-
- long usableSpace = server.getPagingManager().getDiskUsableSpace();
- long totalSpace = server.getPagingManager().getDiskTotalSpace();
-
- return (long) FileStoreMonitor.calculateUsage(usableSpace, totalSpace);
+ return server.getDiskStoreUsage();
} finally {
blockOnIO();
}
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 3bbc721..d3b8ea5 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
@@ -889,4 +889,6 @@ public interface ActiveMQServer extends ServiceComponent {
void removeAddressInfo(SimpleString address, SecurityAuth auth, boolean force) throws Exception;
String getInternalNamingPrefix();
+
+ double getDiskStoreUsage();
}
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 6d78f16..41edad9 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
@@ -3086,16 +3086,19 @@ public class ActiveMQServerImpl implements ActiveMQServer {
builder.register(BrokerMetricNames.TOTAL_CONNECTION_COUNT, this, metrics -> Double.valueOf(getTotalConnectionCount()), ActiveMQServerControl.TOTAL_CONNECTION_COUNT_DESCRIPTION);
builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_DESCRIPTION);
builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE_PERCENTAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsagePercentage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_PERCENTAGE_DESCRIPTION);
- builder.register(BrokerMetricNames.DISK_STORE_USAGE, this, metrics -> Double.valueOf(calculateDiskStoreUsage()), ActiveMQServerControl.DISK_STORE_USAGE_DESCRIPTION);
+ builder.register(BrokerMetricNames.DISK_STORE_USAGE, this, metrics -> Double.valueOf(getDiskStoreUsage()), ActiveMQServerControl.DISK_STORE_USAGE_DESCRIPTION);
});
}
}
- private double calculateDiskStoreUsage() {
- long usableSpace = getPagingManager().getDiskUsableSpace();
- long totalSpace = getPagingManager().getDiskTotalSpace();
+ @Override
+ public double getDiskStoreUsage() {
+ //this should not happen but if it does, return -1 to highlight it is not working
+ if (getPagingManager() == null) {
+ return -1L;
+ }
- return FileStoreMonitor.calculateUsage(usableSpace, totalSpace);
+ return FileStoreMonitor.calculateUsage(getPagingManager().getDiskUsableSpace(), getPagingManager().getDiskTotalSpace());
}
private void unregisterMeters() {
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 2c32c25..4b8138b 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
@@ -764,9 +764,9 @@ public class ActiveMQServerControlUsingCoreTest extends ActiveMQServerControlTes
}
@Override
- public long getDiskStoreUsage() {
+ public double getDiskStoreUsage() {
try {
- return (Long) proxy.invokeOperation("getDiskStoreUsage");
+ return (Double) proxy.invokeOperation("getDiskStoreUsage");
} catch (Exception e) {
e.printStackTrace();
}
[activemq-artemis] 06/07: ARTEMIS-2834 leaking meters
Posted by cl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit f5d571013333d92f657f620858f827a7402b25eb
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Wed Jul 1 13:19:03 2020 -0500
ARTEMIS-2834 leaking meters
Move all of the meter registration code into the ManagementServer
implementation to provide better life-cycle management.
---
.../core/server/impl/ActiveMQServerImpl.java | 27 +------
.../artemis/core/server/impl/QueueImpl.java | 46 +----------
.../management/impl/ManagementServiceImpl.java | 67 ++++++++++++++--
.../core/server/metrics/MetricsManager.java | 38 +++++----
.../failover/SharedStoreMetricsLeakTest.java | 89 ++++++++++++++++++++++
5 files changed, 167 insertions(+), 100 deletions(-)
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 41edad9..fe25fe1 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
@@ -60,7 +60,6 @@ import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.QueueConfiguration;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
@@ -154,9 +153,7 @@ import org.apache.activemq.artemis.core.server.group.impl.RemoteGroupingHandler;
import org.apache.activemq.artemis.core.server.impl.jdbc.JdbcNodeManager;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.server.management.impl.ManagementServiceImpl;
-import org.apache.activemq.artemis.core.server.metrics.BrokerMetricNames;
import org.apache.activemq.artemis.core.server.metrics.MetricsManager;
-import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerFederationPlugin;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQPluginRunnable;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerAddressPlugin;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerBasePlugin;
@@ -165,6 +162,7 @@ import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerBridgePlugin
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerConnectionPlugin;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerConsumerPlugin;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerCriticalPlugin;
+import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerFederationPlugin;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerMessagePlugin;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerQueuePlugin;
import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerSessionPlugin;
@@ -1173,7 +1171,6 @@ public class ActiveMQServerImpl implements ActiveMQServer {
}
stopComponent(managementService);
- unregisterMeters();
stopComponent(resourceManager);
stopComponent(postOffice);
@@ -2893,8 +2890,6 @@ public class ActiveMQServerImpl implements ActiveMQServer {
metricsManager = new MetricsManager(configuration.getName(), configuration.getMetricsConfiguration(), addressSettingsRepository);
}
- registerMeters();
-
postOffice = new PostOfficeImpl(this, storageManager, pagingManager, queueFactory, managementService, configuration.getMessageExpiryScanPeriod(), configuration.getAddressQueueScanPeriod(), configuration.getWildcardConfiguration(), configuration.getIDCacheSize(), configuration.isPersistIDCache(), addressSettingsRepository);
// This can't be created until node id is set
@@ -3078,19 +3073,6 @@ public class ActiveMQServerImpl implements ActiveMQServer {
callActivationCompleteCallbacks();
}
- private void registerMeters() {
- MetricsManager metricsManager = this.metricsManager; // volatile load
- if (metricsManager != null) {
- metricsManager.registerBrokerGauge(builder -> {
- builder.register(BrokerMetricNames.CONNECTION_COUNT, this, metrics -> Double.valueOf(getConnectionCount()), ActiveMQServerControl.CONNECTION_COUNT_DESCRIPTION);
- builder.register(BrokerMetricNames.TOTAL_CONNECTION_COUNT, this, metrics -> Double.valueOf(getTotalConnectionCount()), ActiveMQServerControl.TOTAL_CONNECTION_COUNT_DESCRIPTION);
- builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_DESCRIPTION);
- builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE_PERCENTAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsagePercentage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_PERCENTAGE_DESCRIPTION);
- builder.register(BrokerMetricNames.DISK_STORE_USAGE, this, metrics -> Double.valueOf(getDiskStoreUsage()), ActiveMQServerControl.DISK_STORE_USAGE_DESCRIPTION);
- });
- }
- }
-
@Override
public double getDiskStoreUsage() {
//this should not happen but if it does, return -1 to highlight it is not working
@@ -3101,13 +3083,6 @@ public class ActiveMQServerImpl implements ActiveMQServer {
return FileStoreMonitor.calculateUsage(getPagingManager().getDiskUsableSpace(), getPagingManager().getDiskTotalSpace());
}
- private void unregisterMeters() {
- MetricsManager metricsManager = this.metricsManager; // volatile load
- if (metricsManager != null) {
- metricsManager.remove(ResourceNames.BROKER + "." + configuration.getName());
- }
- }
-
private void deploySecurityFromConfiguration() {
for (Map.Entry<String, Set<Role>> entry : configuration.getSecurityRoles().entrySet()) {
securityRepository.addMatch(entry.getKey(), entry.getValue(), true);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java
index d2e7d88..040e4a3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java
@@ -52,8 +52,6 @@ import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.management.CoreNotificationType;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
-import org.apache.activemq.artemis.api.core.management.QueueControl;
-import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.PriorityAware;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.filter.impl.FilterImpl;
@@ -63,8 +61,8 @@ import org.apache.activemq.artemis.core.paging.cursor.PageIterator;
import org.apache.activemq.artemis.core.paging.cursor.PagePosition;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
import org.apache.activemq.artemis.core.paging.cursor.PagedReference;
-import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.persistence.AddressQueueStatus;
+import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.postoffice.Binding;
import org.apache.activemq.artemis.core.postoffice.Bindings;
@@ -90,8 +88,6 @@ import org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding;
import org.apache.activemq.artemis.core.server.cluster.impl.Redistributor;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.server.management.Notification;
-import org.apache.activemq.artemis.core.server.metrics.MetricsManager;
-import org.apache.activemq.artemis.core.server.metrics.QueueMetricNames;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.HierarchicalRepositoryChangeListener;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -689,7 +685,6 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
this.factory = factory;
- registerMeters();
if (this.addressInfo != null && this.addressInfo.isPaused()) {
this.pause(false);
}
@@ -2264,8 +2259,6 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
slowConsumerReaperFuture.cancel(false);
}
- unregisterMeters();
-
tx.commit();
} catch (Exception e) {
tx.rollback();
@@ -4346,43 +4339,6 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
}
}
- private void registerMeters() {
- if (server != null && server.getMetricsManager() != null) {
- String addressName = address.toString();
- String queueName = name.toString();
- MetricsManager metricsManager = server.getMetricsManager();
-
- metricsManager.registerQueueGauge(addressName, queueName, (builder) -> {
- builder.register(QueueMetricNames.MESSAGE_COUNT, this, metrics -> Double.valueOf(getMessageCount()), QueueControl.MESSAGE_COUNT_DESCRIPTION);
- builder.register(QueueMetricNames.DURABLE_MESSAGE_COUNT, this, metrics -> Double.valueOf(getDurableMessageCount()), QueueControl.DURABLE_MESSAGE_COUNT_DESCRIPTION);
- builder.register(QueueMetricNames.PERSISTENT_SIZE, this, metrics -> Double.valueOf(getPersistentSize()), QueueControl.PERSISTENT_SIZE_DESCRIPTION);
- builder.register(QueueMetricNames.DURABLE_PERSISTENT_SIZE, this, metrics -> Double.valueOf(getDurablePersistentSize()), QueueControl.DURABLE_PERSISTENT_SIZE_DESCRIPTION);
-
- builder.register(QueueMetricNames.DELIVERING_MESSAGE_COUNT, this, metrics -> Double.valueOf(getDeliveringCount()), QueueControl.DELIVERING_MESSAGE_COUNT_DESCRIPTION);
- builder.register(QueueMetricNames.DELIVERING_DURABLE_MESSAGE_COUNT, this, metrics -> Double.valueOf(getDurableDeliveringCount()), QueueControl.DURABLE_DELIVERING_MESSAGE_COUNT_DESCRIPTION);
- builder.register(QueueMetricNames.DELIVERING_PERSISTENT_SIZE, this, metrics -> Double.valueOf(getDeliveringSize()), QueueControl.DELIVERING_SIZE_DESCRIPTION);
- builder.register(QueueMetricNames.DELIVERING_DURABLE_PERSISTENT_SIZE, this, metrics -> Double.valueOf(getDurableDeliveringSize()), QueueControl.DURABLE_DELIVERING_SIZE_DESCRIPTION);
-
- builder.register(QueueMetricNames.SCHEDULED_MESSAGE_COUNT, this, metrics -> Double.valueOf(getScheduledCount()), QueueControl.SCHEDULED_MESSAGE_COUNT_DESCRIPTION);
- builder.register(QueueMetricNames.SCHEDULED_DURABLE_MESSAGE_COUNT, this, metrics -> Double.valueOf(getDurableScheduledCount()), QueueControl.DURABLE_SCHEDULED_MESSAGE_COUNT_DESCRIPTION);
- builder.register(QueueMetricNames.SCHEDULED_PERSISTENT_SIZE, this, metrics -> Double.valueOf(getScheduledSize()), QueueControl.SCHEDULED_SIZE_DESCRIPTION);
- builder.register(QueueMetricNames.SCHEDULED_DURABLE_PERSISTENT_SIZE, this, metrics -> Double.valueOf(getDurableScheduledSize()), QueueControl.DURABLE_SCHEDULED_SIZE_DESCRIPTION);
-
- builder.register(QueueMetricNames.MESSAGES_ACKNOWLEDGED, this, metrics -> Double.valueOf(getMessagesAcknowledged()), QueueControl.MESSAGES_ACKNOWLEDGED_DESCRIPTION);
- builder.register(QueueMetricNames.MESSAGES_ADDED, this, metrics -> Double.valueOf(getMessagesAdded()), QueueControl.MESSAGES_ADDED_DESCRIPTION);
- builder.register(QueueMetricNames.MESSAGES_KILLED, this, metrics -> Double.valueOf(getMessagesKilled()), QueueControl.MESSAGES_KILLED_DESCRIPTION);
- builder.register(QueueMetricNames.MESSAGES_EXPIRED, this, metrics -> Double.valueOf(getMessagesExpired()), QueueControl.MESSAGES_EXPIRED_DESCRIPTION);
- builder.register(QueueMetricNames.CONSUMER_COUNT, this, metrics -> Double.valueOf(getConsumerCount()), QueueControl.CONSUMER_COUNT_DESCRIPTION);
- });
- }
- }
-
- private void unregisterMeters() {
- if (server != null && server.getMetricsManager() != null) {
- server.getMetricsManager().remove(ResourceNames.QUEUE + name);
- }
- }
-
private class AddressSettingsRepositoryListener implements HierarchicalRepositoryChangeListener {
@Override
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 207a2da..6e86677 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
@@ -47,6 +47,7 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.UDPBroadcastEndpointFactory;
import org.apache.activemq.artemis.api.core.management.AcceptorControl;
+import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
import org.apache.activemq.artemis.api.core.management.AddressControl;
import org.apache.activemq.artemis.api.core.management.BaseBroadcastGroupControl;
import org.apache.activemq.artemis.api.core.management.BridgeControl;
@@ -54,6 +55,7 @@ import org.apache.activemq.artemis.api.core.management.ClusterConnectionControl;
import org.apache.activemq.artemis.api.core.management.DivertControl;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
+import org.apache.activemq.artemis.api.core.management.QueueControl;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
@@ -95,7 +97,9 @@ import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.core.server.management.NotificationListener;
import org.apache.activemq.artemis.core.server.metrics.AddressMetricNames;
+import org.apache.activemq.artemis.core.server.metrics.BrokerMetricNames;
import org.apache.activemq.artemis.core.server.metrics.MetricsManager;
+import org.apache.activemq.artemis.core.server.metrics.QueueMetricNames;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.transaction.ResourceManager;
@@ -215,15 +219,30 @@ public class ManagementServiceImpl implements ManagementService {
ObjectName objectName = objectNameBuilder.getActiveMQServerObjectName();
registerInJMX(objectName, messagingServerControl);
registerInRegistry(ResourceNames.BROKER, messagingServerControl);
+ registerBrokerMeters();
return messagingServerControl;
}
+ private void registerBrokerMeters() {
+ MetricsManager metricsManager = messagingServer.getMetricsManager();
+ if (metricsManager != null) {
+ metricsManager.registerBrokerGauge(builder -> {
+ builder.register(BrokerMetricNames.CONNECTION_COUNT, this, metrics -> Double.valueOf(messagingServer.getConnectionCount()), ActiveMQServerControl.CONNECTION_COUNT_DESCRIPTION);
+ builder.register(BrokerMetricNames.TOTAL_CONNECTION_COUNT, this, metrics -> Double.valueOf(messagingServer.getTotalConnectionCount()), ActiveMQServerControl.TOTAL_CONNECTION_COUNT_DESCRIPTION);
+ builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_DESCRIPTION);
+ builder.register(BrokerMetricNames.ADDRESS_MEMORY_USAGE_PERCENTAGE, this, metrics -> Double.valueOf(messagingServerControl.getAddressMemoryUsagePercentage()), ActiveMQServerControl.ADDRESS_MEMORY_USAGE_PERCENTAGE_DESCRIPTION);
+ builder.register(BrokerMetricNames.DISK_STORE_USAGE, this, metrics -> Double.valueOf(messagingServer.getDiskStoreUsage()), ActiveMQServerControl.DISK_STORE_USAGE_DESCRIPTION);
+ });
+ }
+ }
+
@Override
public synchronized void unregisterServer() throws Exception {
ObjectName objectName = objectNameBuilder.getActiveMQServerObjectName();
unregisterFromJMX(objectName);
unregisterFromRegistry(ResourceNames.BROKER);
+ unregisterMeters(ResourceNames.BROKER + "." + messagingServer.getConfiguration().getName());
}
@Override
@@ -260,7 +279,7 @@ public class ManagementServiceImpl implements ManagementService {
unregisterFromJMX(objectName);
unregisterFromRegistry(ResourceNames.ADDRESS + address);
- unregisterAddressMeters(address.toString());
+ unregisterMeters(ResourceNames.ADDRESS + address);
}
public synchronized void registerQueue(final Queue queue,
@@ -283,11 +302,13 @@ public class ManagementServiceImpl implements ManagementService {
ObjectName objectName = objectNameBuilder.getQueueObjectName(addressInfo.getName(), queue.getName(), queue.getRoutingType());
registerInJMX(objectName, queueControl);
registerInRegistry(ResourceNames.QUEUE + queue.getName(), queueControl);
+ registerQueueMeters(queue);
if (logger.isDebugEnabled()) {
logger.debug("registered queue " + objectName);
}
}
+
@Override
public synchronized void registerQueue(final Queue queue,
final SimpleString address,
@@ -300,11 +321,47 @@ public class ManagementServiceImpl implements ManagementService {
ObjectName objectName = objectNameBuilder.getQueueObjectName(address, name, routingType);
unregisterFromJMX(objectName);
unregisterFromRegistry(ResourceNames.QUEUE + name);
+ unregisterMeters(ResourceNames.QUEUE + name);
if (messageCounterManager != null) {
messageCounterManager.unregisterMessageCounter(name.toString());
}
}
+ private void registerQueueMeters(final Queue queue) {
+ MetricsManager metricsManager = messagingServer.getMetricsManager();
+ if (metricsManager != null) {
+ metricsManager.registerQueueGauge(queue.getAddress().toString(), queue.getName().toString(), (builder) -> {
+ builder.register(QueueMetricNames.MESSAGE_COUNT, this, metrics -> Double.valueOf(queue.getMessageCount()), QueueControl.MESSAGE_COUNT_DESCRIPTION);
+ builder.register(QueueMetricNames.DURABLE_MESSAGE_COUNT, this, metrics -> Double.valueOf(queue.getDurableMessageCount()), QueueControl.DURABLE_MESSAGE_COUNT_DESCRIPTION);
+ builder.register(QueueMetricNames.PERSISTENT_SIZE, this, metrics -> Double.valueOf(queue.getPersistentSize()), QueueControl.PERSISTENT_SIZE_DESCRIPTION);
+ builder.register(QueueMetricNames.DURABLE_PERSISTENT_SIZE, this, metrics -> Double.valueOf(queue.getDurablePersistentSize()), QueueControl.DURABLE_PERSISTENT_SIZE_DESCRIPTION);
+
+ builder.register(QueueMetricNames.DELIVERING_MESSAGE_COUNT, this, metrics -> Double.valueOf(queue.getDeliveringCount()), QueueControl.DELIVERING_MESSAGE_COUNT_DESCRIPTION);
+ builder.register(QueueMetricNames.DELIVERING_DURABLE_MESSAGE_COUNT, this, metrics -> Double.valueOf(queue.getDurableDeliveringCount()), QueueControl.DURABLE_DELIVERING_MESSAGE_COUNT_DESCRIPTION);
+ builder.register(QueueMetricNames.DELIVERING_PERSISTENT_SIZE, this, metrics -> Double.valueOf(queue.getDeliveringSize()), QueueControl.DELIVERING_SIZE_DESCRIPTION);
+ builder.register(QueueMetricNames.DELIVERING_DURABLE_PERSISTENT_SIZE, this, metrics -> Double.valueOf(queue.getDurableDeliveringSize()), QueueControl.DURABLE_DELIVERING_SIZE_DESCRIPTION);
+
+ builder.register(QueueMetricNames.SCHEDULED_MESSAGE_COUNT, this, metrics -> Double.valueOf(queue.getScheduledCount()), QueueControl.SCHEDULED_MESSAGE_COUNT_DESCRIPTION);
+ builder.register(QueueMetricNames.SCHEDULED_DURABLE_MESSAGE_COUNT, this, metrics -> Double.valueOf(queue.getDurableScheduledCount()), QueueControl.DURABLE_SCHEDULED_MESSAGE_COUNT_DESCRIPTION);
+ builder.register(QueueMetricNames.SCHEDULED_PERSISTENT_SIZE, this, metrics -> Double.valueOf(queue.getScheduledSize()), QueueControl.SCHEDULED_SIZE_DESCRIPTION);
+ builder.register(QueueMetricNames.SCHEDULED_DURABLE_PERSISTENT_SIZE, this, metrics -> Double.valueOf(queue.getDurableScheduledSize()), QueueControl.DURABLE_SCHEDULED_SIZE_DESCRIPTION);
+
+ builder.register(QueueMetricNames.MESSAGES_ACKNOWLEDGED, this, metrics -> Double.valueOf(queue.getMessagesAcknowledged()), QueueControl.MESSAGES_ACKNOWLEDGED_DESCRIPTION);
+ builder.register(QueueMetricNames.MESSAGES_ADDED, this, metrics -> Double.valueOf(queue.getMessagesAdded()), QueueControl.MESSAGES_ADDED_DESCRIPTION);
+ builder.register(QueueMetricNames.MESSAGES_KILLED, this, metrics -> Double.valueOf(queue.getMessagesKilled()), QueueControl.MESSAGES_KILLED_DESCRIPTION);
+ builder.register(QueueMetricNames.MESSAGES_EXPIRED, this, metrics -> Double.valueOf(queue.getMessagesExpired()), QueueControl.MESSAGES_EXPIRED_DESCRIPTION);
+ builder.register(QueueMetricNames.CONSUMER_COUNT, this, metrics -> Double.valueOf(queue.getConsumerCount()), QueueControl.CONSUMER_COUNT_DESCRIPTION);
+ });
+ }
+ }
+
+ private void unregisterMeters(final String name) {
+ MetricsManager metricsManager = messagingServer.getMetricsManager();
+ if (metricsManager != null) {
+ metricsManager.remove(name);
+ }
+ }
+
@Override
public synchronized void registerDivert(final Divert divert) throws Exception {
ObjectName objectName = objectNameBuilder.getDivertObjectName(divert.getUniqueName().toString(), divert.getAddress().toString());
@@ -560,13 +617,6 @@ public class ManagementServiceImpl implements ManagementService {
}
}
- public void unregisterAddressMeters(String address) {
- MetricsManager metricsManager = messagingServer.getMetricsManager();
- if (metricsManager != null) {
- metricsManager.remove(ResourceNames.ADDRESS + address);
- }
- }
-
@Override
public void addNotificationListener(final NotificationListener listener) {
listeners.add(listener);
@@ -622,6 +672,7 @@ public class ManagementServiceImpl implements ManagementService {
for (String resourceName : resourceNames) {
unregisterFromRegistry(resourceName);
+ unregisterMeters(resourceName);
}
if (jmxManagementEnabled) {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java
index fb177bc..8fab39c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java
@@ -33,12 +33,14 @@ import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.config.MetricsConfiguration;
-import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import org.jboss.logging.Logger;
public class MetricsManager {
+ private static final Logger log = Logger.getLogger(MetricsManager.class);
+
private final String brokerName;
private final MeterRegistry meterRegistry;
@@ -91,14 +93,7 @@ public class MetricsManager {
newMeters.add(meter);
});
final String resource = ResourceNames.QUEUE + queue;
- this.meters.compute(resource, (s, meters) -> {
- //the old meters are ignored on purpose
- meters = new ArrayList<>(newMeters.size());
- for (Gauge.Builder gauge : newMeters) {
- meters.add(gauge.register(meterRegistry));
- }
- return meters;
- });
+ registerMeter(newMeters, resource);
}
public void registerAddressGauge(String address, Consumer<MetricGaugeBuilder> builder) {
@@ -116,14 +111,7 @@ public class MetricsManager {
newMeters.add(meter);
});
final String resource = ResourceNames.ADDRESS + address;
- this.meters.compute(resource, (s, meters) -> {
- //the old meters are ignored on purpose
- meters = new ArrayList<>(newMeters.size());
- for (Gauge.Builder gauge : newMeters) {
- meters.add(gauge.register(meterRegistry));
- }
- return meters;
- });
+ registerMeter(newMeters, resource);
}
public void registerBrokerGauge(Consumer<MetricGaugeBuilder> builder) {
@@ -140,11 +128,19 @@ public class MetricsManager {
newMeters.add(meter);
});
final String resource = ResourceNames.BROKER + "." + brokerName;
+ registerMeter(newMeters, resource);
+ }
+
+ private void registerMeter(List<Gauge.Builder> newMeters, String resource) {
this.meters.compute(resource, (s, meters) -> {
//the old meters are ignored on purpose
meters = new ArrayList<>(newMeters.size());
- for (Gauge.Builder gauge : newMeters) {
- meters.add(gauge.register(meterRegistry));
+ for (Gauge.Builder gaugeBuilder : newMeters) {
+ Gauge gauge = gaugeBuilder.register(meterRegistry);
+ meters.add(gauge);
+ if (log.isDebugEnabled()) {
+ log.debug("Registered meter: " + gauge.getId());
+ }
}
return meters;
});
@@ -157,8 +153,8 @@ public class MetricsManager {
}
for (Meter meter : meters) {
Meter removed = meterRegistry.remove(meter);
- if (ActiveMQServerLogger.LOGGER.isDebugEnabled()) {
- ActiveMQServerLogger.LOGGER.debug("Removed meter: " + removed.getId());
+ if (log.isDebugEnabled()) {
+ log.debug("Unregistered meter: " + removed.getId());
}
}
return null;
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/SharedStoreMetricsLeakTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/SharedStoreMetricsLeakTest.java
new file mode 100755
index 0000000..43c904b
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/SharedStoreMetricsLeakTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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.activemq.artemis.tests.integration.cluster.failover;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.activemq.artemis.core.config.MetricsConfiguration;
+import org.apache.activemq.artemis.core.config.ha.SharedStoreMasterPolicyConfiguration;
+import org.apache.activemq.artemis.core.config.ha.SharedStoreSlavePolicyConfiguration;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
+import org.apache.activemq.artemis.core.server.metrics.plugins.SimpleMetricsPlugin;
+import org.apache.activemq.artemis.tests.integration.cluster.distribution.ClusterTestBase;
+import org.apache.activemq.artemis.tests.util.Wait;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SharedStoreMetricsLeakTest extends ClusterTestBase {
+
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+
+ setupServers();
+ }
+
+ private void setupServers() throws Exception {
+ setupLiveServer(0, isFileStorage(), true, isNetty(), false);
+ setupBackupServer(1, 0, isFileStorage(), true, isNetty());
+
+ getServer(0).getConfiguration().setHAPolicyConfiguration(new SharedStoreMasterPolicyConfiguration().setFailoverOnServerShutdown(true));
+ getServer(0).getConfiguration().setMetricsConfiguration(new MetricsConfiguration().setJvmThread(false).setJvmGc(false).setJvmMemory(false).setPlugin(new SimpleMetricsPlugin().init(null)));
+ getServer(1).getConfiguration().setHAPolicyConfiguration(new SharedStoreSlavePolicyConfiguration().setFailoverOnServerShutdown(true).setAllowFailBack(true));
+ getServer(1).getConfiguration().setMetricsConfiguration(new MetricsConfiguration().setJvmThread(false).setJvmGc(false).setJvmMemory(false).setPlugin(new SimpleMetricsPlugin().init(null)));
+
+ // configure cluster for bother servers
+ setupClusterConnection("cluster", "queues", MessageLoadBalancingType.ON_DEMAND, 1, isNetty(), 0, 1);
+ setupClusterConnection("cluster", "queues", MessageLoadBalancingType.ON_DEMAND, 1, isNetty(), 1, 0);
+ }
+
+ private boolean isNetty() {
+ return true;
+ }
+
+ @Test
+ public void testForMeterLeaks() throws Exception {
+ ActiveMQServer live = getServer(0);
+ ActiveMQServer backup = getServer(1);
+
+ live.start();
+ assertTrue(live.waitForActivation(5, TimeUnit.SECONDS));
+
+ backup.start();
+ assertFalse(backup.waitForActivation(1, TimeUnit.SECONDS));
+
+ // there should be a handful of metrics available from the ActiveMQServerImpl itself
+ long baseline = backup.getMetricsManager().getMeterRegistry().getMeters().size();
+
+ live.stop();
+ assertTrue(backup.waitForActivation(5, TimeUnit.SECONDS));
+
+ // after failover more meters should get registered
+ Wait.assertTrue(() -> backup.getMetricsManager().getMeterRegistry().getMeters().size() > baseline, 2000, 100);
+
+ live.start();
+ assertTrue(live.waitForActivation(5, TimeUnit.SECONDS));
+
+ // after failback the number of registered meters should return to baseline
+ Wait.assertTrue(() -> backup.getMetricsManager().getMeterRegistry().getMeters().size() == baseline, 2000, 100);
+
+ live.stop();
+ backup.stop();
+ }
+}