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);
}
}
}