diff --git a/pom.xml b/pom.xml index 6c7b6701eb..aa2de16943 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,8 @@ ratis-examples ratis-replicated-map - ratis-metrics + ratis-metrics-api + ratis-metrics-default ratis-tools ratis-shell ratis-assembly @@ -271,16 +272,21 @@ ${project.version} - ratis-metrics - org.apache.ratis - ${project.version} + ratis-metrics-api + org.apache.ratis + ${project.version} + + + ratis-metrics-default + org.apache.ratis + ${project.version} - ratis-metrics - org.apache.ratis - ${project.version} - test-jar - test + ratis-metrics-default + org.apache.ratis + ${project.version} + test-jar + test ratis-tools diff --git a/ratis-assembly/pom.xml b/ratis-assembly/pom.xml index 6cb0f0182c..588e2a84f7 100644 --- a/ratis-assembly/pom.xml +++ b/ratis-assembly/pom.xml @@ -291,7 +291,11 @@ org.apache.ratis - ratis-metrics + ratis-metrics-api + + + org.apache.ratis + ratis-metrics-default org.apache.ratis diff --git a/ratis-assembly/src/main/assembly/bin.xml b/ratis-assembly/src/main/assembly/bin.xml index 59462c322d..85c14fc33b 100644 --- a/ratis-assembly/src/main/assembly/bin.xml +++ b/ratis-assembly/src/main/assembly/bin.xml @@ -39,7 +39,8 @@ org.apache.ratis:ratis-server-api org.apache.ratis:ratis-server org.apache.ratis:ratis-test - org.apache.ratis:ratis-metrics + org.apache.ratis:ratis-metrics-api + org.apache.ratis:ratis-metrics-default org.apache.ratis:ratis-tools org.apache.ratis:ratis-resource-bundle diff --git a/ratis-assembly/src/main/assembly/src.xml b/ratis-assembly/src/main/assembly/src.xml index 4207472b2d..6b001af63c 100644 --- a/ratis-assembly/src/main/assembly/src.xml +++ b/ratis-assembly/src/main/assembly/src.xml @@ -42,7 +42,8 @@ org.apache.ratis:ratis-server org.apache.ratis:ratis-shell org.apache.ratis:ratis-test - org.apache.ratis:ratis-metrics + org.apache.ratis:ratis-metrics-api + org.apache.ratis:ratis-metrics-default org.apache.ratis:ratis-tools org.apache.ratis:ratis-resource-bundle diff --git a/ratis-examples/pom.xml b/ratis-examples/pom.xml index 7dae2e1cbc..9fa6c841b8 100644 --- a/ratis-examples/pom.xml +++ b/ratis-examples/pom.xml @@ -64,6 +64,11 @@ test-jar + + ratis-metrics-default + org.apache.ratis + + ratis-grpc org.apache.ratis diff --git a/ratis-metrics-api/pom.xml b/ratis-metrics-api/pom.xml new file mode 100644 index 0000000000..bb22fc5b16 --- /dev/null +++ b/ratis-metrics-api/pom.xml @@ -0,0 +1,38 @@ + + + + 4.0.0 + + ratis + org.apache.ratis + 3.0.0-SNAPSHOT + + + ratis-metrics-api + Apache Ratis Metrics API + + + + ratis-common + org.apache.ratis + + + + org.slf4j + slf4j-api + + + diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/LongCounter.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/LongCounter.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/LongCounter.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/LongCounter.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistries.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistries.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistries.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistries.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistriesLoader.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistriesLoader.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistriesLoader.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistriesLoader.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryFactory.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistryFactory.java similarity index 99% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryFactory.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistryFactory.java index 8f45deb2b6..deb15f3445 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryFactory.java +++ b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistryFactory.java @@ -1,5 +1,4 @@ -/** - * +/* * 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 @@ -16,8 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.ratis.metrics; /** diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java similarity index 69% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java index 70efac6272..8cf30a97f6 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java +++ b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java @@ -18,23 +18,25 @@ package org.apache.ratis.metrics; -import org.apache.ratis.thirdparty.com.codahale.metrics.MetricRegistry; +import org.apache.ratis.util.JavaUtils; +import org.apache.ratis.util.MemoizedSupplier; import java.util.Objects; +import java.util.function.Supplier; /** - * - * This class holds the name and description and JMX related context names for such group of - * metrics. + * This class holds the name, description and JMX related context names for such group of metrics. + *

+ * This class is immutable. */ public class MetricRegistryInfo { - private final String prefix; private final String metricsDescription; private final String metricsComponentName; - private final String fullName; private final String applicationName; + private final Supplier hash = MemoizedSupplier.valueOf(this::computeHash); + /** * @param prefix className or component name this metric registry collects metric for * @param applicationName application Name needs to be in small case as it is used for hadoop2metrics @@ -48,7 +50,6 @@ public MetricRegistryInfo(String prefix, String applicationName, String metricsC this.applicationName = applicationName; this.metricsComponentName = metricsComponentName; this.metricsDescription = metricsDescription; - this.fullName = MetricRegistry.name(applicationName, metricsComponentName, prefix); } public String getApplicationName() { @@ -79,21 +80,33 @@ public String getPrefix() { @Override public boolean equals(Object obj) { - if (obj instanceof MetricRegistryInfo) { - return this.hashCode() == obj.hashCode(); - } else { + if (this == obj) { + return true; + } else if (!(obj instanceof MetricRegistryInfo)) { return false; } + final MetricRegistryInfo that = (MetricRegistryInfo) obj; + return Objects.equals(prefix, that.prefix) + && Objects.equals(metricsDescription, that.metricsDescription) + && Objects.equals(metricsComponentName, that.metricsComponentName) + && Objects.equals(applicationName, that.applicationName); } @Override public int hashCode() { - return Objects.hash(prefix, metricsDescription, metricsComponentName); + return hash.get(); } - public String getName() { - return fullName; + private Integer computeHash() { + return Objects.hash(prefix, metricsDescription, metricsComponentName); } - + @Override + public String toString() { + return JavaUtils.getClassSimpleName(getClass()) + + ": applicationName=" + getApplicationName() + + ", metricsComponentName=" + getMetricsComponentName() + + ", prefix=" + getPrefix() + + ", metricsDescription=" + getMetricsDescription(); + } } diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetrics.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/RatisMetrics.java similarity index 93% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetrics.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/RatisMetrics.java index 7481394ee8..32bcf52e3c 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetrics.java +++ b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/RatisMetrics.java @@ -59,9 +59,7 @@ protected static > Map newTimerMap( protected static RatisMetricRegistry create(MetricRegistryInfo info) { Optional metricRegistry = MetricRegistries.global().get(info); return metricRegistry.orElseGet(() -> { - if (LOG.isDebugEnabled()) { - LOG.debug("Creating Metrics Registry : {}", info.getName()); - } + LOG.debug("Creating {}", info); return MetricRegistries.global().create(info); }); } @@ -74,9 +72,7 @@ protected RatisMetrics(RatisMetricRegistry registry) { public void unregister() { MetricRegistryInfo info = registry.getMetricRegistryInfo(); - if (LOG.isDebugEnabled()) { - LOG.debug("Unregistering Metrics Registry : {}", info.getName()); - } + LOG.debug("Unregistering {}", info); Optional metricRegistry = MetricRegistries.global().get(info); if (metricRegistry.isPresent()) { MetricRegistries.global().remove(info); diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/Timekeeper.java b/ratis-metrics-api/src/main/java/org/apache/ratis/metrics/Timekeeper.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/Timekeeper.java rename to ratis-metrics-api/src/main/java/org/apache/ratis/metrics/Timekeeper.java diff --git a/ratis-metrics/pom.xml b/ratis-metrics-default/pom.xml similarity index 88% rename from ratis-metrics/pom.xml rename to ratis-metrics-default/pom.xml index 96e8716521..178f892761 100644 --- a/ratis-metrics/pom.xml +++ b/ratis-metrics-default/pom.xml @@ -21,10 +21,14 @@ 3.0.0-SNAPSHOT - ratis-metrics - Apache Ratis Metrics + ratis-metrics-default + Apache Ratis Metrics Default Implementation + + ratis-metrics-api + org.apache.ratis + ratis-proto org.apache.ratis diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/DefaultTimekeeperImpl.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/DefaultTimekeeperImpl.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/DefaultTimekeeperImpl.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/DefaultTimekeeperImpl.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/JvmMetrics.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/JvmMetrics.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/JvmMetrics.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/JvmMetrics.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricsReporting.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/MetricsReporting.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricsReporting.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/MetricsReporting.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java similarity index 94% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java index 0de6bc02d7..4e8e58d474 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java +++ b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java @@ -32,6 +32,7 @@ import org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting; import java.util.Map; +import java.util.Objects; import java.util.SortedMap; import java.util.function.Supplier; @@ -49,13 +50,14 @@ static RatisMetricRegistryImpl cast(RatisMetricRegistry registry) { private final MetricRegistry metricRegistry = new MetricRegistry(); private final MetricRegistryInfo info; + private final String namePrefix; private JmxReporter jmxReporter; private ConsoleReporter consoleReporter; public RatisMetricRegistryImpl(MetricRegistryInfo info) { - super(); - this.info = info; + this.info = Objects.requireNonNull(info, "info == null"); + this.namePrefix = MetricRegistry.name(info.getApplicationName(), info.getMetricsComponentName(), info.getPrefix()); } @Override @@ -111,7 +113,7 @@ public Metric get(String shortName) { } private String getMetricName(String shortName) { - return MetricRegistry.name(info.getName(), shortName); + return MetricRegistry.name(namePrefix, shortName); } private T register(String name, T metric) throws IllegalArgumentException { diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisObjectNameFactory.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/RatisObjectNameFactory.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisObjectNameFactory.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/RatisObjectNameFactory.java diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RefCountingMap.java b/ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/RefCountingMap.java similarity index 100% rename from ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RefCountingMap.java rename to ratis-metrics-default/src/main/java/org/apache/ratis/metrics/impl/RefCountingMap.java diff --git a/ratis-metrics/src/main/resources/META-INF/services/org.apache.ratis.metrics.MetricRegistries b/ratis-metrics-default/src/main/resources/META-INF/services/org.apache.ratis.metrics.MetricRegistries similarity index 100% rename from ratis-metrics/src/main/resources/META-INF/services/org.apache.ratis.metrics.MetricRegistries rename to ratis-metrics-default/src/main/resources/META-INF/services/org.apache.ratis.metrics.MetricRegistries diff --git a/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestMetricRegistriesLoader.java b/ratis-metrics-default/src/test/java/org/apache/ratis/metrics/TestMetricRegistriesLoader.java similarity index 99% rename from ratis-metrics/src/test/java/org/apache/ratis/metrics/TestMetricRegistriesLoader.java rename to ratis-metrics-default/src/test/java/org/apache/ratis/metrics/TestMetricRegistriesLoader.java index 8429ded139..cbfa6810c6 100644 --- a/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestMetricRegistriesLoader.java +++ b/ratis-metrics-default/src/test/java/org/apache/ratis/metrics/TestMetricRegistriesLoader.java @@ -1,4 +1,4 @@ -/** +/* * 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 diff --git a/ratis-metrics/src/test/java/org/apache/ratis/metrics/impl/TestRefCountingMap.java b/ratis-metrics-default/src/test/java/org/apache/ratis/metrics/impl/TestRefCountingMap.java similarity index 100% rename from ratis-metrics/src/test/java/org/apache/ratis/metrics/impl/TestRefCountingMap.java rename to ratis-metrics-default/src/test/java/org/apache/ratis/metrics/impl/TestRefCountingMap.java diff --git a/ratis-metrics/src/test/resources/hadoop-metrics2.properties b/ratis-metrics/src/test/resources/hadoop-metrics2.properties deleted file mode 100644 index fdec0fad22..0000000000 --- a/ratis-metrics/src/test/resources/hadoop-metrics2.properties +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash -# -# 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. - -#There are two options with file names: -# 1. hadoop-metrics2-[prefix].properties -# 2. hadoop-metrics2.properties -# Either will be loaded by the metrics system (but not both). -# -# NOTE: The metrics system is only initialized once per JVM (but does ref-counting, so we can't -# shutdown and restart), so we only load the first prefix that we find. Generally, this will be -# ratis_log_service_metadata/ratis_log_service/ratis (unless someone else registers first, -# but for many clients, there should only be one). -# -# Usually, you would use hadoop-metrics2-phoenix.properties, but we use the generic -# hadoop-metrics2.properties to ensure it these are loaded regardless of where we are running, -# assuming there isn't another config on the classpath. - -# -# When specifying sinks, the syntax to use is: -# [prefix].[source|sink].[instance].[options] -# See javadoc of package-info.java for org.apache.hadoop.metrics2 for detail - -ratis_test.source.start_mbeans=true -ratis.sink.sink0.class=org.apache.ratis.metrics.TestHadoop2MetricsSink -#ratis_test.sink.ganglia.servers=localhost:8649 -#*.sink.graphite.class=org.apache.hadoop.metrics2.sink.GraphiteSink -#ratis_test.sink.graphite.server_host=localhost -#ratis_test.sink.graphite.server_port=2003 -# Frequency, in seconds, of sampling from the sources -*.period=1 diff --git a/ratis-server/pom.xml b/ratis-server/pom.xml index c145137f04..c1a433e139 100644 --- a/ratis-server/pom.xml +++ b/ratis-server/pom.xml @@ -82,15 +82,15 @@ org.apache.ratis - ratis-metrics + ratis-metrics-api org.apache.ratis - ratis-metrics - test-jar + ratis-metrics-default test + com.github.spotbugs spotbugs-annotations diff --git a/ratis-test/pom.xml b/ratis-test/pom.xml index ce05786a92..fcc751049c 100644 --- a/ratis-test/pom.xml +++ b/ratis-test/pom.xml @@ -54,6 +54,12 @@ test-jar + + ratis-metrics-default + org.apache.ratis + test + + ratis-netty org.apache.ratis diff --git a/ratis-grpc/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java b/ratis-test/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java similarity index 100% rename from ratis-grpc/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java rename to ratis-test/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java