diff --git a/pom.xml b/pom.xml index 2811e0dfa06..34e0855fa5b 100644 --- a/pom.xml +++ b/pom.xml @@ -574,6 +574,7 @@ 2.17.0 0.25.4 3.5.1 + 1.4.2 4.4.1 3.7.0.1746 @@ -780,6 +781,11 @@ dnsjava ${dnsjava.version} + + com.tngtech.archunit + archunit-junit5 + ${archunit.version} + diff --git a/zookeeper-server/pom.xml b/zookeeper-server/pom.xml index f4b76095d2e..2fc4f247a32 100644 --- a/zookeeper-server/pom.xml +++ b/zookeeper-server/pom.xml @@ -180,6 +180,11 @@ tools test + + com.tngtech.archunit + archunit-junit5 + test + org.xerial.snappy snappy-java 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 dab8446472e..d189a8785fc 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 00000000000..486b5a434c3 --- /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. + * + *

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("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 db24797180b..7b2b8e72a5e 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 3b15e0cca35..b084bf2fe9b 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 8ca33f798c7..e3f05fd18a9 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 -> {