This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch branch-3.9
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/branch-3.9 by this push:
new 12e61503a ZOOKEEPER-4324: dropwizard-metrics should be optional
12e61503a is described below
commit 12e61503a8cf972d87e5623fa1ced4710efdb8f0
Author: David Smiley <[email protected]>
AuthorDate: Thu Sep 17 10:55:25 2026 -0400
ZOOKEEPER-4324: dropwizard-metrics should be optional
Reviewers: maoling, PDavid, anmolnar
Author: dsmiley
Closes #2402 from dsmiley/ZK-4324-dropWizardDepOpt2
(cherry picked from commit 508e473d9b0242059ac8c566b2db13afbd4408ed)
Signed-off-by: Andor Molnar <[email protected]>
---
.../org/apache/zookeeper/server/ServerMetrics.java | 8 +---
.../DropwizardMetricsOptionalArchTest.java | 56 ++++++++++++++++++++++
.../test/java/org/apache/zookeeper/ZKTestCase.java | 4 ++
.../server/quorum/LearnerHandlerMetricsTest.java | 3 ++
.../quorum/SyncRequestProcessorMetricTest.java | 4 ++
5 files changed, 68 insertions(+), 7 deletions(-)
diff --git
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
index e3476ff6d..34bf0bd87 100644
---
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
+++
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
@@ -25,7 +25,6 @@
import org.apache.zookeeper.metrics.MetricsProvider;
import org.apache.zookeeper.metrics.Summary;
import org.apache.zookeeper.metrics.SummarySet;
-import org.apache.zookeeper.metrics.impl.DefaultMetricsProvider;
import org.apache.zookeeper.metrics.impl.NullMetricsProvider;
import org.apache.zookeeper.server.util.QuotaMetricsUtils;
import org.slf4j.Logger;
@@ -40,16 +39,11 @@ public final class ServerMetrics {
*/
public static final ServerMetrics NULL_METRICS = new
ServerMetrics(NullMetricsProvider.INSTANCE);
- /**
- * Dummy instance useful for tests.
- */
- public static final ServerMetrics DEFAULT_METRICS_FOR_TESTS = new
ServerMetrics(new DefaultMetricsProvider());
-
/**
* Real instance used for tracking server side metrics. The final value is
* assigned after the {@link MetricsProvider} bootstrap.
*/
- private static volatile ServerMetrics CURRENT = DEFAULT_METRICS_FOR_TESTS;
+ private static volatile ServerMetrics CURRENT = NULL_METRICS;
/**
* Access current ServerMetrics.
diff --git
a/zookeeper-server/src/test/java/org/apache/zookeeper/DropwizardMetricsOptionalArchTest.java
b/zookeeper-server/src/test/java/org/apache/zookeeper/DropwizardMetricsOptionalArchTest.java
new file mode 100644
index 000000000..486b5a434
--- /dev/null
+++
b/zookeeper-server/src/test/java/org/apache/zookeeper/DropwizardMetricsOptionalArchTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.zookeeper;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
+import com.tngtech.archunit.base.DescribedPredicate;
+import com.tngtech.archunit.core.domain.JavaClass;
+import com.tngtech.archunit.core.domain.JavaClasses;
+import com.tngtech.archunit.core.importer.ClassFileImporter;
+import com.tngtech.archunit.core.importer.ImportOption;
+import com.tngtech.archunit.lang.ArchRule;
+import java.util.Collections;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Architectural test to enforce that Dropwizard metrics is an optional
dependency.
+ *
+ * <p>Only {@link
org.apache.zookeeper.server.metric.AvgMinMaxPercentileCounter} may depend
+ * on {@code com.codahale.metrics} packages. All other ZooKeeper classes must
remain Dropwizard-free so that it can be
+ * an optional dependency.
+ */
+public class DropwizardMetricsOptionalArchTest {
+
+ @Test
+ public void onlyAvgMinMaxPercentileCounterShouldDependOnDropwizard() {
+ JavaClasses importedClasses =
+ new ClassFileImporter(Collections.singletonList(new
ImportOption.DoNotIncludeTests())).importPackages(
+ "org.apache.zookeeper").that(new
DescribedPredicate<JavaClass>("ZK non-Dropwizard classes") {
+ @Override
+ public boolean test(JavaClass javaClass) {
+ return
!javaClass.getName().contains("AvgMinMaxPercentileCounter");
+ }
+ });
+
+ ArchRule rule =
noClasses().should().dependOnClassesThat().resideInAnyPackage("com.codahale..");
+
+ rule.check(importedClasses);
+ }
+
+}
diff --git
a/zookeeper-server/src/test/java/org/apache/zookeeper/ZKTestCase.java
b/zookeeper-server/src/test/java/org/apache/zookeeper/ZKTestCase.java
index db2479718..7b2b8e72a 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/ZKTestCase.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/ZKTestCase.java
@@ -24,6 +24,8 @@
import java.time.Instant;
import java.util.concurrent.CompletableFuture;
import org.apache.zookeeper.metrics.MetricsUtils;
+import org.apache.zookeeper.metrics.impl.DefaultMetricsProvider;
+import org.apache.zookeeper.server.ServerMetrics;
import org.apache.zookeeper.util.ServiceUtils;
import org.hamcrest.CustomMatcher;
import org.hamcrest.Description;
@@ -93,6 +95,8 @@ public static void before() {
@BeforeEach
public void starting(TestInfo testInfo) {
+ ServerMetrics.metricsProviderInitialized(new DefaultMetricsProvider());
+
// By default, disable starting a JettyAdminServer in tests to avoid
// accidentally attempting to start multiple admin servers on the
// same port.
diff --git
a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LearnerHandlerMetricsTest.java
b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LearnerHandlerMetricsTest.java
index 3b15e0cca..b084bf2fe 100644
---
a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LearnerHandlerMetricsTest.java
+++
b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LearnerHandlerMetricsTest.java
@@ -35,6 +35,7 @@
import java.util.concurrent.TimeUnit;
import org.apache.jute.BinaryOutputArchive;
import org.apache.zookeeper.metrics.MetricsUtils;
+import org.apache.zookeeper.metrics.impl.DefaultMetricsProvider;
import org.apache.zookeeper.server.ServerMetrics;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -55,6 +56,8 @@ class MockLearnerHandler extends LearnerHandler {
@BeforeEach
public void setup() throws IOException {
+ ServerMetrics.metricsProviderInitialized(new DefaultMetricsProvider());
+
Leader leader = mock(Leader.class);
when(leader.getQuorumAuthServer()).thenReturn(null);
diff --git
a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/SyncRequestProcessorMetricTest.java
b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/SyncRequestProcessorMetricTest.java
index 17ccdae6e..fa5b9d38d 100644
---
a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/SyncRequestProcessorMetricTest.java
+++
b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/SyncRequestProcessorMetricTest.java
@@ -31,9 +31,11 @@
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.metrics.MetricsUtils;
+import org.apache.zookeeper.metrics.impl.DefaultMetricsProvider;
import org.apache.zookeeper.server.Request;
import org.apache.zookeeper.server.RequestProcessor;
import org.apache.zookeeper.server.RequestRecord;
+import org.apache.zookeeper.server.ServerMetrics;
import org.apache.zookeeper.server.SyncRequestProcessor;
import org.apache.zookeeper.server.ZKDatabase;
import org.apache.zookeeper.server.ZooKeeperServer;
@@ -48,6 +50,8 @@ public class SyncRequestProcessorMetricTest {
@BeforeEach
public void setup() throws Exception {
+ ServerMetrics.metricsProviderInitialized(new DefaultMetricsProvider());
+
ZKDatabase db = mock(ZKDatabase.class);
when(db.append(any(Request.class))).thenReturn(true);
doAnswer(invocation -> {