This is an automated email from the ASF dual-hosted git repository. leesf pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-hudi.git
The following commit(s) were added to refs/heads/master by this push: new 0b52ae3 [HUDI-209] Implement JMX metrics reporter (#1045) 0b52ae3 is described below commit 0b52ae3ac2685c5afa7821d663854b526b5a1cff Author: ForwardXu <forwardxu...@gmail.com> AuthorDate: Thu Nov 28 19:17:34 2019 +0800 [HUDI-209] Implement JMX metrics reporter (#1045) --- .../apache/hudi/config/HoodieMetricsConfig.java | 8 ++ .../org/apache/hudi/config/HoodieWriteConfig.java | 8 ++ .../apache/hudi/metrics/JmxMetricsReporter.java | 85 ++++++++++++++++++++++ .../hudi/metrics/MetricsReporterFactory.java | 3 + .../apache/hudi/metrics/MetricsReporterType.java | 2 +- ...oodieMetrics.java => TestHoodieJmxMetrics.java} | 28 ++++--- .../org/apache/hudi/metrics/TestHoodieMetrics.java | 4 +- pom.xml | 2 +- 8 files changed, 123 insertions(+), 17 deletions(-) diff --git a/hudi-client/src/main/java/org/apache/hudi/config/HoodieMetricsConfig.java b/hudi-client/src/main/java/org/apache/hudi/config/HoodieMetricsConfig.java index 8b911e8..4bb8a3f 100644 --- a/hudi-client/src/main/java/org/apache/hudi/config/HoodieMetricsConfig.java +++ b/hudi-client/src/main/java/org/apache/hudi/config/HoodieMetricsConfig.java @@ -47,6 +47,14 @@ public class HoodieMetricsConfig extends DefaultHoodieConfig { public static final String GRAPHITE_SERVER_PORT = GRAPHITE_PREFIX + ".port"; public static final int DEFAULT_GRAPHITE_SERVER_PORT = 4756; + // Jmx + public static final String JMX_PREFIX = METRIC_PREFIX + ".jmx"; + public static final String JMX_HOST = JMX_PREFIX + ".host"; + public static final String DEFAULT_JMX_HOST = "localhost"; + + public static final String JMX_PORT = JMX_PREFIX + ".port"; + public static final int DEFAULT_JMX_PORT = 9889; + public static final String GRAPHITE_METRIC_PREFIX = GRAPHITE_PREFIX + ".metric.prefix"; private HoodieMetricsConfig(Properties props) { diff --git a/hudi-client/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java b/hudi-client/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java index 05c8406..3743116 100644 --- a/hudi-client/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java +++ b/hudi-client/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java @@ -474,6 +474,14 @@ public class HoodieWriteConfig extends DefaultHoodieConfig { return props.getProperty(HoodieMetricsConfig.GRAPHITE_METRIC_PREFIX); } + public String getJmxHost() { + return props.getProperty(HoodieMetricsConfig.JMX_HOST); + } + + public int getJmxPort() { + return Integer.parseInt(props.getProperty(HoodieMetricsConfig.JMX_PORT)); + } + /** * memory configs */ diff --git a/hudi-client/src/main/java/org/apache/hudi/metrics/JmxMetricsReporter.java b/hudi-client/src/main/java/org/apache/hudi/metrics/JmxMetricsReporter.java new file mode 100644 index 0000000..7bc73d2 --- /dev/null +++ b/hudi-client/src/main/java/org/apache/hudi/metrics/JmxMetricsReporter.java @@ -0,0 +1,85 @@ +/* + * 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.hudi.metrics; + +import com.google.common.base.Preconditions; +import java.io.Closeable; + +import java.lang.management.ManagementFactory; +import java.rmi.registry.LocateRegistry; +import javax.management.remote.JMXConnectorServer; +import javax.management.remote.JMXConnectorServerFactory; +import javax.management.remote.JMXServiceURL; +import org.apache.hudi.config.HoodieWriteConfig; +import org.apache.hudi.exception.HoodieException; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; + +/** + * Implementation of Jmx reporter, which used to report jmx metric. + */ +public class JmxMetricsReporter extends MetricsReporter { + + private static Logger logger = LogManager.getLogger(JmxMetricsReporter.class); + private final JMXConnectorServer connector; + private String host; + private int port; + + public JmxMetricsReporter(HoodieWriteConfig config) { + try { + // Check the host and port here + this.host = config.getJmxHost(); + this.port = config.getJmxPort(); + if (host == null || port == 0) { + throw new RuntimeException( + String.format("Jmx cannot be initialized with host[%s] and port[%s].", + host, port)); + } + LocateRegistry.createRegistry(port); + String serviceUrl = + "service:jmx:rmi://" + host + ":" + port + "/jndi/rmi://" + host + ":" + port + "/jmxrmi"; + JMXServiceURL url = new JMXServiceURL(serviceUrl); + this.connector = JMXConnectorServerFactory + .newJMXConnectorServer(url, null, ManagementFactory.getPlatformMBeanServer()); + } catch (Exception e) { + String msg = "Jmx initialize failed: "; + logger.error(msg, e); + throw new HoodieException(msg, e); + } + } + + @Override + public void start() { + try { + Preconditions.checkNotNull(connector, "Cannot start as the jmxReporter is null."); + connector.start(); + } catch (Exception e) { + throw new HoodieException(e); + } + } + + @Override + public void report() { + } + + @Override + public Closeable getReporter() { + return null; + } +} diff --git a/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java b/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java index 195d147..962abd4 100644 --- a/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java +++ b/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java @@ -41,6 +41,9 @@ public class MetricsReporterFactory { case INMEMORY: reporter = new InMemoryMetricsReporter(); break; + case JMX: + reporter = new JmxMetricsReporter(config); + break; default: logger.error("Reporter type[" + type + "] is not supported."); break; diff --git a/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterType.java b/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterType.java index 6d7ccd3..eeec289 100644 --- a/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterType.java +++ b/hudi-client/src/main/java/org/apache/hudi/metrics/MetricsReporterType.java @@ -22,5 +22,5 @@ package org.apache.hudi.metrics; * Types of the reporter. Right now we only support Graphite. We can include JMX and CSV in the future. */ public enum MetricsReporterType { - GRAPHITE, INMEMORY + GRAPHITE, INMEMORY, JMX } diff --git a/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java b/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieJmxMetrics.java similarity index 71% copy from hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java copy to hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieJmxMetrics.java index e69afb8..7260774 100644 --- a/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java +++ b/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieJmxMetrics.java @@ -18,31 +18,35 @@ package org.apache.hudi.metrics; -import org.apache.hudi.config.HoodieWriteConfig; - -import org.junit.Before; -import org.junit.Test; - import static org.apache.hudi.metrics.Metrics.registerGauge; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class TestHoodieMetrics { +import org.apache.hudi.config.HoodieMetricsConfig; +import org.apache.hudi.config.HoodieWriteConfig; + +import org.junit.Test; - private HoodieMetrics metrics = null; +/** + * Test for the Jmx metrics report. + */ +public class TestHoodieJmxMetrics extends TestHoodieMetrics { - @Before + @Override public void start() { HoodieWriteConfig config = mock(HoodieWriteConfig.class); when(config.isMetricsOn()).thenReturn(true); - when(config.getMetricsReporterType()).thenReturn(MetricsReporterType.INMEMORY); - metrics = new HoodieMetrics(config, "raw_table"); + when(config.getMetricsReporterType()).thenReturn(MetricsReporterType.JMX); + when(config.getJmxHost()).thenReturn(HoodieMetricsConfig.DEFAULT_JMX_HOST); + when(config.getJmxPort()).thenReturn(HoodieMetricsConfig.DEFAULT_JMX_PORT); + new HoodieMetrics(config, "raw_table"); } @Test public void testRegisterGauge() { - registerGauge("metric1", 123L); - assertTrue(Metrics.getInstance().getRegistry().getGauges().get("metric1").getValue().toString().equals("123")); + registerGauge("jmx_metric", 123L); + assertTrue(Metrics.getInstance().getRegistry().getGauges() + .get("jmx_metric").getValue().toString().equals("123")); } } diff --git a/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java b/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java index e69afb8..058c7b9 100644 --- a/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java +++ b/hudi-client/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java @@ -30,14 +30,12 @@ import static org.mockito.Mockito.when; public class TestHoodieMetrics { - private HoodieMetrics metrics = null; - @Before public void start() { HoodieWriteConfig config = mock(HoodieWriteConfig.class); when(config.isMetricsOn()).thenReturn(true); when(config.getMetricsReporterType()).thenReturn(MetricsReporterType.INMEMORY); - metrics = new HoodieMetrics(config, "raw_table"); + new HoodieMetrics(config, "raw_table"); } @Test diff --git a/pom.xml b/pom.xml index aa4d706..c61e4a6 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <hadoop.version>2.7.3</hadoop.version> <hive.groupid>org.apache.hive</hive.groupid> <hive.version>2.3.1</hive.version> - <metrics.version>4.0.2</metrics.version> + <metrics.version>4.1.1</metrics.version> <spark.version>2.1.0</spark.version> <avro.version>1.7.7</avro.version> <scala.version>2.11.8</scala.version>