This is an automated email from the ASF dual-hosted git repository.

tanxinyu pushed a commit to branch rel/1.0
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.0 by this push:
     new 1513e16b0a [IOTDB-5231]Add the handle of exception when metric 
reporter failed to start (#8523) (#8559)
1513e16b0a is described below

commit 1513e16b0a1bf64016be344d56a18b58473a5694
Author: ZhangHongYin <[email protected]>
AuthorDate: Wed Dec 21 19:21:57 2022 +0800

    [IOTDB-5231]Add the handle of exception when metric reporter failed to 
start (#8523) (#8559)
    
    * Add exception process of reporter
    
    * Optimize the code
    
    * Unify the start of reporter
    
    (cherry picked from commit 7b92bd295e1fd9afdd86b162d28080fe9c6a6a13)
---
 .../reporter/iotdb/InternalIoTDBReporter.java      |  2 +-
 .../iotdb/MemoryInternalIoTDBReporter.java         |  4 +-
 .../reporter/iotdb/SessionIoTDBReporter.java       | 46 +++++++++++-----------
 .../reporter/prometheus/PrometheusReporter.java    | 33 ++++++++--------
 .../micrometer/reporter/MicrometerJmxReporter.java |  6 ++-
 .../commons/service/metric/MetricService.java      |  7 +++-
 .../db/service/metrics/IoTDBInternalReporter.java  | 24 +++++------
 7 files changed, 64 insertions(+), 58 deletions(-)

diff --git 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/InternalIoTDBReporter.java
 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/InternalIoTDBReporter.java
index 0af98d579d..f6d66e2733 100644
--- 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/InternalIoTDBReporter.java
+++ 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/InternalIoTDBReporter.java
@@ -34,7 +34,7 @@ public abstract class InternalIoTDBReporter extends 
IoTDBReporter {
   /**
    * Add autoGauge into internal reporter
    *
-   * @param gauge autoGauge
+   * @param autoGauge autoGauge
    * @param name the name of autoGauge
    * @param tags the tags of autoGauge
    */
diff --git 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/MemoryInternalIoTDBReporter.java
 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/MemoryInternalIoTDBReporter.java
index 82fbb7e220..a4e2bd1a0a 100644
--- 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/MemoryInternalIoTDBReporter.java
+++ 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/MemoryInternalIoTDBReporter.java
@@ -42,12 +42,12 @@ public class MemoryInternalIoTDBReporter extends 
InternalIoTDBReporter {
 
   @Override
   public boolean start() {
-    return false;
+    return true;
   }
 
   @Override
   public boolean stop() {
-    return false;
+    return true;
   }
 
   @Override
diff --git 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/SessionIoTDBReporter.java
 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/SessionIoTDBReporter.java
index c29f0a231c..5b7f271952 100644
--- 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/SessionIoTDBReporter.java
+++ 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/SessionIoTDBReporter.java
@@ -80,30 +80,30 @@ public class SessionIoTDBReporter extends IoTDBReporter {
   @Override
   @SuppressWarnings("unsafeThreadSchedule")
   public boolean start() {
-    if (currentServiceFuture == null) {
-      currentServiceFuture =
-          service.scheduleAtFixedRate(
-              () -> {
-                try {
-                  Map<String, Map<String, Object>> values = new HashMap<>();
-                  for (Map.Entry<MetricInfo, IMetric> metricEntry :
-                      metricManager.getAllMetrics().entrySet()) {
-                    String prefix = 
IoTDBMetricsUtils.generatePath(metricEntry.getKey());
-                    Map<String, Object> value = new HashMap<>();
-                    metricEntry.getValue().constructValueMap(value);
-                    values.put(prefix, value);
-                  }
-                  writeMetricsToIoTDB(values, System.currentTimeMillis());
-                } catch (Throwable t) {
-                  LOGGER.error("Schedule task failed", t);
-                }
-              },
-              1,
-              MetricConfigDescriptor.getInstance()
-                  .getMetricConfig()
-                  .getAsyncCollectPeriodInSecond(),
-              TimeUnit.SECONDS);
+    if (currentServiceFuture != null) {
+      LOGGER.warn("IoTDB Session Reporter already start");
+      return false;
     }
+    currentServiceFuture =
+        service.scheduleAtFixedRate(
+            () -> {
+              try {
+                Map<String, Map<String, Object>> values = new HashMap<>();
+                for (Map.Entry<MetricInfo, IMetric> metricEntry :
+                    metricManager.getAllMetrics().entrySet()) {
+                  String prefix = 
IoTDBMetricsUtils.generatePath(metricEntry.getKey());
+                  Map<String, Object> value = new HashMap<>();
+                  metricEntry.getValue().constructValueMap(value);
+                  values.put(prefix, value);
+                }
+                writeMetricsToIoTDB(values, System.currentTimeMillis());
+              } catch (Throwable t) {
+                LOGGER.error("Schedule task failed", t);
+              }
+            },
+            1,
+            
MetricConfigDescriptor.getInstance().getMetricConfig().getAsyncCollectPeriodInSecond(),
+            TimeUnit.SECONDS);
     return true;
   }
 
diff --git 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/prometheus/PrometheusReporter.java
 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/prometheus/PrometheusReporter.java
index 57e8b837b5..551bd28332 100644
--- 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/prometheus/PrometheusReporter.java
+++ 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/prometheus/PrometheusReporter.java
@@ -68,17 +68,23 @@ public class PrometheusReporter implements Reporter {
     if (httpServer != null) {
       return false;
     }
-    httpServer =
-        HttpServer.create()
-            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000)
-            .channelGroup(new 
DefaultChannelGroup(GlobalEventExecutor.INSTANCE))
-            .port(metricConfig.getPrometheusReporterPort())
-            .route(
-                routes ->
-                    routes.get(
-                        "/metrics",
-                        (request, response) -> 
response.sendString(Mono.just(scrape()))))
-            .bindNow();
+    try {
+      httpServer =
+          HttpServer.create()
+              .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000)
+              .channelGroup(new 
DefaultChannelGroup(GlobalEventExecutor.INSTANCE))
+              .port(metricConfig.getPrometheusReporterPort())
+              .route(
+                  routes ->
+                      routes.get(
+                          "/metrics",
+                          (request, response) -> 
response.sendString(Mono.just(scrape()))))
+              .bindNow();
+    } catch (Exception e) {
+      httpServer = null;
+      LOGGER.error("Failed to start prometheus reporter", e);
+      return false;
+    }
     LOGGER.info(
         "http server for metrics started, listen on {}", 
metricConfig.getPrometheusReporterPort());
     return true;
@@ -196,11 +202,6 @@ public class PrometheusReporter implements Reporter {
     return result;
   }
 
-  private static String getHelpMessage(String metric, MetricType type) {
-    return String.format(
-        "Generated from metric import (metric=%s, type=%s)", metric, 
type.toString());
-  }
-
   @Override
   public boolean stop() {
     if (httpServer != null) {
diff --git 
a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/reporter/MicrometerJmxReporter.java
 
b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/reporter/MicrometerJmxReporter.java
index 8aa0769a02..c1d2685c58 100644
--- 
a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/reporter/MicrometerJmxReporter.java
+++ 
b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/reporter/MicrometerJmxReporter.java
@@ -43,9 +43,11 @@ public class MicrometerJmxReporter implements JmxReporter {
           Metrics.globalRegistry.getRegistries().stream()
               .filter(reporter -> reporter instanceof JmxMeterRegistry)
               .collect(Collectors.toSet());
-      if (meterRegistrySet.size() == 0) {
-        Metrics.addRegistry(new JmxMeterRegistry(JmxConfig.DEFAULT, 
Clock.SYSTEM));
+      if (meterRegistrySet.size() != 0) {
+        LOGGER.warn("Jmx Reporter already start");
+        return false;
       }
+      Metrics.addRegistry(new JmxMeterRegistry(JmxConfig.DEFAULT, 
Clock.SYSTEM));
     } catch (Exception e) {
       LOGGER.error("Failed to start Micrometer JmxReporter, because {}", 
e.getMessage());
       return false;
diff --git 
a/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/MetricService.java
 
b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/MetricService.java
index e889e10e69..5da8cf628d 100644
--- 
a/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/MetricService.java
+++ 
b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/MetricService.java
@@ -84,7 +84,7 @@ public class MetricService extends AbstractMetricService 
implements MetricServic
     internalReporter.addAutoGauge(this.internalReporter.getAllAutoGauge());
     this.internalReporter.stop();
     this.internalReporter = internalReporter;
-    this.internalReporter.start();
+    startInternalReporter();
     logger.info("Finish reloading internal reporter");
   }
 
@@ -120,7 +120,10 @@ public class MetricService extends AbstractMetricService 
implements MetricServic
   }
 
   public void startInternalReporter() {
-    this.internalReporter.start();
+    if (!this.internalReporter.start()) {
+      logger.error("Failed to start internal reporter");
+      this.internalReporter = new MemoryInternalIoTDBReporter();
+    }
   }
 
   public static MetricService getInstance() {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalReporter.java
 
b/server/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalReporter.java
index 18f8b8b7b2..cac9714802 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalReporter.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalReporter.java
@@ -88,19 +88,19 @@ public class IoTDBInternalReporter extends 
InternalIoTDBReporter {
 
   @Override
   public boolean start() {
-    if (currentServiceFuture == null) {
-      currentServiceFuture =
-          ScheduledExecutorUtil.safelyScheduleAtFixedRate(
-              service,
-              () -> {
-                writeMetricToIoTDB(autoGauges);
-              },
-              1,
-              MetricConfigDescriptor.getInstance()
-                  .getMetricConfig()
-                  .getAsyncCollectPeriodInSecond(),
-              TimeUnit.SECONDS);
+    if (currentServiceFuture != null) {
+      LOGGER.warn("IoTDB Internal Reporter already start");
+      return false;
     }
+    currentServiceFuture =
+        ScheduledExecutorUtil.safelyScheduleAtFixedRate(
+            service,
+            () -> {
+              writeMetricToIoTDB(autoGauges);
+            },
+            1,
+            
MetricConfigDescriptor.getInstance().getMetricConfig().getAsyncCollectPeriodInSecond(),
+            TimeUnit.SECONDS);
     return true;
   }
 

Reply via email to