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();
+   }
+}