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

vavrtom pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git


The following commit(s) were added to refs/heads/main by this push:
     new b57add218b QPID-8603: [Broker-J] Reset statistics (#143)
b57add218b is described below

commit b57add218bce181b9c9752b6c5dc5f54b4adf35d
Author: Daniil Kirilyuk <[email protected]>
AuthorDate: Thu Oct 20 07:36:47 2022 +0200

    QPID-8603: [Broker-J] Reset statistics (#143)
---
 .../store/berkeleydb/AbstractBDBMessageStore.java  |   6 +
 .../server/consumer/AbstractConsumerTarget.java    |   7 +
 .../qpid/server/consumer/ConsumerTarget.java       |   2 +
 .../qpid/server/exchange/AbstractExchange.java     |  11 ++
 .../java/org/apache/qpid/server/model/Broker.java  |  24 ++-
 .../org/apache/qpid/server/model/BrokerImpl.java   |  22 +++
 .../org/apache/qpid/server/model/BrokerLogger.java |  15 +-
 .../model/ConfiguredObjectInjectedStatistic.java   |   6 +
 .../model/ConfiguredObjectMethodStatistic.java     |   6 +
 .../server/model/ConfiguredObjectStatistic.java    |   2 +
 .../org/apache/qpid/server/model/Connection.java   |  50 ++++--
 .../org/apache/qpid/server/model/Consumer.java     |  15 +-
 .../org/apache/qpid/server/model/Exchange.java     |  20 ++-
 .../apache/qpid/server/model/ManagedStatistic.java |   1 +
 .../java/org/apache/qpid/server/model/Queue.java   |  63 +++++--
 .../java/org/apache/qpid/server/model/Session.java |  27 ++-
 .../qpid/server/model/VirtualHostLogger.java       |  15 +-
 .../apache/qpid/server/model/port/AmqpPort.java    |   7 +-
 .../qpid/server/model/port/AmqpPortImpl.java       |   8 +
 .../apache/qpid/server/queue/AbstractQueue.java    |  32 +++-
 .../qpid/server/queue/QueueConsumerImpl.java       |   8 +
 .../apache/qpid/server/queue/QueueStatistics.java  |  72 ++++++--
 .../qpid/server/session/AbstractAMQPSession.java   |  11 ++
 .../qpid/server/store/MemoryMessageStore.java      |   6 +
 .../org/apache/qpid/server/store/MessageStore.java |   2 +
 .../apache/qpid/server/store/NullMessageStore.java |   6 +
 .../server/transport/AbstractAMQPConnection.java   |  21 +++
 .../server/virtualhost/AbstractVirtualHost.java    |  19 ++
 .../virtualhost/QueueManagingVirtualHost.java      |  38 +++-
 .../qpid/server/consumer/TestConsumerTarget.java   |   6 +
 .../server/exchange/ExchangeStatisticsTest.java    | 170 ++++++++++++++++++
 .../apache/qpid/server/model/BrokerTestHelper.java |  30 ++++
 .../qpid/server/model/adapter/BrokerImplTest.java  |  34 ++++
 .../qpid/server/model/port/AmqpPortImplTest.java   |  23 +++
 .../qpid/server/queue/QueueStatisticsTest.java     | 199 +++++++++++++++++++++
 .../server/session/AbstractAMQPSessionTest.java    |  39 +++-
 .../protocol/v0_8/AMQPConnection_0_8Test.java      |  31 ++++
 .../protocol/v1_0/AMQPConnection_1_0ImplTest.java  |  32 ++++
 .../management/logger/brokerlogger/graylog/show.js |   5 +-
 .../logger/virtualhostlogger/graylog/show.js       |   5 +-
 .../store/jdbc/AbstractJDBCMessageStore.java       |   6 +
 .../logging/logback/AbstractBrokerLogger.java      |   2 -
 .../server/logging/logback/AbstractLogger.java     |   5 +
 .../server/logging/logback/CompositeFilter.java    |   8 +-
 .../server/logging/logback/BrokerLoggerTest.java   |  10 +-
 .../logging/logback/VirtualHostLoggerTest.java     |  79 ++++++++
 .../server/management/amqp/ProxyMessageSource.java |   6 +
 .../plugin/servlet/rest/ApiDocsServlet.java        |   4 +-
 .../java/resources/common/StatisticsWidget.html    |   2 +
 .../resources/js/qpid/common/StatisticsWidget.js   |  15 ++
 .../src/main/java/resources/js/qpid/common/util.js |  22 +++
 .../java/resources/js/qpid/management/Broker.js    |   1 +
 .../resources/js/qpid/management/Connection.js     |   5 +-
 .../java/resources/js/qpid/management/Exchange.js  |   1 +
 .../java/resources/js/qpid/management/Queue.js     |   1 +
 .../resources/js/qpid/management/VirtualHost.js    |   1 +
 .../js/qpid/management/logger/brokerlogger/show.js |  14 +-
 .../management/logger/virtualhostlogger/show.js    |  22 ++-
 .../resources/js/qpid/management/port/amqp/show.js |   1 +
 .../java/resources/logger/brokerlogger/show.html   |   3 +
 .../resources/logger/virtualhostlogger/show.html   |   3 +
 61 files changed, 1204 insertions(+), 103 deletions(-)

diff --git 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
index cf2b81f63b..1d5de02218 100644
--- 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
+++ 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
@@ -262,6 +262,12 @@ public abstract class AbstractBDBMessageStore implements 
MessageStore
         return true;
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _bytesEvacuatedFromMemory.set(0L);
+    }
+
     @Override
     public org.apache.qpid.server.store.Transaction newTransaction()
     {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java
 
b/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java
index 6733ed4c86..33c6bbe395 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java
@@ -228,6 +228,13 @@ public abstract class AbstractConsumerTarget<T extends 
AbstractConsumerTarget<T>
         return _unacknowledgedBytes.longValue();
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _unacknowledgedCount.set(0L);
+        _unacknowledgedBytes.set(0L);
+    }
+
     protected abstract void doSend(final MessageInstanceConsumer consumer, 
MessageInstance entry, boolean batch);
 
 
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java 
b/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java
index 419673c3c8..0f5a111d92 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java
@@ -59,6 +59,8 @@ public interface ConsumerTarget<T extends ConsumerTarget<T>>
 
     long getUnacknowledgedMessages();
 
+    void resetStatistics();
+
     AMQPSession<?,T> getSession();
 
     void send(final MessageInstanceConsumer<T> consumer, MessageInstance 
entry, boolean batch);
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
 
b/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
index 32a7ce1502..7742992566 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
@@ -1108,6 +1108,17 @@ public abstract class AbstractExchange<T extends 
AbstractExchange<T>>
         }
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _receivedMessageCount.set(0);
+        _receivedMessageSize.set(0);
+        _routedMessageCount.set(0);
+        _routedMessageSize.set(0);
+        _droppedMessageCount.set(0);
+        _droppedMessageSize.set(0);
+    }
+
     @Override
     protected void logCreated(final Map<String, Object> attributes,
                               final Outcome outcome)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
index 456660060a..00aa628bcb 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
@@ -201,7 +201,8 @@ public interface Broker<X extends Broker<X>> extends 
ConfiguredObject<X>, EventL
             units = StatisticUnit.BYTES,
             label = "Inbound",
             description = "Total size of all messages received by the Broker.",
-            metricName = "inbound_bytes_count")
+            metricName = "inbound_bytes_count",
+            resettable = true)
     long getBytesIn();
 
     @SuppressWarnings("unused")
@@ -209,7 +210,8 @@ public interface Broker<X extends Broker<X>> extends 
ConfiguredObject<X>, EventL
             units = StatisticUnit.BYTES,
             label = "Outbound",
             description = "Total size of all messages delivered by the 
Broker.",
-            metricName = "outbound_bytes_count")
+            metricName = "outbound_bytes_count",
+            resettable = true)
     long getBytesOut();
 
     @SuppressWarnings("unused")
@@ -217,7 +219,8 @@ public interface Broker<X extends Broker<X>> extends 
ConfiguredObject<X>, EventL
             units = StatisticUnit.MESSAGES,
             label = "Inbound",
             description = "Total number of messages received by the Broker.",
-            metricName = "inbound_messages_count")
+            metricName = "inbound_messages_count",
+            resettable = true)
     long getMessagesIn();
 
     @SuppressWarnings("unused")
@@ -225,7 +228,8 @@ public interface Broker<X extends Broker<X>> extends 
ConfiguredObject<X>, EventL
             units = StatisticUnit.MESSAGES,
             label = "Outbound",
             description = "Total number of messages delivered by the Broker.",
-            metricName = "outbound_messages_count")
+            metricName = "outbound_messages_count",
+            resettable = true)
     long getMessagesOut();
 
 
@@ -234,7 +238,8 @@ public interface Broker<X extends Broker<X>> extends 
ConfiguredObject<X>, EventL
             units = StatisticUnit.MESSAGES,
             label = "Transacted Inbound",
             description = "Total number of messages delivered by the Broker 
within a transaction.",
-            metricName = "inbound_transacted_messages_count")
+            metricName = "inbound_transacted_messages_count",
+            resettable = true)
     long getTransactedMessagesIn();
 
     @SuppressWarnings("unused")
@@ -242,9 +247,13 @@ public interface Broker<X extends Broker<X>> extends 
ConfiguredObject<X>, EventL
             units = StatisticUnit.MESSAGES,
             label = "Transacted Outbound",
             description = "Total number of messages received by the Broker 
within a transaction.",
-            metricName = "outbound_transacted_messages_count")
+            metricName = "outbound_transacted_messages_count",
+            resettable = true)
     long getTransactedMessagesOut();
 
+    @ManagedOperation(description = "Resets broker statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
+
     @ManagedOperation(nonModifying = true,
             description = "Initiates an orderly shutdown of the Broker.",
             changesConfiguredObjectState = false)
@@ -332,7 +341,8 @@ public interface Broker<X extends Broker<X>> extends 
ConfiguredObject<X>, EventL
             units = StatisticUnit.BYTES,
             label = "Maximum recorded size of inbound messages",
             description = "Maximum size of messages published into the Broker 
since start-up.",
-            metricName = "inbound_message_size_high_watermark")
+            metricName = "inbound_message_size_high_watermark",
+            resettable = true)
     long getInboundMessageSizeHighWatermark();
 
     @ManagedOperation(nonModifying = true,
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
index 5d4b8ee1cc..d69d55900d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
@@ -65,6 +65,7 @@ import 
org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
 import org.apache.qpid.server.logging.messages.BrokerMessages;
+import org.apache.qpid.server.model.port.AmqpPort;
 import org.apache.qpid.server.model.preferences.Preference;
 import org.apache.qpid.server.model.preferences.UserPreferences;
 import org.apache.qpid.server.model.preferences.UserPreferencesImpl;
@@ -991,6 +992,27 @@ public class BrokerImpl extends 
AbstractContainer<BrokerImpl> implements Broker<
         return _documentationUrl;
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _maximumMessageSize.set(0L);
+
+        _bytesIn.set(0L);
+        _bytesOut.set(0L);
+        _messagesIn.set(0L);
+        _messagesOut.set(0L);
+        _transactedMessagesIn.set(0L);
+        _transactedMessagesOut.set(0L);
+
+        getChildren(BrokerLogger.class).forEach(BrokerLogger::resetStatistics);
+        getChildren(Port.class).stream()
+                .filter(AmqpPort.class::isInstance).map(port -> (AmqpPort<?>) 
port)
+                .forEach(AmqpPort::resetStatistics);
+        getVirtualHostNodes().stream().map(VirtualHostNode::getVirtualHost)
+                .filter(QueueManagingVirtualHost.class::isInstance).map(vh -> 
(QueueManagingVirtualHost<?>) vh)
+                .forEach(QueueManagingVirtualHost::resetStatistics);
+    }
+
     @Override
     public void restart()
     {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java
index 8c4ad5ba5b..75e35d0d31 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java
@@ -28,9 +28,20 @@ public interface BrokerLogger<X extends BrokerLogger<X>> 
extends ConfiguredObjec
 
     void stopLogging();
 
-    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT, label = "Errors", metricName = "errors_count")
+    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE,
+            units = StatisticUnit.COUNT,
+            label = "Errors",
+            metricName = "errors_count",
+            resettable = true)
     long getErrorCount();
 
-    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT, label = "Warnings", metricName = "warnings_count")
+    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE,
+            units = StatisticUnit.COUNT,
+            label = "Warnings",
+            metricName = "warnings_count",
+            resettable = true)
     long getWarnCount();
+
+    @ManagedOperation(description = "Resets broker logger statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
 }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedStatistic.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedStatistic.java
index f1d9c6b747..6df6a5323e 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedStatistic.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedStatistic.java
@@ -165,4 +165,10 @@ final public class ConfiguredObjectInjectedStatistic<C 
extends ConfiguredObject,
     {
         return _metricDisabled;
     }
+
+    @Override
+    public boolean isResettable()
+    {
+        return false;
+    }
 }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodStatistic.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodStatistic.java
index 528d80ee41..cb7b12ed1a 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodStatistic.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodStatistic.java
@@ -78,4 +78,10 @@ public final class ConfiguredObjectMethodStatistic<C extends 
ConfiguredObject, T
     {
         return _annotation.metricDisabled();
     }
+
+    @Override
+    public boolean isResettable()
+    {
+        return _annotation.resettable();
+    }
 }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectStatistic.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectStatistic.java
index 4585b4241a..6cff8de750 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectStatistic.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectStatistic.java
@@ -33,4 +33,6 @@ public interface ConfiguredObjectStatistic<C extends 
ConfiguredObject, T extends
     String getMetricName();
 
     boolean isMetricDisabled();
+
+    boolean isResettable();
 }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
index 39022d17bf..cfb7c9814b 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
@@ -117,24 +117,32 @@ public interface Connection<X extends Connection<X>> 
extends ConfiguredObject<X>
     // See also QPID-7689: 
https://issues.apache.org/jira/browse/QPID-7689?focusedCommentId=16022923#comment-16022923
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Inbound",
-                      description = "Total size of all messages received by 
this connection.", metricName = "inbound_bytes_count")
+            description = "Total size of all messages received by this 
connection.",
+            metricName = "inbound_bytes_count",
+            resettable = true)
     long getBytesIn();
 
     // currently this reports outbound message content size without header.
     // See also QPID-7689: 
https://issues.apache.org/jira/browse/QPID-7689?focusedCommentId=16022923#comment-16022923
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Outbound",
-                      description = "Total size of all messages delivered by 
this connection.", metricName = "outbound_bytes_count")
+            description = "Total size of all messages delivered by this 
connection.",
+            metricName = "outbound_bytes_count",
+            resettable = true)
     long getBytesOut();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Inbound",
-                      description = "Total number of messages delivered by 
this connection.", metricName = "inbound_messages_count")
+            description = "Total number of messages delivered by this 
connection.",
+            metricName = "inbound_messages_count",
+            resettable = true)
     long getMessagesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Outbound",
-                      description = "Total number of messages received by this 
connection.", metricName = "outbound_messages_count")
+            description = "Total number of messages received by this 
connection.",
+            metricName = "outbound_messages_count",
+            resettable = true)
     long getMessagesOut();
 
     @SuppressWarnings("unused")
@@ -144,20 +152,23 @@ public interface Connection<X extends Connection<X>> 
extends ConfiguredObject<X>
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.ABSOLUTE_TIME, label = "Last Inbound Message",
-            description = "Time of last message received by the broker on this 
connection. "
-                          + "If no message has been received the connection 
creation time will be used.")
+            description = "Time of last message received by the broker on this 
connection. " +
+                          "If no message has been received the connection 
creation time will be used.",
+            resettable = true)
     Date getLastInboundMessageTime();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.ABSOLUTE_TIME, label = "Last Outbound Message",
-            description = "Time of last message sent by the broker on this 
connection. "
-                          + "If no message has been snt the connection 
creation time will be used.")
+            description = "Time of last message sent by the broker on this 
connection. " +
+                          "If no message has been snt the connection creation 
time will be used.",
+            resettable = true)
     Date getLastOutboundMessageTime();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.ABSOLUTE_TIME, label = "Last Message",
-            description = "Time of last message sent or received by the broker 
on this connection. "
-                          + "If no message has been sent or received the 
connection creation time will be used.")
+            description = "Time of last message sent or received by the broker 
on this connection. " +
+                          "If no message has been sent or received the 
connection creation time will be used.",
+            resettable = true)
     Date getLastMessageTime();
 
     @SuppressWarnings("unused")
@@ -167,12 +178,16 @@ public interface Connection<X extends Connection<X>> 
extends ConfiguredObject<X>
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT,
-            label = "Transactions", description = "Total number of 
transactions started.")
+            label = "Transactions",
+            description = "Total number of transactions started.",
+            resettable = true)
     long getLocalTransactionBegins();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT,
-            label = "Rolled-back Transactions", description = "Total number of 
rolled-back transactions.")
+            label = "Rolled-back Transactions",
+            description = "Total number of rolled-back transactions.",
+            resettable = true)
     long getLocalTransactionRollbacks();
 
     @SuppressWarnings("unused")
@@ -188,14 +203,21 @@ public interface Connection<X extends Connection<X>> 
extends ConfiguredObject<X>
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Transacted Inbound",
-            description = "Total number of messages delivered by this 
connection within a transaction.", metricName = 
"transacted_inbound_messages_count")
+            description = "Total number of messages delivered by this 
connection within a transaction.",
+            metricName = "transacted_inbound_messages_count",
+            resettable = true)
     long getTransactedMessagesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Transacted Outbound",
-            description = "Total number of messages received by this 
connection within a transaction.", metricName = 
"transacted_outbound_messages_count")
+            description = "Total number of messages received by this 
connection within a transaction.",
+            metricName = "transacted_outbound_messages_count",
+            resettable = true)
     long getTransactedMessagesOut();
 
+    @ManagedOperation(description = "Resets connection statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
+
     //children
     Collection<Session> getSessions();
 
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
index 033f2634d1..e4fc698371 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
@@ -69,10 +69,18 @@ public interface Consumer<X extends Consumer<X,T>, T 
extends ConsumerTarget> ext
                         + "consumers.  Priority 2147483647 is the highest 
priority.")
     int getPriority();
 
-    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Outbound", metricName = "outbound_bytes_count")
+    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE,
+            units = StatisticUnit.BYTES,
+            label = "Outbound",
+            metricName = "outbound_bytes_count",
+            resettable = true)
     long getBytesOut();
 
-    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Outbound", metricName = 
"outbound_messages_count")
+    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE,
+            units = StatisticUnit.MESSAGES,
+            label = "Outbound",
+            metricName = "outbound_messages_count",
+            resettable = true)
     long getMessagesOut();
 
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.BYTES, label = "Prefetch")
@@ -81,6 +89,9 @@ public interface Consumer<X extends Consumer<X,T>, T extends 
ConsumerTarget> ext
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.MESSAGES, label = "Prefetch")
     long getUnacknowledgedMessages();
 
+    @ManagedOperation(description = "Resets consumer statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
+
     long getConsumerNumber();
 
     boolean isSuspended();
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java
index f95c6a3948..36272b8bf3 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java
@@ -88,27 +88,35 @@ public interface Exchange<X extends Exchange<X>> extends 
ConfiguredObject<X>, Me
     // Statistics
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.COUNT, label = "Bindings",
-                      description = "Current number of bindings to this 
exchange.", metricName = "bindings_total")
+            description = "Current number of bindings to this exchange.", 
metricName = "bindings_total")
     long getBindingCount();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Dropped",
-                      description = "Total size of all unroutable messages 
dropped by this exchange.", metricName = "dropped_bytes_count")
+            description = "Total size of all unroutable messages dropped by 
this exchange.",
+            metricName = "dropped_bytes_count",
+            resettable = true)
     long getBytesDropped();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Inbound",
-                      description = "Total size of messages received by this 
exchange.", metricName = "inbound_bytes_count")
+            description = "Total size of messages received by this exchange.",
+            metricName = "inbound_bytes_count",
+            resettable = true)
     long getBytesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Dropped",
-                      description = "Number of unroutable messages dropped by 
this exchange.", metricName = "dropped_messages_count")
+            description = "Number of unroutable messages dropped by this 
exchange.",
+            metricName = "dropped_messages_count",
+            resettable = true)
     long getMessagesDropped();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Inbound",
-                      description = "Number of messages received by this 
exchange.", metricName = "inbound_messages_count")
+            description = "Number of messages received by this exchange.",
+            metricName = "inbound_messages_count",
+            resettable = true)
     long getMessagesIn();
 
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.COUNT, label = "Producers",
@@ -128,6 +136,8 @@ public interface Exchange<X extends Exchange<X>> extends 
ConfiguredObject<X>, Me
     boolean unbind(@Param(name="destination", mandatory = true) String 
destination,
                    @Param(name="bindingKey", mandatory = true) String 
bindingKey);
 
+    @ManagedOperation(changesConfiguredObjectState = true, description = 
"Resets exchange statistics")
+    void resetStatistics();
 
     /**
      * @return true if the exchange will be deleted after all queues have been 
detached
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/ManagedStatistic.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/ManagedStatistic.java
index 1bcd52e338..64ca72cbbe 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/ManagedStatistic.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/ManagedStatistic.java
@@ -35,4 +35,5 @@ public @interface ManagedStatistic
     StatisticType statisticType();
     String metricName()  default "";
     boolean metricDisabled() default false;
+    boolean resettable() default false;
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
index 1e1f5db950..e40763d883 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
@@ -404,22 +404,26 @@ public interface Queue<X extends Queue<X>> extends 
ConfiguredObject<X>,
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Delivered (Persistent)",
-                      description = "Total size of all persistent messages 
delivered by this queue.")
+            description = "Total size of all persistent messages delivered by 
this queue.",
+            resettable = true)
     long getPersistentDequeuedBytes();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Delivered (Persistent)",
-                      description = "Total number of persistent messages 
delivered by this queue.")
+            description = "Total number of persistent messages delivered by 
this queue.",
+            resettable = true)
     long getPersistentDequeuedMessages();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Enqueued (Persistent)",
-                      description = "Total size of all persistent messages 
received by this queue.")
+            description = "Total size of all persistent messages received by 
this queue.",
+            resettable = true)
     long getPersistentEnqueuedBytes();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Enqueued (Persistent)",
-                      description = "Total number of persistent messages 
received by this queue.")
+            description = "Total number of persistent messages received by 
this queue.",
+            resettable = true)
     long getPersistentEnqueuedMessages();
 
     @SuppressWarnings("unused")
@@ -434,32 +438,44 @@ public interface Queue<X extends Queue<X>> extends 
ConfiguredObject<X>,
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Delivered",
-                      description = "Total size of all messages delivered by 
this queue.", metricName = "dequeued_bytes_count")
+            description = "Total size of all messages delivered by this 
queue.",
+            metricName = "dequeued_bytes_count",
+            resettable = true)
     long getTotalDequeuedBytes();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Delivered",
-                      description = "Total number of messages delivered by 
this queue.", metricName = "dequeued_messages_count")
+            description = "Total number of messages delivered by this queue.",
+            metricName = "dequeued_messages_count",
+            resettable = true)
     long getTotalDequeuedMessages();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Enqueued",
-                      description = "Total size of all messages received by 
this queue.", metricName = "enqueue_bytes_count")
+            description = "Total size of all messages received by this queue.",
+            metricName = "enqueue_bytes_count",
+            resettable = true)
     long getTotalEnqueuedBytes();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Enqueued",
-                      description = "Total number of messages received by this 
queue.", metricName = "enqueued_messages_count")
+            description = "Total number of messages received by this queue.",
+            metricName = "enqueued_messages_count",
+            resettable = true)
     long getTotalEnqueuedMessages();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Expired",
-            description = "Total size of all messages expired by message 
time-to-live on this queue.", metricName = "expired_bytes_count")
+            description = "Total size of all messages expired by message 
time-to-live on this queue.",
+            metricName = "expired_bytes_count",
+            resettable = true)
     long getTotalExpiredBytes();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Expired",
-            description = "Total number of messages expired by message 
time-to-live on this queue.", metricName = "expired_messages_count")
+            description = "Total number of messages expired by message 
time-to-live on this queue.",
+            metricName = "expired_messages_count",
+            resettable = true)
     long getTotalExpiredMessages();
 
 
@@ -485,22 +501,30 @@ public interface Queue<X extends Queue<X>> extends 
ConfiguredObject<X>,
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.BYTES, label = "Available HWM",
-                      description = "Maximum recorded size of available 
messages.", metricName = "available_bytes_high_water_mark")
+            description = "Maximum recorded size of available messages.",
+            metricName = "available_bytes_high_water_mark",
+            resettable = true)
     long getAvailableBytesHighWatermark();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.MESSAGES, label = "Available HWM",
-                      description = "Maximum recorded number of available 
messages.", metricName = "available_messages_high_water_mark")
+            description = "Maximum recorded number of available messages.",
+            metricName = "available_messages_high_water_mark",
+            resettable = true)
     int getAvailableMessagesHighWatermark();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.BYTES, label = "Queue Depth HWM",
-                      description = "Maximum recorded size of enqueued 
messages.", metricName = "depth_bytes_high_water_mark")
+            description = "Maximum recorded size of enqueued messages.",
+            metricName = "depth_bytes_high_water_mark",
+            resettable = true)
     long getQueueDepthBytesHighWatermark();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.MESSAGES, label = "Queue Depth HWM",
-                      description = "Maximum recorded number of enqueued 
messages.", metricName = "depth_messages_high_water_mark")
+            description = "Maximum recorded number of enqueued messages.",
+            metricName = "depth_messages_high_water_mark",
+            resettable = true)
     int getQueueDepthMessagesHighWatermark();
 
     @SuppressWarnings("unused")
@@ -510,14 +534,21 @@ public interface Queue<X extends Queue<X>> extends 
ConfiguredObject<X>,
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Malformed",
-            description = "Total size of enqueued malformed messages.", 
metricName = "malformed_bytes_count")
+            description = "Total size of enqueued malformed messages.",
+            metricName = "malformed_bytes_count",
+            resettable = true)
     long getTotalMalformedBytes();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Malformed",
-            description = "Total number of enqueued malformed messages.", 
metricName = "malformed_messages_count")
+            description = "Total number of enqueued malformed messages.",
+            metricName = "malformed_messages_count",
+            resettable = true)
     long getTotalMalformedMessages();
 
+    @ManagedOperation(description = "Resets queue statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
+
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.COUNT, label = "Producers",
             description = "Number of producers to this queue.", metricName = 
"producers_count")
     long getProducerCount();
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/Session.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/Session.java
index 36d73a817d..2bf9fe06dd 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Session.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Session.java
@@ -68,34 +68,49 @@ public interface Session<X extends Session<X>> extends 
ConfiguredObject<X>
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Inbound",
-            description = "Total size of all messages received by this 
session.", metricName = "inbound_bytes_count")
+            description = "Total size of all messages received by this 
session.",
+            metricName = "inbound_bytes_count",
+            resettable = true)
     long getBytesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Outbound",
-            description = "Total size of all messages delivered by this 
session.", metricName = "outbound_bytes_count")
+            description = "Total size of all messages delivered by this 
session.",
+            metricName = "outbound_bytes_count",
+            resettable = true)
     long getBytesOut();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Inbound",
-            description = "Total number of messages delivered by this 
session.", metricName = "inbound_messages_count")
+            description = "Total number of messages delivered by this 
session.",
+            metricName = "inbound_messages_count",
+            resettable = true)
     long getMessagesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Outbound",
-            description = "Total number of messages received by this 
session.", metricName = "outbound_messages_count")
+            description = "Total number of messages received by this session.",
+            metricName = "outbound_messages_count",
+            resettable = true)
     long getMessagesOut();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Transacted Inbound",
-            description = "Total number of messages delivered by this session 
within a transaction.", metricName = "transacted_inbound_messages_count")
+            description = "Total number of messages delivered by this session 
within a transaction.",
+            metricName = "transacted_inbound_messages_count",
+            resettable = true)
     long getTransactedMessagesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Transacted Outbound",
-            description = "Total number of messages received by this session 
within a transaction.", metricName = "transacted_outbound_messages_count")
+            description = "Total number of messages received by this session 
within a transaction.",
+            metricName = "transacted_outbound_messages_count",
+            resettable = true)
     long getTransactedMessagesOut();
 
+    @ManagedOperation(description = "Resets session statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
+
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.COUNT, label = "Producers",
             description = "Number of producers to this exchange.", metricName 
= "producers_count")
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java
index 6599a0f2a9..0d3907b2e4 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java
@@ -25,9 +25,20 @@ public interface VirtualHostLogger <X extends 
VirtualHostLogger<X>> extends Conf
 {
     void stopLogging();
 
-    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT, label = "Errors", metricName = "errors_count")
+    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE,
+            units = StatisticUnit.COUNT,
+            label = "Errors",
+            metricName = "errors_count",
+            resettable = true)
     long getErrorCount();
 
-    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT, label = "Warnings", metricName = "warnings_count")
+    @ManagedStatistic(statisticType = StatisticType.CUMULATIVE,
+            units = StatisticUnit.COUNT,
+            label = "Warnings",
+            metricName = "warnings_count",
+            resettable = true)
     long getWarnCount();
+
+    @ManagedOperation(description = "Resets VirtualHostLogger statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
 }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java
index 98aadbad04..b51f90d710 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java
@@ -28,6 +28,7 @@ import org.apache.qpid.server.model.DerivedAttribute;
 import org.apache.qpid.server.model.ManagedAttribute;
 import org.apache.qpid.server.model.ManagedContextDefault;
 import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.ManagedOperation;
 import org.apache.qpid.server.model.ManagedStatistic;
 import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.Protocol;
@@ -199,9 +200,13 @@ public interface AmqpPort<X extends AmqpPort<X>> extends 
Port<X>
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT,
             label = "Total Connections",
             description = "Total number of connections made through this port 
since broker startup",
-            metricName = "aggregate_connection_count")
+            metricName = "aggregate_connection_count",
+            resettable = true)
     long getTotalConnectionCount();
 
+    @ManagedOperation(description = "Resets port statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
+
     @DerivedAttribute(description = "Maximum time allowed for a new connection 
to send a protocol header."
                                     + " If the connection does not send a 
protocol header within this time,"
                                     + " the connection will be aborted.")
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java 
b/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
index f59e280757..8a3143fbce 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
@@ -49,6 +49,7 @@ import org.apache.qpid.server.logging.messages.BrokerMessages;
 import org.apache.qpid.server.logging.messages.PortMessages;
 import org.apache.qpid.server.logging.subjects.PortLogSubject;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Connection;
 import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.DefaultVirtualHostAlias;
 import org.apache.qpid.server.model.HostNameAlias;
@@ -626,6 +627,13 @@ public class AmqpPortImpl extends 
AbstractPort<AmqpPortImpl> implements AmqpPort
         return _protocolHandshakeTimeout;
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _totalConnectionCount.set(0L);
+        getChildren(Connection.class).forEach(Connection::resetStatistics);
+    }
+
     @Override
     public boolean getCloseWhenNoRoute()
     {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java 
b/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
index 7a660c5d5f..5fcd012c71 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
@@ -100,7 +100,28 @@ import org.apache.qpid.server.message.RejectType;
 import org.apache.qpid.server.message.RoutingResult;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.message.internal.InternalMessage;
-import org.apache.qpid.server.model.*;
+
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.AlternateBinding;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Consumer;
+import org.apache.qpid.server.model.Content;
+import org.apache.qpid.server.model.CustomRestHeaders;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.ExclusivityPolicy;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.NamedAddressSpace;
+import org.apache.qpid.server.model.OverflowPolicy;
+import org.apache.qpid.server.model.PublishingLink;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.QueueNotificationListener;
+import org.apache.qpid.server.model.RestContentHeader;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.StateTransition;
 import org.apache.qpid.server.model.preferences.GenericPrincipal;
 import org.apache.qpid.server.plugin.MessageConverter;
 import org.apache.qpid.server.plugin.MessageFilterFactory;
@@ -310,7 +331,7 @@ public abstract class AbstractQueue<X extends 
AbstractQueue<X>>
     {
         super.onCreate();
 
-        if(isDurable() && (getLifetimePolicy()  == 
LifetimePolicy.DELETE_ON_CONNECTION_CLOSE
+        if(isDurable() && (getLifetimePolicy() == 
LifetimePolicy.DELETE_ON_CONNECTION_CLOSE
                             || getLifetimePolicy() == 
LifetimePolicy.DELETE_ON_SESSION_END))
         {
             Subject.doAs(getSubjectWithAddedSystemRights(),
@@ -1469,6 +1490,13 @@ public abstract class AbstractQueue<X extends 
AbstractQueue<X>>
         return _queueStatistics.getEnqueueCount();
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _queueStatistics.reset();
+        getConsumers().forEach(Consumer::resetStatistics);
+    }
+
     private void setLastSeenEntry(final QueueConsumer<?,?> sub, final 
QueueEntry entry)
     {
         QueueContext subContext = sub.getQueueContext();
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java 
b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
index a899b3c2e2..f0bb3138db 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
@@ -511,6 +511,14 @@ class QueueConsumerImpl<T extends ConsumerTarget>
         return _deliveredCount.longValue();
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _deliveredBytes.set(0L);
+        _deliveredCount.set(0L);
+        _target.resetStatistics();
+    }
+
     @Override
     public void acquisitionRemoved(final QueueEntry node)
     {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueStatistics.java 
b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueStatistics.java
index ea0cc5b650..971a65dce8 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueStatistics.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueStatistics.java
@@ -57,92 +57,92 @@ final class QueueStatistics
     private final AtomicInteger _malformedCount = new AtomicInteger();
     private final AtomicLong _malformedSize = new AtomicLong();
 
-    public final int getQueueCount()
+    public int getQueueCount()
     {
         return _queueCount.get();
     }
 
-    public final long getQueueSize()
+    public long getQueueSize()
     {
         return _queueSize.get();
     }
 
-    public final int getUnackedCount()
+    public int getUnackedCount()
     {
         return _unackedCount.get();
     }
 
-    public final long getUnackedSize()
+    public long getUnackedSize()
     {
         return _unackedSize.get();
     }
 
-    public final int getAvailableCount()
+    public int getAvailableCount()
     {
         return _availableCount.get();
     }
 
-    public final long getAvailableSize()
+    public long getAvailableSize()
     {
         return _availableSize.get();
     }
 
-    public final long getEnqueueCount()
+    public long getEnqueueCount()
     {
         return _enqueueCount.get();
     }
 
-    public final long getEnqueueSize()
+    public long getEnqueueSize()
     {
         return _enqueueSize.get();
     }
 
-    public final long getDequeueCount()
+    public long getDequeueCount()
     {
         return _dequeueCount.get();
     }
 
-    public final long getDequeueSize()
+    public long getDequeueSize()
     {
         return _dequeueSize.get();
     }
 
-    public final long getPersistentEnqueueCount()
+    public long getPersistentEnqueueCount()
     {
         return _persistentEnqueueCount.get();
     }
 
-    public final long getPersistentEnqueueSize()
+    public long getPersistentEnqueueSize()
     {
         return _persistentEnqueueSize.get();
     }
 
-    public final long getPersistentDequeueCount()
+    public long getPersistentDequeueCount()
     {
         return _persistentDequeueCount.get();
     }
 
-    public final long getPersistentDequeueSize()
+    public long getPersistentDequeueSize()
     {
         return _persistentDequeueSize.get();
     }
 
-    public final int getQueueCountHwm()
+    public int getQueueCountHwm()
     {
         return _queueCountHwm.get();
     }
 
-    public final long getQueueSizeHwm()
+    public long getQueueSizeHwm()
     {
         return _queueSizeHwm.get();
     }
 
-    public final int getAvailableCountHwm()
+    public int getAvailableCountHwm()
     {
         return _availableCountHwm.get();
     }
 
-    public final long getAvailableSizeHwm()
+    public long getAvailableSizeHwm()
     {
         return _availableSizeHwm.get();
     }
@@ -258,4 +258,40 @@ final class QueueStatistics
         _malformedCount.incrementAndGet();
         _malformedSize.addAndGet(size);
     }
+
+    void reset()
+    {
+        _queueCountHwm.set(_queueCount.get());
+        // _queueCount shouldn't be reset
+
+        _queueSizeHwm.set(_queueSize.get());
+        // _queueSize shouldn't be reset
+
+        // _unackedCount shouldn't be reset
+        // _unackedSize shouldn't be reset
+
+        _availableCountHwm.set(_availableCount.get());
+        // _availableCount shouldn't be reset
+
+        _availableSizeHwm.set(_availableSize.get());
+        // _availableSize shouldn't be reset
+
+        _dequeueCount.set(0L);
+        _dequeueSize.set(0L);
+
+        _enqueueCount.set(0L);
+        _enqueueSize.set(0L);
+
+        _persistentEnqueueCount.set(0L);
+        _persistentEnqueueSize.set(0L);
+
+        _persistentDequeueCount.set(0L);
+        _persistentDequeueSize.set(0L);
+
+        _expiredCount.set(0);
+        _expiredSize.set(0L);
+
+        _malformedCount.set(0);
+        _malformedSize.set(0L);
+    }
 }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/session/AbstractAMQPSession.java
 
b/broker-core/src/main/java/org/apache/qpid/server/session/AbstractAMQPSession.java
index 72840e1336..023e177420 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/session/AbstractAMQPSession.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/session/AbstractAMQPSession.java
@@ -387,6 +387,17 @@ public abstract class AbstractAMQPSession<S extends 
AbstractAMQPSession<S, X>,
         _connection.registerTransactedMessageReceived();
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _bytesIn.set(0L);
+        _bytesOut.set(0L);
+        _messagesIn.set(0L);
+        _messagesOut.set(0L);
+        _transactedMessagesIn.set(0L);
+        _transactedMessagesOut.set(0L);
+    }
+
     @Override
     public long getProducerCount()
     {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
 
b/broker-core/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
index 657be12592..0168ce0082 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
@@ -354,6 +354,12 @@ public class MemoryMessageStore implements MessageStore
         return 0L;
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        // ignore
+    }
+
     @Override
     public Transaction newTransaction()
     {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/store/MessageStore.java 
b/broker-core/src/main/java/org/apache/qpid/server/store/MessageStore.java
index a6bf9cf9f4..437feb94d3 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/store/MessageStore.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/store/MessageStore.java
@@ -65,6 +65,8 @@ public interface MessageStore
 
     long getBytesEvacuatedFromMemory();
 
+    void resetStatistics();
+
     /**
      * Is this store capable of persisting the data
      *
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/store/NullMessageStore.java 
b/broker-core/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
index e6f6e29c91..f4f86f9095 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
@@ -108,6 +108,12 @@ public abstract class NullMessageStore implements 
MessageStore, DurableConfigura
         return 0L;
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        // ignore
+    }
+
     @Override
     public Transaction newTransaction()
     {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java
 
b/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java
index e21d1a260f..9b08201b17 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java
@@ -72,6 +72,7 @@ import org.apache.qpid.server.model.Transport;
 import org.apache.qpid.server.model.port.AmqpPort;
 import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
 import org.apache.qpid.server.security.auth.sasl.SaslSettings;
+import org.apache.qpid.server.session.AbstractAMQPSession;
 import org.apache.qpid.server.stats.StatisticsGatherer;
 import org.apache.qpid.server.store.StoreException;
 import org.apache.qpid.server.transport.network.NetworkConnection;
@@ -742,6 +743,26 @@ public abstract class AbstractAMQPConnection<C extends 
AbstractAMQPConnection<C,
         return _transactedMessagesOut.get();
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _lastMessageInboundTime = System.currentTimeMillis();
+        _lastMessageOutboundTime = System.currentTimeMillis();
+
+        _bytesIn.set(0L);
+        _bytesOut.set(0L);
+        _messagesIn.set(0L);
+        _messagesOut.set(0L);
+        _transactedMessagesIn.set(0L);
+        _transactedMessagesOut.set(0L);
+        _localTransactionBegins.set(0L);
+        _localTransactionRollbacks.set(0L);
+
+        getChildren(Session.class).stream()
+                .filter(AbstractAMQPSession.class::isInstance).map(session -> 
(AbstractAMQPSession<?, ?>) session)
+                .forEach(AbstractAMQPSession::resetStatistics);
+    }
+
     public AccessControlContext getAccessControllerContext()
     {
         return _accessControllerContext;
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
 
b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
index 549776e01e..46b2d78a29 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
@@ -1572,6 +1572,25 @@ public abstract class AbstractVirtualHost<X extends 
AbstractVirtualHost<X>> exte
         return _defaultDestination;
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _totalConnectionCount.set(0L);
+        _maximumMessageSize.set(0L);
+
+        _bytesIn.set(0L);
+        _bytesOut.set(0L);
+        _messagesIn.set(0L);
+        _messagesOut.set(0L);
+        _transactedMessagesIn.set(0L);
+        _transactedMessagesOut.set(0L);
+
+        _messageStore.resetStatistics();
+
+        
getChildren(VirtualHostLogger.class).forEach(VirtualHostLogger::resetStatistics);
+        getChildren(Queue.class).forEach(Queue::resetStatistics);
+        getChildren(Exchange.class).forEach(Exchange::resetStatistics);
+    }
 
     private ListenableFuture<Exchange<?>> addExchangeAsync(Map<String,Object> 
attributes)
             throws ReservedExchangeNameException,
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
 
b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
index b03917afd5..21534d8a12 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
@@ -224,40 +224,54 @@ public interface QueueManagingVirtualHost<X extends 
QueueManagingVirtualHost<X>>
     long getConnectionCount();
 
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.COUNT, label = "Total Connections",
-            description = "Total number of messaging connections made to this 
virtualhost since broker startup", metricName = "aggregate_connection_count")
+            description = "Total number of messaging connections made to this 
virtualhost since broker startup",
+            metricName = "aggregate_connection_count",
+            resettable = true)
     long getTotalConnectionCount();
 
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Inbound",
-                      description = "Total size of all messages received by 
this virtualhost.", metricName = "inbound_bytes_count")
+            description = "Total size of all messages received by this 
virtualhost.",
+            metricName = "inbound_bytes_count",
+            resettable = true)
     long getBytesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Outbound",
-                      description = "Total size of all messages delivered by 
this virtualhost.", metricName = "outbound_bytes_count")
+            description = "Total size of all messages delivered by this 
virtualhost.",
+            metricName = "outbound_bytes_count",
+            resettable = true)
     long getBytesOut();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Inbound",
-                      description = "Total number of messages received by this 
virtualhost.", metricName = "inbound_messages_count")
+            description = "Total number of messages received by this 
virtualhost.",
+            metricName = "inbound_messages_count",
+            resettable = true)
     long getMessagesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES, label = "Outbound",
-                      description = "Total number of messages delivered by 
this virtualhost.", metricName = "outbound_messages_count")
+            description = "Total number of messages delivered by this 
virtualhost.",
+            metricName = "outbound_messages_count",
+            resettable = true)
     long getMessagesOut();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES,
             label = "Transacted Inbound",
-            description = "Total number of messages delivered by this 
virtualhost within a transaction.", metricName = 
"inbound_transacted_messages_count")
+            description = "Total number of messages delivered by this 
virtualhost within a transaction.",
+            metricName = "inbound_transacted_messages_count",
+            resettable = true)
     long getTransactedMessagesIn();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.MESSAGES,
             label = "Transacted Outbound",
-            description = "Total number of messages received by this 
virtualhost within a transaction.", metricName = 
"outbound_transacted_messages_count")
+            description = "Total number of messages received by this 
virtualhost within a transaction.",
+            metricName = "outbound_transacted_messages_count",
+            resettable = true)
     long getTransactedMessagesOut();
 
     @SuppressWarnings("unused")
@@ -284,16 +298,22 @@ public interface QueueManagingVirtualHost<X extends 
QueueManagingVirtualHost<X>>
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.CUMULATIVE, units = 
StatisticUnit.BYTES, label = "Evacuated Message Bytes",
-                      description = "Total Number of Bytes Evacuated from 
Memory Due to Flow to Disk.")
+            description = "Total Number of Bytes Evacuated from Memory Due to 
Flow to Disk.",
+            resettable = true)
     long getBytesEvacuatedFromMemory();
 
     @SuppressWarnings("unused")
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME,
             units = StatisticUnit.BYTES,
             label = "Maximum recorded size of inbound messages",
-            description = "Maximum size of message published into the Virtual 
Host since start-up.", metricName = "inbound_message_size_high_water_mark")
+            description = "Maximum size of message published into the Virtual 
Host since start-up.",
+            metricName = "inbound_message_size_high_water_mark",
+            resettable = true)
     long getInboundMessageSizeHighWatermark();
 
+    @ManagedOperation(description = "Resets Virtual Host statistics", 
changesConfiguredObjectState = true)
+    void resetStatistics();
+
     @Override
     @ManagedOperation(nonModifying = true, changesConfiguredObjectState = 
false)
     Collection<? extends Connection<?>> getConnections();
diff --git 
a/broker-core/src/test/java/org/apache/qpid/server/consumer/TestConsumerTarget.java
 
b/broker-core/src/test/java/org/apache/qpid/server/consumer/TestConsumerTarget.java
index 9b0aa1a1f6..20a293ecbb 100644
--- 
a/broker-core/src/test/java/org/apache/qpid/server/consumer/TestConsumerTarget.java
+++ 
b/broker-core/src/test/java/org/apache/qpid/server/consumer/TestConsumerTarget.java
@@ -89,6 +89,12 @@ public class TestConsumerTarget implements 
ConsumerTarget<TestConsumerTarget>
         return 0;
     }
 
+    @Override
+    public void resetStatistics()
+    {
+
+    }
+
     public Queue<?> getQueue()
     {
         return queue;
diff --git 
a/broker-core/src/test/java/org/apache/qpid/server/exchange/ExchangeStatisticsTest.java
 
b/broker-core/src/test/java/org/apache/qpid/server/exchange/ExchangeStatisticsTest.java
new file mode 100644
index 0000000000..9b9de685e1
--- /dev/null
+++ 
b/broker-core/src/test/java/org/apache/qpid/server/exchange/ExchangeStatisticsTest.java
@@ -0,0 +1,170 @@
+/*
+ *
+ * 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.qpid.server.exchange;
+
+import static org.apache.qpid.server.filter.AMQPFilterTypes.JMS_SELECTOR;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.InstanceProperties;
+import org.apache.qpid.server.message.RoutingResult;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.BrokerTestHelper;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.store.TransactionLogResource;
+import org.apache.qpid.test.utils.UnitTestBase;
+
+public class ExchangeStatisticsTest extends UnitTestBase
+{
+    private VirtualHost<?> _vhost;
+    private Exchange<?> _exchange;
+
+    @Before
+    public void setUp() throws Exception
+    {
+        _vhost = BrokerTestHelper.createVirtualHost(getTestName(), this);
+        final Map<String, Object> attributes = Map.of(
+                Exchange.NAME, "test",
+                Exchange.DURABLE, false,
+                Exchange.TYPE, ExchangeDefaults.TOPIC_EXCHANGE_CLASS);
+        _exchange = _vhost.createChild(Exchange.class, attributes);
+        _exchange.open();
+    }
+
+    @Test
+    public void getStatistics()
+    {
+        final Map<String, Object> statistics = _exchange.getStatistics();
+
+        assertEquals(6, statistics.size());
+
+        assertTrue(statistics.containsKey("bindingCount"));
+        assertTrue(statistics.containsKey("bytesDropped"));
+        assertTrue(statistics.containsKey("bytesIn"));
+        assertTrue(statistics.containsKey("messagesDropped"));
+        assertTrue(statistics.containsKey("messagesIn"));
+        assertTrue(statistics.containsKey("producerCount"));
+
+        assertEquals(0L, _exchange.getStatistics().get("bindingCount"));
+        assertEquals(0L, _exchange.getStatistics().get("bytesDropped"));
+        assertEquals(0L, _exchange.getStatistics().get("bytesIn"));
+        assertEquals(0L, _exchange.getStatistics().get("messagesDropped"));
+        assertEquals(0L, _exchange.getStatistics().get("messagesIn"));
+        assertEquals(0L, _exchange.getStatistics().get("producerCount"));
+    }
+
+    @Test
+    public void bindingCount()
+    {
+        final Queue<?> queue = _vhost.createChild(Queue.class, 
Map.of(Queue.NAME, getTestName() + "_queue"));
+
+        _exchange.bind(queue.getName(), "test", 
Map.of(JMS_SELECTOR.toString(), "prop = True"), false);
+        assertEquals(1L, _exchange.getStatistics().get("bindingCount"));
+
+        _exchange.unbind(queue.getName(), "test");
+        assertEquals(0L, _exchange.getStatistics().get("bindingCount"));
+
+        queue.close();
+    }
+
+    @Test
+    public void messageRouted()
+    {
+        final InstanceProperties instanceProperties = 
mock(InstanceProperties.class);
+        final ServerMessage<?> matchingMessage = 
createTestMessage(Map.of("prop", true));
+        final Queue<?> queue = _vhost.createChild(Queue.class, 
Map.of(Queue.NAME, getTestName() + "_queue"));
+
+        boolean bind = _exchange.bind(queue.getName(), "test", 
Map.of(JMS_SELECTOR.toString(), "prop = True"), false);
+        assertTrue("Bind operation should be successful", bind);
+
+        final RoutingResult<ServerMessage<?>> result = 
_exchange.route(matchingMessage, "test", instanceProperties);
+        assertTrue("Message with matching selector not routed to queue", 
result.hasRoutes());
+
+        assertEquals(1L, _exchange.getStatistics().get("bindingCount"));
+        assertEquals(0L, _exchange.getStatistics().get("bytesDropped"));
+        assertEquals(100L, _exchange.getStatistics().get("bytesIn"));
+        assertEquals(1L, _exchange.getStatistics().get("messagesIn"));
+        assertEquals(0L, _exchange.getStatistics().get("messagesDropped"));
+
+        _exchange.resetStatistics();
+
+        assertEquals(1L, _exchange.getStatistics().get("bindingCount"));
+        assertEquals(0L, _exchange.getStatistics().get("bytesIn"));
+        assertEquals(0L, _exchange.getStatistics().get("bytesDropped"));
+        assertEquals(0L, _exchange.getStatistics().get("messagesIn"));
+        assertEquals(0L, _exchange.getStatistics().get("messagesDropped"));
+
+        queue.close();
+    }
+
+    @Test
+    public void messageNotRouted()
+    {
+        final InstanceProperties instanceProperties = 
mock(InstanceProperties.class);
+        final ServerMessage<?> unmatchingMessage = 
createTestMessage(Map.of("prop", false));
+        final Queue<?> queue = _vhost.createChild(Queue.class, 
Map.of(Queue.NAME, getTestName() + "_queue"));
+
+        boolean bind = _exchange.bind(queue.getName(), "test", 
Map.of(JMS_SELECTOR.toString(), "prop = True"), false);
+        assertTrue("Bind operation should be successful", bind);
+
+        final RoutingResult<ServerMessage<?>> result = 
_exchange.route(unmatchingMessage, "test", instanceProperties);
+        assertFalse("Message without matching selector unexpectedly routed to 
queue", result.hasRoutes());
+
+        assertEquals(1L, _exchange.getStatistics().get("bindingCount"));
+        assertEquals(100L, _exchange.getStatistics().get("bytesDropped"));
+        assertEquals(100L, _exchange.getStatistics().get("bytesIn"));
+        assertEquals(1L, _exchange.getStatistics().get("messagesIn"));
+        assertEquals(1L, _exchange.getStatistics().get("messagesDropped"));
+
+        _exchange.resetStatistics();
+
+        assertEquals(1L, _exchange.getStatistics().get("bindingCount"));
+        assertEquals(0L, _exchange.getStatistics().get("bytesIn"));
+        assertEquals(0L, _exchange.getStatistics().get("bytesDropped"));
+        assertEquals(0L, _exchange.getStatistics().get("messagesIn"));
+        assertEquals(0L, _exchange.getStatistics().get("messagesDropped"));
+
+        queue.close();
+    }
+
+    private ServerMessage<?> createTestMessage(final Map<String, Object> 
headerValues)
+    {
+        final AMQMessageHeader header = mock(AMQMessageHeader.class);
+        headerValues.forEach((key, value) -> 
when(header.getHeader(key)).thenReturn(value));
+        final ServerMessage<?> message = mock(ServerMessage.class);
+        
when(message.isResourceAcceptable(any(TransactionLogResource.class))).thenReturn(true);
+        when(message.getMessageHeader()).thenReturn(header);
+        when(message.getSizeIncludingHeader()).thenReturn(100L);
+        return message;
+    }
+}
diff --git 
a/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTestHelper.java 
b/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTestHelper.java
index f140ec75e0..5864ef80c5 100644
--- 
a/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTestHelper.java
+++ 
b/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTestHelper.java
@@ -42,12 +42,17 @@ import javax.security.auth.Subject;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
+import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.MessageReference;
+import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.security.AccessControl;
 import org.apache.qpid.server.security.Result;
 import org.apache.qpid.server.security.SecurityToken;
 import org.apache.qpid.server.security.access.Operation;
 import org.apache.qpid.server.session.AMQPSession;
 import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.TransactionLogResource;
 import org.apache.qpid.server.store.preferences.PreferenceStore;
 import org.apache.qpid.server.transport.AMQPConnection;
 import org.apache.qpid.server.virtualhost.AbstractVirtualHost;
@@ -342,4 +347,29 @@ public class BrokerTestHelper
     {
         return mockWithSystemPrincipal(clazz, SYSTEM_PRINCIPAL);
     }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public static ServerMessage<?> createMessage(final Long id)
+    {
+        final AMQMessageHeader header = mock(AMQMessageHeader.class);
+        when(header.getMessageId()).thenReturn(String.valueOf(id));
+
+        final ServerMessage<?> message = mock(ServerMessage.class);
+        when(message.getMessageNumber()).thenReturn(id);
+        when(message.getMessageHeader()).thenReturn(header);
+        when(message.checkValid()).thenReturn(true);
+        when(message.getSizeIncludingHeader()).thenReturn(100L);
+        when(message.getArrivalTime()).thenReturn(System.currentTimeMillis());
+
+        final StoredMessage storedMessage = mock(StoredMessage.class);
+        when(message.getStoredMessage()).thenReturn(storedMessage);
+
+        final MessageReference ref = mock(MessageReference.class);
+        when(ref.getMessage()).thenReturn(message);
+
+        when(message.newReference()).thenReturn(ref);
+        
when(message.newReference(any(TransactionLogResource.class))).thenReturn(ref);
+
+        return message;
+    }
 }
diff --git 
a/broker-core/src/test/java/org/apache/qpid/server/model/adapter/BrokerImplTest.java
 
b/broker-core/src/test/java/org/apache/qpid/server/model/adapter/BrokerImplTest.java
index 9563a9dfbc..68b152bbf4 100644
--- 
a/broker-core/src/test/java/org/apache/qpid/server/model/adapter/BrokerImplTest.java
+++ 
b/broker-core/src/test/java/org/apache/qpid/server/model/adapter/BrokerImplTest.java
@@ -247,6 +247,40 @@ public class BrokerImplTest extends UnitTestBase
         verify(_preferenceStore).replace(Collections.singleton(preferenceId), 
Collections.EMPTY_SET);
     }
 
+    @Test
+    public void resetStatistics()
+    {
+        final Map<String, Object> brokerAttributes = Map.of(
+                "name", "Broker",
+                Broker.MODEL_VERSION, BrokerModel.MODEL_VERSION,
+                Broker.DURABLE, true);
+        _brokerImpl = new BrokerImpl(brokerAttributes, _systemConfig);
+        _brokerImpl.open();
+
+        _brokerImpl.registerMessageDelivered(100L);
+        _brokerImpl.registerMessageReceived(100L);
+        _brokerImpl.registerTransactedMessageDelivered();
+        _brokerImpl.registerTransactedMessageReceived();
+
+        final Map<String, Object> statisticsBeforeReset = 
_brokerImpl.getStatistics();
+        assertEquals(100L, statisticsBeforeReset.get("bytesIn"));
+        assertEquals(100L, statisticsBeforeReset.get("bytesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesOut"));
+
+        _brokerImpl.resetStatistics();
+
+        final Map<String, Object> statisticsAfterReset = 
_brokerImpl.getStatistics();
+        assertEquals(0L, statisticsAfterReset.get("bytesIn"));
+        assertEquals(0L, statisticsAfterReset.get("bytesOut"));
+        assertEquals(0L, statisticsAfterReset.get("messagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("messagesOut"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesOut"));
+    }
+
     private Collection<Preference> getPreferencesAs(final Subject 
testUserSubject)
     {
         return Subject.doAs(testUserSubject, new 
PrivilegedAction<Collection<Preference>>()
diff --git 
a/broker-core/src/test/java/org/apache/qpid/server/model/port/AmqpPortImplTest.java
 
b/broker-core/src/test/java/org/apache/qpid/server/model/port/AmqpPortImplTest.java
index 257c47bce6..4895824fdb 100644
--- 
a/broker-core/src/test/java/org/apache/qpid/server/model/port/AmqpPortImplTest.java
+++ 
b/broker-core/src/test/java/org/apache/qpid/server/model/port/AmqpPortImplTest.java
@@ -351,6 +351,29 @@ public class AmqpPortImplTest extends UnitTestBase
         assertFalse(_port.acceptNewConnectionAndIncrementCount(new 
InetSocketAddress("example.org", 0)));
     }
 
+    @Test
+    public void resetStatistics()
+    {
+        final Map<String, Object> attributes = Map.of(
+                AmqpPort.PORT, 0,
+                AmqpPort.NAME, getTestName(),
+                AmqpPort.AUTHENTICATION_PROVIDER, AUTHENTICATION_PROVIDER_NAME,
+                AmqpPort.MAX_OPEN_CONNECTIONS, 10,
+                AmqpPort.CONTEXT, 
Map.of(AmqpPort.OPEN_CONNECTIONS_WARN_PERCENT, "80"));
+        _port = new AmqpPortImpl(attributes, _broker);
+        _port.create();
+
+        _port.acceptNewConnectionAndIncrementCount(new 
InetSocketAddress("example.org", 0));
+
+        final Map<String, Object> statisticsBeforeReset = 
_port.getStatistics();
+        assertEquals(1L, statisticsBeforeReset.get("totalConnectionCount"));
+
+        _port.resetStatistics();
+
+        final Map<String, Object> statisticsAfterReset = _port.getStatistics();
+        assertEquals(0L, statisticsAfterReset.get("totalConnectionCount"));
+    }
+
     private AmqpPortImpl createPort(final String portName)
     {
         return createPort(portName, Collections.emptyMap());
diff --git 
a/broker-core/src/test/java/org/apache/qpid/server/queue/QueueStatisticsTest.java
 
b/broker-core/src/test/java/org/apache/qpid/server/queue/QueueStatisticsTest.java
new file mode 100644
index 0000000000..31049264d3
--- /dev/null
+++ 
b/broker-core/src/test/java/org/apache/qpid/server/queue/QueueStatisticsTest.java
@@ -0,0 +1,199 @@
+/*
+ *
+ * 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.qpid.server.queue;
+
+import static org.apache.qpid.server.filter.AMQPFilterTypes.JMS_SELECTOR;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.qpid.server.exchange.ExchangeDefaults;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.BrokerTestHelper;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.virtualhost.QueueManagingVirtualHost;
+import org.apache.qpid.test.utils.UnitTestBase;
+
+public class QueueStatisticsTest extends UnitTestBase
+{
+    private QueueManagingVirtualHost<?> _vhost;
+    private Queue<?> _queue;
+
+    @Before
+    public void setUp() throws Exception
+    {
+        _vhost = BrokerTestHelper.createVirtualHost(getClass().getName(), 
this);
+        final Map<String,Object> attributes = Map.of(
+                Queue.NAME, "queue",
+                Queue.OWNER, "owner");
+        _queue = _vhost.createChild(Queue.class, attributes);
+    }
+
+    @Test
+    public void getStatistics()
+    {
+        final Map<String, Object> statistics = _queue.getStatistics();
+
+        assertEquals(27, statistics.size());
+
+        assertTrue(statistics.containsKey("availableBytes"));
+        assertTrue(statistics.containsKey("availableBytesHighWatermark"));
+        assertTrue(statistics.containsKey("availableMessages"));
+        assertTrue(statistics.containsKey("availableMessagesHighWatermark"));
+        assertTrue(statistics.containsKey("bindingCount"));
+        assertTrue(statistics.containsKey("consumerCount"));
+        assertTrue(statistics.containsKey("consumerCountWithCredit"));
+        assertTrue(statistics.containsKey("producerCount"));
+        assertTrue(statistics.containsKey("oldestMessageAge"));
+        assertTrue(statistics.containsKey("persistentDequeuedBytes"));
+        assertTrue(statistics.containsKey("persistentEnqueuedBytes"));
+        assertTrue(statistics.containsKey("persistentDequeuedMessages"));
+        assertTrue(statistics.containsKey("persistentEnqueuedMessages"));
+        assertTrue(statistics.containsKey("queueDepthBytes"));
+        assertTrue(statistics.containsKey("queueDepthBytesHighWatermark"));
+        assertTrue(statistics.containsKey("queueDepthMessages"));
+        assertTrue(statistics.containsKey("queueDepthMessagesHighWatermark"));
+        assertTrue(statistics.containsKey("totalDequeuedBytes"));
+        assertTrue(statistics.containsKey("totalDequeuedMessages"));
+        assertTrue(statistics.containsKey("totalMalformedBytes"));
+        assertTrue(statistics.containsKey("totalMalformedMessages"));
+        assertTrue(statistics.containsKey("totalEnqueuedBytes"));
+        assertTrue(statistics.containsKey("totalEnqueuedMessages"));
+        assertTrue(statistics.containsKey("totalExpiredBytes"));
+        assertTrue(statistics.containsKey("totalExpiredMessages"));
+        assertTrue(statistics.containsKey("unacknowledgedBytes"));
+        assertTrue(statistics.containsKey("unacknowledgedMessages"));
+
+        assertEquals(0L, statistics.get("availableBytes"));
+        assertEquals(0L, statistics.get("availableBytesHighWatermark"));
+        assertEquals(0, statistics.get("availableMessages"));
+        assertEquals(0, statistics.get("availableMessagesHighWatermark"));
+        assertEquals(0, statistics.get("bindingCount"));
+        assertEquals(0, statistics.get("consumerCount"));
+        assertEquals(0, statistics.get("consumerCountWithCredit"));
+        assertEquals(0L, statistics.get("producerCount"));
+        assertEquals(0L, statistics.get("oldestMessageAge"));
+        assertEquals(0L, statistics.get("persistentDequeuedBytes"));
+        assertEquals(0L, statistics.get("persistentEnqueuedBytes"));
+        assertEquals(0L, statistics.get("persistentDequeuedMessages"));
+        assertEquals(0L, statistics.get("persistentEnqueuedMessages"));
+        assertEquals(0L, statistics.get("queueDepthBytes"));
+        assertEquals(0L, statistics.get("queueDepthBytesHighWatermark"));
+        assertEquals(0, statistics.get("queueDepthMessages"));
+        assertEquals(0, statistics.get("queueDepthMessagesHighWatermark"));
+        assertEquals(0L, statistics.get("totalDequeuedBytes"));
+        assertEquals(0L, statistics.get("totalDequeuedMessages"));
+        assertEquals(0L, statistics.get("totalMalformedBytes"));
+        assertEquals(0L, statistics.get("totalMalformedMessages"));
+        assertEquals(0L, statistics.get("totalEnqueuedBytes"));
+        assertEquals(0L, statistics.get("totalEnqueuedMessages"));
+        assertEquals(0L, statistics.get("totalExpiredBytes"));
+        assertEquals(0L, statistics.get("totalExpiredMessages"));
+        assertEquals(0L, statistics.get("unacknowledgedBytes"));
+        assertEquals(0L, statistics.get("unacknowledgedMessages"));
+    }
+
+    @Test
+    public void bindingCount()
+    {
+        assertEquals(0, _queue.getStatistics().get("bindingCount"));
+
+        final Exchange<?> exchange = _vhost.createChild(Exchange.class, Map.of(
+                Exchange.NAME, "exchange",
+                Exchange.TYPE, ExchangeDefaults.TOPIC_EXCHANGE_CLASS));
+        exchange.bind(_queue.getName(), "test", 
Map.of(JMS_SELECTOR.toString(), "prop = True"), false);
+        assertEquals(1, _queue.getStatistics().get("bindingCount"));
+
+        exchange.unbind(_queue.getName(), "test");
+        assertEquals(0, _queue.getStatistics().get("bindingCount"));
+
+        exchange.close();
+    }
+
+    @Test
+    public void resetStatistics()
+    {
+        final ServerMessage<?> message = BrokerTestHelper.createMessage(0L);
+        _queue.enqueue(message, null, null);
+
+        Map<String, Object> statistics = _queue.getStatistics();
+
+        assertEquals(100L, statistics.get("availableBytes"));
+        assertEquals(100L, statistics.get("availableBytesHighWatermark"));
+        assertEquals(1, statistics.get("availableMessages"));
+        assertEquals(1, statistics.get("availableMessagesHighWatermark"));
+        assertEquals(0, statistics.get("bindingCount"));
+        assertEquals(0, statistics.get("consumerCount"));
+        assertEquals(0, statistics.get("consumerCountWithCredit"));
+        assertEquals(0L, statistics.get("persistentDequeuedBytes"));
+        assertEquals(0L, statistics.get("persistentEnqueuedBytes"));
+        assertEquals(0L, statistics.get("persistentDequeuedMessages"));
+        assertEquals(0L, statistics.get("persistentEnqueuedMessages"));
+        assertEquals(100L, statistics.get("queueDepthBytes"));
+        assertEquals(100L, statistics.get("queueDepthBytesHighWatermark"));
+        assertEquals(1, statistics.get("queueDepthMessages"));
+        assertEquals(1, statistics.get("queueDepthMessagesHighWatermark"));
+        assertEquals(0L, statistics.get("totalDequeuedBytes"));
+        assertEquals(0L, statistics.get("totalDequeuedMessages"));
+        assertEquals(0L, statistics.get("totalMalformedBytes"));
+        assertEquals(0L, statistics.get("totalMalformedMessages"));
+        assertEquals(100L, statistics.get("totalEnqueuedBytes"));
+        assertEquals(1L, statistics.get("totalEnqueuedMessages"));
+        assertEquals(0L, statistics.get("totalExpiredBytes"));
+        assertEquals(0L, statistics.get("totalExpiredMessages"));
+        assertEquals(0L, statistics.get("unacknowledgedBytes"));
+        assertEquals(0L, statistics.get("unacknowledgedMessages"));
+
+        _queue.resetStatistics();
+        statistics = _queue.getStatistics();
+
+        assertEquals(100L, statistics.get("availableBytes"));
+        assertEquals(100L, statistics.get("availableBytesHighWatermark"));
+        assertEquals(1, statistics.get("availableMessages"));
+        assertEquals(1, statistics.get("availableMessagesHighWatermark"));
+        assertEquals(0, statistics.get("bindingCount"));
+        assertEquals(0, statistics.get("consumerCount"));
+        assertEquals(0, statistics.get("consumerCountWithCredit"));
+        assertEquals(0L, statistics.get("persistentDequeuedBytes"));
+        assertEquals(0L, statistics.get("persistentEnqueuedBytes"));
+        assertEquals(0L, statistics.get("persistentDequeuedMessages"));
+        assertEquals(0L, statistics.get("persistentEnqueuedMessages"));
+        assertEquals(100L, statistics.get("queueDepthBytes"));
+        assertEquals(100L, statistics.get("queueDepthBytesHighWatermark"));
+        assertEquals(1, statistics.get("queueDepthMessages"));
+        assertEquals(1, statistics.get("queueDepthMessagesHighWatermark"));
+        assertEquals(0L, statistics.get("totalDequeuedBytes"));
+        assertEquals(0L, statistics.get("totalDequeuedMessages"));
+        assertEquals(0L, statistics.get("totalMalformedBytes"));
+        assertEquals(0L, statistics.get("totalMalformedMessages"));
+        assertEquals(0L, statistics.get("totalEnqueuedBytes"));
+        assertEquals(0L, statistics.get("totalEnqueuedMessages"));
+        assertEquals(0L, statistics.get("totalExpiredBytes"));
+        assertEquals(0L, statistics.get("totalExpiredMessages"));
+        assertEquals(0L, statistics.get("unacknowledgedBytes"));
+        assertEquals(0L, statistics.get("unacknowledgedMessages"));
+    }
+}
diff --git 
a/broker-core/src/test/java/org/apache/qpid/server/session/AbstractAMQPSessionTest.java
 
b/broker-core/src/test/java/org/apache/qpid/server/session/AbstractAMQPSessionTest.java
index f4e2a5935a..363149f43a 100644
--- 
a/broker-core/src/test/java/org/apache/qpid/server/session/AbstractAMQPSessionTest.java
+++ 
b/broker-core/src/test/java/org/apache/qpid/server/session/AbstractAMQPSessionTest.java
@@ -21,13 +21,11 @@
 package org.apache.qpid.server.session;
 
 import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.net.InetSocketAddress;
 import java.security.Principal;
-import java.util.UUID;
+import java.util.Map;
 
 import org.junit.After;
 import org.junit.Before;
@@ -38,7 +36,6 @@ import javax.security.auth.Subject;
 
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
-import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerModel;
 import org.apache.qpid.server.model.BrokerTestHelper;
@@ -46,9 +43,7 @@ import org.apache.qpid.server.model.Connection;
 import org.apache.qpid.server.model.Model;
 import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.model.Session;
-import org.apache.qpid.server.model.SystemConfig;
 import org.apache.qpid.server.model.VirtualHost;
-import org.apache.qpid.server.security.SecurityToken;
 import org.apache.qpid.server.security.auth.TestPrincipalUtils;
 import org.apache.qpid.server.transport.AMQPConnection;
 import org.apache.qpid.server.virtualhost.QueueManagingVirtualHost;
@@ -132,7 +127,37 @@ public class AbstractAMQPSessionTest extends UnitTestBase
         verify(_connection).registerTransactedMessageReceived();
     }
 
-    private static class MockAMQPSession extends AbstractAMQPSession{
+    @Test
+    public void resetStatistics()
+    {
+        mockAMQPSession.resetStatistics();
+
+        mockAMQPSession.registerMessageDelivered(100);
+        mockAMQPSession.registerMessageReceived(100);
+        mockAMQPSession.registerTransactedMessageDelivered();
+        mockAMQPSession.registerTransactedMessageReceived();
+
+        final Map<String, Object> statisticsBeforeReset = 
mockAMQPSession.getStatistics();
+        assertEquals(100L, statisticsBeforeReset.get("bytesIn"));
+        assertEquals(100L, statisticsBeforeReset.get("bytesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesOut"));
+
+        mockAMQPSession.resetStatistics();
+
+        final Map<String, Object> statisticsAfterReset = 
mockAMQPSession.getStatistics();
+        assertEquals(0L, statisticsAfterReset.get("bytesIn"));
+        assertEquals(0L, statisticsAfterReset.get("bytesOut"));
+        assertEquals(0L, statisticsAfterReset.get("messagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("messagesOut"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesOut"));
+    }
+
+    private static class MockAMQPSession extends AbstractAMQPSession
+    {
 
         protected MockAMQPSession(final Connection parent, final int sessionId)
         {
diff --git 
a/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Test.java
 
b/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Test.java
index 14e9c29405..b41dd6a6a3 100644
--- 
a/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Test.java
+++ 
b/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Test.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.when;
 
 import java.net.InetSocketAddress;
 import java.util.Collections;
+import java.util.Map;
 
 import javax.security.auth.Subject;
 
@@ -252,4 +253,34 @@ public class AMQPConnection_0_8Test extends UnitTestBase
                           conn.isClosing());
     }
 
+    @Test
+    public void resetStatistics()
+    {
+        final AMQPConnection_0_8Impl connection =
+                new AMQPConnection_0_8Impl(_broker, _network, _port, 
_transport, _protocol, 0, _ticker);
+        connection.create();
+        connection.setAddressSpace(_virtualHost);
+        connection.registerMessageReceived(100L);
+        connection.registerMessageDelivered(100L);
+        connection.registerTransactedMessageReceived();
+        connection.registerTransactedMessageDelivered();
+
+        final Map<String, Object> statisticsBeforeReset = 
connection.getStatistics();
+        assertEquals(100L, statisticsBeforeReset.get("bytesIn"));
+        assertEquals(100L, statisticsBeforeReset.get("bytesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesOut"));
+
+        connection.resetStatistics();
+
+        final Map<String, Object> statisticsAfterReset = 
connection.getStatistics();
+        assertEquals(0L, statisticsAfterReset.get("bytesIn"));
+        assertEquals(0L, statisticsAfterReset.get("bytesOut"));
+        assertEquals(0L, statisticsAfterReset.get("messagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("messagesOut"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesOut"));
+    }
 }
diff --git 
a/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0ImplTest.java
 
b/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0ImplTest.java
index 473c9dceec..ad21a79cdd 100644
--- 
a/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0ImplTest.java
+++ 
b/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0ImplTest.java
@@ -23,12 +23,14 @@ package org.apache.qpid.server.protocol.v1_0;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.net.SocketAddress;
 import java.util.Iterator;
+import java.util.Map;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -156,4 +158,34 @@ public class AMQPConnection_1_0ImplTest extends 
UnitTestBase
             // pass
         }
     }
+
+    @Test
+    public void resetStatistics()
+    {
+        final AMQPConnection_1_0Impl connection =
+                new AMQPConnection_1_0Impl(_broker, _network, _port, 
Transport.TCP, 0, _aggregateTicket);
+        connection.setAddressSpace(_virtualHost);
+        connection.registerMessageReceived(100L);
+        connection.registerMessageDelivered(100L);
+        connection.registerTransactedMessageReceived();
+        connection.registerTransactedMessageDelivered();
+
+        final Map<String, Object> statisticsBeforeReset = 
connection.getStatistics();
+        assertEquals(100L, statisticsBeforeReset.get("bytesIn"));
+        assertEquals(100L, statisticsBeforeReset.get("bytesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("messagesOut"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesIn"));
+        assertEquals(1L, statisticsBeforeReset.get("transactedMessagesOut"));
+
+        connection.resetStatistics();
+
+        final Map<String, Object> statisticsAfterReset = 
connection.getStatistics();
+        assertEquals(0L, statisticsAfterReset.get("bytesIn"));
+        assertEquals(0L, statisticsAfterReset.get("bytesOut"));
+        assertEquals(0L, statisticsAfterReset.get("messagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("messagesOut"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesIn"));
+        assertEquals(0L, statisticsAfterReset.get("transactedMessagesOut"));
+    }
 }
diff --git 
a/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/brokerlogger/graylog/show.js
 
b/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/brokerlogger/graylog/show.js
index fa42eeff0c..e0406298e4 100644
--- 
a/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/brokerlogger/graylog/show.js
+++ 
b/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/brokerlogger/graylog/show.js
@@ -49,7 +49,10 @@ define(["qpid/common/util",
             util.updateAttributeNodes(this.attributeContainers, restData, 
util.updateBooleanAttributeNode,
                 (containerObject, data, utl) => 
util.updateMapAttributeNode(containerObject, data, utl, fieldTemplate));
             const bufferUsage = 
String(restData["statistics"]["appenderBufferUsage"]);
-            this.appenderBufferUsage.forEach(node => node.innerHTML = 
bufferUsage);
+            if (this.appenderBufferUsage)
+            {
+                this.appenderBufferUsage.forEach(node => node.innerHTML = 
bufferUsage);
+            }
         }
 
         return Graylog;
diff --git 
a/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/graylog/show.js
 
b/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/graylog/show.js
index cdfef05f20..e493f1491e 100644
--- 
a/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/graylog/show.js
+++ 
b/broker-plugins/graylog-logging-logback/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/graylog/show.js
@@ -49,7 +49,10 @@ define(["qpid/common/util",
             util.updateAttributeNodes(this.attributeContainers, restData, 
util.updateBooleanAttributeNode,
                 (containerObject, data, utl) => 
util.updateMapAttributeNode(containerObject, data, utl, fieldTemplate));
             const bufferUsage = 
String(restData["statistics"]["appenderBufferUsage"]);
-            this.appenderBufferUsage.forEach(node => node.innerHTML = 
bufferUsage);
+            if (this.appenderBufferUsage)
+            {
+                this.appenderBufferUsage.forEach(node => node.innerHTML = 
bufferUsage);
+            }
         }
 
         return Graylog;
diff --git 
a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
 
b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
index 7b405d4fbd..a5bd7b8900 100644
--- 
a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
+++ 
b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
@@ -1204,6 +1204,12 @@ public abstract class AbstractJDBCMessageStore 
implements MessageStore
         return _bytesEvacuatedFromMemory.get();
     }
 
+    @Override
+    public void resetStatistics()
+    {
+        _bytesEvacuatedFromMemory.set(0L);
+    }
+
     protected class JDBCTransaction implements Transaction
     {
         private final ConnectionWrapper _connWrapper;
diff --git 
a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractBrokerLogger.java
 
b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractBrokerLogger.java
index 0983f213aa..61d38e898d 100644
--- 
a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractBrokerLogger.java
+++ 
b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractBrokerLogger.java
@@ -58,6 +58,4 @@ public abstract class AbstractBrokerLogger<X extends 
AbstractBrokerLogger<X>> ex
     {
         return _virtualHostLogEventExcluded;
     }
-
-
 }
diff --git 
a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java
 
b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java
index 071309e7f7..f23f63d722 100644
--- 
a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java
+++ 
b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java
@@ -135,6 +135,11 @@ public abstract class AbstractLogger<X extends 
AbstractLogger<X>> extends Abstra
         }
     }
 
+    public void resetStatistics()
+    {
+        _compositeFilter.resetStatistics();
+    }
+
     protected Appender<ILoggingEvent> getAppender()
     {
         return ROOT_LOGGER.getAppender(getName());
diff --git 
a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/CompositeFilter.java
 
b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/CompositeFilter.java
index 843887607b..3efbddd96f 100644
--- 
a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/CompositeFilter.java
+++ 
b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/CompositeFilter.java
@@ -36,7 +36,7 @@ import ch.qos.logback.core.spi.FilterReply;
 
 public class CompositeFilter extends Filter<ILoggingEvent>
 {
-    private List<Filter<ILoggingEvent>> _filterList = new 
CopyOnWriteArrayList<>();
+    private final List<Filter<ILoggingEvent>> _filterList = new 
CopyOnWriteArrayList<>();
     private final AtomicLong _warnCount = new AtomicLong();
     private final AtomicLong _errorCount = new AtomicLong();
 
@@ -105,4 +105,10 @@ public class CompositeFilter extends Filter<ILoggingEvent>
     {
         return _warnCount.get();
     }
+
+    public void resetStatistics()
+    {
+        _errorCount.set(0L);
+        _warnCount.set(0L);
+    }
 }
diff --git 
a/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerLoggerTest.java
 
b/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerLoggerTest.java
index 1b939299ed..adff511d87 100644
--- 
a/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerLoggerTest.java
+++ 
b/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerLoggerTest.java
@@ -104,7 +104,10 @@ public class BrokerLoggerTest extends UnitTestBase
     {
         try
         {
-            _brokerLogger.delete();
+            if (_brokerLogger != null)
+            {
+                _brokerLogger.delete();
+            }
             _taskExecutor.stopImmediately();
         }
         finally
@@ -242,6 +245,11 @@ public class BrokerLoggerTest extends UnitTestBase
         assertEquals(1L, _brokerLogger.getWarnCount());
         assertEquals(2L, _brokerLogger.getErrorCount());
 
+        _brokerLogger.resetStatistics();
+
+        assertEquals(0L, _brokerLogger.getWarnCount());
+        assertEquals(0L, _brokerLogger.getErrorCount());
+
         errorFilter.delete();
     }
 
diff --git 
a/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/VirtualHostLoggerTest.java
 
b/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/VirtualHostLoggerTest.java
index 9cd651d097..85a40c342d 100644
--- 
a/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/VirtualHostLoggerTest.java
+++ 
b/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/VirtualHostLoggerTest.java
@@ -29,10 +29,14 @@ import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.security.Principal;
+import java.security.PrivilegedAction;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
+
+import javax.security.auth.Subject;
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
@@ -46,6 +50,7 @@ import 
org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.LogFileDetails;
+import org.apache.qpid.server.logging.LogLevel;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerModel;
@@ -55,6 +60,7 @@ import org.apache.qpid.server.model.Model;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.SystemConfig;
 import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostLogInclusionRule;
 import org.apache.qpid.server.model.VirtualHostLogger;
 import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.security.AccessControl;
@@ -241,6 +247,70 @@ public class VirtualHostLoggerTest extends UnitTestBase
         logger.stopLogging();
     }
 
+    @Test
+    public void testStatistics()
+    {
+        final String loggerName = getTestName();
+        final VirtualHostFileLogger<?> logger = (VirtualHostFileLogger<?>) 
createVirtualHostLogger();
+        logger.open();
+
+        final Logger messageLogger = LoggerFactory.getLogger(loggerName);
+
+        assertEquals(0L, logger.getWarnCount());
+        assertEquals(0L, logger.getErrorCount());
+
+        final VirtualHostLogInclusionRule<?> warnFilter = logger.createChild(
+                VirtualHostLogInclusionRule.class,
+                createInclusionRuleAttributes(loggerName, LogLevel.WARN));
+
+        final Subject subject = new Subject(false, 
Set.of(_virtualHost.getPrincipal()), Set.of(), Set.of());
+        Subject.doAs(subject, (PrivilegedAction<Void>) () ->
+        {
+            messageLogger.warn("warn");
+            return null;
+        });
+
+        assertEquals(1L, logger.getWarnCount());
+        assertEquals(0L, logger.getErrorCount());
+
+        Subject.doAs(subject, (PrivilegedAction<Void>) () ->
+        {
+            messageLogger.error("error");
+            return null;
+        });
+        assertEquals(1L, logger.getWarnCount());
+        assertEquals(1L, logger.getErrorCount());
+
+        warnFilter.delete();
+
+        final VirtualHostLogInclusionRule<?> errorFilter = logger.createChild(
+                VirtualHostLogInclusionRule.class,
+                createInclusionRuleAttributes(loggerName, LogLevel.ERROR));
+
+        Subject.doAs(subject, (PrivilegedAction<Void>) () ->
+        {
+            messageLogger.warn("warn");
+            return null;
+        });
+        assertEquals(1L, logger.getWarnCount());
+        assertEquals(1L, logger.getErrorCount());
+
+        Subject.doAs(subject, (PrivilegedAction<Void>) () ->
+        {
+            messageLogger.error("error");
+            return null;
+        });
+        assertEquals(1L, logger.getWarnCount());
+        assertEquals(2L, logger.getErrorCount());
+
+        logger.resetStatistics();
+
+        assertEquals(0L, logger.getWarnCount());
+        assertEquals(0L, logger.getErrorCount());
+
+        errorFilter.delete();
+    }
+
     private VirtualHostFileLogger createErrorredLogger()
     {
         Map<String, Object> attributes = new HashMap<>();
@@ -270,4 +340,13 @@ public class VirtualHostLoggerTest extends UnitTestBase
         return _virtualHost.createChild(VirtualHostLogger.class, attributes);
     }
 
+    private Map<String, Object> createInclusionRuleAttributes(final String 
loggerName,
+                                                              final LogLevel 
logLevel)
+    {
+        return Map.of(
+                VirtualHostNameAndLevelLogInclusionRule.LOGGER_NAME, 
loggerName,
+                VirtualHostNameAndLevelLogInclusionRule.LEVEL, logLevel,
+                VirtualHostNameAndLevelLogInclusionRule.NAME, "test",
+                ConfiguredObject.TYPE, 
VirtualHostNameAndLevelLogInclusionRule.TYPE);
+    }
 }
diff --git 
a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ProxyMessageSource.java
 
b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ProxyMessageSource.java
index c49cffb179..10bca28832 100644
--- 
a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ProxyMessageSource.java
+++ 
b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ProxyMessageSource.java
@@ -301,6 +301,12 @@ public class ProxyMessageSource implements MessageSource, 
MessageDestination
             return _underlying.getUnacknowledgedMessages();
         }
 
+        @Override
+        public void resetStatistics()
+        {
+            _underlying.resetStatistics();
+        }
+
         @Override
         public AMQPSession getSession()
         {
diff --git 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java
 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java
index ca1c9d2440..9c213e54b8 100644
--- 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java
+++ 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java
@@ -378,7 +378,7 @@ public class ApiDocsServlet extends AbstractServlet
     {
         writer.println("<table class=\"statistics\">");
         writer.println("<thead>");
-        writer.println("<tr><th class=\"name\">Statistic Name</th><th 
class=\"type\">Type</th><th class=\"units\">Units</th><th 
class=\"statisticType\">Stat Type</th><th 
class=\"description\">Description</th></tr>");
+        writer.println("<tr><th class=\"name\">Statistic Name</th><th 
class=\"type\">Type</th><th class=\"units\">Units</th><th 
class=\"statisticType\">Stat Type</th><th 
class=\"statisticResettable\">Resettable</th><th 
class=\"description\">Description</th></tr>");
         writer.println("</thead>");
         writer.println("<tbody>");
 
@@ -392,6 +392,8 @@ public class ApiDocsServlet extends AbstractServlet
                            + statistic.getUnits()
                            + "</td><td class=\"stattype\">"
                            + statistic.getStatisticType()
+                           + "</td><td class=\"resettable\">"
+                           + statistic.isResettable()
                            + "</td><td class=\"description\">"
                            + statistic.getDescription()
                            + "</td></tr>");
diff --git 
a/broker-plugins/management-http/src/main/java/resources/common/StatisticsWidget.html
 
b/broker-plugins/management-http/src/main/java/resources/common/StatisticsWidget.html
index 68f3e9819d..7e21245309 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/common/StatisticsWidget.html
+++ 
b/broker-plugins/management-http/src/main/java/resources/common/StatisticsWidget.html
@@ -25,6 +25,8 @@
         <div 
data-dojo-attach-point="msgBytePairPointInTimeStatisticsGridContainer"></div>
         <div 
data-dojo-attach-point="otherPointInTimeStatisticsGridContainer"></div>
         <div class="alignRight">
+            <button data-dojo-type="dijit/form/Button" type="button" 
data-dojo-attach-point="resetStatisticsButton"
+                    class="resetStatisticsButton">Reset Statistics</button>
             <div data-dojo-attach-point="allStatsToggle" 
data-dojo-type="dijit/form/ToggleButton"
                  data-dojo-props="label: 'Show more statistics',
                                   iconClass: 'addIcon',
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/StatisticsWidget.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/StatisticsWidget.js
index 34db71551e..91a17e7362 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/StatisticsWidget.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/StatisticsWidget.js
@@ -28,6 +28,7 @@ define(["dojox/lang/functional/object",
         "dojo/on",
         "dojo/mouse",
         "dojo/number",
+        "dojo/query",
         "dstore/Memory",
         'dstore/Trackable',
         "dojox/html/entities",
@@ -37,6 +38,7 @@ define(["dojox/lang/functional/object",
         "dijit/Tooltip",
         "dijit/registry",
         "qpid/common/formatter",
+        "qpid/common/util",
         "dojo/text!common/StatisticsWidget.html",
         "dijit/form/ToggleButton",
         "dojo/domReady!"],
@@ -50,6 +52,7 @@ define(["dojox/lang/functional/object",
               on,
               mouse,
               number,
+              query,
               Memory,
               Trackable,
               entities,
@@ -59,6 +62,7 @@ define(["dojox/lang/functional/object",
               Tooltip,
               registry,
               formatter,
+              util,
               template) {
 
         return declare("qpid.common.StatisticsWidget",
@@ -75,9 +79,11 @@ define(["dojox/lang/functional/object",
 
                 statisticsPane: null,
                 allStatsToggle: null,
+                resetStatisticsButton: null,
 
                 // constructor arguments
                 category: null,
+                modelObj: null,
                 type: null,
                 management: null,
                 defaultStatistics: null,
@@ -208,6 +214,7 @@ define(["dojox/lang/functional/object",
 
                     this.statisticsPane.on("show", lang.hitch(this, 
this.resize));
                     this.allStatsToggle.on("change", lang.hitch(this, 
this._onStatsToggleChange));
+                    this.resetStatisticsButton.on("click", lang.hitch(this, 
this.resetStatistics));
                 },
                 startup: function ()
                 {
@@ -445,6 +452,14 @@ define(["dojox/lang/functional/object",
                             Tooltip.hide(rowNode);
                         });
                     }
+                },
+                resetStatistics: function()
+                {
+                    util.resetStatistics(this.management,
+                                         this.modelObj,
+                                         this.resetStatisticsButton,
+                                         this.category,
+                                         this.modelObj.name);
                 }
             });
     });
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
index 8b88d2bebd..1ee707aa49 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
@@ -1171,5 +1171,27 @@ define(["dojo/_base/xhr",
             }
         }
 
+        util.resetStatistics = function (management, modelObj, 
resetStatisticsButton, category, name)
+        {
+            if (confirm("Are you sure you want to reset statistics for " + 
category + " '" + name + "'?"))
+            {
+                resetStatisticsButton.set("disabled", true);
+                const obj =
+                {
+                    type: category.toLowerCase(),
+                    name: "resetStatistics",
+                    parent: modelObj
+                };
+                const url = management.buildObjectURL(obj) +
+                            (category === "Broker" ? "/resetStatistics" : "");
+                management.post({url: url}, {})
+                    .then(null, management.xhrErrorHandler)
+                    .always(function ()
+                    {
+                        resetStatisticsButton.set("disabled", false);
+                    });
+            }
+        }
+
         return util;
     });
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
index 4f8fb944c3..e0645654cb 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
@@ -1014,6 +1014,7 @@ define(["dojo/parser",
                     {
                         that.brokerStatistics = new 
qpid.common.StatisticsWidget({
                             category:  "Broker",
+                            modelObj: that.brokerObj,
                             type: null,
                             management: that.controller.management,
                             defaultStatistics: ["messagesIn", "messagesOut"]
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js
index 1b9dcffd03..58f49f24ee 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js
@@ -228,7 +228,7 @@ define(["dojo/parser",
             {
                 return;
             }
-
+            const that = this;
             this.management.load(this.modelObj, { excludeInheritedContext: 
true, depth: 0})
                 .then(lang.hitch(this, function (data)
                 {
@@ -238,8 +238,9 @@ define(["dojo/parser",
                     {
                         this.connectionStatistics = new StatisticsWidget({
                             category:  "Connection",
+                            modelObj: that.modelObj,
                             type: null,
-                            management: this.management,
+                            management: that.management,
                             defaultStatistics: ["messagesIn", "messagesOut", 
"lastIoTime"]
                         });
                         
this.connectionStatistics.placeAt(this.connectionStatisticsNode);
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js
index ced2a1fa08..9d9e04cc93 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js
@@ -282,6 +282,7 @@ define(["dojo/_base/xhr",
                     {
                         thisObj.exchangeStatistics = new StatisticsWidget({
                             category:  "Exchange",
+                            modelObj: thisObj.modelObj,
                             type: thisObj.exchangeData.type,
                             management: thisObj.management,
                             defaultStatistics: ["messagesIn", 
"messagesDropped"]
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
index bff2a8c853..22b63d1606 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
@@ -671,6 +671,7 @@ define(["dojo/_base/declare",
                     {
                         thisObj.queueStatistics = new StatisticsWidget({
                             category:  "Queue",
+                            modelObj: thisObj.modelObj,
                             type: thisObj.queueData.type,
                             management: thisObj.management,
                             defaultStatistics: ["totalEnqueuedMessages", 
"totalDequeuedMessages",
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
index 8d7ef9a407..00e846605c 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
@@ -730,6 +730,7 @@ define(["dojo/parser",
             {
                 this.virtualhostStatistics = new StatisticsWidget({
                     category: "VirtualHost",
+                    modelObj: this.modelObj,
                     type: this.vhostData.type,
                     management: this.management,
                     defaultStatistics: ["messagesIn", "messagesOut", 
"totalDepthOfQueuesMessages"]
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
index 552bea4dc7..56666c005d 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
@@ -19,11 +19,12 @@
  *
  */
 define(["qpid/common/util",
+        "dijit/registry",
         "dojo/query",
         "dojo/_base/lang",
         "dojo/text!logger/brokerlogger/show.html",
         "qpid/common/CategoryTabExtension",
-        "dojo/domReady!"], function (util, query, lang, template, 
CategoryTabExtension)
+        "dojo/domReady!"], function (util, registry, query, lang, template, 
CategoryTabExtension)
 {
     function BrokerLogger(params)
     {
@@ -40,6 +41,8 @@ define(["qpid/common/util",
     BrokerLogger.prototype.postParse = function (containerNode)
     {
         this.virtualHostLogEventExcludedCheckboxContainer = 
query(".virtualHostLogEventExcluded", containerNode)[0];
+        this._resetStatisticsButton = 
registry.byNode(query(".resetStatistics", containerNode)[0]);
+        this._resetStatisticsButton.on("click", lang.hitch(this, 
this.resetStatistics));
     }
 
     BrokerLogger.prototype.update = function (restData)
@@ -50,5 +53,14 @@ define(["qpid/common/util",
         CategoryTabExtension.prototype.update.call(this, restData);
     }
 
+    BrokerLogger.prototype.resetStatistics = function ()
+    {
+        util.resetStatistics(this.management,
+                             this.modelObj,
+                             this._resetStatisticsButton,
+                             "BrokerLogger",
+                             this.modelObj.name);
+    }
+
     return BrokerLogger;
 });
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
index c0fe7a9e60..0c4dbe8b92 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
@@ -19,11 +19,12 @@
  *
  */
 define(["qpid/common/util",
+        "dijit/registry",
         "dojo/query",
         "dojo/_base/lang",
         "dojo/text!logger/virtualhostlogger/show.html",
         "qpid/common/CategoryTabExtension",
-        "dojo/domReady!"], function (util, query, lang, template, 
CategoryTabExtension)
+        "dojo/domReady!"], function (util, registry, query, lang, template, 
CategoryTabExtension)
 {
     function VirtualHostLogger(params)
     {
@@ -35,5 +36,22 @@ define(["qpid/common/util",
         CategoryTabExtension.call(this, categoryExtensionParams);
     }
 
-    return util.extend(VirtualHostLogger, CategoryTabExtension);
+    util.extend(VirtualHostLogger, CategoryTabExtension);
+
+    VirtualHostLogger.prototype.postParse = function (containerNode)
+    {
+        this._resetStatisticsButton = 
registry.byNode(query(".resetStatistics", containerNode)[0]);
+        this._resetStatisticsButton.on("click", lang.hitch(this, 
this.resetStatistics));
+    }
+
+    VirtualHostLogger.prototype.resetStatistics = function ()
+    {
+        util.resetStatistics(this.management,
+                             this.modelObj,
+                             this._resetStatisticsButton,
+                             "VirtualHostLogger",
+                             this.modelObj.name);
+    }
+
+    return VirtualHostLogger;
 });
diff --git 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/port/amqp/show.js
 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/port/amqp/show.js
index aae7439dcc..c9e37e5289 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/port/amqp/show.js
+++ 
b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/port/amqp/show.js
@@ -128,6 +128,7 @@ define(["dojo/query",
         {
             this.portStatistics = new StatisticsWidget({
                 category: "Port",
+                modelObj: this.modelObj,
                 type: restData.type,
                 management: this.management,
                 defaultStatistics: ["connectionCount", "totalConnectionCount"]
diff --git 
a/broker-plugins/management-http/src/main/java/resources/logger/brokerlogger/show.html
 
b/broker-plugins/management-http/src/main/java/resources/logger/brokerlogger/show.html
index bf80ca5741..70875f672f 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/logger/brokerlogger/show.html
+++ 
b/broker-plugins/management-http/src/main/java/resources/logger/brokerlogger/show.html
@@ -24,4 +24,7 @@
         <div class="virtualHostLogEventExcluded"><input type="checkbox"/></div>
     </div>
     <div class="typeSpecificAttributes"></div>
+    <div class="alignRight">
+        <button data-dojo-type="dijit/form/Button" type="button" 
class="resetStatistics">Reset Statistics</button>
+    </div>
 </div>
diff --git 
a/broker-plugins/management-http/src/main/java/resources/logger/virtualhostlogger/show.html
 
b/broker-plugins/management-http/src/main/java/resources/logger/virtualhostlogger/show.html
index 2356b4f0b8..564fbbb908 100644
--- 
a/broker-plugins/management-http/src/main/java/resources/logger/virtualhostlogger/show.html
+++ 
b/broker-plugins/management-http/src/main/java/resources/logger/virtualhostlogger/show.html
@@ -20,4 +20,7 @@
  -->
 <div>
     <div class="typeSpecificAttributes"></div>
+    <div class="alignRight">
+        <button data-dojo-type="dijit/form/Button" type="button" 
class="resetStatistics">Reset Statistics</button>
+    </div>
 </div>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to