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

anmolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 508e473d9 ZOOKEEPER-4324: dropwizard-metrics should be optional
508e473d9 is described below

commit 508e473d9b0242059ac8c566b2db13afbd4408ed
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
---
 .../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 dab844647..d189a8785 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 8ca33f798..e3f05fd18 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 -> {

Reply via email to