You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ch...@apache.org on 2021/02/18 11:31:13 UTC

[iotdb] branch feature/metric2021 updated: add micrometer metric example

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

chaow pushed a commit to branch feature/metric2021
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/feature/metric2021 by this push:
     new fd1693b  add micrometer metric example
fd1693b is described below

commit fd1693b21de189f3d8b00836f239dedaa7e2582d
Author: chaow <xu...@gmail.com>
AuthorDate: Thu Feb 18 19:30:27 2021 +0800

    add micrometer metric example
---
 .../org/apache/iotdb/metrics/MetricReporter.java   |   1 +
 .../org/apache/iotdb/metrics/MetricService.java    |  94 ++++++------
 .../org/apache/iotdb/metrics/type/Counter.java     |   2 -
 metrics/micrometer-metrics/pom.xml                 |  23 +++
 .../micrometer/MicrometerMetricFactory.java        |  97 ++++++++++++
 .../micrometer/MicrometerMetricManager.java        | 166 +++++++++++++++++++++
 .../micrometer/MicrometerMetricReporter.java       |  71 +++++++++
 .../micrometer/type/MicrometerCounter.java}        |  32 +++-
 ...otdb.metrics.micrometer.MicrometerMetricFactory |   1 +
 ...tdb.metrics.micrometer.MicrometerMetricReporter |   1 +
 metrics/pom.xml                                    |   1 +
 .../java/org/apache/iotdb/db/service/IoTDB.java    |   4 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |   4 +
 13 files changed, 442 insertions(+), 55 deletions(-)

diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricReporter.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricReporter.java
index 1a67cfe..68862f4 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricReporter.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricReporter.java
@@ -2,5 +2,6 @@ package org.apache.iotdb.metrics;
 
 public interface MetricReporter {
   boolean start();
+  void setMetricFactory(MetricFactory metricFactory);
   boolean stop();
 }
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java
index 4a6056d..47adaf6 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java
@@ -4,64 +4,70 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.ServiceLoader;
+
 import org.apache.iotdb.metrics.impl.DoNothingFactory;
 
 public class MetricService {
 
- private static List<MetricReporter> reporters = new ArrayList<>();
+  private static final List<MetricReporter> reporters = new ArrayList<>();
+
+  private static MetricFactory factory;
+
+  static {
+    init();
+  }
+
+  private static void init() {
 
- private static MetricFactory factory;
+    ServiceLoader<MetricFactory> metricFactories = ServiceLoader.load(MetricFactory.class);
+    int size = 0;
+    MetricFactory nothingFactory = null;
 
- static {
-  init();
- }
+    for (MetricFactory mf : metricFactories) {
+      if (mf instanceof DoNothingFactory) {
+        nothingFactory = mf;
+        continue;
+      }
+      size++;
+//      if (size > 1) {
+//        throw new RuntimeException("More than one Metric Implementation is detected.");
+//      }
+      factory = mf;
+      break;
+    }
 
- private static void init() {
+    // if no more implementation, we use nothingFactory.
+    if (size == 0) {
+      factory = nothingFactory;
+    }
 
-  ServiceLoader<MetricReporter> reporter = ServiceLoader.load(MetricReporter.class);
-  for (MetricReporter r : reporter) {
-   reporters.add(r);
-   r.start();
+    ServiceLoader<MetricReporter> reporter = ServiceLoader.load(MetricReporter.class);
+    for (MetricReporter r : reporter) {
+      reporters.add(r);
+      r.setMetricFactory(factory);
+      r.start();
+    }
   }
 
-  ServiceLoader<MetricFactory> metricFactories = ServiceLoader.load(MetricFactory.class);
-  int size = 0;
-  MetricFactory nothingFactory = null;
-
-  for (MetricFactory mf : metricFactories) {
-   if (mf instanceof DoNothingFactory) {
-    nothingFactory = mf;
-    continue;
-   }
-    size ++;
-    if (size > 1) {
-     throw new RuntimeException("More than one Metric Implementation is detected.");
+  public static void stop() {
+    for (MetricReporter r : reporters) {
+      r.stop();
     }
-   factory = mf;
   }
 
-  // if no more implementation, we use nothingFactory.
-  if (size == 0) {
-   factory = nothingFactory;
+  public static MetricManager getMetric(String namespace) {
+    return factory.getMetric(namespace);
+  }
+
+  public static void enableKnownMetric(KnownMetric metric) {
+    factory.enableKnownMetric(metric);
+  }
+
+  public static Map<String, MetricManager> getAllMetrics() {
+    return factory.getAllMetrics();
   }
- }
 
- public static void stop() {
-  for (MetricReporter r : reporters) {
-   r.stop();
+  public static boolean isEnable() {
+    return factory.isEnable();
   }
- }
-
- public static MetricManager getMetric(String namespace) {
-  return factory.getMetric(namespace);
- }
- public static void enableKnownMetric(KnownMetric metric) {
-  factory.enableKnownMetric(metric);
- }
- public static Map<String, MetricManager> getAllMetrics() {
-  return factory.getAllMetrics();
- }
- public static boolean isEnable() {
-  return factory.isEnable();
- }
 }
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Counter.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Counter.java
index cc4ac5e..1c96e72 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Counter.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Counter.java
@@ -21,8 +21,6 @@ package org.apache.iotdb.metrics.type;
 public interface Counter extends IMetric {
   void inc();
   void inc(long n);
-  void dec();
-  void dec(long n);
 
   long count();
 }
diff --git a/metrics/micrometer-metrics/pom.xml b/metrics/micrometer-metrics/pom.xml
new file mode 100644
index 0000000..43d1239
--- /dev/null
+++ b/metrics/micrometer-metrics/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>iotdb-metrics</artifactId>
+        <groupId>org.apache.iotdb</groupId>
+        <version>0.12.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>micrometer-metrics</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.iotdb</groupId>
+            <artifactId>metrics-interface</artifactId>
+            <version>0.12.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricFactory.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricFactory.java
new file mode 100644
index 0000000..29a8130
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricFactory.java
@@ -0,0 +1,97 @@
+/*
+ * 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.iotdb.metrics.micrometer;
+
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmHeapPressureMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
+import org.apache.iotdb.metrics.KnownMetric;
+import org.apache.iotdb.metrics.MetricFactory;
+import org.apache.iotdb.metrics.MetricManager;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class MicrometerMetricFactory implements MetricFactory {
+  boolean isEnable;
+  Map<String, MetricManager> currentMetricManagers = new ConcurrentHashMap<String, MetricManager>();
+
+  @Override
+  public MetricManager getMetric(String namespace) {
+    if (!isEnable) {
+      return null;
+    }
+    currentMetricManagers.putIfAbsent(namespace, new MicrometerMetricManager());
+    return currentMetricManagers.get(namespace);
+  }
+
+  @Override
+  public void enableKnownMetric(KnownMetric metric) {
+    if (!isEnable) {
+      return;
+    }
+    switch (metric) {
+      case JVM:
+        enableJVMMetrics();
+        break;
+      case SYSTEM:
+        break;
+      case THREAD:
+        break;
+      default:
+        // ignore;
+    }
+  }
+
+  private void enableJVMMetrics() {
+    MeterRegistry meterRegistry = (MeterRegistry) currentMetricManagers.get("iotdb");
+    ClassLoaderMetrics classLoaderMetrics = new ClassLoaderMetrics();
+    classLoaderMetrics.bindTo(meterRegistry);
+    JvmCompilationMetrics jvmCompilationMetrics = new JvmCompilationMetrics();
+    jvmCompilationMetrics.bindTo(meterRegistry);
+    try (JvmGcMetrics jvmGcMetrics = new JvmGcMetrics();
+         JvmHeapPressureMetrics jvmHeapPressureMetrics = new JvmHeapPressureMetrics()) {
+      jvmGcMetrics.bindTo(meterRegistry);
+      jvmHeapPressureMetrics.bindTo(meterRegistry);
+    }
+    JvmMemoryMetrics jvmMemoryMetrics = new JvmMemoryMetrics();
+    jvmMemoryMetrics.bindTo(meterRegistry);
+    JvmThreadMetrics jvmThreadMetrics = new JvmThreadMetrics();
+    jvmThreadMetrics.bindTo(meterRegistry);
+  }
+
+  @Override
+  public Map<String, MetricManager> getAllMetrics() {
+    if (!isEnable) {
+      return Collections.emptyMap();
+    }
+    return currentMetricManagers;
+  }
+
+  @Override
+  public boolean isEnable() {
+    return isEnable;
+  }
+}
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricManager.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricManager.java
new file mode 100644
index 0000000..4b6b660
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricManager.java
@@ -0,0 +1,166 @@
+/*
+ * 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.iotdb.metrics.micrometer;
+
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.prometheus.PrometheusConfig;
+import io.micrometer.prometheus.PrometheusMeterRegistry;
+import org.apache.iotdb.metrics.MetricManager;
+import org.apache.iotdb.metrics.micrometer.type.MicrometerCounter;
+import org.apache.iotdb.metrics.type.Counter;
+import org.apache.iotdb.metrics.type.Gauge;
+import org.apache.iotdb.metrics.type.Histogram;
+import org.apache.iotdb.metrics.type.IMetric;
+import org.apache.iotdb.metrics.type.Rate;
+import org.apache.iotdb.metrics.type.Timer;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class MicrometerMetricManager implements MetricManager {
+  Map<Meter.Id, IMetric> currentMeters;
+
+  io.micrometer.prometheus.PrometheusMeterRegistry prometheusMeterRegistry;
+
+  public MicrometerMetricManager() {
+    prometheusMeterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
+  }
+
+  public MeterRegistry getMeterRegistry() {
+    return prometheusMeterRegistry;
+  }
+
+  @Override
+  public Counter counter(String metric, String... tags) {
+    io.micrometer.core.instrument.Counter innerCounter = prometheusMeterRegistry.counter(metric, tags);
+    IMetric counter = currentMeters.get(innerCounter.getId());
+    if (counter == null) {
+      counter = new MicrometerCounter(innerCounter);
+      currentMeters.put(innerCounter.getId(), counter);
+    }
+    return (Counter) counter;
+  }
+
+  @Override
+  public Gauge gauge(String metric, String... tags) {
+    return null;
+  }
+
+  @Override
+  public Histogram histogram(String metric, String... tags) {
+    return null;
+  }
+
+  @Override
+  public Rate rate(String metric, String... tags) {
+    return null;
+  }
+
+  @Override
+  public Timer timer(String metric, String... tags) {
+    return null;
+  }
+
+  @Override
+  public void count(int delta, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void count(long delta, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void histogram(int value, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void histogram(long value, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void gauge(int value, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void gauge(long value, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void meter(int value, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void meter(long value, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void timer(long delta, TimeUnit timeUnit, String metric, String... tags) {
+
+  }
+
+  @Override
+  public void timerStart(String metric, String... tags) {
+
+  }
+
+  @Override
+  public void timerEnd(String metric, String... tags) {
+
+  }
+
+  @Override
+  public Map<String, String[]> getAllMetricKeys() {
+    return null;
+  }
+
+  @Override
+  public Map<String[], Counter> getAllCounters() {
+    return null;
+  }
+
+  @Override
+  public Map<String[], Gauge> getAllGauges() {
+    return null;
+  }
+
+  @Override
+  public Map<String[], Rate> getAllMeters() {
+    return null;
+  }
+
+  @Override
+  public Map<String[], Histogram> getAllHistograms() {
+    return null;
+  }
+
+  @Override
+  public Map<String[], Timer> getAllTimers() {
+    return null;
+  }
+}
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricReporter.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricReporter.java
new file mode 100644
index 0000000..f738baa
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricReporter.java
@@ -0,0 +1,71 @@
+/*
+ * 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.iotdb.metrics.micrometer;
+
+import com.sun.net.httpserver.HttpServer;
+import io.micrometer.prometheus.PrometheusMeterRegistry;
+import org.apache.iotdb.metrics.MetricFactory;
+import org.apache.iotdb.metrics.MetricReporter;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+
+public class MicrometerMetricReporter implements MetricReporter {
+  MetricFactory micrometerMetricFactory;
+  Thread runThread;
+
+  @Override
+  public boolean start() {
+    try {
+      HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
+      server.createContext("/prometheus", httpExchange -> {
+        String response = ((PrometheusMeterRegistry)
+          ((MicrometerMetricManager) micrometerMetricFactory.getMetric("iotdb"))
+            .getMeterRegistry()).scrape();
+        httpExchange.sendResponseHeaders(200, response.getBytes().length);
+        try (OutputStream os = httpExchange.getResponseBody()) {
+          os.write(response.getBytes());
+        }
+      });
+
+      runThread = new Thread(server::start);
+      runThread.start();
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+    return true;
+  }
+
+  @Override
+  public void setMetricFactory(MetricFactory metricFactory) {
+    micrometerMetricFactory = metricFactory;
+  }
+
+  @Override
+  public boolean stop() {
+    try {
+      runThread.join();
+    } catch (InterruptedException e) {
+      e.printStackTrace();
+    }
+    return true;
+  }
+}
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Counter.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
similarity index 61%
copy from metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Counter.java
copy to metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
index cc4ac5e..9fbfa6f 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Counter.java
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
@@ -16,13 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.metrics.type;
 
-public interface Counter extends IMetric {
-  void inc();
-  void inc(long n);
-  void dec();
-  void dec(long n);
+package org.apache.iotdb.metrics.micrometer.type;
 
-  long count();
+import org.apache.iotdb.metrics.type.Counter;
+
+public class MicrometerCounter implements Counter {
+
+  public MicrometerCounter(io.micrometer.core.instrument.Counter counter) {
+    this.counter = counter;
+  }
+
+  io.micrometer.core.instrument.Counter counter;
+
+  @Override
+  public void inc() {
+    counter.increment();
+  }
+
+  @Override
+  public void inc(long n) {
+    counter.increment(n);
+  }
+
+  @Override
+  public long count() {
+    return (long) counter.count();
+  }
 }
diff --git a/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricFactory b/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricFactory
new file mode 100644
index 0000000..a17288f
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricFactory
@@ -0,0 +1 @@
+org.apache.iotdb.metrics.micrometer.MicrometerMetricFactory
\ No newline at end of file
diff --git a/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricReporter b/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricReporter
new file mode 100644
index 0000000..a96ed11
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricReporter
@@ -0,0 +1 @@
+org.apache.iotdb.metrics.micrometer.MicrometerMetricReporter
\ No newline at end of file
diff --git a/metrics/pom.xml b/metrics/pom.xml
index 7a73162..2ac4d14 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -34,6 +34,7 @@
     <url>https://github.com/thulab/iotdb/tree/master/tsfile</url>
     <modules>
         <module>interface</module>
+        <module>micrometer-metrics</module>
     </modules>
     <dependencies/>
 </project>
diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index 44e4d3c..c0c8afc 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -41,8 +41,8 @@ import org.apache.iotdb.db.rescon.SystemInfo;
 import org.apache.iotdb.db.rescon.TVListAllocator;
 import org.apache.iotdb.db.sync.receiver.SyncServerManager;
 import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
-import org.apache.iotdb.metrics.MetricRegistry;
 import org.apache.iotdb.metrics.MetricManager;
+import org.apache.iotdb.metrics.MetricService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,7 +58,7 @@ public class IoTDB implements IoTDBMBean {
     return IoTDBHolder.INSTANCE;
   }
 
-  public static MetricRegistry serverMetricRegistry = MetricManager.getMetric("iotdb");
+  public static MetricManager serverMetricManager = MetricService.getMetric("iotdb");
 
   public static void main(String[] args) {
     if (args.length > 0) {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index a92d3d2..ba3515f 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -106,6 +106,7 @@ import org.apache.iotdb.db.tools.watermark.WatermarkEncoder;
 import org.apache.iotdb.db.utils.FilePathUtils;
 import org.apache.iotdb.db.utils.QueryDataSetUtils;
 import org.apache.iotdb.db.utils.SchemaUtils;
+import org.apache.iotdb.metrics.type.Counter;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.ServerProperties;
@@ -208,6 +209,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
 
   private QueryTimeManager queryTimeManager = QueryTimeManager.getInstance();
 
+  Counter counter = IoTDB.serverMetricManager.counter("request_total", "user", "root");
+
   public TSServiceImpl() throws QueryProcessException {
     processor = new Planner();
     executor = new PlanExecutor();
@@ -1090,6 +1093,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
           .debug("Session {} insertRecords, first device {}, first time {}", currSessionId.get(),
               req.deviceIds.get(0), req.getTimestamps().get(0));
     }
+    counter.inc();
 
     List<TSStatus> statusList = new ArrayList<>();