diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java index c871253aed6e4..7f0ec1076f127 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java @@ -1475,6 +1475,10 @@ public String getGraphiteMetricPrefix() { return getString(HoodieMetricsGraphiteConfig.GRAPHITE_METRIC_PREFIX_VALUE); } + public int getGraphiteReportPeriodSeconds() { + return getInt(HoodieMetricsGraphiteConfig.GRAPHITE_REPORT_PERIOD_IN_SECONDS); + } + public String getJmxHost() { return getString(HoodieMetricsJmxConfig.JMX_HOST_NAME); } diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/metrics/HoodieMetricsGraphiteConfig.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/metrics/HoodieMetricsGraphiteConfig.java index 12987a7e1574e..25c4c6af4a4c2 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/metrics/HoodieMetricsGraphiteConfig.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/metrics/HoodieMetricsGraphiteConfig.java @@ -61,6 +61,12 @@ public class HoodieMetricsGraphiteConfig extends HoodieConfig { .sinceVersion("0.5.1") .withDocumentation("Standard prefix applied to all metrics. This helps to add datacenter, environment information for e.g"); + public static final ConfigProperty GRAPHITE_REPORT_PERIOD_IN_SECONDS = ConfigProperty + .key(GRAPHITE_PREFIX + ".report.period.seconds") + .defaultValue(30) + .sinceVersion("0.10.0") + .withDocumentation("Graphite reporting period in seconds. Default to 30."); + /** * @deprecated Use {@link #GRAPHITE_SERVER_HOST_NAME} and its methods instead */ @@ -126,6 +132,11 @@ public HoodieMetricsGraphiteConfig.Builder usePrefix(String prefix) { return this; } + public HoodieMetricsGraphiteConfig.Builder periodSeconds(String periodSeconds) { + hoodieMetricsGraphiteConfig.setValue(GRAPHITE_REPORT_PERIOD_IN_SECONDS, periodSeconds); + return this; + } + public HoodieMetricsGraphiteConfig build() { hoodieMetricsGraphiteConfig.setDefaults(HoodieMetricsGraphiteConfig.class.getName()); return hoodieMetricsGraphiteConfig; diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/MetricsGraphiteReporter.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/MetricsGraphiteReporter.java index 9855ac0b0272d..c6dff8fd869ec 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/MetricsGraphiteReporter.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/MetricsGraphiteReporter.java @@ -42,6 +42,7 @@ public class MetricsGraphiteReporter extends MetricsReporter { private final HoodieWriteConfig config; private String serverHost; private int serverPort; + private final int periodSeconds; public MetricsGraphiteReporter(HoodieWriteConfig config, MetricRegistry registry) { this.registry = registry; @@ -56,12 +57,13 @@ public MetricsGraphiteReporter(HoodieWriteConfig config, MetricRegistry registry } this.graphiteReporter = createGraphiteReport(); + this.periodSeconds = config.getGraphiteReportPeriodSeconds(); } @Override public void start() { if (graphiteReporter != null) { - graphiteReporter.start(30, TimeUnit.SECONDS); + graphiteReporter.start(periodSeconds, TimeUnit.SECONDS); } else { LOG.error("Cannot start as the graphiteReporter is null."); } diff --git a/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/metrics/TestHoodieGraphiteMetrics.java b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/metrics/TestHoodieGraphiteMetrics.java new file mode 100644 index 0000000000000..6ff7ee88ac8fb --- /dev/null +++ b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/metrics/TestHoodieGraphiteMetrics.java @@ -0,0 +1,60 @@ +/* + * 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 org.apache.hudi.common.testutils.NetworkTestUtils; +import org.apache.hudi.config.HoodieWriteConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.apache.hudi.metrics.Metrics.registerGauge; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +/** + * Test for the Graphite metrics report. + */ +@ExtendWith(MockitoExtension.class) +public class TestHoodieGraphiteMetrics { + + @Mock + HoodieWriteConfig config; + + @AfterEach + void shutdownMetrics() { + Metrics.shutdown(); + } + + @Test + public void testRegisterGauge() { + when(config.isMetricsOn()).thenReturn(true); + when(config.getTableName()).thenReturn("table1"); + when(config.getMetricsReporterType()).thenReturn(MetricsReporterType.GRAPHITE); + when(config.getGraphiteServerHost()).thenReturn("localhost"); + when(config.getGraphiteServerPort()).thenReturn(NetworkTestUtils.nextFreePort()); + when(config.getGraphiteReportPeriodSeconds()).thenReturn(30); + new HoodieMetrics(config); + registerGauge("graphite_metric", 123L); + assertEquals("123", Metrics.getInstance().getRegistry().getGauges() + .get("graphite_metric").getValue().toString()); + } +}