You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by "rangareddy (via GitHub)" <gi...@apache.org> on 2026/07/30 11:20:10 UTC

[PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

rangareddy opened a new pull request, #19418:
URL: https://github.com/apache/hudi/pull/19418

   ### Describe the issue this Pull Request addresses
   
   Closes #15293 (HUDI-4452).
   
   The CloudWatch metrics reporter lives in the optional `hudi-aws` module and is loaded reflectively by
   `MetricsReporterFactory`. `packaging/hudi-spark-bundle/pom.xml` does not shade `hudi-aws` (unlike
   `hudi-flink-bundle` and `hudi-kafka-connect-bundle`, which do), so a Spark user who sets
   `hoodie.metrics.reporter.type=CLOUDWATCH` with only the Spark bundle on the classpath gets:
   
   ```
   org.apache.hudi.exception.HoodieException: Unable to load class
     Caused by: java.lang.ClassNotFoundException: org.apache.hudi.aws.metrics.cloudwatch.CloudWatchMetricsReporter
   ```
   
   The message names neither the missing class nor anything the user can do about it.
   
   ### Summary and Changelog
   
   Turns that failure into an actionable one instead of changing the bundle's dependencies.
   
   - `MetricsReporterFactory`: extracted the reporter class name to a constant and moved the reflective
     load into a small private helper. When the load fails with a `ClassNotFoundException` cause, rethrow a
     `HoodieException` naming the missing class, the `hudi-aws` module, the `hudi-aws-bundle` jar to add,
     and `hoodie.metrics.reporter.type` as the alternative. Every other failure is rethrown unchanged.
   - `TestMetricsReporterFactory`: new test asserting the message names the class, the bundle, and the
     config key. It works because `hudi-aws` is not on `hudi-common`'s test classpath, which is the same
     condition the user hits (the pre-existing CloudWatch test has to `mockStatic` `ReflectionUtils` for
     exactly that reason).
   
   **On the approach:** the issue title asks for `hudi-aws` to be added to `hudi-spark-bundle`. #6183 did
   that and was closed unmerged; the review there asked for the opposite direction — "Ideally, we need a
   way to completely decouple the two. Just because one class we need to pull in this dependency" — and
   conditioned merging on `hudi-aws` being in `provided` scope, which would not put the class on a user's
   classpath anyway. Shading an AWS SDK into the general-purpose Spark bundle for one optional reporter
   seemed like the wrong trade, so this PR fixes the user-visible defect (an unactionable error) and leaves
   the bundle contents alone. Happy to switch approaches if the preference is otherwise.
   
   `MetricsReporterFactory` is the only place the class is loaded, so there is no second path to update.
   
   ### Impact
   
   No API, config, or format change, and no change in which reporters work. Only the failure message for
   `CLOUDWATCH` when `hudi-aws` is missing; the exception type stays `HoodieException`.
   
   Known limitation, deliberately not addressed: if `hudi-aws` is present but the AWS SDK is not, the JVM
   raises `NoClassDefFoundError`, which this does not intercept — catching `Error` in a metrics factory
   would be worse than the message it would improve.
   
   ### Risk Level
   
   none
   
   ### Documentation Update
   
   none — no new config and no default value change.
   
   ### Contributor's checklist
   
   - [x] Read through [contributor's guide](https://hudi.apache.org/contribute/how-to-contribute)
   - [x] Enough context is provided in the sections above
   - [x] Adequate tests were added if applicable
   - [x] CI passes on my PR
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "voonhous (via GitHub)" <gi...@apache.org>.
voonhous commented on code in PR #19418:
URL: https://github.com/apache/hudi/pull/19418#discussion_r3694786303


##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which

Review Comment:
   Same staleness hook as the user-facing message below: `(notably {@code hudi-spark-bundle} does not)` is a packaging fact that will not get updated when packaging changes. Lower stakes in a comment, but `Not every engine bundle shades that module` already carries the point without pinning it to one bundle.



##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which
+   * case class loading fails with a message that names neither the missing class nor a remedy. Translate
+   * that into an actionable error.
+   */
+  private static MetricsReporter createCloudWatchReporter(HoodieMetricsConfig metricsConfig, MetricRegistry registry) {
+    try {
+      return (MetricsReporter) ReflectionUtils.loadClass(CLOUDWATCH_REPORTER_CLASS,
+          new Class[] {HoodieMetricsConfig.class, MetricRegistry.class}, metricsConfig, registry);
+    } catch (HoodieException e) {
+      if (e.getCause() instanceof ClassNotFoundException) {

Review Comment:
   Consider fixing the generic message in the same PR, since it is strictly cheaper and has far more reach. The underlying complaint in #15293 is that `Unable to load class` names no class at all, and that string comes from `ReflectionUtils.getClass`:
   
   ```java
   // hudi-io/src/main/java/org/apache/hudi/common/util/ReflectionUtils.java:53
   throw new HoodieException("Unable to load class", e);
   ```
   
   That is the message *every* reflective load in Hudi produces on a missing class: payload classes, key generators, index types, sources, sinks, write clients. Changing it to `"Unable to load class " + c` is one line and fixes half of the reported defect for all of those call sites rather than just `CLOUDWATCH`, and the CloudWatch-specific remedy here then layers on top of an already-useful base message.



##########
hudi-common/src/test/java/org/apache/hudi/metrics/TestMetricsReporterFactory.java:
##########
@@ -94,6 +94,28 @@ void metricsReporterFactoryShouldReturnCloudWatchReporter() {
     }
   }
 
+  /**
+   * {@code hudi-aws} is deliberately absent from this module's test classpath, which is exactly the
+   * situation a user hits with {@code hudi-spark-bundle}: that bundle does not shade {@code hudi-aws},
+   * so the reflectively loaded CloudWatch reporter cannot be found. The failure must name the missing
+   * class and how to fix it, not just report that some class could not be loaded.
+   */
+  @Test
+  void metricsReporterFactoryShouldExplainHowToEnableCloudWatchWhenHudiAwsIsMissing() {
+    when(metricsConfig.getMetricsReporterType()).thenReturn(MetricsReporterType.CLOUDWATCH);
+
+    HoodieException exception = assertThrows(HoodieException.class,
+        () -> MetricsReporterFactory.createReporter(metricsConfig, registry));
+
+    String message = exception.getMessage();
+    assertTrue(message.contains("org.apache.hudi.aws.metrics.cloudwatch.CloudWatchMetricsReporter"),

Review Comment:
   The FQCN is now written in three places: the new `CLOUDWATCH_REPORTER_CLASS` constant, line 85 above, and here. `hudi-common` already has `org.apache.hudi.common.util.VisibleForTesting`, so making the constant package-private and annotating it would let both tests reference it and keep them honest if the class ever moves.



##########
hudi-common/src/test/java/org/apache/hudi/metrics/TestMetricsReporterFactory.java:
##########
@@ -94,6 +94,28 @@ void metricsReporterFactoryShouldReturnCloudWatchReporter() {
     }
   }
 
+  /**
+   * {@code hudi-aws} is deliberately absent from this module's test classpath, which is exactly the
+   * situation a user hits with {@code hudi-spark-bundle}: that bundle does not shade {@code hudi-aws},
+   * so the reflectively loaded CloudWatch reporter cannot be found. The failure must name the missing
+   * class and how to fix it, not just report that some class could not be loaded.
+   */
+  @Test
+  void metricsReporterFactoryShouldExplainHowToEnableCloudWatchWhenHudiAwsIsMissing() {
+    when(metricsConfig.getMetricsReporterType()).thenReturn(MetricsReporterType.CLOUDWATCH);
+
+    HoodieException exception = assertThrows(HoodieException.class,
+        () -> MetricsReporterFactory.createReporter(metricsConfig, registry));

Review Comment:
   The classpath premise here is solid and worth keeping: `hudi-common` cannot depend on `hudi-aws` (the dependency runs the other way), so the absence is structural rather than incidental, and this is a genuine end-to-end check that `ReflectionUtils` still wraps the failure the way `createCloudWatchReporter` assumes.
   
   That said, the test passes for *any* reason the class fails to resolve, so it verifies the symptom rather than the branch. Consider adding a stubbed sibling that pins the mapping deterministically, mirroring `metricsReporterFactoryShouldReturnCloudWatchReporter` above:
   
   ```java
   mockedStatic.when(() -> ReflectionUtils.loadClass(
       eq(CLOUDWATCH_REPORTER_CLASS), any(Class[].class), eq(metricsConfig), eq(registry)))
       .thenThrow(new HoodieException("Unable to load class",
           new ClassNotFoundException(CLOUDWATCH_REPORTER_CLASS)));
   ```



##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which
+   * case class loading fails with a message that names neither the missing class nor a remedy. Translate
+   * that into an actionable error.
+   */
+  private static MetricsReporter createCloudWatchReporter(HoodieMetricsConfig metricsConfig, MetricRegistry registry) {
+    try {
+      return (MetricsReporter) ReflectionUtils.loadClass(CLOUDWATCH_REPORTER_CLASS,
+          new Class[] {HoodieMetricsConfig.class, MetricRegistry.class}, metricsConfig, registry);
+    } catch (HoodieException e) {
+      if (e.getCause() instanceof ClassNotFoundException) {
+        throw new HoodieException(String.format(
+            "Cannot report metrics to CloudWatch: %s was not found on the classpath. It ships in the "
+                + "optional hudi-aws module, which is not included in every engine bundle (for example "
+                + "hudi-spark-bundle does not bundle it). Add the hudi-aws-bundle jar matching your Hudi "
+                + "version to the classpath, or set %s to a different reporter type.",
+            CLOUDWATCH_REPORTER_CLASS, HoodieMetricsConfig.METRICS_REPORTER_TYPE_VALUE.key()), e);
+      }
+      throw e;

Review Comment:
   This pass-through branch is not covered by a test, and it is the one most likely to regress: if someone later "improves" the cause check into a deep walk of the cause chain, unrelated instantiation failures start getting rewritten into a misleading "add hudi-aws-bundle" message and nothing would catch it.
   
   Stubbing `ReflectionUtils.loadClass` to throw `new HoodieException("Unable to instantiate class ...", new NoSuchMethodException())` and asserting the message comes through unchanged would pin it.



##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which
+   * case class loading fails with a message that names neither the missing class nor a remedy. Translate
+   * that into an actionable error.
+   */
+  private static MetricsReporter createCloudWatchReporter(HoodieMetricsConfig metricsConfig, MetricRegistry registry) {
+    try {
+      return (MetricsReporter) ReflectionUtils.loadClass(CLOUDWATCH_REPORTER_CLASS,
+          new Class[] {HoodieMetricsConfig.class, MetricRegistry.class}, metricsConfig, registry);
+    } catch (HoodieException e) {
+      if (e.getCause() instanceof ClassNotFoundException) {
+        throw new HoodieException(String.format(
+            "Cannot report metrics to CloudWatch: %s was not found on the classpath. It ships in the "
+                + "optional hudi-aws module, which is not included in every engine bundle (for example "
+                + "hudi-spark-bundle does not bundle it). Add the hudi-aws-bundle jar matching your Hudi "
+                + "version to the classpath, or set %s to a different reporter type.",

Review Comment:
   Naming specific bundle contents in a `hudi-common` error message couples this string to `packaging/hudi-spark-bundle/pom.xml`, with nothing keeping the two in sync. If that bundle ever shades `hudi-aws` (which is exactly what #15293 asks for) this message silently becomes wrong and no test fails. It is also noise for a Flink or Kafka Connect user who reaches this line for some other reason.
   
   Suggest dropping the parenthetical and keeping the durable part:
   
   ```suggestion
               "Cannot report metrics to CloudWatch: %s was not found on the classpath. It ships in the "
                   + "optional hudi-aws module, which not every engine bundle includes. Add the "
                   + "hudi-aws-bundle jar matching your Hudi version to the classpath, or set %s to a "
                   + "different reporter type.",
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "rangareddy (via GitHub)" <gi...@apache.org>.
rangareddy commented on code in PR #19418:
URL: https://github.com/apache/hudi/pull/19418#discussion_r3701440810


##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which
+   * case class loading fails with a message that names neither the missing class nor a remedy. Translate
+   * that into an actionable error.
+   */
+  private static MetricsReporter createCloudWatchReporter(HoodieMetricsConfig metricsConfig, MetricRegistry registry) {
+    try {
+      return (MetricsReporter) ReflectionUtils.loadClass(CLOUDWATCH_REPORTER_CLASS,
+          new Class[] {HoodieMetricsConfig.class, MetricRegistry.class}, metricsConfig, registry);
+    } catch (HoodieException e) {
+      if (e.getCause() instanceof ClassNotFoundException) {

Review Comment:
   Done in bf4ef23, and agreed this is the higher-leverage half. `ReflectionUtils.getClass` now throws `"Unable to load class " + c`, so every reflective load in Hudi names the class it could not find, and the CloudWatch remedy layers on top of that instead of compensating for it.
   
   Checked the blast radius before changing it: the only assertion on that string is `TestHoodieDeltaStreamer:444`, which uses `contains("Unable to load class")`, so the prefix keeps it passing.



##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which
+   * case class loading fails with a message that names neither the missing class nor a remedy. Translate
+   * that into an actionable error.
+   */
+  private static MetricsReporter createCloudWatchReporter(HoodieMetricsConfig metricsConfig, MetricRegistry registry) {
+    try {
+      return (MetricsReporter) ReflectionUtils.loadClass(CLOUDWATCH_REPORTER_CLASS,
+          new Class[] {HoodieMetricsConfig.class, MetricRegistry.class}, metricsConfig, registry);
+    } catch (HoodieException e) {
+      if (e.getCause() instanceof ClassNotFoundException) {
+        throw new HoodieException(String.format(
+            "Cannot report metrics to CloudWatch: %s was not found on the classpath. It ships in the "
+                + "optional hudi-aws module, which is not included in every engine bundle (for example "
+                + "hudi-spark-bundle does not bundle it). Add the hudi-aws-bundle jar matching your Hudi "
+                + "version to the classpath, or set %s to a different reporter type.",

Review Comment:
   Applied your suggestion verbatim in bf4ef23. The staleness argument is the convincing part — if `hudi-spark-bundle` ever does shade `hudi-aws`, which is literally what #15293 asks for, the message would have become wrong with no test to catch it.



##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which

Review Comment:
   Fixed in the same commit. The javadoc now reads "Not every engine bundle shades that module", with no bundle named.



##########
hudi-common/src/main/java/org/apache/hudi/metrics/MetricsReporterFactory.java:
##########
@@ -99,4 +101,27 @@ public static Option<MetricsReporter> createReporter(HoodieMetricsConfig metrics
     }
     return Option.ofNullable(reporter);
   }
+
+  /**
+   * The CloudWatch reporter ships in the optional {@code hudi-aws} module and so is loaded reflectively.
+   * Not every engine bundle shades that module (notably {@code hudi-spark-bundle} does not), in which
+   * case class loading fails with a message that names neither the missing class nor a remedy. Translate
+   * that into an actionable error.
+   */
+  private static MetricsReporter createCloudWatchReporter(HoodieMetricsConfig metricsConfig, MetricRegistry registry) {
+    try {
+      return (MetricsReporter) ReflectionUtils.loadClass(CLOUDWATCH_REPORTER_CLASS,
+          new Class[] {HoodieMetricsConfig.class, MetricRegistry.class}, metricsConfig, registry);
+    } catch (HoodieException e) {
+      if (e.getCause() instanceof ClassNotFoundException) {
+        throw new HoodieException(String.format(
+            "Cannot report metrics to CloudWatch: %s was not found on the classpath. It ships in the "
+                + "optional hudi-aws module, which is not included in every engine bundle (for example "
+                + "hudi-spark-bundle does not bundle it). Add the hudi-aws-bundle jar matching your Hudi "
+                + "version to the classpath, or set %s to a different reporter type.",
+            CLOUDWATCH_REPORTER_CLASS, HoodieMetricsConfig.METRICS_REPORTER_TYPE_VALUE.key()), e);
+      }
+      throw e;

Review Comment:
   Added `metricsReporterFactoryLeavesNonClassNotFoundFailuresUntouched` in bf4ef23, stubbing `ReflectionUtils.loadClass` to throw `HoodieException("Unable to instantiate class ...", new NoSuchMethodException(...))` and asserting the message comes through byte-for-byte. That is exactly the regression you describe: if the cause check is later widened into a deep walk, this fails.



##########
hudi-common/src/test/java/org/apache/hudi/metrics/TestMetricsReporterFactory.java:
##########
@@ -94,6 +94,28 @@ void metricsReporterFactoryShouldReturnCloudWatchReporter() {
     }
   }
 
+  /**
+   * {@code hudi-aws} is deliberately absent from this module's test classpath, which is exactly the
+   * situation a user hits with {@code hudi-spark-bundle}: that bundle does not shade {@code hudi-aws},
+   * so the reflectively loaded CloudWatch reporter cannot be found. The failure must name the missing
+   * class and how to fix it, not just report that some class could not be loaded.
+   */
+  @Test
+  void metricsReporterFactoryShouldExplainHowToEnableCloudWatchWhenHudiAwsIsMissing() {
+    when(metricsConfig.getMetricsReporterType()).thenReturn(MetricsReporterType.CLOUDWATCH);
+
+    HoodieException exception = assertThrows(HoodieException.class,
+        () -> MetricsReporterFactory.createReporter(metricsConfig, registry));

Review Comment:
   Added `metricsReporterFactoryRewritesClassNotFoundIntoAnActionableMessage` alongside it, stubbed the way you suggested. Kept the classpath-based test too, for the reason you gave — `hudi-common` cannot depend on `hudi-aws`, so it is a genuine end-to-end check that `ReflectionUtils` still wraps the failure the way `createCloudWatchReporter` assumes. The two stubbed tests now pin the mapping in both directions.



##########
hudi-common/src/test/java/org/apache/hudi/metrics/TestMetricsReporterFactory.java:
##########
@@ -94,6 +94,28 @@ void metricsReporterFactoryShouldReturnCloudWatchReporter() {
     }
   }
 
+  /**
+   * {@code hudi-aws} is deliberately absent from this module's test classpath, which is exactly the
+   * situation a user hits with {@code hudi-spark-bundle}: that bundle does not shade {@code hudi-aws},
+   * so the reflectively loaded CloudWatch reporter cannot be found. The failure must name the missing
+   * class and how to fix it, not just report that some class could not be loaded.
+   */
+  @Test
+  void metricsReporterFactoryShouldExplainHowToEnableCloudWatchWhenHudiAwsIsMissing() {
+    when(metricsConfig.getMetricsReporterType()).thenReturn(MetricsReporterType.CLOUDWATCH);
+
+    HoodieException exception = assertThrows(HoodieException.class,
+        () -> MetricsReporterFactory.createReporter(metricsConfig, registry));
+
+    String message = exception.getMessage();
+    assertTrue(message.contains("org.apache.hudi.aws.metrics.cloudwatch.CloudWatchMetricsReporter"),

Review Comment:
   Done — `CLOUDWATCH_REPORTER_CLASS` is now package-private with `@VisibleForTesting`, and both tests reference it, so the FQCN appears once.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "codecov-commenter (via GitHub)" <gi...@apache.org>.
codecov-commenter commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5130592512

   ## [Codecov](https://app.codecov.io/gh/apache/hudi/pull/19418?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
   :x: Patch coverage is `0%` with `7 lines` in your changes missing coverage. Please review.
   :white_check_mark: Project coverage is 66.99%. Comparing base ([`46cd134`](https://app.codecov.io/gh/apache/hudi/commit/46cd134343081c0252e3019bdce0c136e7b8c1d2?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`3f01559`](https://app.codecov.io/gh/apache/hudi/commit/3f01559a975eff02647ceb23f9feb969b2df6f82?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/hudi/pull/19418?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
   |---|---|---|
   | [...rg/apache/hudi/metrics/MetricsReporterFactory.java](https://app.codecov.io/gh/apache/hudi/pull/19418?src=pr&el=tree&filepath=hudi-common%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fhudi%2Fmetrics%2FMetricsReporterFactory.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-aHVkaS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2h1ZGkvbWV0cmljcy9NZXRyaWNzUmVwb3J0ZXJGYWN0b3J5LmphdmE=) | 0.00% | [7 Missing :warning: ](https://app.codecov.io/gh/apache/hudi/pull/19418?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   > :exclamation:  There is a different number of reports uploaded between BASE (46cd134) and HEAD (3f01559). Click for more details.
   > 
   > <details><summary>HEAD has 11 uploads less than BASE</summary>
   >
   >| Flag | BASE (46cd134) | HEAD (3f01559) |
   >|------|------|------|
   >|spark-scala-tests|14|3|
   ></details>
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   ```diff
   @@             Coverage Diff              @@
   ##             master   #19418      +/-   ##
   ============================================
   - Coverage     75.55%   66.99%   -8.57%     
   + Complexity    32664    29157    -3507     
   ============================================
     Files          2574     2574              
     Lines        142995   143001       +6     
     Branches      17530    17531       +1     
   ============================================
   - Hits         108036    95799   -12237     
   - Misses        26926    39824   +12898     
   + Partials       8033     7378     -655     
   ```
   
   | [Components](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=components&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [hudi-common](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `79.75% <0.00%> (-2.52%)` | :arrow_down: |
   | [hudi-client](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `74.61% <ø> (-7.20%)` | :arrow_down: |
   | [hudi-flink](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `84.02% <ø> (-0.02%)` | :arrow_down: |
   | [hudi-spark-datasource](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `34.56% <ø> (-33.78%)` | :arrow_down: |
   | [hudi-utilities](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `71.24% <ø> (ø)` | |
   | [hudi-cli](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `15.32% <ø> (ø)` | |
   | [hudi-hadoop](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `59.35% <ø> (-4.15%)` | :arrow_down: |
   | [hudi-sync](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `70.65% <ø> (-0.03%)` | :arrow_down: |
   | [hudi-io](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `79.05% <ø> (-0.53%)` | :arrow_down: |
   | [hudi-timeline-service](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `77.66% <ø> (-5.88%)` | :arrow_down: |
   | [hudi-cloud](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `64.00% <ø> (ø)` | |
   | [hudi-kafka-connect](https://app.codecov.io/gh/apache/hudi/pull/19418/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `53.20% <ø> (ø)` | |
   
   | [Flag](https://app.codecov.io/gh/apache/hudi/pull/19418/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [flink-integration-tests](https://app.codecov.io/gh/apache/hudi/pull/19418/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `48.84% <0.00%> (+<0.01%)` | :arrow_up: |
   | [hadoop-mr-java-client](https://app.codecov.io/gh/apache/hudi/pull/19418/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `43.38% <0.00%> (-0.01%)` | :arrow_down: |
   | [spark-client-hadoop-common](https://app.codecov.io/gh/apache/hudi/pull/19418/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `48.71% <0.00%> (-0.01%)` | :arrow_down: |
   | [spark-scala-tests](https://app.codecov.io/gh/apache/hudi/pull/19418/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `32.69% <0.00%> (-13.40%)` | :arrow_down: |
   
   Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#carryforward-flags-in-the-pull-request-comment) to find out more.
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/hudi/pull/19418?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [...rg/apache/hudi/metrics/MetricsReporterFactory.java](https://app.codecov.io/gh/apache/hudi/pull/19418?src=pr&el=tree&filepath=hudi-common%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fhudi%2Fmetrics%2FMetricsReporterFactory.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-aHVkaS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2h1ZGkvbWV0cmljcy9NZXRyaWNzUmVwb3J0ZXJGYWN0b3J5LmphdmE=) | `77.27% <0.00%> (-14.84%)` | :arrow_down: |
   
   ... and [592 files with indirect coverage changes](https://app.codecov.io/gh/apache/hudi/pull/19418/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   </details>
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
   - :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5162641131

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855",
       "triggerID" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "triggerType" : "PUSH"
     }, {
       "hash" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15954",
       "triggerID" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 3f01559a975eff02647ceb23f9feb969b2df6f82 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855) 
   * bf4ef237aa0e14901017f4bb27d54722957c3db1 Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15954) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5162613210

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855",
       "triggerID" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "triggerType" : "PUSH"
     }, {
       "hash" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "status" : "UNKNOWN",
       "url" : "TBD",
       "triggerID" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 3f01559a975eff02647ceb23f9feb969b2df6f82 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855) 
   * bf4ef237aa0e14901017f4bb27d54722957c3db1 UNKNOWN
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5131921144

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855",
       "triggerID" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 3f01559a975eff02647ceb23f9feb969b2df6f82 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "voonhous (via GitHub)" <gi...@apache.org>.
voonhous merged PR #19418:
URL: https://github.com/apache/hudi/pull/19418


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5130217650

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "status" : "UNKNOWN",
       "url" : "TBD",
       "triggerID" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 3f01559a975eff02647ceb23f9feb969b2df6f82 UNKNOWN
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5130272303

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855",
       "triggerID" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 3f01559a975eff02647ceb23f9feb969b2df6f82 Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5163503850

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855",
       "triggerID" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "triggerType" : "PUSH"
     }, {
       "hash" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15954",
       "triggerID" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a1b1887454adf1b18214428d5230d68a14e7223a",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15968",
       "triggerID" : "a1b1887454adf1b18214428d5230d68a14e7223a",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 3f01559a975eff02647ceb23f9feb969b2df6f82 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855) 
   * bf4ef237aa0e14901017f4bb27d54722957c3db1 Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15954) 
   * a1b1887454adf1b18214428d5230d68a14e7223a Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15968) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix(metrics): explain how to enable the CloudWatch reporter when hudi-aws is absent [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19418:
URL: https://github.com/apache/hudi/pull/19418#issuecomment-5163455742

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855",
       "triggerID" : "3f01559a975eff02647ceb23f9feb969b2df6f82",
       "triggerType" : "PUSH"
     }, {
       "hash" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15954",
       "triggerID" : "bf4ef237aa0e14901017f4bb27d54722957c3db1",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a1b1887454adf1b18214428d5230d68a14e7223a",
       "status" : "UNKNOWN",
       "url" : "TBD",
       "triggerID" : "a1b1887454adf1b18214428d5230d68a14e7223a",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 3f01559a975eff02647ceb23f9feb969b2df6f82 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15855) 
   * bf4ef237aa0e14901017f4bb27d54722957c3db1 Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=15954) 
   * a1b1887454adf1b18214428d5230d68a14e7223a UNKNOWN
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@hudi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org