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

szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new b931482  RATIS-702. Make metrics reporting implementation pluggable.  
Contributed by Marton Elek
b931482 is described below

commit b9314825150cce323b092e31c90620dc757111e3
Author: Tsz Wo Nicholas Sze <[email protected]>
AuthorDate: Thu Oct 17 11:45:56 2019 +0800

    RATIS-702. Make metrics reporting implementation pluggable.  Contributed by 
Marton Elek
---
 pom.xml                                            |  7 --
 .../main/java/org/apache/ratis/util/FileUtils.java | 19 +++--
 .../ratis/examples/filestore/cli/Server.java       | 12 ++-
 .../ratis/grpc/metrics/GrpcServerMetrics.java      | 13 +--
 .../metrics/LogServiceMetricsRegistry.java         |  7 --
 ratis-metrics/pom.xml                              | 11 ++-
 .../java/org/apache/ratis/metrics/JVMMetrics.java  | 35 ++++----
 .../org/apache/ratis/metrics/MetricRegistries.java | 19 ++++-
 .../org/apache/ratis/metrics/MetricsReporting.java | 97 +++++-----------------
 .../ratis/metrics/impl/MetricRegistriesImpl.java   | 32 ++++++-
 .../metrics/impl/MetricRegistryFactoryImpl.java    |  5 +-
 .../metrics/impl/RatisMetricRegistryImpl.java      |  4 -
 .../ratis/metrics/TestHadoop2MetricsAdaptor.java   | 75 -----------------
 .../ratis/metrics/TestHadoop2MetricsSink.java      | 42 ----------
 .../ratis/server/impl/RaftLeaderMetrics.java       |  2 +-
 .../apache/ratis/server/metrics/RatisMetrics.java  | 20 +----
 .../ratis/statemachine/impl/BaseStateMachine.java  |  2 +-
 .../impl/SimpleStateMachineStorage.java            |  4 +-
 18 files changed, 120 insertions(+), 286 deletions(-)

diff --git a/pom.xml b/pom.xml
index acb12a2..5dd1c93 100644
--- a/pom.xml
+++ b/pom.xml
@@ -203,8 +203,6 @@
 
     <!--metrics-->
     <dropwizard.version>3.2.5</dropwizard.version>
-    <dropwizard-metrics-hadoop-metrics2-reporter.version>0.1.2
-    </dropwizard-metrics-hadoop-metrics2-reporter.version>
   </properties>
 
   <dependencyManagement>
@@ -316,11 +314,6 @@
         <type>test-jar</type>
         <scope>test</scope>
       </dependency>
-      <dependency>
-        <groupId>com.github.joshelser</groupId>
-        <artifactId>dropwizard-metrics-hadoop-metrics2-reporter</artifactId>
-        
<version>${dropwizard-metrics-hadoop-metrics2-reporter.version}</version>
-      </dependency>
 
       <dependency>
         <artifactId>ratis-server</artifactId>
diff --git a/ratis-common/src/main/java/org/apache/ratis/util/FileUtils.java 
b/ratis-common/src/main/java/org/apache/ratis/util/FileUtils.java
index d7f722b..1033512 100644
--- a/ratis-common/src/main/java/org/apache/ratis/util/FileUtils.java
+++ b/ratis-common/src/main/java/org/apache/ratis/util/FileUtils.java
@@ -6,9 +6,9 @@
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
@@ -36,7 +36,8 @@ public interface FileUtils {
         () -> {
           try (FileOutputStream out = new FileOutputStream(f, true)) {
             out.getChannel().truncate(target);
-          }},
+          }
+        },
         () -> "FileOutputStream.getChannel().truncate " + f + " length: " + 
original + " -> " + target);
   }
 
@@ -66,12 +67,20 @@ public interface FileUtils {
         () -> "Files.move " + src + " to " + dst);
   }
 
-
   /** The same as passing f.toPath() to {@link #delete(Path)}. */
   static void deleteFile(File f) throws IOException {
     delete(f.toPath());
   }
 
+  /** The same as passing f.toPath() to {@link #delete(Path)}. */
+  static void deleteFileQuietly(File f) {
+    try {
+      delete(f.toPath());
+    } catch (Exception ex) {
+      LOG.debug("File delete was not susccesful {}", f.getAbsoluteFile(), ex);
+    }
+  }
+
   /**
    * Use {@link Files#delete(Path)} to delete the given path.
    *
diff --git 
a/ratis-examples/src/main/java/org/apache/ratis/examples/filestore/cli/Server.java
 
b/ratis-examples/src/main/java/org/apache/ratis/examples/filestore/cli/Server.java
index 0788e11..a08dfe4 100644
--- 
a/ratis-examples/src/main/java/org/apache/ratis/examples/filestore/cli/Server.java
+++ 
b/ratis-examples/src/main/java/org/apache/ratis/examples/filestore/cli/Server.java
@@ -25,6 +25,9 @@ import org.apache.ratis.examples.common.SubCommandBase;
 import org.apache.ratis.examples.filestore.FileStoreCommon;
 import org.apache.ratis.examples.filestore.FileStoreStateMachine;
 import org.apache.ratis.grpc.GrpcConfigKeys;
+import org.apache.ratis.metrics.JVMMetrics;
+import org.apache.ratis.metrics.MetricRegistries;
+import org.apache.ratis.metrics.MetricsReporting;
 import org.apache.ratis.protocol.RaftGroup;
 import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftPeer;
@@ -53,7 +56,6 @@ public class Server extends SubCommandBase {
   @Parameter(names = {"--storage", "-s"}, description = "Storage dir", 
required = true)
   private File storageDir;
 
-
   @Override
   public void run() throws Exception {
     RaftPeerId peerId = RaftPeerId.valueOf(id);
@@ -67,6 +69,11 @@ public class Server extends SubCommandBase {
     ConfUtils.setFile(properties::setFile, 
FileStoreCommon.STATEMACHINE_DIR_KEY,
         storageDir);
     StateMachine stateMachine = new FileStoreStateMachine(properties);
+    MetricRegistries registries = MetricRegistries.global();
+    JVMMetrics.addJvmMetrics(registries);
+
+    registries.addReporterRegistration(MetricsReporting.consoleReporter(10, 
TimeUnit.SECONDS));
+    registries.addReporterRegistration(MetricsReporting.jmxReporter());
 
     final RaftGroup raftGroup = 
RaftGroup.valueOf(RaftGroupId.valueOf(ByteString.copyFromUtf8(raftGroupId)), 
peers);
     RaftServer raftServer = RaftServer.newBuilder()
@@ -74,9 +81,10 @@ public class Server extends SubCommandBase {
         .setStateMachine(stateMachine).setProperties(properties)
         .setGroup(raftGroup)
         .build();
+
     raftServer.start();
 
-    for(; raftServer.getLifeCycleState() != LifeCycle.State.CLOSED;) {
+    for (; raftServer.getLifeCycleState() != LifeCycle.State.CLOSED; ) {
       TimeUnit.SECONDS.sleep(1);
     }
   }
diff --git 
a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java 
b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java
index 75da000..fcbd053 100644
--- 
a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java
+++ 
b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java
@@ -18,20 +18,16 @@
 package org.apache.ratis.grpc.metrics;
 
 import java.util.Optional;
-import java.util.concurrent.TimeUnit;
 
-import org.apache.ratis.metrics.JVMMetrics;
 import org.apache.ratis.metrics.MetricRegistries;
 import org.apache.ratis.metrics.MetricRegistryInfo;
-import org.apache.ratis.metrics.MetricsReporting;
 import org.apache.ratis.metrics.RatisMetricRegistry;
+import 
org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting;
 
 import com.codahale.metrics.Timer;
-import com.google.common.annotations.VisibleForTesting;
 
 public class GrpcServerMetrics {
   private final RatisMetricRegistry registry;
-  private static MetricsReporting metricsReporting = new MetricsReporting(500, 
TimeUnit.MILLISECONDS);
 
   private static final String RATIS_GRPC_METRICS_APP_NAME = "ratis_grpc";
   private static final String RATIS_GRPC_METRICS_COMP_NAME = "log_appender";
@@ -54,11 +50,6 @@ public class GrpcServerMetrics {
     Optional<RatisMetricRegistry> metricRegistry = 
MetricRegistries.global().get(info);
 
     registry = metricRegistry.orElseGet(() -> 
MetricRegistries.global().create(info));
-
-    metricsReporting.startMetricsReporter(registry, 
MetricsReporting.MetricReporterType.JMX,
-            MetricsReporting.MetricReporterType.HADOOP2);
-    // JVM metrics
-    JVMMetrics.startJVMReporting(1000, TimeUnit.MILLISECONDS, 
MetricsReporting.MetricReporterType.JMX);
   }
 
   public Timer getGrpcLogAppenderLatencyTimer(String follower) {
@@ -78,7 +69,7 @@ public class GrpcServerMetrics {
   }
 
   public void onRequestNotLeader(String follower) {
-      
registry.counter(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_NOT_LEADER, 
follower)).inc();
+    registry.counter(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_NOT_LEADER, 
follower)).inc();
   }
 
   public void onRequestInconsistency(String follower) {
diff --git 
a/ratis-logservice/src/main/java/org/apache/ratis/logservice/metrics/LogServiceMetricsRegistry.java
 
b/ratis-logservice/src/main/java/org/apache/ratis/logservice/metrics/LogServiceMetricsRegistry.java
index 08314f2..8172e40 100644
--- 
a/ratis-logservice/src/main/java/org/apache/ratis/logservice/metrics/LogServiceMetricsRegistry.java
+++ 
b/ratis-logservice/src/main/java/org/apache/ratis/logservice/metrics/LogServiceMetricsRegistry.java
@@ -18,11 +18,8 @@
 
 package org.apache.ratis.logservice.metrics;
 
-import java.util.concurrent.TimeUnit;
-
 import org.apache.ratis.metrics.MetricRegistries;
 import org.apache.ratis.metrics.MetricRegistryInfo;
-import org.apache.ratis.metrics.MetricsReporting;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 
 public class LogServiceMetricsRegistry {
@@ -32,7 +29,6 @@ public class LogServiceMetricsRegistry {
   public static final String RATIS_LOG_SERVICE_META_DATA_METRICS = 
"metadata_statemachine";
   public static final String RATIS_LOG_SERVICE_META_DATA_METRICS_DESC =
       "Ratis log service metadata metrics";
-  static MetricsReporting metricsReporting = new MetricsReporting(500, 
TimeUnit.MILLISECONDS);
 
   public static RatisMetricRegistry createMetricRegistryForLogService(String 
logName,
       String serverId) {
@@ -59,9 +55,6 @@ public class LogServiceMetricsRegistry {
 
   private static RatisMetricRegistry create(MetricRegistryInfo info) {
     RatisMetricRegistry registry = MetricRegistries.global().create(info);
-    metricsReporting
-        .startMetricsReporter(registry, 
MetricsReporting.MetricReporterType.JMX,
-            MetricsReporting.MetricReporterType.HADOOP2);
     return registry;
   }
 
diff --git a/ratis-metrics/pom.xml b/ratis-metrics/pom.xml
index 40eb2b1..4ff3d6c 100644
--- a/ratis-metrics/pom.xml
+++ b/ratis-metrics/pom.xml
@@ -12,7 +12,8 @@
   See the License for the specific language governing permissions and
   limitations under the License. See accompanying LICENSE file.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <artifactId>ratis</artifactId>
@@ -44,7 +45,7 @@
     </dependency>
     <dependency>
       <artifactId>ratis-common</artifactId>
-       <groupId>org.apache.ratis</groupId>
+      <groupId>org.apache.ratis</groupId>
     </dependency>
     <dependency>
       <groupId>io.dropwizard.metrics</groupId>
@@ -57,12 +58,9 @@
       <type>test-jar</type>
     </dependency>
     <dependency>
-      <groupId>com.github.joshelser</groupId>
-      <artifactId>dropwizard-metrics-hadoop-metrics2-reporter</artifactId>
-    </dependency>
-    <dependency>
       <groupId>io.dropwizard.metrics</groupId>
       <artifactId>metrics-jvm</artifactId>
+      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>io.dropwizard.metrics</groupId>
@@ -73,6 +71,7 @@
           <artifactId>oncrpc</artifactId>
         </exclusion>
       </exclusions>
+      <optional>true</optional>
     </dependency>
   </dependencies>
 </project>
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/JVMMetrics.java 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/JVMMetrics.java
index ba387fc..4d76ed6 100644
--- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/JVMMetrics.java
+++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/JVMMetrics.java
@@ -6,9 +6,9 @@
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
@@ -17,30 +17,27 @@
  */
 package org.apache.ratis.metrics;
 
-import java.util.concurrent.TimeUnit;
-
 import com.codahale.metrics.jvm.ClassLoadingGaugeSet;
 import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
 import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
 import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
 
-public class JVMMetrics {
-  static MetricRegistryInfo info = new MetricRegistryInfo("jvm", "ratis_jvm", 
"jvm", "jvm metrics");
-  static RatisMetricRegistry registry = MetricRegistries.global().create(info);
-  static {
+/**
+ * Helper class to add JVM metrics.
+ */
+public final class JVMMetrics {
+
+  private JVMMetrics() {
+  }
+
+  public static void addJvmMetrics(MetricRegistries registries) {
+    MetricRegistryInfo info = new MetricRegistryInfo("jvm", "ratis_jvm", 
"jvm", "jvm metrics");
+
+    RatisMetricRegistry registry = registries.create(info);
+
     registry.registerAll("gc", new GarbageCollectorMetricSet());
     registry.registerAll("memory", new MemoryUsageGaugeSet());
     registry.registerAll("threads", new ThreadStatesGaugeSet());
     registry.registerAll("classLoading", new ClassLoadingGaugeSet());
   }
-
-  public static RatisMetricRegistry getRegistry() {
-    return registry;
-  }
-
-  public static void startJVMReporting(long period, TimeUnit unit,
-      MetricsReporting.MetricReporterType... reporting){
-    MetricsReporting metricsReporting = new MetricsReporting(period,unit);
-    metricsReporting.startMetricsReporter(getRegistry(), reporting);
-  }
 }
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistries.java 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistries.java
index a9ea10e..78d149b 100644
--- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistries.java
+++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistries.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
@@ -7,9 +6,9 @@
  * 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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.
@@ -22,6 +21,7 @@ package org.apache.ratis.metrics;
 import java.util.Collection;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Consumer;
 
 /**
  * MetricRegistries is collection of MetricRegistry's. MetricsRegistries 
implementations should do
@@ -35,6 +35,7 @@ public abstract class MetricRegistries {
 
   /**
    * Return the global singleton instance for the MetricRegistries.
+   *
    * @return MetricRegistries implementation.
    */
   public static MetricRegistries global() {
@@ -50,6 +51,7 @@ public abstract class MetricRegistries {
    * Create or return MetricRegistry with the given info. MetricRegistry will 
only be created
    * if current reference count is 0. Otherwise ref counted is incremented, 
and an existing instance
    * will be returned.
+   *
    * @param info the info object for the MetricRegistrytry.
    * @return created or existing MetricRegistry.
    */
@@ -57,6 +59,7 @@ public abstract class MetricRegistries {
 
   /**
    * Decrements the ref count of the MetricRegistry, and removes if ref count 
== 0.
+   *
    * @param key the info object for the MetricRegistrytry.
    * @return true if metric registry is removed.
    */
@@ -64,6 +67,7 @@ public abstract class MetricRegistries {
 
   /**
    * Returns the MetricRegistry if found.
+   *
    * @param info the info for the registry.
    * @return a MetricRegistry optional.
    */
@@ -71,13 +75,22 @@ public abstract class MetricRegistries {
 
   /**
    * Returns MetricRegistryInfo's for the MetricRegistry's created.
+   *
    * @return MetricRegistryInfo's for the MetricRegistry's created.
    */
   public abstract Set<MetricRegistryInfo> getMetricRegistryInfos();
 
   /**
    * Returns MetricRegistry's created.
+   *
    * @return MetricRegistry's created.
    */
   public abstract Collection<RatisMetricRegistry> getMetricRegistries();
+
+  /**
+   * Add hook to register reporter for the metricRegistry.
+   *
+   * @param reporterRegistration Consumer to create the reporter for the 
registry.
+   */
+  public abstract void addReporterRegistration(Consumer<RatisMetricRegistry> 
reporterRegistration);
 }
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java
index 666bfc2..b35a4b2 100644
--- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java
+++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java
@@ -6,9 +6,9 @@
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
@@ -17,93 +17,34 @@
  */
 package org.apache.ratis.metrics;
 
-import java.io.IOException;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
 
 import com.codahale.metrics.ConsoleReporter;
 import com.codahale.metrics.JmxReporter;
-import com.codahale.metrics.MetricRegistry;
-import com.codahale.metrics.ganglia.GangliaReporter;
-import com.github.joshelser.dropwizard.metrics.hadoop.HadoopMetrics2Reporter;
-import info.ganglia.gmetric4j.gmetric.GMetric;
-import org.apache.hadoop.metrics2.MetricsSystem;
-import org.apache.hadoop.metrics2.impl.MetricsSystemImpl;
-import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
+import com.codahale.metrics.JmxReporter.Builder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class MetricsReporting {
+public final class MetricsReporting {
   public static final Logger LOG = 
LoggerFactory.getLogger(MetricsReporting.class);
-  private TimeUnit unit;
-  private long period;
-  private static RatisMetricRegistry jvmRegistry;
-  private GMetric ganglia;
-  static{
-    DefaultMetricsSystem.initialize("ratis");
-  }
 
-  public enum MetricReporterType {
-    JMX, HADOOP2, CONSOLE, GANGLIA
+  private MetricsReporting() {
   }
 
-  public MetricsReporting(long period, TimeUnit unit) {
-    this.period = period;
-    this.unit = unit;
+  public static Consumer<RatisMetricRegistry> consoleReporter(int period, 
TimeUnit unit) {
+    return ratisMetricRegistry -> 
ConsoleReporter.forRegistry(ratisMetricRegistry.getDropWizardMetricRegistry())
+        
.convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build()
+        .start(period, unit);
   }
 
-  public void configureGanglia(String host, int port) throws IOException {
-    ganglia = new GMetric(host, port, GMetric.UDPAddressingMode.MULTICAST, 1);
-
-  }
-
-  /**
-   * @param registry
-   * @param reporting
-   * @return
-   */
-  public boolean startMetricsReporter(RatisMetricRegistry registry, 
MetricReporterType... reporting) {
-
-    MetricRegistry dropWizardRegistry = registry.getDropWizardMetricRegistry();
-    for (MetricReporterType reporter : reporting) {
-      try {
-        switch (reporter) {
-        case CONSOLE:
-          ConsoleReporter.forRegistry(dropWizardRegistry)
-              
.convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build()
-              .start(period, unit);
-          break;
-        case JMX:
-          JmxReporter.Builder builder =
-              JmxReporter.forRegistry(dropWizardRegistry);
-          
builder.inDomain(registry.getMetricRegistryInfo().getApplicationName());
-          builder.build().start();
-          break;
-        case HADOOP2:
-          MetricRegistryInfo info = registry.getMetricRegistryInfo();
-          HadoopMetrics2Reporter.forRegistry(dropWizardRegistry)
-              .build(DefaultMetricsSystem.instance(), info.getName(), 
info.getMetricsDescription(),
-                  info.getMetricsComponentName()).start(period, unit);
-          break;
-        case GANGLIA:
-          if (ganglia == null) {
-            throw new IllegalStateException(
-                "Ganglia is not configured!! please configure it first by "
-                    + "using MetricReporting#configureGanglia..");
-          }
-          GangliaReporter.forRegistry(dropWizardRegistry)
-              .convertRatesTo(TimeUnit.SECONDS)
-              .convertDurationsTo(TimeUnit.MILLISECONDS)
-              .build(ganglia);
-          break;
-        default:
-          LOG.warn("Unhandled reporter, " + reporter + " provided.");
-          return false;
-        }
-      } catch (Exception e) {
-        return false;
-      }
-    }
-    return true;
+  public static Consumer<RatisMetricRegistry> jmxReporter() {
+    return registry -> {
+      Builder builder =
+          JmxReporter.forRegistry(registry.getDropWizardMetricRegistry());
+      builder.inDomain(registry.getMetricRegistryInfo().getApplicationName());
+      builder.build().start();
+    };
   }
+}
 
-}
\ No newline at end of file
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java
 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java
index ec3df20..002ee15 100644
--- 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java
+++ 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.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
@@ -7,9 +6,9 @@
  * 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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.
@@ -18,21 +17,32 @@
  */
 package org.apache.ratis.metrics.impl;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Consumer;
 
 import org.apache.ratis.metrics.MetricRegistries;
 import org.apache.ratis.metrics.MetricRegistryFactory;
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Implementation of MetricRegistries that does ref-counting.
  */
 public class MetricRegistriesImpl extends MetricRegistries {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(MetricRegistriesImpl.class);
+
+  private List<Consumer<RatisMetricRegistry>> reporterRegistrations = new 
ArrayList<>();
+
   private final MetricRegistryFactory factory;
+
   private final RefCountingMap<MetricRegistryInfo, RatisMetricRegistry> 
registries;
 
   public MetricRegistriesImpl() {
@@ -46,7 +56,16 @@ public class MetricRegistriesImpl extends MetricRegistries {
 
   @Override
   public RatisMetricRegistry create(MetricRegistryInfo info) {
-    return registries.put(info, () -> factory.create(info));
+    return registries.put(info, () -> {
+      if (reporterRegistrations.size() == 0) {
+        LOG.warn(
+            "First MetricRegistry has been created without registering 
reporters. You may need to call" +
+                " MetricRegistries.global().addReportRegistration(...) 
before.");
+      }
+      RatisMetricRegistry registry = factory.create(info);
+      reporterRegistrations.forEach(reg -> reg.accept(registry));
+      return registry;
+    });
   }
 
   @Override
@@ -73,4 +92,9 @@ public class MetricRegistriesImpl extends MetricRegistries {
   public Set<MetricRegistryInfo> getMetricRegistryInfos() {
     return Collections.unmodifiableSet(registries.keySet());
   }
+
+  @Override
+  public void addReporterRegistration(Consumer<RatisMetricRegistry> 
reporterRegistration) {
+    this.reporterRegistrations.add(reporterRegistration);
+  }
 }
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java
 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java
index 822f865..ae33e62 100644
--- 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java
+++ 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.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
@@ -7,9 +6,9 @@
  * 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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.
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java
 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java
index 69fedf4..a2575d5 100644
--- 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java
+++ 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java
@@ -30,10 +30,6 @@ import com.codahale.metrics.MetricRegistry;
 import com.codahale.metrics.MetricRegistry.MetricSupplier;
 import com.codahale.metrics.MetricSet;
 import com.codahale.metrics.Timer;
-import com.codahale.metrics.jvm.ClassLoadingGaugeSet;
-import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
-import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
-import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import 
org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting;
diff --git 
a/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestHadoop2MetricsAdaptor.java
 
b/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestHadoop2MetricsAdaptor.java
deleted file mode 100644
index 99381ed..0000000
--- 
a/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestHadoop2MetricsAdaptor.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * 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.ratis.metrics;
-
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import com.codahale.metrics.Counter;
-import org.apache.hadoop.metrics2.AbstractMetric;
-import org.junit.Test;
-
-public class TestHadoop2MetricsAdaptor {
-
-  @Test public void testMetrics() throws InterruptedException {
-    MetricRegistryInfo info =
-        new MetricRegistryInfo(TestHadoop2MetricsAdaptor.class.getName(), 
"ratis_test",
-            "test","ratis test metrics");
-    RatisMetricRegistry registry = MetricRegistries.global().create(info);
-    MetricsReporting metricsReporting = new MetricsReporting(500, 
TimeUnit.MILLISECONDS);
-    metricsReporting
-        .startMetricsReporter(registry, 
MetricsReporting.MetricReporterType.HADOOP2);
-    Counter counter = registry.counter("test");
-    counter.inc();
-    counter.inc();
-    counter.inc();
-    counter.dec();
-    int count = 0;
-    Map<String, Long> expectedMetrics = new HashMap<String, Long>();
-    
expectedMetrics.put("org.apache.ratis.metrics.TestHadoop2MetricsAdaptor.ratis_test.test",
 2L);
-    Thread.sleep(1000);
-    boolean result=false;
-    while ( count < 10) {
-      if(TestHadoop2MetricsSink.metrics != null) {
-        result = verifyMetric(expectedMetrics);
-        if (result) {
-          break;
-        }
-      }
-      Thread.sleep(1000);
-      count++;
-    } assertTrue(result);
-  }
-
-  public boolean verifyMetric(Map<String, Long> expectedMetrics) {
-    for (AbstractMetric metric : TestHadoop2MetricsSink.metrics) {
-      if (expectedMetrics.containsKey(metric.name())) {
-        long expectedValue = expectedMetrics.get(metric.name());
-        long actualValue = metric.value().longValue();
-        if (expectedValue != actualValue) {
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-}
diff --git 
a/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestHadoop2MetricsSink.java
 
b/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestHadoop2MetricsSink.java
deleted file mode 100644
index 270b227..0000000
--- 
a/ratis-metrics/src/test/java/org/apache/ratis/metrics/TestHadoop2MetricsSink.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * 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.ratis.metrics;
-
-import org.apache.commons.configuration.SubsetConfiguration;
-import org.apache.hadoop.metrics2.AbstractMetric;
-import org.apache.hadoop.metrics2.MetricsRecord;
-import org.apache.hadoop.metrics2.MetricsSink;
-
-public class TestHadoop2MetricsSink implements MetricsSink {
-
-  public static final String RATIS_METRICS_RECORD_NAME = "test";
-  static Object lock = new Object();
-  static Iterable<AbstractMetric> metrics;
-
-  @Override public void putMetrics(MetricsRecord metricsRecord) {
-    if (metricsRecord.name().equals(RATIS_METRICS_RECORD_NAME)) {
-        TestHadoop2MetricsSink.metrics = metricsRecord.metrics();
-    }
-  }
-
-  @Override public void flush() {
-  }
-
-  @Override public void init(SubsetConfiguration subsetConfiguration) {
-  }
-}
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftLeaderMetrics.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftLeaderMetrics.java
index 04b6895..44f6b2f 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftLeaderMetrics.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftLeaderMetrics.java
@@ -26,10 +26,10 @@ import java.util.Map;
 import java.util.SortedMap;
 
 import com.codahale.metrics.Gauge;
-import com.google.common.annotations.VisibleForTesting;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.protocol.RaftPeer;
 import org.apache.ratis.server.metrics.RatisMetrics;
+import 
org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting;
 import org.apache.ratis.util.Preconditions;
 
 /**
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java
index 2877351..e2dc55f 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java
@@ -19,18 +19,15 @@
 package org.apache.ratis.server.metrics;
 
 import java.util.Optional;
-import java.util.concurrent.TimeUnit;
 
 import org.apache.ratis.metrics.MetricRegistries;
 import org.apache.ratis.metrics.MetricRegistryInfo;
-import org.apache.ratis.metrics.JVMMetrics;
-import org.apache.ratis.metrics.MetricsReporting;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 
 public class RatisMetrics {
-  public final static String RATIS_LOG_WORKER_METRICS_DESC = "Ratis metrics";
-  public final static String RATIS_LOG_WORKER_METRICS = "ratis_log_worker";
-  public final static String RATIS_APPLICATION_NAME_METRICS = "ratis_core";
+  public static final String RATIS_LOG_WORKER_METRICS_DESC = "Ratis metrics";
+  public static final String RATIS_LOG_WORKER_METRICS = "ratis_log_worker";
+  public static final String RATIS_APPLICATION_NAME_METRICS = "ratis_core";
   public static final String RATIS_LEADER_ELECTION_METRICS = "leader_election";
   public static final String RATIS_LEADER_ELECTION_METRICS_DESC = "Metrics for 
Ratis Leader Election.";
   public static final String RATIS_LEADER_METRICS = "ratis_leader";
@@ -40,27 +37,18 @@ public class RatisMetrics {
   public static final String RATIS_SERVER_METRICS = "server";
   public static final String RATIS_SERVER_METRICS_DESC = "Metrics for Raft 
server";
 
-  static MetricsReporting metricsReporting = new MetricsReporting(500, 
TimeUnit.MILLISECONDS);
-
   private static RatisMetricRegistry create(MetricRegistryInfo info) {
     Optional<RatisMetricRegistry> metricRegistry = 
MetricRegistries.global().get(info);
     if (metricRegistry.isPresent()) {
       return metricRegistry.get();
     }
     RatisMetricRegistry registry = MetricRegistries.global().create(info);
-    metricsReporting
-        .startMetricsReporter(registry, 
MetricsReporting.MetricReporterType.JMX,
-            MetricsReporting.MetricReporterType.HADOOP2);
-    // JVM metrics
-    JVMMetrics
-        .startJVMReporting(1000, TimeUnit.MILLISECONDS, 
MetricsReporting.MetricReporterType.JMX);
-
     return registry;
   }
 
   public static RatisMetricRegistry getMetricRegistryForLeaderElection(String 
serverId) {
     return create(new MetricRegistryInfo(serverId, 
RATIS_APPLICATION_NAME_METRICS, RATIS_LEADER_ELECTION_METRICS,
-            RATIS_LEADER_ELECTION_METRICS_DESC));
+        RATIS_LEADER_ELECTION_METRICS_DESC));
   }
 
   public static RatisMetricRegistry getMetricRegistryForRaftLeader(String 
serverId) {
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
 
b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
index 57d88e1..156a698 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
@@ -19,7 +19,6 @@
 package org.apache.ratis.statemachine.impl;
 
 import com.codahale.metrics.Timer;
-import com.google.common.annotations.VisibleForTesting;
 import org.apache.ratis.protocol.Message;
 import org.apache.ratis.protocol.RaftClientRequest;
 import org.apache.ratis.protocol.RaftGroupId;
@@ -32,6 +31,7 @@ import org.apache.ratis.statemachine.SnapshotInfo;
 import org.apache.ratis.statemachine.StateMachine;
 import org.apache.ratis.statemachine.StateMachineStorage;
 import org.apache.ratis.statemachine.TransactionContext;
+import 
org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting;
 import org.apache.ratis.util.LifeCycle;
 import org.apache.ratis.util.Preconditions;
 
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java
 
b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java
index af5b0b5..db60f42 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java
@@ -17,7 +17,6 @@
  */
 package org.apache.ratis.statemachine.impl;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.ratis.io.MD5Hash;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.storage.FileInfo;
@@ -25,6 +24,7 @@ import org.apache.ratis.server.storage.RaftStorage;
 import org.apache.ratis.statemachine.StateMachineStorage;
 import 
org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting;
 import org.apache.ratis.util.AtomicFileOutputStream;
+import org.apache.ratis.util.FileUtils;
 import org.apache.ratis.util.MD5FileUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -97,7 +97,7 @@ public class SimpleStateMachineStorage implements 
StateMachineStorage {
             .collect(Collectors.toList());
         for (File snapshotFile : snapshotFilesToBeCleaned) {
           LOG.info("Deleting old snapshot at {}", 
snapshotFile.getAbsolutePath());
-          FileUtils.deleteQuietly(snapshotFile);
+          FileUtils.deleteFileQuietly(snapshotFile);
         }
       }
     }

Reply via email to