This is an automated email from the ASF dual-hosted git repository.
brusdev pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new e0c63ca462 ARTEMIS-5280 metrics manager doesn't inspect temp queue
namespace
e0c63ca462 is described below
commit e0c63ca462d19f4bb3446223197936c6e976fca2
Author: Justin Bertram <[email protected]>
AuthorDate: Fri Jan 31 13:56:28 2025 -0600
ARTEMIS-5280 metrics manager doesn't inspect temp queue namespace
---
.../core/server/impl/ActiveMQServerImpl.java | 2 +-
.../management/impl/ManagementServiceImpl.java | 2 +-
.../core/server/metrics/MetricsManager.java | 12 +++-
.../core/server/metrics/MetricsManagerTest.java | 81 ++++++++++++++++++++++
.../integration/plugin/MetricsPluginTest.java | 33 ++++++---
5 files changed, 116 insertions(+), 14 deletions(-)
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 884089d43f..3388c893a4 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -3297,7 +3297,7 @@ public class ActiveMQServerImpl implements ActiveMQServer
{
* are not required to be included in the OSGi bundle and the Micrometer
jars apparently don't support OSGi.
*/
if (configuration.getMetricsConfiguration() != null &&
configuration.getMetricsConfiguration().getPlugin() != null) {
- metricsManager = new MetricsManager(configuration.getName(),
configuration.getMetricsConfiguration(), addressSettingsRepository,
securityStore);
+ metricsManager = new MetricsManager(configuration.getName(),
configuration.getMetricsConfiguration(), addressSettingsRepository,
securityStore, temp -> getRuntimeTempQueueNamespace(temp));
}
postOffice = new PostOfficeImpl(this, storageManager, pagingManager,
queueFactory, managementService, configuration.getMessageExpiryScanPeriod(),
configuration.getAddressQueueScanPeriod(),
configuration.getWildcardConfiguration(), configuration.getIDCacheSize(),
configuration.isPersistIDCache(), addressSettingsRepository);
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index b762d84db7..d253e0e8f0 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -327,7 +327,7 @@ public class ManagementServiceImpl implements
ManagementService {
if (messagingServer != null) { // messagingServer could be null on
certain unit tests where metrics are not relevant
MetricsManager metricsManager = messagingServer.getMetricsManager();
if (metricsManager != null) {
- metricsManager.registerQueueGauge(queue.getAddress().toString(),
queue.getName().toString(), (builder) -> {
+ metricsManager.registerQueueGauge(queue.getAddress().toString(),
queue.getName().toString(), queue.isTemporary(), (builder) -> {
builder.build(QueueMetricNames.MESSAGE_COUNT, queue, metrics ->
(double) queue.getMessageCount(), QueueControl.MESSAGE_COUNT_DESCRIPTION,
Collections.emptyList());
builder.build(QueueMetricNames.DURABLE_MESSAGE_COUNT, queue,
metrics -> (double) queue.getDurableMessageCount(),
QueueControl.DURABLE_MESSAGE_COUNT_DESCRIPTION, Collections.emptyList());
builder.build(QueueMetricNames.PERSISTENT_SIZE, queue, metrics
-> (double) queue.getPersistentSize(),
QueueControl.PERSISTENT_SIZE_DESCRIPTION, Collections.emptyList());
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java
index d3ed24eeb1..3f17b3a6dd 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
+import java.util.function.Function;
import java.util.function.ToDoubleFunction;
import io.micrometer.core.instrument.Gauge;
@@ -66,14 +67,19 @@ public class MetricsManager {
private final HierarchicalRepository<AddressSettings>
addressSettingsRepository;
+ // a function used to calculate the name of the queue when looking up
address settings
+ private final Function<Boolean, String> queueNameFunction;
+
public MetricsManager(String brokerName,
MetricsConfiguration metricsConfiguration,
HierarchicalRepository<AddressSettings>
addressSettingsRepository,
- SecurityStore securityStore) {
+ SecurityStore securityStore,
+ Function<Boolean, String> queueNameFunction) {
this.brokerName = brokerName;
this.meterRegistry = metricsConfiguration.getPlugin().getRegistry();
this.addressSettingsRepository = addressSettingsRepository;
this.commonTags = Tags.of(BROKER_TAG_NAME, brokerName);
+ this.queueNameFunction = queueNameFunction;
if (meterRegistry != null) {
Metrics.globalRegistry.add(meterRegistry);
if (metricsConfiguration.isJvmMemory()) {
@@ -117,8 +123,8 @@ public class MetricsManager {
void build(String metricName, Object state, ToDoubleFunction<Object> f,
String description, List<Tag> tags);
}
- public void registerQueueGauge(String address, String queue,
Consumer<MetricGaugeBuilder> builder) {
- if (this.meterRegistry == null ||
!addressSettingsRepository.getMatch(address).isEnableMetrics()) {
+ public void registerQueueGauge(String address, String queue, boolean
temporary, Consumer<MetricGaugeBuilder> builder) {
+ if (this.meterRegistry == null ||
!addressSettingsRepository.getMatch(queueNameFunction.apply(temporary) +
queue).isEnableMetrics()) {
return;
}
final List<Builder<Object>> gaugeBuilders = new ArrayList<>();
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/metrics/MetricsManagerTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/metrics/MetricsManagerTest.java
new file mode 100644
index 0000000000..cd35e6ff90
--- /dev/null
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/metrics/MetricsManagerTest.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.core.server.metrics;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.activemq.artemis.core.config.MetricsConfiguration;
+import org.apache.activemq.artemis.core.config.WildcardConfiguration;
+import
org.apache.activemq.artemis.core.server.metrics.plugins.SimpleMetricsPlugin;
+import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
+import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import
org.apache.activemq.artemis.core.settings.impl.HierarchicalObjectRepository;
+import org.apache.activemq.artemis.utils.RandomUtil;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class MetricsManagerTest {
+
+ @Test
+ public void testQueueMetricsEnabled() throws Exception {
+ testQueueMetrics(true);
+ }
+
+ @Test
+ public void testQueueMetricsDisabled() throws Exception {
+ testQueueMetrics(false);
+ }
+
+ public void testQueueMetrics(boolean enableMetrics) throws Exception {
+ final String tempQueueNamespace = "temp.";
+ final long latchTimeout = 100;
+
+ HierarchicalRepository<AddressSettings> addressSettingsRepository = new
HierarchicalObjectRepository<>(new WildcardConfiguration());
+
+ // configure metrics for temp queues
+ addressSettingsRepository.addMatch(tempQueueNamespace + "#", new
AddressSettings().setEnableMetrics(enableMetrics));
+
+ // configure metrics for normal queues
+ addressSettingsRepository.addMatch("#", new
AddressSettings().setEnableMetrics(enableMetrics));
+
+ MetricsConfiguration metricsConfiguration = new MetricsConfiguration();
+ metricsConfiguration.setPlugin(new SimpleMetricsPlugin().init(null));
+ MetricsManager metricsManager = new
MetricsManager(RandomUtil.randomUUIDString(), metricsConfiguration,
addressSettingsRepository, null, temp -> {
+ // this is a simplified version of
org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.getRuntimeTempQueueNamespace
+ if (temp) {
+ return tempQueueNamespace;
+ } else {
+ return "";
+ }
+ });
+
+ // test temp queue
+ AtomicBoolean tempTest = new AtomicBoolean(false);
+ metricsManager.registerQueueGauge(RandomUtil.randomUUIDString(),
RandomUtil.randomUUIDString(), true, (builder) -> {
+ tempTest.set(true);
+ });
+ assertEquals(enableMetrics, tempTest.get());
+
+ // test normal queue
+ AtomicBoolean test = new AtomicBoolean(false);
+ metricsManager.registerQueueGauge(RandomUtil.randomUUIDString(),
RandomUtil.randomUUIDString(), false, (builder) -> {
+ test.set(true);
+ });
+ assertEquals(enableMetrics, test.get());
+ }
+}
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
index 413bcb3519..084b54e40b 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/plugin/MetricsPluginTest.java
@@ -62,9 +62,12 @@ public class MetricsPluginTest extends ActiveMQTestBase {
protected ClientSession session;
protected ClientSessionFactory sf;
protected ServerLocator locator;
+ private static final String TEMP_QUEUE_NAMESPACE = "temp";
protected void configureServer(ActiveMQServer server) {
- server.getConfiguration().setMetricsConfiguration(new
MetricsConfiguration().setPlugin(new SimpleMetricsPlugin().init(null)));
+ server.getConfiguration()
+ .setTemporaryQueueNamespace(TEMP_QUEUE_NAMESPACE)
+ .setMetricsConfiguration(new MetricsConfiguration().setPlugin(new
SimpleMetricsPlugin().init(null)));
}
@Override
@@ -175,23 +178,33 @@ public class MetricsPluginTest extends ActiveMQTestBase {
}
@Test
- public void testForBasicMetricsPresenceAndValue() throws Exception {
- internalTestForBasicMetrics(true);
+ public void testForBasicQueueMetricsPresenceAndValue() throws Exception {
+ internalTestForBasicQueueMetrics(true, false);
}
@Test
- public void testDisablingMetrics() throws Exception {
- internalTestForBasicMetrics(false);
+ public void testDisablingQueueMetrics() throws Exception {
+ internalTestForBasicQueueMetrics(false, false);
}
- private void internalTestForBasicMetrics(boolean enabled) throws Exception {
+ @Test
+ public void testForBasicTempQueueMetricsPresenceAndValue() throws Exception
{
+ internalTestForBasicQueueMetrics(true, true);
+ }
+
+ @Test
+ public void testDisablingTempQueueMetrics() throws Exception {
+ internalTestForBasicQueueMetrics(false, true);
+ }
+
+ private void internalTestForBasicQueueMetrics(boolean enabled, boolean
temp) throws Exception {
final String data = "Simple Text " + UUID.randomUUID().toString();
final String queueName = "simpleQueue";
final String addressName = "simpleAddress";
-
server.getAddressSettingsRepository().getMatch(addressName).setEnableMetrics(enabled);
+ server.getAddressSettingsRepository().getMatch(temp ?
TEMP_QUEUE_NAMESPACE + "." + addressName :
addressName).setEnableMetrics(enabled);
-
session.createQueue(QueueConfiguration.of(queueName).setAddress(addressName).setRoutingType(RoutingType.ANYCAST));
+
session.createQueue(QueueConfiguration.of(queueName).setAddress(addressName).setRoutingType(RoutingType.ANYCAST).setTemporary(temp).setDurable(!temp));
ClientProducer producer = session.createProducer(addressName);
ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeString(data);
@@ -206,7 +219,9 @@ public class MetricsPluginTest extends ActiveMQTestBase {
checkMetric(metrics, "artemis.message.count", "queue", queueName, 1.0,
enabled);
checkMetric(metrics, "artemis.messages.added", "queue", queueName, 1.0,
enabled);
checkMetric(metrics, "artemis.messages.acknowledged", "queue",
queueName, 0.0, enabled);
- checkMetric(metrics, "artemis.durable.message.count", "queue",
queueName, 1.0, enabled);
+ if (!temp) {
+ checkMetric(metrics, "artemis.durable.message.count", "queue",
queueName, 1.0, enabled);
+ }
checkMetric(metrics, "artemis.delivering.message.count", "queue",
queueName, 0.0, enabled);
checkMetric(metrics, "artemis.routed.message.count", "address",
addressName, 1.0, enabled);
checkMetric(metrics, "artemis.unrouted.message.count", "address",
addressName, 0.0, enabled);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact