You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by si...@apache.org on 2023/12/26 21:09:00 UTC
(hudi) 02/02: Fix missing datadog configuration metrics on mdt
This is an automated email from the ASF dual-hosted git repository.
sivabalan pushed a commit to branch release-0.14.1
in repository https://gitbox.apache.org/repos/asf/hudi.git
commit 420ad9026cf70dc1625dd2b02363aaf189bf2369
Author: Nicolas Paris <ni...@adevinta.com>
AuthorDate: Mon Dec 25 17:26:58 2023 +0100
Fix missing datadog configuration metrics on mdt
---
.../hudi/metadata/HoodieMetadataWriteUtils.java | 17 ++++
.../hudi/functional/TestMetricsReporter.scala | 98 ++++++++++++++++++++++
2 files changed, 115 insertions(+)
diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieMetadataWriteUtils.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieMetadataWriteUtils.java
index e73f6fb7bc3..7c42ccf5016 100644
--- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieMetadataWriteUtils.java
+++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieMetadataWriteUtils.java
@@ -38,6 +38,7 @@ import org.apache.hudi.config.metrics.HoodieMetricsConfig;
import org.apache.hudi.config.metrics.HoodieMetricsGraphiteConfig;
import org.apache.hudi.config.metrics.HoodieMetricsJmxConfig;
import org.apache.hudi.config.metrics.HoodieMetricsPrometheusConfig;
+import org.apache.hudi.config.metrics.HoodieMetricsDatadogConfig;
import org.apache.hudi.exception.HoodieMetadataException;
import org.apache.hudi.table.action.compact.strategy.UnBoundedCompactionStrategy;
@@ -182,6 +183,22 @@ public class HoodieMetadataWriteUtils {
builder.withProperties(prometheusConfig.getProps());
break;
case DATADOG:
+ HoodieMetricsDatadogConfig.Builder datadogConfig = HoodieMetricsDatadogConfig.newBuilder()
+ .withDatadogApiKey(writeConfig.getDatadogApiKey())
+ .withDatadogApiKeySkipValidation(writeConfig.getDatadogApiKeySkipValidation())
+ .withDatadogPrefix(writeConfig.getDatadogMetricPrefix())
+ .withDatadogReportPeriodSeconds(writeConfig.getDatadogReportPeriodSeconds())
+ .withDatadogTags(String.join(",", writeConfig.getDatadogMetricTags()))
+ .withDatadogApiTimeoutSeconds(writeConfig.getDatadogApiTimeoutSeconds());
+ if (writeConfig.getDatadogMetricHost() != null) {
+ datadogConfig = datadogConfig.withDatadogHost(writeConfig.getDatadogMetricHost());
+ }
+ if (writeConfig.getDatadogApiSite() != null) {
+ datadogConfig = datadogConfig.withDatadogApiSite(writeConfig.getDatadogApiSite().name());
+ }
+
+ builder.withProperties(datadogConfig.build().getProps());
+ break;
case PROMETHEUS:
case CONSOLE:
case INMEMORY:
diff --git a/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/hudi/functional/TestMetricsReporter.scala b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/hudi/functional/TestMetricsReporter.scala
new file mode 100644
index 00000000000..99f74870d87
--- /dev/null
+++ b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/hudi/functional/TestMetricsReporter.scala
@@ -0,0 +1,98 @@
+/*
+ * 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.functional
+
+import org.apache.hudi.HoodieConversionUtils.toJavaOption
+import org.apache.hudi.common.config.HoodieMetadataConfig
+import org.apache.hudi.common.testutils.RawTripTestPayload.recordsToStrings
+import org.apache.hudi.common.util
+import org.apache.hudi.config.HoodieWriteConfig
+import org.apache.hudi.config.metrics.{HoodieMetricsConfig, HoodieMetricsDatadogConfig}
+import org.apache.hudi.testutils.HoodieSparkClientTestBase
+import org.apache.hudi.util.JFunction
+import org.apache.hudi.{DataSourceWriteOptions, SparkDatasetMixin}
+import org.apache.spark.sql._
+import org.apache.spark.sql.hudi.HoodieSparkSessionExtension
+import org.junit.jupiter.api.function.Executable
+import org.junit.jupiter.api.{AfterEach, Assertions, BeforeEach, Test}
+import org.slf4j.LoggerFactory
+
+import java.util.function.Consumer
+import scala.collection.JavaConverters._
+
+/**
+ * Tests on Spark DataSource for MOR table.
+ */
+class TestMetricsReporter extends HoodieSparkClientTestBase with SparkDatasetMixin {
+ var spark: SparkSession = null
+ private val log = LoggerFactory.getLogger(classOf[TestMORDataSource])
+ val commonOpts = Map(
+ "hoodie.insert.shuffle.parallelism" -> "4",
+ "hoodie.upsert.shuffle.parallelism" -> "4",
+ DataSourceWriteOptions.RECORDKEY_FIELD.key -> "_row_key",
+ DataSourceWriteOptions.PARTITIONPATH_FIELD.key -> "partition",
+ DataSourceWriteOptions.PRECOMBINE_FIELD.key -> "timestamp",
+ HoodieWriteConfig.TBL_NAME.key -> "hoodie_test"
+ )
+
+ @BeforeEach override def setUp() {
+ setTableName("hoodie_test")
+ initPath()
+ initSparkContexts()
+ spark = sqlContext.sparkSession
+ initTestDataGenerator()
+ initFileSystem()
+ }
+
+ @AfterEach override def tearDown() = {
+ cleanupSparkContexts()
+ cleanupTestDataGenerator()
+ cleanupFileSystem()
+ }
+
+ override def getSparkSessionExtensionsInjector: util.Option[Consumer[SparkSessionExtensions]] =
+ toJavaOption(
+ Some(
+ JFunction.toJavaConsumer((receiver: SparkSessionExtensions) => new HoodieSparkSessionExtension().apply(receiver)))
+ )
+
+ @Test
+ def testSmokeDatadogReporter() {
+ val records1 = recordsToStrings(dataGen.generateInserts("001", 100)).asScala
+ val inputDF1 = spark.read.json(spark.sparkContext.parallelize(records1, 2))
+ val writeOpts: Map[String, String] = commonOpts ++ Map(
+ DataSourceWriteOptions.OPERATION.key -> DataSourceWriteOptions.UPSERT_OPERATION_OPT_VAL,
+ DataSourceWriteOptions.TABLE_TYPE.key -> DataSourceWriteOptions.COW_TABLE_TYPE_OPT_VAL,
+ HoodieMetadataConfig.ENABLE.key -> "true",
+ HoodieMetricsConfig.TURN_METRICS_ON.key -> "true",
+ HoodieMetricsConfig.METRICS_REPORTER_TYPE_VALUE.key -> "DATADOG",
+ HoodieMetricsDatadogConfig.API_KEY_SKIP_VALIDATION.key -> "true",
+ HoodieMetricsDatadogConfig.METRIC_PREFIX_VALUE.key -> "hudi",
+ HoodieMetricsDatadogConfig.API_SITE_VALUE.key -> "US",
+ HoodieMetricsDatadogConfig.API_KEY.key -> "dummykey")
+
+ Assertions.assertDoesNotThrow(new Executable {
+ override def execute(): Unit =
+ inputDF1.write.format("org.apache.hudi")
+ .options(writeOpts)
+ .mode(SaveMode.Overwrite)
+ .save(basePath)
+
+ })
+ }
+}