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/25 08:06:32 UTC

[iotdb] branch feature/metric2021 updated (4315055 -> 4b26410)

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

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


    from 4315055  add log output; implement counter
     new e4c562a  add implements
     add 8289372  Update tsdb comparison doc (#2601)
     add 00414af  fix the client leak of client pool
     add 978dd58  use remote schema cache when check timeseries exist or not
     add 761895f  use try-catch-with-resource instead of try-catch
     add 65d5ab3  use ClientUtils.putBackSyncClient all over the place
     add 5a31889  fix the sonar bug in PublicBAOS.java
     add 26ecec7  remove the synchronized keyword of those override method in PublicBAOS
     add c79f8ef  Apply spotless
     add 92c8384  Merge branch 'apache_master' into apache_master_0204_fix_client_pool_leak
     add 61c9286  Merge pull request #2635 from neuyilan/apache_master_0204_fix_client_pool_leak
     add 46b0c2f  [ISSUE-2673] Improve tests in PhysicalPlanSerializeTest (#2672)
     add bd87c55  remove some duplicate statements in Chinese config manual  (#2701)
     add 032a0e7  [IOTDB-1168] Remove duplicated-throws
     add cccd30d  [IOTDB-1167] Remove unnecessary modifier
     add aefd8ef  [IOTDB-1165] Using Java Style array declaration
     add 5a14711   [IOTDB-1166] Remove redundant toString() calls (#2704)
     add 7d4b568  [ISSUE-2611] An unsequence file that covers too many sequence file causes OOM query (#2616)
     add 603d6b2  [IOTDB-1135] Fix count timeseries bug when the paths are nested (#2677)
     add dcab9bd  Add the description about TsClean to docs (#2711)
     add e5e36f3  Fix an error in AggregationQuery system design doc (#2719)
     add 67b08f9  Add level merge to  "merge" command (#2605)
     add bc64896  Add new committer (#2720)
     add c84771b  [IOTDB-1152] optimize regular data size in traversing (#2667)
     add ca40856  move sonar and coverall as seperate actions; merge Linux and Mac actions into one file (#2713)
     add cb24696  Remove unexpected exception thrown when all CreateTimeseries opeartions are successful for CreateMultiTimeseries (#2718)
     add de69352  Update ASF copyright year on website (#2723)
     add 3aed578  [IOTDB-1024] Support multiple aggregated measurements for group by level statement (#2714)
     add 6770dba  New distribution structure for v0.12 (#2646)
     add b4544d8  [IOTDB-1163]optimize the insertRecords session interface for cluster version (#2698)
     add 0cf96a5  [IOTDB-1169] Clean up for redundant throw clause (#2721)
     add 56ffbcf  [ISSUE-2484] Fix creating timeseries error by using "create" or "insert" statement (#2468)
     add 7c5356b  fix IoTDBAutoCreateSchemaIT compile error (#2728)
     add a2b704d  bug fix - skip illegal path when delete multi timeseries  (#2567)
     new 4b26410  merge master

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/client.yml                       |   4 +-
 .github/workflows/{main-mac.yml => main-unix.yml}  |  10 +-
 .github/workflows/main-win.yml                     |   2 +-
 .../{main-linux.yml => sonar-coveralls.yml}        |  20 +-
 README.md                                          |   2 +
 .../java/org/apache/iotdb/cli/AbstractCliIT.java   |   2 +-
 .../org/apache/iotdb/cli/StartClientScriptIT.java  |   4 +-
 client-cpp/pom.xml                                 | 156 ++++----
 client-cpp/src/assembly/client-cpp.xml             |   1 +
 cluster/src/assembly/cluster.xml                   |   8 +-
 .../java/org/apache/iotdb/cluster/ClientMain.java  |   2 +-
 .../iotdb/cluster/client/DataClientProvider.java   |   7 +-
 .../iotdb/cluster/coordinator/Coordinator.java     |  42 +-
 .../cluster/log/applier/AsyncDataLogApplier.java   |   8 +
 .../iotdb/cluster/log/applier/BaseApplier.java     |   3 +
 .../iotdb/cluster/log/applier/DataLogApplier.java  |  11 +
 .../cluster/log/logtypes/PhysicalPlanLog.java      |   2 +-
 .../cluster/log/snapshot/MetaSimpleSnapshot.java   |   3 +-
 .../apache/iotdb/cluster/metadata/CMManager.java   | 168 +++++---
 .../apache/iotdb/cluster/metadata/MetaPuller.java  |  26 +-
 .../iotdb/cluster/query/ClusterPlanExecutor.java   |  57 +--
 .../iotdb/cluster/query/ClusterPlanRouter.java     |  35 +-
 .../cluster/query/aggregate/ClusterAggregator.java |  16 +-
 .../query/groupby/RemoteGroupByExecutor.java       |  37 +-
 .../query/last/ClusterLastQueryExecutor.java       |  32 +-
 .../cluster/query/reader/ClusterReaderFactory.java |  16 +-
 .../iotdb/cluster/query/reader/DataSourceInfo.java |   3 +-
 .../reader/RemoteSeriesReaderByTimestamp.java      |  16 +-
 .../query/reader/RemoteSimpleSeriesReader.java     |  14 +-
 .../apache/iotdb/cluster/server/ClientServer.java  |  14 +-
 .../iotdb/cluster/server/StoppedMemberManager.java |   2 +-
 .../cluster/server/member/DataGroupMember.java     |  12 +-
 .../apache/iotdb/cluster/server/monitor/Timer.java |   2 +-
 .../cluster/utils/nodetool/function/Host.java      |   2 +-
 .../cluster/client/DataClientProviderTest.java     |   3 +
 .../iotdb/cluster/common/TestLogManager.java       |   4 +-
 .../iotdb/cluster/log/CommitLogCallbackTest.java   |   4 +-
 .../cluster/log/applier/MetaLogApplierTest.java    |  11 +-
 .../cluster/log/manage/RaftLogManagerTest.java     |   3 +-
 .../cluster/log/snapshot/DataSnapshotTest.java     |   2 +-
 .../iotdb/cluster/query/LoadConfigurationTest.java |   4 +-
 .../query/reader/RemoteSimpleSeriesReaderTest.java |   2 +-
 .../caller/AppendGroupEntryHandlerTest.java        |   3 +-
 .../handlers/caller/ElectionHandlerTest.java       |   2 +-
 compile-tools/thrift/pom.xml                       | 432 +++++++--------------
 compile-tools/thrift/src/assembly/compiler.xml     |  37 --
 compile-tools/thrift/src/assembly/cpp.xml          |  51 ---
 compile-tools/thrift/src/assembly/python.xml       |  38 --
 distribution/pom.xml                               |  31 +-
 .../src/assembly/{distribution.xml => all.xml}     |  57 +--
 {cli => distribution}/src/assembly/cli.xml         |  24 +-
 .../src/assembly/client-cpp.xml                    |  14 +-
 .../src/assembly/{distribution.xml => cluster.xml} |  64 ++-
 distribution/src/assembly/common-files.xml         |  48 +++
 .../src/assembly/grafana.xml                       |  26 +-
 .../src/assembly/{distribution.xml => server.xml}  |  49 +--
 docker/src/main/Dockerfile                         |   2 +-
 docs/UserGuide/Comparison/TSDB-Comparison.md       | 107 +++--
 .../DML Data Manipulation Language.md              |  38 +-
 .../Operation Manual/UDF User Defined Function.md  |   6 +-
 docs/zh/SystemDesign/DataQuery/AggregationQuery.md |   2 +-
 .../DML Data Manipulation Language.md              |  36 +-
 .../Operation Manual/UDF User Defined Function.md  |   6 +-
 docs/zh/UserGuide/Server/Config Manual.md          |  30 +-
 example/client-cpp-example/pom.xml                 | 214 +++++-----
 .../iotdb/flink/FlinkTsFileStreamSource.java       |   3 +-
 .../iotdb/hadoop/tsfile/TSFMRReadExample.java      |   3 +-
 .../iotdb/hadoop/tsfile/TSMRWriteExample.java      |   3 +-
 .../apache/iotdb/hadoop/tsfile/TsFileHelper.java   |   3 +-
 .../main/java/org/apache/iotdb/SessionExample.java |   5 +-
 .../java/org/apache/iotdb/SessionPoolExample.java  |   2 +-
 .../iotdb/tsfile/TsFileWriteWithTSRecord.java      |   2 +-
 .../java/org/apache/iotdb/flink/IoTDBSink.java     |   2 +-
 .../iotdb/flink/IoTDBSinkBatchInsertTest.java      |   2 +-
 .../iotdb/flink/IoTDBSinkBatchTimerTest.java       |   4 +-
 .../iotdb/flink/tsfile/RowTSRecordConverter.java   |   7 +-
 .../flink/tsfile/RowTsFileConnectorTestBase.java   |   2 +-
 .../flink/tsfile/RowTsFileInputFormatITCase.java   |   2 +-
 .../web/grafana/dao/impl/BasicDaoImplTest.java     |   4 +-
 .../apache/iotdb/hadoop/fileSystem/HDFSFile.java   |  23 +-
 .../apache/iotdb/hadoop/fileSystem/HDFSInput.java  |  10 +-
 .../apache/iotdb/hadoop/fileSystem/HDFSOutput.java |   4 +-
 .../iotdb/hadoop/tsfile/TSFRecordReader.java       |   4 +-
 .../iotdb/hadoop/tsfile/TSFRecordWriter.java       |   2 +-
 .../apache/iotdb/hadoop/tsfile/TSFHadoopTest.java  |   4 +-
 .../iotdb/hadoop/tsfile/TSFInputSplitTest.java     |   2 +-
 .../iotdb/hadoop/tsfile/TsFileTestHelper.java      |   3 +-
 .../org/apache/iotdb/hive/TSFHiveOutputFormat.java |   2 +-
 .../org/apache/iotdb/hive/TSFHiveRecordReader.java |   2 +-
 .../org/apache/iotdb/hive/TsFileDeserializer.java  |   2 +-
 .../java/org/apache/iotdb/hive/TsFileSerDe.java    |   4 +-
 .../org/apache/iotdb/hive/TsFileTestHelper.java    |   3 +-
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |   2 +-
 .../org/apache/iotdb/jdbc/IoTDBDataSource.java     |  17 +-
 .../apache/iotdb/jdbc/IoTDBDataSourceFactory.java  |  10 +-
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   |   8 +-
 .../java/org/apache/iotdb/jdbc/IoTDBDriver.java    |   4 +-
 .../apache/iotdb/jdbc/IoTDBPreparedStatement.java  |  24 +-
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |   2 +-
 .../test/java/org/apache/iotdb/jdbc/BatchTest.java |   2 +-
 .../org/apache/iotdb/jdbc/IoTDBConnectionTest.java |   6 +-
 .../apache/iotdb/jdbc/IoTDBResultMetadataTest.java |   4 +-
 .../org/apache/iotdb/jdbc/IoTDBStatementTest.java  |   2 +-
 .../test/java/org/apache/iotdb/jdbc/UtilsTest.java |   4 +-
 metrics/dropwizard-metrics/pom.xml                 |  27 ++
 .../dropwizard/DropwizardMetricManager.java        | 362 +++++++++++++++++
 .../dropwizard/DropwizardMetricReporter.java       |  93 +++++
 .../iotdb/metrics/dropwizard/MetricName.java       | 116 ++++++
 .../dropwizard/type/DropwizardCounter.java}        |  15 +-
 .../metrics/dropwizard/type/DropwizardGauge.java   |  62 +++
 .../dropwizard/type/DropwizardHistogram.java}      |  30 +-
 .../type/DropwizardHistogramSnapshot.java          |  73 ++++
 .../metrics/dropwizard/type/DropwizardRate.java    |  95 +++++
 .../metrics/dropwizard/type/DropwizardTimer.java}  |  29 +-
 .../org.apache.iotdb.metrics.MetricManager         |  14 +-
 .../org.apache.iotdb.metrics.MetricReporter        |  14 +-
 .../org/apache/iotdb/metrics/MetricManager.java    |  48 ++-
 .../org/apache/iotdb/metrics/MetricReporter.java   |   2 +-
 .../org/apache/iotdb/metrics/MetricService.java    |  55 +--
 .../apache/iotdb/metrics/config/MetricConfig.java  | 125 ++++++
 .../metrics/config/MetricConfigDescriptor.java     | 132 +++++++
 .../iotdb/metrics/config/MetricConstant.java       |   9 +-
 .../iotdb/metrics/impl/DoNothingMetricManager.java |  29 +-
 .../iotdb/metrics/type/HistogramSnapshot.java      |   2 -
 .../java/org/apache/iotdb/metrics/type/Timer.java  |   7 +-
 .../ReporterType.java}                             |  37 +-
 metrics/micrometer-metrics/pom.xml                 |  10 +
 .../iotdb/metrics/micrometer/MeterIdUtils.java     |  16 +-
 .../micrometer/MicrometerMetricFactory.java        |  98 -----
 .../micrometer/MicrometerMetricManager.java        | 367 +++++++++++++++--
 .../micrometer/MicrometerMetricReporter.java       |  63 ++-
 .../metrics/micrometer/type/MicrometerCounter.java |   3 +-
 .../metrics/micrometer/type/MicrometerGauge.java}  |  35 +-
 ...ometerCounter.java => MicrometerHistogram.java} |  28 +-
 .../type/MicrometerHistogramSnapshot.java          |  91 +++++
 .../metrics/micrometer/type/MicrometerRate.java    |  81 ++++
 ...MicrometerCounter.java => MicrometerTimer.java} |  32 +-
 ...otdb.metrics.micrometer.MicrometerMetricFactory |   1 -
 ...tdb.metrics.micrometer.MicrometerMetricReporter |   1 -
 .../org.apache.iotdb.metrics.MetricManager         |  14 +-
 .../org.apache.iotdb.metrics.MetricReporter        |  14 +-
 metrics/pom.xml                                    |   2 +-
 pom.xml                                            |  29 +-
 server/pom.xml                                     |  10 +
 .../resources/conf/iotdb-metric.properties         |  15 +-
 .../iotdb/db/auth/authorizer/OpenIdAuthorizer.java |   8 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   2 +-
 .../org/apache/iotdb/db/engine/StorageEngine.java  |   9 +-
 .../db/engine/compaction/TsFileManagement.java     |   6 +
 .../level/LevelCompactionTsFileManagement.java     |   3 +-
 .../iotdb/db/engine/merge/manage/MergeManager.java |   4 +-
 .../io/LocalTextModificationAccessor.java          |   2 +-
 .../engine/storagegroup/StorageGroupProcessor.java |  69 +++-
 .../storagegroup/virtualSg/VirtualPartitioner.java |   4 +-
 .../virtualSg/VirtualStorageGroupManager.java      |   4 +-
 .../query/UnSupportedFillTypeException.java        |   2 +-
 .../org/apache/iotdb/db/metadata/MManager.java     |  66 ++--
 .../java/org/apache/iotdb/db/metadata/MTree.java   | 128 +++---
 .../org/apache/iotdb/db/metadata/MetaUtils.java    |  37 ++
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |  49 ++-
 .../apache/iotdb/db/metrics/server/JettyUtil.java  |   6 +-
 .../iotdb/db/metrics/server/QueryServlet.java      |   7 +-
 .../apache/iotdb/db/metrics/ui/MetricsPage.java    |   2 +-
 .../apache/iotdb/db/qp/executor/IPlanExecutor.java |   8 +
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  | 101 +++--
 .../org/apache/iotdb/db/qp/logical/Operator.java   |   3 +-
 .../apache/iotdb/db/qp/physical/PhysicalPlan.java  |   8 +-
 .../iotdb/db/qp/physical/crud/AggregationPlan.java |  35 ++
 .../iotdb/db/qp/physical/crud/InsertRowPlan.java   |  10 +-
 .../physical/crud/InsertRowsOfOneDevicePlan.java   |   4 +-
 .../iotdb/db/qp/physical/crud/InsertRowsPlan.java  | 219 +++++++++++
 .../iotdb/db/qp/physical/sys/AuthorPlan.java       |   2 +-
 .../qp/physical/sys/CreateMultiTimeSeriesPlan.java |  14 +
 .../iotdb/db/qp/physical/sys/DataAuthPlan.java     |   2 +-
 .../db/qp/physical/sys/DeleteTimeSeriesPlan.java   |  22 ++
 .../apache/iotdb/db/qp/physical/sys/ShowPlan.java  |   2 +-
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    |   2 +-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  11 +
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |  11 -
 .../db/query/aggregation/impl/AvgAggrResult.java   |  17 +
 .../db/query/aggregation/impl/CountAggrResult.java |   2 +-
 .../query/aggregation/impl/MaxValueAggrResult.java |   4 +-
 .../query/aggregation/impl/MinValueAggrResult.java |   7 +-
 .../iotdb/db/query/dataset/SingleDataSet.java      |   5 +-
 .../query/dataset/groupby/GroupByTimeDataSet.java  |   8 +-
 .../db/query/executor/AggregationExecutor.java     |  12 +-
 .../db/query/reader/chunk/DiskChunkLoader.java     |   2 +-
 .../db/query/reader/chunk/MemChunkLoader.java      |   4 +-
 .../db/query/reader/chunk/MemChunkReader.java      |   2 +-
 .../chunk/metadata/MemChunkMetadataLoader.java     |   3 +-
 .../query/reader/series/SeriesAggregateReader.java |   2 +-
 .../iotdb/db/query/reader/series/SeriesReader.java |  20 +-
 .../UDFInputSeriesDataTypeNotValidException.java   |   4 +-
 .../db/query/udf/core/executor/UDTFExecutor.java   |   2 +-
 .../udf/service/TemporaryQueryDataFileService.java |   7 +-
 .../query/udf/service/UDFRegistrationService.java  |   9 +-
 .../java/org/apache/iotdb/db/service/IoTDB.java    |   5 +-
 .../org/apache/iotdb/db/service/JMXService.java    |   3 +-
 .../org/apache/iotdb/db/service/MQTTService.java   |   3 +-
 .../apache/iotdb/db/service/MetricsService.java    |   4 +-
 .../org/apache/iotdb/db/service/RPCService.java    |   3 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 139 ++++---
 .../org/apache/iotdb/db/service/UpgradeSevice.java |   3 +-
 .../iotdb/db/sync/receiver/SyncServerManager.java  |   3 +-
 .../db/sync/receiver/transfer/SyncServiceImpl.java |   9 +-
 .../apache/iotdb/db/tools/TsFileSketchTool.java    |   6 +-
 .../db/tools/watermark/WatermarkDetector.java      |   2 +-
 .../java/org/apache/iotdb/db/utils/AuthUtils.java  |   2 +-
 .../iotdb/db/utils/EncodingInferenceUtils.java     |   2 +-
 .../org/apache/iotdb/db/utils/FilePathUtils.java   | 155 ++++----
 .../java/org/apache/iotdb/db/utils/FileUtils.java  |   3 +-
 .../org/apache/iotdb/db/utils/SchemaUtils.java     |   6 +-
 .../db/auth/authorizer/OpenIdAuthorizerTest.java   |   2 +-
 .../db/auth/role/LocalFileRoleAccessorTest.java    |   2 +-
 .../db/auth/role/LocalFileRoleManagerTest.java     |   2 +-
 .../db/auth/user/LocalFileUserAccessorTest.java    |   2 +-
 .../IoTDBDefaultThreadExceptionHandlerTest.java    |   4 +-
 .../db/concurrent/IoTDBThreadPoolFactoryTest.java  |   8 +-
 .../org/apache/iotdb/db/constant/TestConstant.java |   3 +-
 .../db/engine/memtable/MemTableFlushTaskTest.java  |   3 +-
 .../db/engine/memtable/MemtableBenchmark.java      |   3 +-
 .../db/engine/memtable/PrimitiveMemTableTest.java  |   4 +-
 .../iotdb/db/engine/merge/MergeTaskTest.java       |   3 +-
 .../engine/modification/DeletionFileNodeTest.java  |   3 +-
 .../io/LocalTextModificationAccessorTest.java      |   2 +-
 .../storagegroup/StorageGroupProcessorTest.java    |   3 +-
 .../iotdb/db/engine/storagegroup/TTLTest.java      |   4 +-
 .../engine/storagegroup/TsFileProcessorTest.java   |   2 +-
 .../virtualSg/HashVirtualPartitionerTest.java      |   2 +-
 .../db/integration/IoTDBAutoCreateSchemaIT.java    | 106 +++++
 .../iotdb/db/integration/IoTDBCheckConfigIT.java   |   2 +-
 .../iotdb/db/integration/IoTDBClearCacheIT.java    |   3 +-
 .../apache/iotdb/db/integration/IoTDBCloseIT.java  |   3 +-
 .../iotdb/db/integration/IoTDBCompleteIT.java      |  20 +-
 .../iotdb/db/integration/IoTDBCompressTypeIT.java  |   2 +-
 .../db/integration/IoTDBCreateSnapshotIT.java      |   2 +-
 .../db/integration/IoTDBCreateTimeseriesIT.java    | 157 ++++++++
 .../apache/iotdb/db/integration/IoTDBDaemonIT.java |  14 +-
 .../db/integration/IoTDBDeleteStorageGroupIT.java  |   2 +-
 .../db/integration/IoTDBDeleteTimeseriesIT.java    |   2 +-
 .../db/integration/IoTDBEngineTimeGeneratorIT.java |   3 +-
 .../apache/iotdb/db/integration/IoTDBFillIT.java   |  21 +-
 .../db/integration/IoTDBFloatPrecisionIT.java      |   5 +-
 .../db/integration/IoTDBFlushQueryMergeIT.java     |   6 +-
 .../iotdb/db/integration/IoTDBLargeDataIT.java     |  12 +-
 .../apache/iotdb/db/integration/IoTDBLastIT.java   |   4 +-
 .../iotdb/db/integration/IoTDBLimitSlimitIT.java   |  11 +-
 .../iotdb/db/integration/IoTDBMergeTest.java       |   2 +-
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |   2 +-
 .../iotdb/db/integration/IoTDBMultiDeviceIT.java   |   3 +-
 .../iotdb/db/integration/IoTDBMultiSeriesIT.java   |   8 +-
 .../db/integration/IoTDBMultiStatementsIT.java     |   3 +-
 .../iotdb/db/integration/IoTDBNumberPathIT.java    |  21 +-
 .../iotdb/db/integration/IoTDBQueryDemoIT.java     |   2 +-
 .../iotdb/db/integration/IoTDBQuotedPathIT.java    |   2 +-
 .../iotdb/db/integration/IoTDBRecoverIT.java       |   4 +-
 .../db/integration/IoTDBRecoverUnclosedIT.java     |   4 +-
 .../db/integration/IoTDBRemovePartitionIT.java     |   7 +-
 .../IoTDBSameMeasurementsDifferentTypesIT.java     |   3 +-
 .../iotdb/db/integration/IoTDBSeriesReaderIT.java  |  41 ++
 .../iotdb/db/integration/IoTDBSimpleQueryIT.java   |   2 +-
 .../iotdb/db/integration/IoTDBTagAlterIT.java      |   2 +-
 .../apache/iotdb/db/integration/IoTDBTagIT.java    |   2 +-
 .../iotdb/db/integration/IoTDBVersionIT.java       |   2 +-
 .../aggregation/IoTDBAggregationByLevelIT.java     |  86 ++--
 .../aggregation/IoTDBAggregationIT.java            |  10 +-
 .../aggregation/IoTDBAggregationLargeDataIT.java   |   7 +-
 .../db/integration/auth/IoTDBAuthorizationIT.java  |   2 +-
 .../iotdb/db/metadata/MManagerBasicTest.java       |  68 +++-
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |  29 +-
 .../apache/iotdb/db/metadata/MetaUtilsTest.java    |  35 ++
 .../apache/iotdb/db/metadata/PartialPathTest.java  |   2 +-
 .../apache/iotdb/db/metadata/mnode/MNodeTest.java  |  71 ++++
 .../iotdb/db/qp/logical/IndexLogicalPlanTest.java  |   5 +-
 .../db/qp/physical/PhysicalPlanSerializeTest.java  | 140 +++----
 .../iotdb/db/qp/physical/SerializationTest.java    |   4 +-
 .../iotdb/db/qp/sql/IoTDBsqlVisitorTest.java       |   4 +-
 .../iotdb/db/query/control/TracingManagerTest.java |   5 +-
 .../reader/series/SeriesAggregateReaderTest.java   |   6 +-
 .../reader/series/SeriesReaderByTimestampTest.java |   6 +-
 .../db/query/reader/series/SeriesReaderTest.java   |   6 +-
 .../query/reader/series/SeriesReaderTestUtil.java  |   6 +-
 .../org/apache/iotdb/db/script/EnvScriptIT.java    |   6 +-
 .../db/sync/receiver/load/FileLoaderTest.java      |   8 +-
 .../recover/SyncReceiverLogAnalyzerTest.java       |   7 +-
 .../receiver/recover/SyncReceiverLoggerTest.java   |   6 +-
 .../db/sync/sender/manage/SyncFileManagerTest.java |   6 +-
 .../db/sync/sender/transfer/SyncClientTest.java    |   6 +-
 .../apache/iotdb/db/tools/IoTDBWatermarkTest.java  |   7 +-
 .../org/apache/iotdb/db/tools/MLogParserTest.java  |   2 +-
 .../apache/iotdb/db/utils/FilePathUtilsTest.java   |   3 +-
 .../org/apache/iotdb/db/utils/SchemaUtilsTest.java |   2 +-
 .../db/utils/datastructure/PrecisionTest.java      |   9 +-
 .../apache/iotdb/db/writelog/PerformanceTest.java  |   5 +-
 .../iotdb/db/writelog/WriteLogNodeManagerTest.java |   2 +-
 .../apache/iotdb/db/writelog/WriteLogNodeTest.java |   2 +-
 .../iotdb/db/writelog/recover/LogReplayerTest.java |   3 +-
 .../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java |   2 +-
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java |  20 +
 .../apache/iotdb/session/SessionCacheLeaderUT.java |  33 +-
 .../public/img/contributor-avatar/xww.jpg          | Bin 0 -> 64538 bytes
 .../public/img/contributor-avatar/yrzh.jpg         | Bin 0 -> 99556 bytes
 site/src/main/.vuepress/theme/components/Page.vue  |  35 +-
 .../theme/global-components/Contributor.vue        |  14 +
 .../apache/iotdb/spark/db/EnvironmentUtils.java    |   2 +-
 .../spark/tsfile/qp/common/BasicOperator.java      |   4 +-
 .../tsfile/qp/optimizer/RemoveNotOptimizer.java    |  20 +-
 .../apache/iotdb/tsfile/compress/ICompressor.java  |   6 +-
 .../iotdb/tsfile/compress/IUnCompressor.java       |   6 +-
 .../tsfile/encoding/decoder/BitmapDecoder.java     |  21 +-
 .../tsfile/encoding/decoder/LongRleDecoder.java    |   3 +-
 .../tsfile/encoding/decoder/PlainDecoder.java      |   3 +-
 .../encoding/encoder/RegularDataEncoder.java       |   8 +-
 .../encoding/encoder/SinglePrecisionEncoderV1.java |   3 +-
 .../iotdb/tsfile/read/UnClosedTsFileReader.java    |   4 +-
 .../read/expression/impl/GlobalTimeExpression.java |   2 +-
 .../query/dataset/DataSetWithoutTimeGenerator.java |   2 +-
 .../tsfile/read/reader/BatchDataIterator.java      |   4 +-
 .../iotdb/tsfile/read/reader/LocalTsFileInput.java |   2 +-
 .../org/apache/iotdb/tsfile/utils/PublicBAOS.java  |   4 +
 .../iotdb/tsfile/utils/RamUsageEstimator.java      |   2 +-
 .../apache/iotdb/tsfile/write/TsFileWriter.java    |   2 +-
 .../tsfile/write/chunk/ChunkGroupWriterImpl.java   |   6 +-
 .../write/record/datapoint/BooleanDataPoint.java   |   4 +-
 .../write/record/datapoint/DoubleDataPoint.java    |   4 +-
 .../write/record/datapoint/FloatDataPoint.java     |   4 +-
 .../write/record/datapoint/IntDataPoint.java       |   4 +-
 .../write/record/datapoint/LongDataPoint.java      |   4 +-
 .../write/record/datapoint/StringDataPoint.java    |   4 +-
 .../iotdb/tsfile/encoding/SDTEncoderTest.java      |  12 +-
 .../tsfile/encoding/bitpacking/IntPackerTest.java  |   2 +-
 .../tsfile/encoding/bitpacking/LongPackerTest.java |   2 +-
 .../tsfile/encoding/decoder/BitmapDecoderTest.java |   4 +-
 .../tsfile/encoding/decoder/FloatDecoderTest.java  |   4 +-
 .../encoding/decoder/GorillaDecoderV1Test.java     |   4 +-
 .../tsfile/encoding/decoder/IntRleDecoderTest.java |   4 +-
 .../encoding/decoder/LongRleDecoderTest.java       |   4 +-
 .../delta/DeltaBinaryEncoderIntegerTest.java       |  10 +-
 .../decoder/delta/DeltaBinaryEncoderLongTest.java  |  10 +-
 .../regular/RegularDataEncoderIntegerTest.java     |  15 +-
 .../regular/RegularDataEncoderLongTest.java        |  15 +-
 .../file/metadata/TimeSeriesMetadataTest.java      |   2 +-
 .../tsfile/file/metadata/TsFileMetadataTest.java   |   2 +-
 .../iotdb/tsfile/read/TimePlainEncodeReadTest.java |   3 +-
 .../tsfile/read/TimeSeriesMetadataReadTest.java    |   2 +-
 .../tsfile/read/filter/GroupByFilterTest.java      |   2 +-
 .../read/query/executor/QueryExecutorTest.java     |   3 +-
 .../query/timegenerator/ReaderByTimestampTest.java |   3 +-
 .../TsFileGeneratorForSeriesReaderByTimestamp.java |   8 +-
 .../tsfile/read/reader/FakedMultiBatchReader.java  |   4 +-
 .../apache/iotdb/tsfile/utils/BytesUtilsTest.java  |   8 +-
 .../org/apache/iotdb/tsfile/utils/FileUtils.java   |   2 +-
 .../tsfile/utils/ReadWriteStreamUtilsTest.java     |   4 +-
 .../tsfile/utils/ReadWriteToBytesUtilsTest.java    |   2 +-
 .../apache/iotdb/tsfile/utils/RecordUtilsTest.java |   3 +-
 .../org/apache/iotdb/tsfile/write/PerfTest.java    |   2 +-
 .../iotdb/tsfile/write/ReadPageInMemTest.java      |   2 +-
 .../iotdb/tsfile/write/TsFileReadWriteTest.java    |   4 +-
 .../iotdb/tsfile/write/TsFileWriterTest.java       |   2 +-
 .../org/apache/iotdb/tsfile/write/WriteTest.java   |   4 +-
 360 files changed, 4916 insertions(+), 2456 deletions(-)
 rename .github/workflows/{main-mac.yml => main-unix.yml} (79%)
 rename .github/workflows/{main-linux.yml => sonar-coveralls.yml} (73%)
 delete mode 100644 compile-tools/thrift/src/assembly/compiler.xml
 delete mode 100644 compile-tools/thrift/src/assembly/cpp.xml
 delete mode 100644 compile-tools/thrift/src/assembly/python.xml
 copy distribution/src/assembly/{distribution.xml => all.xml} (66%)
 copy {cli => distribution}/src/assembly/cli.xml (57%)
 copy server/src/assembly/server.xml => distribution/src/assembly/client-cpp.xml (73%)
 copy distribution/src/assembly/{distribution.xml => cluster.xml} (57%)
 create mode 100644 distribution/src/assembly/common-files.xml
 copy server/src/assembly/server.xml => distribution/src/assembly/grafana.xml (61%)
 rename distribution/src/assembly/{distribution.xml => server.xml} (65%)
 create mode 100644 metrics/dropwizard-metrics/pom.xml
 create mode 100644 metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricManager.java
 create mode 100644 metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricReporter.java
 create mode 100644 metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/MetricName.java
 copy metrics/{micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java => dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardCounter.java} (76%)
 create mode 100644 metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardGauge.java
 copy metrics/{micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java => dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogram.java} (58%)
 create mode 100644 metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogramSnapshot.java
 create mode 100644 metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardRate.java
 copy metrics/{micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java => dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardTimer.java} (56%)
 copy server/src/main/resources/META-INF/services/org.apache.iotdb.db.mqtt.PayloadFormatter => metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager (55%)
 copy server/src/main/resources/META-INF/services/org.apache.iotdb.db.mqtt.PayloadFormatter => metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter (55%)
 create mode 100644 metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfig.java
 create mode 100644 metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java
 copy tsfile/src/main/java/org/apache/iotdb/tsfile/exception/NullFieldException.java => metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConstant.java (82%)
 rename metrics/interface/src/main/java/org/apache/iotdb/metrics/{MetricFactory.java => utils/ReporterType.java} (59%)
 copy tsfile/src/test/java/org/apache/iotdb/tsfile/read/common/FieldTest.java => metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MeterIdUtils.java (69%)
 delete mode 100644 metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricFactory.java
 rename metrics/{interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingFactory.java => micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerGauge.java} (56%)
 copy metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/{MicrometerCounter.java => MicrometerHistogram.java} (57%)
 create mode 100644 metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerHistogramSnapshot.java
 create mode 100644 metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerRate.java
 copy metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/{MicrometerCounter.java => MicrometerTimer.java} (53%)
 delete mode 100644 metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricFactory
 delete mode 100644 metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricReporter
 copy server/src/main/resources/META-INF/services/org.apache.iotdb.db.mqtt.PayloadFormatter => metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager (55%)
 copy server/src/main/resources/META-INF/services/org.apache.iotdb.db.mqtt.PayloadFormatter => metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter (55%)
 copy test/e2e/cases/cli/cleanup.sh => server/src/assembly/resources/conf/iotdb-metric.properties (81%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java
 create mode 100644 server/src/test/java/org/apache/iotdb/db/integration/IoTDBCreateTimeseriesIT.java
 create mode 100644 server/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
 create mode 100644 site/src/main/.vuepress/public/img/contributor-avatar/xww.jpg
 create mode 100644 site/src/main/.vuepress/public/img/contributor-avatar/yrzh.jpg


[iotdb] 02/02: merge master

Posted by ch...@apache.org.
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

commit 4b26410817c08d7a8924fd7fd856cc679ce2e7d4
Merge: e4c562a a2b704d
Author: chaow <xu...@gmail.com>
AuthorDate: Thu Feb 25 15:41:17 2021 +0800

    merge master

 .github/workflows/client.yml                       |   4 +-
 .github/workflows/{main-mac.yml => main-unix.yml}  |  10 +-
 .github/workflows/main-win.yml                     |   2 +-
 .../{main-linux.yml => sonar-coveralls.yml}        |  20 +-
 README.md                                          |   2 +
 .../java/org/apache/iotdb/cli/AbstractCliIT.java   |   2 +-
 .../org/apache/iotdb/cli/StartClientScriptIT.java  |   4 +-
 client-cpp/pom.xml                                 | 156 ++++----
 client-cpp/src/assembly/client-cpp.xml             |   1 +
 cluster/src/assembly/cluster.xml                   |   8 +-
 .../java/org/apache/iotdb/cluster/ClientMain.java  |   2 +-
 .../iotdb/cluster/client/DataClientProvider.java   |   7 +-
 .../iotdb/cluster/coordinator/Coordinator.java     |  42 +-
 .../cluster/log/applier/AsyncDataLogApplier.java   |   8 +
 .../iotdb/cluster/log/applier/BaseApplier.java     |   3 +
 .../iotdb/cluster/log/applier/DataLogApplier.java  |  11 +
 .../cluster/log/logtypes/PhysicalPlanLog.java      |   2 +-
 .../cluster/log/snapshot/MetaSimpleSnapshot.java   |   3 +-
 .../apache/iotdb/cluster/metadata/CMManager.java   | 168 +++++---
 .../apache/iotdb/cluster/metadata/MetaPuller.java  |  26 +-
 .../iotdb/cluster/query/ClusterPlanExecutor.java   |  57 +--
 .../iotdb/cluster/query/ClusterPlanRouter.java     |  35 +-
 .../cluster/query/aggregate/ClusterAggregator.java |  16 +-
 .../query/groupby/RemoteGroupByExecutor.java       |  37 +-
 .../query/last/ClusterLastQueryExecutor.java       |  32 +-
 .../cluster/query/reader/ClusterReaderFactory.java |  16 +-
 .../iotdb/cluster/query/reader/DataSourceInfo.java |   3 +-
 .../reader/RemoteSeriesReaderByTimestamp.java      |  16 +-
 .../query/reader/RemoteSimpleSeriesReader.java     |  14 +-
 .../apache/iotdb/cluster/server/ClientServer.java  |  14 +-
 .../iotdb/cluster/server/StoppedMemberManager.java |   2 +-
 .../cluster/server/member/DataGroupMember.java     |  12 +-
 .../apache/iotdb/cluster/server/monitor/Timer.java |   2 +-
 .../cluster/utils/nodetool/function/Host.java      |   2 +-
 .../cluster/client/DataClientProviderTest.java     |   3 +
 .../iotdb/cluster/common/TestLogManager.java       |   4 +-
 .../iotdb/cluster/log/CommitLogCallbackTest.java   |   4 +-
 .../cluster/log/applier/MetaLogApplierTest.java    |  11 +-
 .../cluster/log/manage/RaftLogManagerTest.java     |   3 +-
 .../cluster/log/snapshot/DataSnapshotTest.java     |   2 +-
 .../iotdb/cluster/query/LoadConfigurationTest.java |   4 +-
 .../query/reader/RemoteSimpleSeriesReaderTest.java |   2 +-
 .../caller/AppendGroupEntryHandlerTest.java        |   3 +-
 .../handlers/caller/ElectionHandlerTest.java       |   2 +-
 compile-tools/thrift/pom.xml                       | 432 +++++++--------------
 compile-tools/thrift/src/assembly/compiler.xml     |  37 --
 compile-tools/thrift/src/assembly/cpp.xml          |  51 ---
 compile-tools/thrift/src/assembly/python.xml       |  38 --
 distribution/pom.xml                               |  31 +-
 .../src/assembly/{distribution.xml => all.xml}     |  57 +--
 distribution/src/assembly/cli.xml                  |  54 +++
 distribution/src/assembly/client-cpp.xml           |  38 ++
 .../src/assembly/{distribution.xml => cluster.xml} |  64 ++-
 distribution/src/assembly/common-files.xml         |  48 +++
 distribution/src/assembly/grafana.xml              |  48 +++
 .../src/assembly/{distribution.xml => server.xml}  |  49 +--
 docker/src/main/Dockerfile                         |   2 +-
 docs/UserGuide/Comparison/TSDB-Comparison.md       | 107 +++--
 .../DML Data Manipulation Language.md              |  38 +-
 .../Operation Manual/UDF User Defined Function.md  |   6 +-
 docs/zh/SystemDesign/DataQuery/AggregationQuery.md |   2 +-
 .../DML Data Manipulation Language.md              |  36 +-
 .../Operation Manual/UDF User Defined Function.md  |   6 +-
 docs/zh/UserGuide/Server/Config Manual.md          |  30 +-
 example/client-cpp-example/pom.xml                 | 214 +++++-----
 .../iotdb/flink/FlinkTsFileStreamSource.java       |   3 +-
 .../iotdb/hadoop/tsfile/TSFMRReadExample.java      |   3 +-
 .../iotdb/hadoop/tsfile/TSMRWriteExample.java      |   3 +-
 .../apache/iotdb/hadoop/tsfile/TsFileHelper.java   |   3 +-
 .../main/java/org/apache/iotdb/SessionExample.java |   5 +-
 .../java/org/apache/iotdb/SessionPoolExample.java  |   2 +-
 .../iotdb/tsfile/TsFileWriteWithTSRecord.java      |   2 +-
 .../java/org/apache/iotdb/flink/IoTDBSink.java     |   2 +-
 .../iotdb/flink/IoTDBSinkBatchInsertTest.java      |   2 +-
 .../iotdb/flink/IoTDBSinkBatchTimerTest.java       |   4 +-
 .../iotdb/flink/tsfile/RowTSRecordConverter.java   |   7 +-
 .../flink/tsfile/RowTsFileConnectorTestBase.java   |   2 +-
 .../flink/tsfile/RowTsFileInputFormatITCase.java   |   2 +-
 .../web/grafana/dao/impl/BasicDaoImplTest.java     |   4 +-
 .../apache/iotdb/hadoop/fileSystem/HDFSFile.java   |  23 +-
 .../apache/iotdb/hadoop/fileSystem/HDFSInput.java  |  10 +-
 .../apache/iotdb/hadoop/fileSystem/HDFSOutput.java |   4 +-
 .../iotdb/hadoop/tsfile/TSFRecordReader.java       |   4 +-
 .../iotdb/hadoop/tsfile/TSFRecordWriter.java       |   2 +-
 .../apache/iotdb/hadoop/tsfile/TSFHadoopTest.java  |   4 +-
 .../iotdb/hadoop/tsfile/TSFInputSplitTest.java     |   2 +-
 .../iotdb/hadoop/tsfile/TsFileTestHelper.java      |   3 +-
 .../org/apache/iotdb/hive/TSFHiveOutputFormat.java |   2 +-
 .../org/apache/iotdb/hive/TSFHiveRecordReader.java |   2 +-
 .../org/apache/iotdb/hive/TsFileDeserializer.java  |   2 +-
 .../java/org/apache/iotdb/hive/TsFileSerDe.java    |   4 +-
 .../org/apache/iotdb/hive/TsFileTestHelper.java    |   3 +-
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |   2 +-
 .../org/apache/iotdb/jdbc/IoTDBDataSource.java     |  17 +-
 .../apache/iotdb/jdbc/IoTDBDataSourceFactory.java  |  10 +-
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   |   8 +-
 .../java/org/apache/iotdb/jdbc/IoTDBDriver.java    |   4 +-
 .../apache/iotdb/jdbc/IoTDBPreparedStatement.java  |  24 +-
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |   2 +-
 .../test/java/org/apache/iotdb/jdbc/BatchTest.java |   2 +-
 .../org/apache/iotdb/jdbc/IoTDBConnectionTest.java |   6 +-
 .../apache/iotdb/jdbc/IoTDBResultMetadataTest.java |   4 +-
 .../org/apache/iotdb/jdbc/IoTDBStatementTest.java  |   2 +-
 .../test/java/org/apache/iotdb/jdbc/UtilsTest.java |   4 +-
 pom.xml                                            |  29 +-
 .../iotdb/db/auth/authorizer/OpenIdAuthorizer.java |   8 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   2 +-
 .../org/apache/iotdb/db/engine/StorageEngine.java  |   9 +-
 .../db/engine/compaction/TsFileManagement.java     |   6 +
 .../level/LevelCompactionTsFileManagement.java     |   3 +-
 .../iotdb/db/engine/merge/manage/MergeManager.java |   4 +-
 .../io/LocalTextModificationAccessor.java          |   2 +-
 .../engine/storagegroup/StorageGroupProcessor.java |  33 +-
 .../storagegroup/virtualSg/VirtualPartitioner.java |   4 +-
 .../virtualSg/VirtualStorageGroupManager.java      |   4 +-
 .../query/UnSupportedFillTypeException.java        |   2 +-
 .../org/apache/iotdb/db/metadata/MManager.java     |  66 ++--
 .../java/org/apache/iotdb/db/metadata/MTree.java   | 128 +++---
 .../org/apache/iotdb/db/metadata/MetaUtils.java    |  37 ++
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |  49 ++-
 .../apache/iotdb/db/metrics/server/JettyUtil.java  |   6 +-
 .../iotdb/db/metrics/server/QueryServlet.java      |   7 +-
 .../apache/iotdb/db/metrics/ui/MetricsPage.java    |   2 +-
 .../apache/iotdb/db/qp/executor/IPlanExecutor.java |   8 +
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |  76 ++--
 .../org/apache/iotdb/db/qp/logical/Operator.java   |   3 +-
 .../apache/iotdb/db/qp/physical/PhysicalPlan.java  |   8 +-
 .../iotdb/db/qp/physical/crud/AggregationPlan.java |  35 ++
 .../iotdb/db/qp/physical/crud/InsertRowPlan.java   |  10 +-
 .../physical/crud/InsertRowsOfOneDevicePlan.java   |   4 +-
 .../iotdb/db/qp/physical/crud/InsertRowsPlan.java  | 219 +++++++++++
 .../iotdb/db/qp/physical/sys/AuthorPlan.java       |   2 +-
 .../qp/physical/sys/CreateMultiTimeSeriesPlan.java |  14 +
 .../iotdb/db/qp/physical/sys/DataAuthPlan.java     |   2 +-
 .../db/qp/physical/sys/DeleteTimeSeriesPlan.java   |  22 ++
 .../apache/iotdb/db/qp/physical/sys/ShowPlan.java  |   2 +-
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    |   2 +-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  11 +
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |  11 -
 .../db/query/aggregation/impl/AvgAggrResult.java   |  17 +
 .../db/query/aggregation/impl/CountAggrResult.java |   2 +-
 .../query/aggregation/impl/MaxValueAggrResult.java |   4 +-
 .../query/aggregation/impl/MinValueAggrResult.java |   7 +-
 .../iotdb/db/query/dataset/SingleDataSet.java      |   5 +-
 .../query/dataset/groupby/GroupByTimeDataSet.java  |   8 +-
 .../db/query/executor/AggregationExecutor.java     |  12 +-
 .../db/query/reader/chunk/DiskChunkLoader.java     |   2 +-
 .../db/query/reader/chunk/MemChunkLoader.java      |   4 +-
 .../db/query/reader/chunk/MemChunkReader.java      |   2 +-
 .../chunk/metadata/MemChunkMetadataLoader.java     |   3 +-
 .../query/reader/series/SeriesAggregateReader.java |   2 +-
 .../iotdb/db/query/reader/series/SeriesReader.java |  20 +-
 .../UDFInputSeriesDataTypeNotValidException.java   |   4 +-
 .../db/query/udf/core/executor/UDTFExecutor.java   |   2 +-
 .../udf/service/TemporaryQueryDataFileService.java |   7 +-
 .../query/udf/service/UDFRegistrationService.java  |   9 +-
 .../org/apache/iotdb/db/service/JMXService.java    |   3 +-
 .../org/apache/iotdb/db/service/MQTTService.java   |   3 +-
 .../apache/iotdb/db/service/MetricsService.java    |   4 +-
 .../org/apache/iotdb/db/service/RPCService.java    |   3 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 100 +++--
 .../org/apache/iotdb/db/service/UpgradeSevice.java |   3 +-
 .../iotdb/db/sync/receiver/SyncServerManager.java  |   3 +-
 .../db/sync/receiver/transfer/SyncServiceImpl.java |   9 +-
 .../apache/iotdb/db/tools/TsFileSketchTool.java    |   6 +-
 .../db/tools/watermark/WatermarkDetector.java      |   2 +-
 .../java/org/apache/iotdb/db/utils/AuthUtils.java  |   2 +-
 .../iotdb/db/utils/EncodingInferenceUtils.java     |   2 +-
 .../org/apache/iotdb/db/utils/FilePathUtils.java   | 155 ++++----
 .../java/org/apache/iotdb/db/utils/FileUtils.java  |   3 +-
 .../org/apache/iotdb/db/utils/SchemaUtils.java     |   6 +-
 .../db/auth/authorizer/OpenIdAuthorizerTest.java   |   2 +-
 .../db/auth/role/LocalFileRoleAccessorTest.java    |   2 +-
 .../db/auth/role/LocalFileRoleManagerTest.java     |   2 +-
 .../db/auth/user/LocalFileUserAccessorTest.java    |   2 +-
 .../IoTDBDefaultThreadExceptionHandlerTest.java    |   4 +-
 .../db/concurrent/IoTDBThreadPoolFactoryTest.java  |   8 +-
 .../org/apache/iotdb/db/constant/TestConstant.java |   3 +-
 .../db/engine/memtable/MemTableFlushTaskTest.java  |   3 +-
 .../db/engine/memtable/MemtableBenchmark.java      |   3 +-
 .../db/engine/memtable/PrimitiveMemTableTest.java  |   4 +-
 .../iotdb/db/engine/merge/MergeTaskTest.java       |   3 +-
 .../engine/modification/DeletionFileNodeTest.java  |   3 +-
 .../io/LocalTextModificationAccessorTest.java      |   2 +-
 .../storagegroup/StorageGroupProcessorTest.java    |   3 +-
 .../iotdb/db/engine/storagegroup/TTLTest.java      |   4 +-
 .../engine/storagegroup/TsFileProcessorTest.java   |   2 +-
 .../virtualSg/HashVirtualPartitionerTest.java      |   2 +-
 .../db/integration/IoTDBAutoCreateSchemaIT.java    | 106 +++++
 .../iotdb/db/integration/IoTDBCheckConfigIT.java   |   2 +-
 .../iotdb/db/integration/IoTDBClearCacheIT.java    |   3 +-
 .../apache/iotdb/db/integration/IoTDBCloseIT.java  |   3 +-
 .../iotdb/db/integration/IoTDBCompleteIT.java      |  20 +-
 .../iotdb/db/integration/IoTDBCompressTypeIT.java  |   2 +-
 .../db/integration/IoTDBCreateSnapshotIT.java      |   2 +-
 .../db/integration/IoTDBCreateTimeseriesIT.java    | 157 ++++++++
 .../apache/iotdb/db/integration/IoTDBDaemonIT.java |  14 +-
 .../db/integration/IoTDBDeleteStorageGroupIT.java  |   2 +-
 .../db/integration/IoTDBDeleteTimeseriesIT.java    |   2 +-
 .../db/integration/IoTDBEngineTimeGeneratorIT.java |   3 +-
 .../apache/iotdb/db/integration/IoTDBFillIT.java   |  21 +-
 .../db/integration/IoTDBFloatPrecisionIT.java      |   5 +-
 .../db/integration/IoTDBFlushQueryMergeIT.java     |   6 +-
 .../iotdb/db/integration/IoTDBLargeDataIT.java     |  12 +-
 .../apache/iotdb/db/integration/IoTDBLastIT.java   |   4 +-
 .../iotdb/db/integration/IoTDBLimitSlimitIT.java   |  11 +-
 .../iotdb/db/integration/IoTDBMergeTest.java       |   2 +-
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |   2 +-
 .../iotdb/db/integration/IoTDBMultiDeviceIT.java   |   3 +-
 .../iotdb/db/integration/IoTDBMultiSeriesIT.java   |   8 +-
 .../db/integration/IoTDBMultiStatementsIT.java     |   3 +-
 .../iotdb/db/integration/IoTDBNumberPathIT.java    |  21 +-
 .../iotdb/db/integration/IoTDBQueryDemoIT.java     |   2 +-
 .../iotdb/db/integration/IoTDBQuotedPathIT.java    |   2 +-
 .../iotdb/db/integration/IoTDBRecoverIT.java       |   4 +-
 .../db/integration/IoTDBRecoverUnclosedIT.java     |   4 +-
 .../db/integration/IoTDBRemovePartitionIT.java     |   7 +-
 .../IoTDBSameMeasurementsDifferentTypesIT.java     |   3 +-
 .../iotdb/db/integration/IoTDBSeriesReaderIT.java  |  41 ++
 .../iotdb/db/integration/IoTDBSimpleQueryIT.java   |   2 +-
 .../iotdb/db/integration/IoTDBTagAlterIT.java      |   2 +-
 .../apache/iotdb/db/integration/IoTDBTagIT.java    |   2 +-
 .../iotdb/db/integration/IoTDBVersionIT.java       |   2 +-
 .../aggregation/IoTDBAggregationByLevelIT.java     |  86 ++--
 .../aggregation/IoTDBAggregationIT.java            |  10 +-
 .../aggregation/IoTDBAggregationLargeDataIT.java   |   7 +-
 .../db/integration/auth/IoTDBAuthorizationIT.java  |   2 +-
 .../iotdb/db/metadata/MManagerBasicTest.java       |  68 +++-
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |  29 +-
 .../apache/iotdb/db/metadata/MetaUtilsTest.java    |  35 ++
 .../apache/iotdb/db/metadata/PartialPathTest.java  |   2 +-
 .../apache/iotdb/db/metadata/mnode/MNodeTest.java  |  71 ++++
 .../iotdb/db/qp/logical/IndexLogicalPlanTest.java  |   5 +-
 .../db/qp/physical/PhysicalPlanSerializeTest.java  | 140 +++----
 .../iotdb/db/qp/physical/SerializationTest.java    |   4 +-
 .../iotdb/db/qp/sql/IoTDBsqlVisitorTest.java       |   4 +-
 .../iotdb/db/query/control/TracingManagerTest.java |   5 +-
 .../reader/series/SeriesAggregateReaderTest.java   |   6 +-
 .../reader/series/SeriesReaderByTimestampTest.java |   6 +-
 .../db/query/reader/series/SeriesReaderTest.java   |   6 +-
 .../query/reader/series/SeriesReaderTestUtil.java  |   6 +-
 .../org/apache/iotdb/db/script/EnvScriptIT.java    |   6 +-
 .../db/sync/receiver/load/FileLoaderTest.java      |   8 +-
 .../recover/SyncReceiverLogAnalyzerTest.java       |   7 +-
 .../receiver/recover/SyncReceiverLoggerTest.java   |   6 +-
 .../db/sync/sender/manage/SyncFileManagerTest.java |   6 +-
 .../db/sync/sender/transfer/SyncClientTest.java    |   6 +-
 .../apache/iotdb/db/tools/IoTDBWatermarkTest.java  |   7 +-
 .../org/apache/iotdb/db/tools/MLogParserTest.java  |   2 +-
 .../apache/iotdb/db/utils/FilePathUtilsTest.java   |   3 +-
 .../org/apache/iotdb/db/utils/SchemaUtilsTest.java |   2 +-
 .../db/utils/datastructure/PrecisionTest.java      |   9 +-
 .../apache/iotdb/db/writelog/PerformanceTest.java  |   5 +-
 .../iotdb/db/writelog/WriteLogNodeManagerTest.java |   2 +-
 .../apache/iotdb/db/writelog/WriteLogNodeTest.java |   2 +-
 .../iotdb/db/writelog/recover/LogReplayerTest.java |   3 +-
 .../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java |   2 +-
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java |  20 +
 .../apache/iotdb/session/SessionCacheLeaderUT.java |  33 +-
 .../public/img/contributor-avatar/xww.jpg          | Bin 0 -> 64538 bytes
 .../public/img/contributor-avatar/yrzh.jpg         | Bin 0 -> 99556 bytes
 site/src/main/.vuepress/theme/components/Page.vue  |  35 +-
 .../theme/global-components/Contributor.vue        |  14 +
 .../apache/iotdb/spark/db/EnvironmentUtils.java    |   2 +-
 .../spark/tsfile/qp/common/BasicOperator.java      |   4 +-
 .../tsfile/qp/optimizer/RemoveNotOptimizer.java    |  20 +-
 .../apache/iotdb/tsfile/compress/ICompressor.java  |   6 +-
 .../iotdb/tsfile/compress/IUnCompressor.java       |   6 +-
 .../tsfile/encoding/decoder/BitmapDecoder.java     |  21 +-
 .../tsfile/encoding/decoder/LongRleDecoder.java    |   3 +-
 .../tsfile/encoding/decoder/PlainDecoder.java      |   3 +-
 .../encoding/encoder/RegularDataEncoder.java       |   8 +-
 .../encoding/encoder/SinglePrecisionEncoderV1.java |   3 +-
 .../iotdb/tsfile/read/UnClosedTsFileReader.java    |   4 +-
 .../read/expression/impl/GlobalTimeExpression.java |   2 +-
 .../query/dataset/DataSetWithoutTimeGenerator.java |   2 +-
 .../tsfile/read/reader/BatchDataIterator.java      |   4 +-
 .../iotdb/tsfile/read/reader/LocalTsFileInput.java |   2 +-
 .../org/apache/iotdb/tsfile/utils/PublicBAOS.java  |   4 +
 .../iotdb/tsfile/utils/RamUsageEstimator.java      |   2 +-
 .../apache/iotdb/tsfile/write/TsFileWriter.java    |   2 +-
 .../tsfile/write/chunk/ChunkGroupWriterImpl.java   |   6 +-
 .../write/record/datapoint/BooleanDataPoint.java   |   4 +-
 .../write/record/datapoint/DoubleDataPoint.java    |   4 +-
 .../write/record/datapoint/FloatDataPoint.java     |   4 +-
 .../write/record/datapoint/IntDataPoint.java       |   4 +-
 .../write/record/datapoint/LongDataPoint.java      |   4 +-
 .../write/record/datapoint/StringDataPoint.java    |   4 +-
 .../iotdb/tsfile/encoding/SDTEncoderTest.java      |  12 +-
 .../tsfile/encoding/bitpacking/IntPackerTest.java  |   2 +-
 .../tsfile/encoding/bitpacking/LongPackerTest.java |   2 +-
 .../tsfile/encoding/decoder/BitmapDecoderTest.java |   4 +-
 .../tsfile/encoding/decoder/FloatDecoderTest.java  |   4 +-
 .../encoding/decoder/GorillaDecoderV1Test.java     |   4 +-
 .../tsfile/encoding/decoder/IntRleDecoderTest.java |   4 +-
 .../encoding/decoder/LongRleDecoderTest.java       |   4 +-
 .../delta/DeltaBinaryEncoderIntegerTest.java       |  10 +-
 .../decoder/delta/DeltaBinaryEncoderLongTest.java  |  10 +-
 .../regular/RegularDataEncoderIntegerTest.java     |  15 +-
 .../regular/RegularDataEncoderLongTest.java        |  15 +-
 .../file/metadata/TimeSeriesMetadataTest.java      |   2 +-
 .../tsfile/file/metadata/TsFileMetadataTest.java   |   2 +-
 .../iotdb/tsfile/read/TimePlainEncodeReadTest.java |   3 +-
 .../tsfile/read/TimeSeriesMetadataReadTest.java    |   2 +-
 .../tsfile/read/filter/GroupByFilterTest.java      |   2 +-
 .../read/query/executor/QueryExecutorTest.java     |   3 +-
 .../query/timegenerator/ReaderByTimestampTest.java |   3 +-
 .../TsFileGeneratorForSeriesReaderByTimestamp.java |   8 +-
 .../tsfile/read/reader/FakedMultiBatchReader.java  |   4 +-
 .../apache/iotdb/tsfile/utils/BytesUtilsTest.java  |   8 +-
 .../org/apache/iotdb/tsfile/utils/FileUtils.java   |   2 +-
 .../tsfile/utils/ReadWriteStreamUtilsTest.java     |   4 +-
 .../tsfile/utils/ReadWriteToBytesUtilsTest.java    |   2 +-
 .../apache/iotdb/tsfile/utils/RecordUtilsTest.java |   3 +-
 .../org/apache/iotdb/tsfile/write/PerfTest.java    |   2 +-
 .../iotdb/tsfile/write/ReadPageInMemTest.java      |   2 +-
 .../iotdb/tsfile/write/TsFileReadWriteTest.java    |   4 +-
 .../iotdb/tsfile/write/TsFileWriterTest.java       |   2 +-
 .../org/apache/iotdb/tsfile/write/WriteTest.java   |   4 +-
 319 files changed, 2992 insertions(+), 2094 deletions(-)

diff --cc pom.xml
index e2ee6db,9e30952..b68e0ef
--- a/pom.xml
+++ b/pom.xml
@@@ -100,7 -100,8 +100,9 @@@
          <module>cross-tests</module>
          <module>zeppelin-interpreter</module>
          <module>client-py</module>
 +        <module>metrics</module>
+         <module>compile-tools</module>
+         <module>client-cpp</module>
      </modules>
      <!-- Properties Management -->
      <properties>
diff --cc server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index f55532d,85fce24..4a0fd88
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@@ -1101,8 -1099,28 +1102,29 @@@ public class PlanExecutor implements IP
    }
  
    @Override
+   public void insert(InsertRowsPlan plan) throws QueryProcessException {
+     boolean allSuccess = true;
+     for (int i = 0; i < plan.getInsertRowPlanList().size(); i++) {
+       if (plan.getResults().containsKey(i)) {
+         allSuccess = false;
+         continue;
+       }
+       try {
+         insert(plan.getInsertRowPlanList().get(i));
+         plan.getResults().put(i, RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS));
+       } catch (QueryProcessException e) {
+         plan.getResults().put(i, RpcUtils.getStatus(e.getErrorCode(), e.getMessage()));
+         allSuccess = false;
+       }
+       if (!allSuccess) {
+         throw new BatchProcessException(plan.getResults().values().toArray(new TSStatus[0]));
+       }
+     }
+   }
+ 
+   @Override
    public void insert(InsertRowPlan insertRowPlan) throws QueryProcessException {
 +    long startTime = System.currentTimeMillis();
      try {
        insertRowPlan.setMeasurementMNodes(
            new MeasurementMNode[insertRowPlan.getMeasurements().length]);
diff --cc server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 3a02261,60feccf..9559bfa
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@@ -1182,35 -1154,46 +1177,58 @@@ public class TSServiceImpl implements T
                  req.getMeasurementsList().get(i).toArray(new String[0]),
                  req.valuesList.get(i));
          TSStatus status = checkAuthority(plan, req.getSessionId());
-         if (status == null) {
-           status = executeNonQueryPlan(plan);
-           isAllSuccessful =
-               ((status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode())
-                   && isAllSuccessful);
+         if (status != null) {
+           insertRowsPlan.getResults().put(i, status);
+           allSuccess = false;
          }
-         statusList.add(status);
+         insertRowsPlan.addOneInsertRowPlan(plan, i);
        } catch (Exception e) {
-         isAllSuccessful = false;
-         statusList.add(
-             onNPEOrUnexpectedException(e, "inserting records", TSStatusCode.INTERNAL_SERVER_ERROR));
+         allSuccess = false;
+         insertRowsPlan
+             .getResults()
+             .put(
+                 i,
+                 onNPEOrUnexpectedException(
+                     e, "inserting records", TSStatusCode.INTERNAL_SERVER_ERROR));
        }
      }
- 
 +    long startTime = System.currentTimeMillis();
+     TSStatus tsStatus = executeNonQueryPlan(insertRowsPlan);
+ 
 +    IoTDB.serverMetricManager.timer(
 +        System.currentTimeMillis() - startTime,
 +        TimeUnit.MILLISECONDS,
 +        "insert_records_latency",
 +        "sg",
 +        "root",
 +        "user",
 +        sessionIdUsernameMap.get(req.getSessionId()),
 +        "host",
 +        config.getRpcAddress());
 +
-     return isAllSuccessful
-         ? RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS)
-         : RpcUtils.getStatus(statusList);
+     return judgeFinalTsStatus(
+         allSuccess, tsStatus, insertRowsPlan.getResults(), req.deviceIds.size());
+   }
+ 
+   private TSStatus judgeFinalTsStatus(
+       boolean allSuccess,
+       TSStatus executeTsStatus,
+       Map<Integer, TSStatus> checkTsStatus,
+       int totalRowCount) {
+ 
+     if (allSuccess) {
+       return executeTsStatus;
+     }
+ 
+     if (executeTsStatus.subStatus == null) {
+       TSStatus[] tmpSubTsStatus = new TSStatus[totalRowCount];
+       Arrays.fill(tmpSubTsStatus, RpcUtils.SUCCESS_STATUS);
+       executeTsStatus.subStatus = Arrays.asList(tmpSubTsStatus);
+     }
+     for (Entry<Integer, TSStatus> entry : checkTsStatus.entrySet()) {
+       executeTsStatus.subStatus.set(entry.getKey(), entry.getValue());
+     }
+     return RpcUtils.getStatus(executeTsStatus.subStatus);
    }
  
    @Override


[iotdb] 01/02: add implements

Posted by ch...@apache.org.
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

commit e4c562aa53df6584dcb704edb4422de2de1873c9
Author: chaow <xu...@gmail.com>
AuthorDate: Thu Feb 25 15:19:44 2021 +0800

    add implements
---
 metrics/dropwizard-metrics/pom.xml                 |  27 ++
 .../dropwizard/DropwizardMetricManager.java        | 362 ++++++++++++++++++++
 .../dropwizard/DropwizardMetricReporter.java       |  93 ++++++
 .../iotdb/metrics/dropwizard/MetricName.java       | 116 +++++++
 .../dropwizard/type/DropwizardCounter.java}        |  15 +-
 .../metrics/dropwizard/type/DropwizardGauge.java   |  62 ++++
 .../dropwizard/type/DropwizardHistogram.java}      |  30 +-
 .../type/DropwizardHistogramSnapshot.java          |  73 ++++
 .../metrics/dropwizard/type/DropwizardRate.java    |  95 ++++++
 .../metrics/dropwizard/type/DropwizardTimer.java}  |  29 +-
 .../org.apache.iotdb.metrics.MetricManager         |  18 +
 .../org.apache.iotdb.metrics.MetricReporter        |  18 +
 .../org/apache/iotdb/metrics/MetricManager.java    |  48 ++-
 .../org/apache/iotdb/metrics/MetricReporter.java   |   2 +-
 .../org/apache/iotdb/metrics/MetricService.java    |  55 +--
 .../apache/iotdb/metrics/config/MetricConfig.java  | 125 +++++++
 .../metrics/config/MetricConfigDescriptor.java     | 132 ++++++++
 .../MetricConstant.java}                           |  10 +-
 .../iotdb/metrics/impl/DoNothingMetricManager.java |  29 +-
 .../iotdb/metrics/type/HistogramSnapshot.java      |   2 -
 .../java/org/apache/iotdb/metrics/type/Timer.java  |   7 +-
 .../ReporterType.java}                             |  37 ++-
 metrics/micrometer-metrics/pom.xml                 |  10 +
 .../iotdb/metrics/micrometer/MeterIdUtils.java}    |  22 +-
 .../micrometer/MicrometerMetricFactory.java        |  98 ------
 .../micrometer/MicrometerMetricManager.java        | 367 +++++++++++++++++++--
 .../micrometer/MicrometerMetricReporter.java       |  63 +++-
 .../metrics/micrometer/type/MicrometerCounter.java |   3 +-
 .../metrics/micrometer/type/MicrometerGauge.java}  |  35 +-
 ...ometerCounter.java => MicrometerHistogram.java} |  28 +-
 .../type/MicrometerHistogramSnapshot.java          |  91 +++++
 .../metrics/micrometer/type/MicrometerRate.java    |  81 +++++
 ...MicrometerCounter.java => MicrometerTimer.java} |  32 +-
 ...otdb.metrics.micrometer.MicrometerMetricFactory |   1 -
 ...tdb.metrics.micrometer.MicrometerMetricReporter |   1 -
 .../org.apache.iotdb.metrics.MetricManager         |  18 +
 .../org.apache.iotdb.metrics.MetricReporter        |  18 +
 metrics/pom.xml                                    |   2 +-
 server/pom.xml                                     |  10 +
 .../resources/conf/iotdb-metric.properties         |  30 ++
 .../engine/storagegroup/StorageGroupProcessor.java |  36 ++
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |  25 ++
 .../java/org/apache/iotdb/db/service/IoTDB.java    |   5 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  41 ++-
 44 files changed, 2092 insertions(+), 310 deletions(-)

diff --git a/metrics/dropwizard-metrics/pom.xml b/metrics/dropwizard-metrics/pom.xml
new file mode 100644
index 0000000..5779fae
--- /dev/null
+++ b/metrics/dropwizard-metrics/pom.xml
@@ -0,0 +1,27 @@
+<?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>dropwizard-metric</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.dropwizard.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard.metrics</groupId>
+            <artifactId>metrics-jvm</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricManager.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricManager.java
new file mode 100644
index 0000000..1f34053
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricManager.java
@@ -0,0 +1,362 @@
+/*
+ * 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.dropwizard;
+
+import org.apache.iotdb.metrics.KnownMetric;
+import org.apache.iotdb.metrics.MetricManager;
+import org.apache.iotdb.metrics.config.MetricConfig;
+import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
+import org.apache.iotdb.metrics.dropwizard.type.DropwizardCounter;
+import org.apache.iotdb.metrics.dropwizard.type.DropwizardGauge;
+import org.apache.iotdb.metrics.dropwizard.type.DropwizardHistogram;
+import org.apache.iotdb.metrics.dropwizard.type.DropwizardRate;
+import org.apache.iotdb.metrics.dropwizard.type.DropwizardTimer;
+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 com.codahale.metrics.JvmAttributeGaugeSet;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.jvm.BufferPoolMetricSet;
+import com.codahale.metrics.jvm.CachedThreadStatesGaugeSet;
+import com.codahale.metrics.jvm.ClassLoadingGaugeSet;
+import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+public class DropwizardMetricManager implements MetricManager {
+
+  private static final Logger logger = LoggerFactory.getLogger(DropwizardMetricManager.class);
+
+  Map<MetricName, IMetric> currentMeters;
+  boolean isEnable;
+
+  com.codahale.metrics.MetricRegistry metricRegistry;
+  MetricConfig metricConfig = MetricConfigDescriptor.getInstance().getMetricConfig();
+
+  public DropwizardMetricManager() {
+    metricRegistry = new MetricRegistry();
+    isEnable = metricConfig.isEnabled();
+    currentMeters = new ConcurrentHashMap<>();
+  }
+
+  @Override
+  public Counter counter(String metric, String... tags) {
+    if (!isEnable) {
+      return null;
+    }
+    MetricName name = new MetricName(metric, tags);
+    return (Counter)
+        currentMeters.computeIfAbsent(
+            name, key -> new DropwizardCounter(metricRegistry.counter(name.toFlatString())));
+  }
+
+  @Override
+  public Gauge gauge(String metric, String... tags) {
+    if (!isEnable) {
+      return null;
+    }
+    MetricName name = new MetricName(metric, tags);
+    return (Gauge)
+        currentMeters.computeIfAbsent(
+            name,
+            key -> {
+              DropwizardGauge dropwizardGauge = new DropwizardGauge();
+              metricRegistry.register(
+                  name.toFlatString(), dropwizardGauge.getDropwizardCachedGauge());
+              return dropwizardGauge;
+            });
+  }
+
+  @Override
+  public Histogram histogram(String metric, String... tags) {
+    if (!isEnable) {
+      return null;
+    }
+    MetricName name = new MetricName(metric, tags);
+    return (Histogram)
+        currentMeters.computeIfAbsent(
+            name, key -> new DropwizardHistogram(metricRegistry.histogram(name.toFlatString())));
+  }
+
+  @Override
+  public Rate rate(String metric, String... tags) {
+    if (!isEnable) {
+      return null;
+    }
+    MetricName name = new MetricName(metric, tags);
+    return (Rate)
+        currentMeters.computeIfAbsent(
+            name, key -> new DropwizardRate(metricRegistry.meter(name.toFlatString())));
+  }
+
+  @Override
+  public Timer timer(String metric, String... tags) {
+    if (!isEnable) {
+      return null;
+    }
+    MetricName name = new MetricName(metric, tags);
+    return (Timer)
+        currentMeters.computeIfAbsent(
+            name, key -> new DropwizardTimer(metricRegistry.timer(name.toFlatString())));
+  }
+
+  @Override
+  public void count(int delta, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Counter)
+            currentMeters.computeIfAbsent(
+                name, key -> new DropwizardCounter(metricRegistry.counter(name.toFlatString()))))
+        .inc(delta);
+  }
+
+  @Override
+  public void count(long delta, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Counter)
+            currentMeters.computeIfAbsent(
+                name, key -> new DropwizardCounter(metricRegistry.counter(name.toFlatString()))))
+        .inc(delta);
+  }
+
+  @Override
+  public void histogram(int value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Histogram)
+            currentMeters.computeIfAbsent(
+                name,
+                key -> new DropwizardHistogram(metricRegistry.histogram(name.toFlatString()))))
+        .update(value);
+  }
+
+  @Override
+  public void histogram(long value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Histogram)
+            currentMeters.computeIfAbsent(
+                name,
+                key -> new DropwizardHistogram(metricRegistry.histogram(name.toFlatString()))))
+        .update(value);
+  }
+
+  @Override
+  public void gauge(int value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Gauge)
+            currentMeters.computeIfAbsent(
+                name,
+                key -> {
+                  DropwizardGauge dropwizardGauge = new DropwizardGauge();
+                  metricRegistry.register(
+                      name.toFlatString(), dropwizardGauge.getDropwizardCachedGauge());
+                  return dropwizardGauge;
+                }))
+        .set(value);
+  }
+
+  @Override
+  public void gauge(long value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Gauge)
+            currentMeters.computeIfAbsent(
+                name,
+                key -> {
+                  DropwizardGauge dropwizardGauge = new DropwizardGauge();
+                  metricRegistry.register(
+                      name.toFlatString(), dropwizardGauge.getDropwizardCachedGauge());
+                  return dropwizardGauge;
+                }))
+        .set(value);
+  }
+
+  @Override
+  public void rate(int value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Rate)
+            currentMeters.computeIfAbsent(
+                name, key -> new DropwizardRate(metricRegistry.meter(name.toFlatString()))))
+        .mark(value);
+  }
+
+  @Override
+  public void rate(long value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Rate)
+            currentMeters.computeIfAbsent(
+                name, key -> new DropwizardRate(metricRegistry.meter(name.toFlatString()))))
+        .mark(value);
+  }
+
+  @Override
+  public void timer(long delta, TimeUnit timeUnit, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    MetricName name = new MetricName(metric, tags);
+    ((Timer)
+            currentMeters.computeIfAbsent(
+                name, key -> new DropwizardTimer(metricRegistry.timer(name.toFlatString()))))
+        .update(delta, timeUnit);
+  }
+
+  @Override
+  public List<String[]> getAllMetricKeys() {
+    if (!isEnable) {
+      return Collections.emptyList();
+    }
+    List<String[]> keys = new ArrayList<>(currentMeters.size());
+    currentMeters.keySet().forEach(k -> keys.add(k.toStringArray()));
+    return keys;
+  }
+
+  @Override
+  public Map<String[], Counter> getAllCounters() {
+    Map<String[], Counter> counterMap = new HashMap<>();
+    for (Map.Entry<MetricName, IMetric> entry : currentMeters.entrySet()) {
+      if (entry.getValue() instanceof Counter) {
+        counterMap.put(entry.getKey().toStringArray(), (Counter) entry.getValue());
+      }
+    }
+    return counterMap;
+  }
+
+  @Override
+  public Map<String[], Gauge> getAllGauges() {
+    Map<String[], Gauge> gaugeMap = new HashMap<>();
+    for (Map.Entry<MetricName, IMetric> entry : currentMeters.entrySet()) {
+      if (entry.getValue() instanceof Gauge) {
+        gaugeMap.put(entry.getKey().toStringArray(), (Gauge) entry.getValue());
+      }
+    }
+    return gaugeMap;
+  }
+
+  @Override
+  public Map<String[], Rate> getAllRates() {
+    Map<String[], Rate> rateMap = new HashMap<>();
+    for (Map.Entry<MetricName, IMetric> entry : currentMeters.entrySet()) {
+      if (entry.getValue() instanceof Rate) {
+        rateMap.put(entry.getKey().toStringArray(), (Rate) entry.getValue());
+      }
+    }
+    return rateMap;
+  }
+
+  @Override
+  public Map<String[], Histogram> getAllHistograms() {
+    Map<String[], Histogram> histogramMap = new HashMap<>();
+    for (Map.Entry<MetricName, IMetric> entry : currentMeters.entrySet()) {
+      if (entry.getValue() instanceof Histogram) {
+        histogramMap.put(entry.getKey().toStringArray(), (Histogram) entry.getValue());
+      }
+    }
+    return histogramMap;
+  }
+
+  @Override
+  public Map<String[], Timer> getAllTimers() {
+    Map<String[], Timer> timerMap = new HashMap<>();
+    for (Map.Entry<MetricName, IMetric> entry : currentMeters.entrySet()) {
+      if (entry.getValue() instanceof Timer) {
+        timerMap.put(entry.getKey().toStringArray(), (Timer) entry.getValue());
+      }
+    }
+    return timerMap;
+  }
+
+  @Override
+  public boolean isEnable() {
+    return isEnable;
+  }
+
+  @Override
+  public void enableKnownMetric(KnownMetric metric) {
+    if (!isEnable) {
+      return;
+    }
+    switch (metric) {
+      case JVM:
+        enableJVMMetrics();
+        break;
+      case SYSTEM:
+        break;
+      case THREAD:
+        break;
+      default:
+        // ignore;
+    }
+  }
+
+  public MetricRegistry getMetricRegistry() {
+    return metricRegistry;
+  }
+
+  private void enableJVMMetrics() {
+    if (!isEnable) {
+      return;
+    }
+    metricRegistry.registerAll(new JvmAttributeGaugeSet());
+    metricRegistry.registerAll(new GarbageCollectorMetricSet());
+    metricRegistry.registerAll(new ClassLoadingGaugeSet());
+    metricRegistry.registerAll(new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer()));
+    metricRegistry.registerAll(new CachedThreadStatesGaugeSet(5, TimeUnit.MILLISECONDS));
+  }
+
+  @Override
+  public boolean init() {
+    return true;
+  }
+}
diff --git a/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricReporter.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricReporter.java
new file mode 100644
index 0000000..235f9ad
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/DropwizardMetricReporter.java
@@ -0,0 +1,93 @@
+/*
+ * 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.dropwizard;
+
+import org.apache.iotdb.metrics.MetricManager;
+import org.apache.iotdb.metrics.MetricReporter;
+import org.apache.iotdb.metrics.config.MetricConfig;
+import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
+import org.apache.iotdb.metrics.utils.ReporterType;
+
+import com.codahale.metrics.JmxReporter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class DropwizardMetricReporter implements MetricReporter {
+  private static Logger logger = LoggerFactory.getLogger(DropwizardMetricReporter.class);
+  private MetricManager dropwizardMetricManager;
+  private MetricConfig metricConfig = MetricConfigDescriptor.getInstance().getMetricConfig();
+
+  private JmxReporter jmxReporter;
+
+  @Override
+  public boolean start() {
+    List<String> reporters = metricConfig.getReporterList();
+    for (String reporter : reporters) {
+      switch (ReporterType.get(reporter)) {
+        case JMX:
+          {
+            jmxReporter =
+                JmxReporter.forRegistry(
+                        ((DropwizardMetricManager) dropwizardMetricManager).getMetricRegistry())
+                    .build();
+            startJmxReporter(jmxReporter);
+          }
+          break;
+        case IOTDB:
+          break;
+        case PROMETHEUS:
+          break;
+        default:
+          logger.warn("Dropwizard don't support reporter type {}", reporter);
+      }
+    }
+    return false;
+  }
+
+  private void startJmxReporter(JmxReporter jmxReporter) {
+    jmxReporter.start();
+  }
+
+  @Override
+  public void setMetricManager(MetricManager metricManager) {
+    dropwizardMetricManager = metricManager;
+  }
+
+  @Override
+  public boolean stop() {
+    List<String> reporters = metricConfig.getReporterList();
+    for (String reporter : reporters) {
+      switch (ReporterType.get(reporter)) {
+        case JMX:
+          jmxReporter.stop();
+          break;
+        case IOTDB:
+          break;
+        case PROMETHEUS:
+          break;
+        default:
+          logger.warn("Dropwizard don't support reporter type {}", reporter);
+      }
+    }
+    return true;
+  }
+}
diff --git a/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/MetricName.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/MetricName.java
new file mode 100644
index 0000000..d214463
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/MetricName.java
@@ -0,0 +1,116 @@
+/*
+ * 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.dropwizard;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+public class MetricName {
+  public static final String SEPARATOR = ".";
+  public static final Map<String, String> EMPTY_TAGS = Collections.emptyMap();
+
+  public String name;
+  public Map<String, String> tags;
+
+  public MetricName(String name, String... tags) {
+    this.name = name;
+    this.tags = new HashMap<>();
+    for (int i = 0; i < tags.length; i++) {
+      this.tags.put(tags[i], tags[i + 1]);
+      i += 2;
+    }
+  }
+
+  public MetricName(String name, Map<String, String> tags) {
+    this.name = name;
+    this.tags = tags;
+  }
+
+  public String toFlatString() {
+    StringBuilder stringBuilder = new StringBuilder(name);
+    tags.forEach((k, v) -> stringBuilder.append(k).append(SEPARATOR).append(v));
+    return stringBuilder.toString().replace(" ", "_");
+  }
+
+  public String[] toStringArray() {
+    List<String> allNames = new ArrayList<>();
+    allNames.add(name);
+    tags.forEach(
+        (k, v) -> {
+          allNames.add(k);
+          allNames.add(v);
+        });
+    return allNames.toArray(new String[0]);
+  }
+
+  @Override
+  public String toString() {
+    return "MetricName{" + "name='" + name + '\'' + ", tags=" + tags + '}';
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public Map<String, String> getTags() {
+    return tags;
+  }
+
+  public void setTags(Map<String, String> tags) {
+    this.tags = tags;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (!(obj instanceof MetricName)) {
+      return false;
+    }
+    MetricName that = (MetricName) obj;
+    if (this.name != that.name) {
+      return false;
+    }
+    if (that.getTags().size() != this.tags.size()) {
+      return false;
+    }
+    Map<String, String> thatTags = that.getTags();
+    for (Map.Entry<String, String> entry : this.tags.entrySet()) {
+      if (!thatTags.containsKey(entry.getKey())) {
+        return false;
+      }
+      if (!thatTags.get(entry.getKey()).equals(entry.getValue())) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(name, tags);
+  }
+}
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardCounter.java
similarity index 76%
copy from metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
copy to metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardCounter.java
index 9fbfa6f..3261ed2 100644
--- a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardCounter.java
@@ -17,30 +17,29 @@
  * under the License.
  */
 
-package org.apache.iotdb.metrics.micrometer.type;
+package org.apache.iotdb.metrics.dropwizard.type;
 
 import org.apache.iotdb.metrics.type.Counter;
 
-public class MicrometerCounter implements Counter {
+public class DropwizardCounter implements Counter {
+  com.codahale.metrics.Counter counter;
 
-  public MicrometerCounter(io.micrometer.core.instrument.Counter counter) {
+  public DropwizardCounter(com.codahale.metrics.Counter counter) {
     this.counter = counter;
   }
 
-  io.micrometer.core.instrument.Counter counter;
-
   @Override
   public void inc() {
-    counter.increment();
+    counter.inc();
   }
 
   @Override
   public void inc(long n) {
-    counter.increment(n);
+    counter.inc(n);
   }
 
   @Override
   public long count() {
-    return (long) counter.count();
+    return counter.getCount();
   }
 }
diff --git a/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardGauge.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardGauge.java
new file mode 100644
index 0000000..c7175f5
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardGauge.java
@@ -0,0 +1,62 @@
+/*
+ * 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.dropwizard.type;
+
+import org.apache.iotdb.metrics.type.Gauge;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class DropwizardGauge implements Gauge {
+
+  AtomicLong atomicLong;
+  DropwizardCachedGauge dropwizardCachedGauge;
+
+  public DropwizardGauge() {
+    atomicLong = new AtomicLong(0);
+    dropwizardCachedGauge = new DropwizardCachedGauge(5, TimeUnit.MILLISECONDS);
+  }
+
+  public class DropwizardCachedGauge extends com.codahale.metrics.CachedGauge<Long> {
+
+    protected DropwizardCachedGauge(long timeout, TimeUnit timeoutUnit) {
+      super(timeout, timeoutUnit);
+    }
+
+    @Override
+    protected Long loadValue() {
+      return atomicLong.get();
+    }
+  }
+
+  @Override
+  public long value() {
+    return dropwizardCachedGauge.getValue();
+  }
+
+  @Override
+  public void set(long value) {
+    atomicLong.set(value);
+  }
+
+  public com.codahale.metrics.Gauge getDropwizardCachedGauge() {
+    return dropwizardCachedGauge;
+  }
+}
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogram.java
similarity index 58%
copy from metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
copy to metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogram.java
index 9fbfa6f..edf5f2b 100644
--- a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogram.java
@@ -17,30 +17,36 @@
  * under the License.
  */
 
-package org.apache.iotdb.metrics.micrometer.type;
+package org.apache.iotdb.metrics.dropwizard.type;
 
-import org.apache.iotdb.metrics.type.Counter;
+import org.apache.iotdb.metrics.type.Histogram;
+import org.apache.iotdb.metrics.type.HistogramSnapshot;
 
-public class MicrometerCounter implements Counter {
+public class DropwizardHistogram implements Histogram {
 
-  public MicrometerCounter(io.micrometer.core.instrument.Counter counter) {
-    this.counter = counter;
-  }
+  com.codahale.metrics.Histogram histogram;
 
-  io.micrometer.core.instrument.Counter counter;
+  public DropwizardHistogram(com.codahale.metrics.Histogram histogram) {
+    this.histogram = histogram;
+  }
 
   @Override
-  public void inc() {
-    counter.increment();
+  public void update(int value) {
+    histogram.update(value);
   }
 
   @Override
-  public void inc(long n) {
-    counter.increment(n);
+  public void update(long value) {
+    histogram.update(value);
   }
 
   @Override
   public long count() {
-    return (long) counter.count();
+    return histogram.getCount();
+  }
+
+  @Override
+  public HistogramSnapshot takeSnapshot() {
+    return new DropwizardHistogramSnapshot(histogram.getSnapshot());
   }
 }
diff --git a/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogramSnapshot.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogramSnapshot.java
new file mode 100644
index 0000000..0fe3a9c
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardHistogramSnapshot.java
@@ -0,0 +1,73 @@
+/*
+ * 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.dropwizard.type;
+
+import org.apache.iotdb.metrics.type.HistogramSnapshot;
+
+import java.io.OutputStream;
+
+public class DropwizardHistogramSnapshot implements HistogramSnapshot {
+
+  com.codahale.metrics.Snapshot snapshot;
+
+  public DropwizardHistogramSnapshot(com.codahale.metrics.Snapshot snapshot) {
+    this.snapshot = snapshot;
+  }
+
+  @Override
+  public double getValue(double quantile) {
+    return snapshot.getValue(quantile);
+  }
+
+  @Override
+  public long[] getValues() {
+    return snapshot.getValues();
+  }
+
+  @Override
+  public int size() {
+    return snapshot.size();
+  }
+
+  @Override
+  public double getMedian() {
+    return snapshot.getMedian();
+  }
+
+  @Override
+  public long getMax() {
+    return snapshot.getMax();
+  }
+
+  @Override
+  public double getMean() {
+    return snapshot.getMean();
+  }
+
+  @Override
+  public long getMin() {
+    return snapshot.getMin();
+  }
+
+  @Override
+  public void dump(OutputStream output) {
+    snapshot.dump(output);
+  }
+}
diff --git a/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardRate.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardRate.java
new file mode 100644
index 0000000..8be1309
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardRate.java
@@ -0,0 +1,95 @@
+/*
+ * 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.dropwizard.type;
+
+import org.apache.iotdb.metrics.type.Rate;
+
+import com.codahale.metrics.Meter;
+
+public class DropwizardRate implements Rate {
+
+  Meter meter;
+  // read-only meter
+  com.codahale.metrics.Timer timer;
+
+  public DropwizardRate(Meter meter) {
+    this.meter = meter;
+    this.timer = null;
+  }
+
+  public DropwizardRate(com.codahale.metrics.Timer timer) {
+    this.timer = timer;
+    this.meter = null;
+  }
+
+  @Override
+  public long getCount() {
+    if (meter != null) {
+      return meter.getCount();
+    }
+    return timer.getCount();
+  }
+
+  @Override
+  public double getOneMinuteRate() {
+    if (meter != null) {
+      return meter.getOneMinuteRate();
+    }
+    return timer.getOneMinuteRate();
+  }
+
+  @Override
+  public double getMeanRate() {
+    if (meter != null) {
+      return meter.getMeanRate();
+    }
+    return timer.getMeanRate();
+  }
+
+  @Override
+  public double getFiveMinuteRate() {
+    if (meter != null) {
+      return meter.getFiveMinuteRate();
+    }
+    return timer.getFiveMinuteRate();
+  }
+
+  @Override
+  public double getFifteenMinuteRate() {
+    if (meter != null) {
+      return meter.getFifteenMinuteRate();
+    }
+    return timer.getFifteenMinuteRate();
+  }
+
+  @Override
+  public void mark() {
+    if (meter != null) {
+      meter.mark();
+    }
+  }
+
+  @Override
+  public void mark(long n) {
+    if (meter != null) {
+      meter.mark(n);
+    }
+  }
+}
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardTimer.java
similarity index 56%
copy from metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
copy to metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardTimer.java
index 9fbfa6f..24a0849 100644
--- a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
+++ b/metrics/dropwizard-metrics/src/main/java/org/apache/iotdb/metrics/dropwizard/type/DropwizardTimer.java
@@ -17,30 +17,33 @@
  * under the License.
  */
 
-package org.apache.iotdb.metrics.micrometer.type;
+package org.apache.iotdb.metrics.dropwizard.type;
 
-import org.apache.iotdb.metrics.type.Counter;
+import org.apache.iotdb.metrics.type.HistogramSnapshot;
+import org.apache.iotdb.metrics.type.Rate;
+import org.apache.iotdb.metrics.type.Timer;
 
-public class MicrometerCounter implements Counter {
+import java.util.concurrent.TimeUnit;
 
-  public MicrometerCounter(io.micrometer.core.instrument.Counter counter) {
-    this.counter = counter;
-  }
+public class DropwizardTimer implements Timer {
+  com.codahale.metrics.Timer timer;
 
-  io.micrometer.core.instrument.Counter counter;
+  public DropwizardTimer(com.codahale.metrics.Timer timer) {
+    this.timer = timer;
+  }
 
   @Override
-  public void inc() {
-    counter.increment();
+  public void update(long duration, TimeUnit unit) {
+    timer.update(duration, unit);
   }
 
   @Override
-  public void inc(long n) {
-    counter.increment(n);
+  public HistogramSnapshot takeSnapshot() {
+    return new DropwizardHistogramSnapshot(timer.getSnapshot());
   }
 
   @Override
-  public long count() {
-    return (long) counter.count();
+  public Rate getImmutableRate() {
+    return new DropwizardRate(timer);
   }
 }
diff --git a/metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager b/metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager
new file mode 100644
index 0000000..b606911
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+org.apache.iotdb.metrics.dropwizard.DropwizardMetricManager
\ No newline at end of file
diff --git a/metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter b/metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter
new file mode 100644
index 0000000..1ac1d1e
--- /dev/null
+++ b/metrics/dropwizard-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+org.apache.iotdb.metrics.dropwizard.DropwizardMetricReporter
\ No newline at end of file
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricManager.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricManager.java
index d61bdb7..8add6ed 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricManager.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricManager.java
@@ -24,11 +24,17 @@ import org.apache.iotdb.metrics.type.Histogram;
 import org.apache.iotdb.metrics.type.Rate;
 import org.apache.iotdb.metrics.type.Timer;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 public interface MetricManager {
-
+  /*
+   * The following functions will create or get a exist Metric
+   * @param metric: the metric name
+   * @param tags: string appear in pairs, like sg="ln",user="user1" will be "sg", "ln", "user", "user1"
+   * @return Metric Instance
+   */
   Counter counter(String metric, String... tags);
 
   Gauge gauge(String metric, String... tags);
@@ -39,7 +45,13 @@ public interface MetricManager {
 
   Timer timer(String metric, String... tags);
 
-  // metric.counter(5, "insertRecords","interface","insertRecords","sg","sg1");
+  /*
+   * The following functions just update the current record value
+   * @param the delta value will be recorded
+   * @param metric the metric name
+   * @param tags string appear in pairs, like sg="ln",user="user1" will be "sg", "ln", "user", "user1"
+   */
+
   void count(int delta, String metric, String... tags);
 
   void count(long delta, String metric, String... tags);
@@ -52,26 +64,40 @@ public interface MetricManager {
 
   void gauge(long value, String metric, String... tags);
 
-  void meter(int value, String metric, String... tags);
+  void rate(int value, String metric, String... tags);
 
-  void meter(long value, String metric, String... tags);
+  void rate(long value, String metric, String... tags);
 
   void timer(long delta, TimeUnit timeUnit, String metric, String... tags);
 
-  void timerStart(String metric, String... tags);
-
-  void timerEnd(String metric, String... tags);
+  /** @return all MetricKeys, key is metric name, value is tags, which is a string array */
+  List<String[]> getAllMetricKeys();
 
-  Map<String, String[]> getAllMetricKeys();
-
-  // key is name + tags
+  // key is name + tags, value
   Map<String[], Counter> getAllCounters();
 
   Map<String[], Gauge> getAllGauges();
 
-  Map<String[], Rate> getAllMeters();
+  Map<String[], Rate> getAllRates();
 
   Map<String[], Histogram> getAllHistograms();
 
   Map<String[], Timer> getAllTimers();
+
+  /** @return whether enable metricService */
+  boolean isEnable();
+
+  /**
+   * enable pre-defined metric set
+   *
+   * @param metric which metric set we want to collect
+   */
+  void enableKnownMetric(KnownMetric metric);
+
+  /**
+   * init something
+   *
+   * @return
+   */
+  boolean init();
 }
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 a1af228..023f0fe 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
@@ -21,7 +21,7 @@ package org.apache.iotdb.metrics;
 public interface MetricReporter {
   boolean start();
 
-  void setMetricFactory(MetricFactory metricFactory);
+  void setMetricManager(MetricManager metricManager);
 
   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 50b0d7d..8e1af33 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
@@ -18,55 +18,65 @@
  */
 package org.apache.iotdb.metrics;
 
-import org.apache.iotdb.metrics.impl.DoNothingFactory;
+import org.apache.iotdb.metrics.impl.DoNothingMetricManager;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.ServiceLoader;
 
-/** MetricService is the entr */
+/** MetricService is the entry to manage all Metric system */
 public class MetricService {
 
   private static final Logger logger = LoggerFactory.getLogger(MetricService.class);
 
   private static final List<MetricReporter> reporters = new ArrayList<>();
 
-  private static MetricFactory factory;
-
   static {
     init();
   }
 
-  private static void init() {
+  private static final MetricService INSTANCE = new MetricService();
+
+  private static MetricManager metricManager;
+
+  public static MetricService getINSTANCE() {
+    return INSTANCE;
+  }
 
-    ServiceLoader<MetricFactory> metricFactories = ServiceLoader.load(MetricFactory.class);
+  private MetricService() {}
+
+  private static void init() {
+    logger.debug("init metric service");
+    ServiceLoader<MetricManager> metricManagers = ServiceLoader.load(MetricManager.class);
     int size = 0;
-    MetricFactory nothingFactory = null;
+    MetricManager nothingManager = new DoNothingMetricManager();
 
-    for (MetricFactory mf : metricFactories) {
-      if (mf instanceof DoNothingFactory) {
-        nothingFactory = mf;
+    for (MetricManager mf : metricManagers) {
+      if (mf instanceof DoNothingMetricManager) {
+        nothingManager = mf;
         continue;
       }
       size++;
-      factory = mf;
+      metricManager = mf;
     }
 
-    // if no more implementation, we use nothingFactory.
+    // if no more implementations, we use nothingFactory.
     if (size == 0) {
-      factory = nothingFactory;
+      metricManager = nothingManager;
     } else if (size > 1) {
-      logger.warn("detect more than one MetricFactory, will use {}", factory.getClass().getName());
+      logger.warn(
+          "detect more than one MetricManager, will use {}", metricManager.getClass().getName());
     }
+    // do some init work
+    metricManager.init();
 
     ServiceLoader<MetricReporter> reporter = ServiceLoader.load(MetricReporter.class);
     for (MetricReporter r : reporter) {
       reporters.add(r);
-      r.setMetricFactory(factory);
+      r.setMetricManager(metricManager);
       r.start();
       logger.info("detect MetricReporter {}", r.getClass().getName());
     }
@@ -74,23 +84,20 @@ public class MetricService {
 
   public static void stop() {
     for (MetricReporter r : reporters) {
+      logger.info("detect MetricReporter {}", r.getClass().getName());
       r.stop();
     }
   }
 
-  public static MetricManager getMetric(String namespace) {
-    return factory.getMetric(namespace);
+  public static MetricManager getMetricManager() {
+    return metricManager;
   }
 
   public static void enableKnownMetric(KnownMetric metric) {
-    factory.enableKnownMetric(metric);
-  }
-
-  public static Map<String, MetricManager> getAllMetrics() {
-    return factory.getAllMetrics();
+    metricManager.enableKnownMetric(metric);
   }
 
   public static boolean isEnable() {
-    return factory.isEnable();
+    return metricManager.isEnable();
   }
 }
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfig.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfig.java
new file mode 100644
index 0000000..fd40973
--- /dev/null
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfig.java
@@ -0,0 +1,125 @@
+/*
+ * 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.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class MetricConfig {
+  private static final Logger logger = LoggerFactory.getLogger(MetricConfig.class);
+  static final String CONFIG_NAME = "iotdb-metric.properties";
+
+  /** The period of data pushed by the reporter to the remote monitoring system */
+  private int pushPeriodInSecond = 5;
+
+  /** enable publishing data */
+  private boolean isEnabled = true;
+
+  /** provide or push metric data to remote system, could be jmx, prometheus, iotdb, etc. */
+  private List<String> reporterList =
+      Arrays.asList("jmx", "prometheus"); // Collections.singletonList("jmx");
+
+  // the following is prometheus related config
+  /** the http server's port for prometheus exporter to get metric data */
+  private String prometheusExporterPort = "8090";
+
+  // the following is iotdb related config
+
+  private String iotdbSg = "monitor";
+  private String iotdbUser = "root";
+  private String iotdbPasswd = "root";
+  private String iotdbIp = "127.0.0.1";
+  private String iotdbPort = "6667";
+
+  public int getPushPeriodInSecond() {
+    return pushPeriodInSecond;
+  }
+
+  public void setPushPeriodInSecond(int pushPeriodInSecond) {
+    this.pushPeriodInSecond = pushPeriodInSecond;
+  }
+
+  public boolean isEnabled() {
+    return isEnabled;
+  }
+
+  public void setEnabled(boolean enabled) {
+    isEnabled = enabled;
+  }
+
+  public String getPrometheusExporterPort() {
+    return prometheusExporterPort;
+  }
+
+  public void setPrometheusExporterPort(String prometheusExporterPort) {
+    this.prometheusExporterPort = prometheusExporterPort;
+  }
+
+  public List<String> getReporterList() {
+    return reporterList;
+  }
+
+  public void setReporterList(List<String> reporterList) {
+    this.reporterList = reporterList;
+  }
+
+  public String getIotdbSg() {
+    return iotdbSg;
+  }
+
+  public void setIotdbSg(String iotdbSg) {
+    this.iotdbSg = iotdbSg;
+  }
+
+  public String getIotdbUser() {
+    return iotdbUser;
+  }
+
+  public void setIotdbUser(String iotdbUser) {
+    this.iotdbUser = iotdbUser;
+  }
+
+  public String getIotdbPasswd() {
+    return iotdbPasswd;
+  }
+
+  public void setIotdbPasswd(String iotdbPasswd) {
+    this.iotdbPasswd = iotdbPasswd;
+  }
+
+  public String getIotdbIp() {
+    return iotdbIp;
+  }
+
+  public void setIotdbIp(String iotdbIp) {
+    this.iotdbIp = iotdbIp;
+  }
+
+  public String getIotdbPort() {
+    return iotdbPort;
+  }
+
+  public void setIotdbPort(String iotdbPort) {
+    this.iotdbPort = iotdbPort;
+  }
+}
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java
new file mode 100644
index 0000000..7990a24
--- /dev/null
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java
@@ -0,0 +1,132 @@
+/*
+ * 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.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+
+public class MetricConfigDescriptor {
+  private static final Logger logger = LoggerFactory.getLogger(MetricConfigDescriptor.class);
+  private final MetricConfig metricConfig = new MetricConfig();
+
+  public MetricConfig getMetricConfig() {
+    return metricConfig;
+  }
+
+  private MetricConfigDescriptor() {
+    loadProps();
+  }
+
+  public static MetricConfigDescriptor getInstance() {
+    return MetricConfigDescriptorHolder.INSTANCE;
+  }
+
+  public String getPropsUrl() {
+    String url = System.getProperty(MetricConstant.METRIC_CONF, null);
+    if (url == null) {
+      url = System.getProperty(MetricConstant.IOTDB_HOME, null);
+      if (url != null) {
+        url = url + File.separatorChar + "conf" + File.separatorChar + MetricConfig.CONFIG_NAME;
+      } else {
+        logger.warn(
+            "Cannot find IOTDB_HOME or METRIC_CONF environment variable when loading "
+                + "config file {}, use default configuration",
+            MetricConfig.CONFIG_NAME);
+        // update all data seriesPath
+        return null;
+      }
+    } else {
+      url += (File.separatorChar + MetricConfig.CONFIG_NAME);
+    }
+    return url;
+  }
+
+  /** load an property file and set TsfileDBConfig variables. */
+  private void loadProps() {
+
+    String url = getPropsUrl();
+    Properties properties = System.getProperties();
+    if (url != null) {
+      try (InputStream inputStream = new FileInputStream(new File(url))) {
+        logger.info("Start to read config file {}", url);
+        properties.load(inputStream);
+      } catch (IOException e) {
+        logger.warn("Fail to find config file {}", url, e);
+      }
+    }
+
+    metricConfig.setEnabled(
+        Boolean.parseBoolean(
+            properties.getProperty("enable_metric", Boolean.toString(metricConfig.isEnabled()))));
+
+    String reporterList = properties.getProperty("metric_reporter_list");
+    if (reporterList != null) {
+      metricConfig.setReporterList(getReporterList(reporterList));
+    }
+
+    metricConfig.setPushPeriodInSecond(
+        Integer.parseInt(
+            properties.getProperty(
+                "push_period_in_second", Integer.toString(metricConfig.getPushPeriodInSecond()))));
+
+    metricConfig.setPrometheusExporterPort(
+        properties.getProperty(
+            "prometheus_exporter_port", metricConfig.getPrometheusExporterPort()));
+
+    metricConfig.setIotdbIp(properties.getProperty("iotdb_ip", metricConfig.getIotdbIp()));
+
+    metricConfig.setIotdbPort(properties.getProperty("iotdb_port", metricConfig.getIotdbPort()));
+
+    metricConfig.setIotdbSg(properties.getProperty("iotdb_sg", metricConfig.getIotdbSg()));
+    metricConfig.setIotdbUser(properties.getProperty("iotdb_user", metricConfig.getIotdbUser()));
+    metricConfig.setIotdbPasswd(
+        properties.getProperty("iotdb_passwd", metricConfig.getIotdbPasswd()));
+  }
+
+  private List<String> getReporterList(String reporterList) {
+    if (reporterList == null) {
+      return Collections.emptyList();
+    }
+    List<String> reporters = new ArrayList<>();
+    String[] split = reporterList.split(",");
+    for (String reporter : split) {
+      reporter = reporter.trim();
+      if ("".equals(reporter)) {
+        continue;
+      }
+      reporters.add(reporter);
+    }
+    return reporters;
+  }
+
+  private static class MetricConfigDescriptorHolder {
+
+    private static final MetricConfigDescriptor INSTANCE = new MetricConfigDescriptor();
+  }
+}
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricReporter.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConstant.java
similarity index 82%
copy from metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricReporter.java
copy to metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConstant.java
index a1af228..9bbfd37 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricReporter.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConstant.java
@@ -16,12 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.metrics;
 
-public interface MetricReporter {
-  boolean start();
+package org.apache.iotdb.metrics.config;
 
-  void setMetricFactory(MetricFactory metricFactory);
-
-  boolean stop();
+public class MetricConstant {
+  static final String METRIC_CONF = "METRIC_CONF";
+  public static final String IOTDB_HOME = "IOTDB_HOME";
 }
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingMetricManager.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingMetricManager.java
index 5f0480c..6b46b34 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingMetricManager.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingMetricManager.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.metrics.impl;
 
+import org.apache.iotdb.metrics.KnownMetric;
 import org.apache.iotdb.metrics.MetricManager;
 import org.apache.iotdb.metrics.type.Counter;
 import org.apache.iotdb.metrics.type.Gauge;
@@ -25,6 +26,7 @@ import org.apache.iotdb.metrics.type.Histogram;
 import org.apache.iotdb.metrics.type.Rate;
 import org.apache.iotdb.metrics.type.Timer;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
@@ -74,22 +76,16 @@ public class DoNothingMetricManager implements MetricManager {
   public void gauge(long value, String metric, String... tags) {}
 
   @Override
-  public void meter(int value, String metric, String... tags) {}
+  public void rate(int value, String metric, String... tags) {}
 
   @Override
-  public void meter(long value, String metric, String... tags) {}
+  public void rate(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() {
+  public List<String[]> getAllMetricKeys() {
     return null;
   }
 
@@ -104,7 +100,7 @@ public class DoNothingMetricManager implements MetricManager {
   }
 
   @Override
-  public Map<String[], Rate> getAllMeters() {
+  public Map<String[], Rate> getAllRates() {
     return null;
   }
 
@@ -117,4 +113,17 @@ public class DoNothingMetricManager implements MetricManager {
   public Map<String[], Timer> getAllTimers() {
     return null;
   }
+
+  @Override
+  public boolean isEnable() {
+    return false;
+  }
+
+  @Override
+  public void enableKnownMetric(KnownMetric metric) {}
+
+  @Override
+  public boolean init() {
+    return false;
+  }
 }
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/HistogramSnapshot.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/HistogramSnapshot.java
index 54adeec..430adf8 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/HistogramSnapshot.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/HistogramSnapshot.java
@@ -37,8 +37,6 @@ public interface HistogramSnapshot {
 
   public abstract long getMin();
 
-  public abstract double getStdDev();
-
   /**
    * Writes the values of the snapshot to the given stream.
    *
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Timer.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Timer.java
index 2f05b2a..fb1952e 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Timer.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/type/Timer.java
@@ -37,5 +37,10 @@ public interface Timer extends IMetric {
 
   HistogramSnapshot takeSnapshot();
 
-  Rate getMeter();
+  /**
+   * It's not safe to use the update interface
+   *
+   * @return the rate related with the timer
+   */
+  Rate getImmutableRate();
 }
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricFactory.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/utils/ReporterType.java
similarity index 59%
copy from metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricFactory.java
copy to metrics/interface/src/main/java/org/apache/iotdb/metrics/utils/ReporterType.java
index 4896aaa..b13884c 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricFactory.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/utils/ReporterType.java
@@ -16,23 +16,36 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.metrics;
 
+package org.apache.iotdb.metrics.utils;
+
+import java.util.HashMap;
 import java.util.Map;
 
-public interface MetricFactory {
+public enum ReporterType {
+  JMX("jmx"),
+  PROMETHEUS("prometheus"),
+  IOTDB("iotdb");
+
+  private String name;
+
+  ReporterType(String name) {
+    this.name = name;
+  }
 
-  /**
-   * repeated calling the method will return the same Object instance.
-   *
-   * @param namespace
-   * @return
-   */
-  MetricManager getMetric(String namespace);
+  public String getName() {
+    return name;
+  }
 
-  void enableKnownMetric(KnownMetric metric);
+  private static final Map<String, ReporterType> lookup = new HashMap<>();
 
-  Map<String, MetricManager> getAllMetrics();
+  static {
+    for (ReporterType reporterType : ReporterType.values()) {
+      lookup.put(reporterType.getName(), reporterType);
+    }
+  }
 
-  boolean isEnable();
+  public static ReporterType get(String name) {
+    return lookup.get(name);
+  }
 }
diff --git a/metrics/micrometer-metrics/pom.xml b/metrics/micrometer-metrics/pom.xml
index 1c51742..319fc04 100644
--- a/metrics/micrometer-metrics/pom.xml
+++ b/metrics/micrometer-metrics/pom.xml
@@ -39,5 +39,15 @@
             <artifactId>micrometer-registry-prometheus</artifactId>
             <version>1.6.2</version>
         </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-jmx</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+            <version>4.1.2</version>
+        </dependency>
     </dependencies>
 </project>
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricFactory.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MeterIdUtils.java
similarity index 68%
rename from metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricFactory.java
rename to metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MeterIdUtils.java
index 4896aaa..2112b22 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricFactory.java
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MeterIdUtils.java
@@ -16,23 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.metrics;
 
-import java.util.Map;
+package org.apache.iotdb.metrics.micrometer;
 
-public interface MetricFactory {
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.Tags;
 
-  /**
-   * repeated calling the method will return the same Object instance.
-   *
-   * @param namespace
-   * @return
-   */
-  MetricManager getMetric(String namespace);
+public class MeterIdUtils {
 
-  void enableKnownMetric(KnownMetric metric);
+  private MeterIdUtils() {}
 
-  Map<String, MetricManager> getAllMetrics();
-
-  boolean isEnable();
+  public static Meter.Id fromMetricName(String metricName, Meter.Type type, String... tags) {
+    return new Meter.Id(metricName, Tags.of(tags), null, null, type);
+  }
 }
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
deleted file mode 100644
index 67aba66..0000000
--- a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/MicrometerMetricFactory.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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 org.apache.iotdb.metrics.KnownMetric;
-import org.apache.iotdb.metrics.MetricFactory;
-import org.apache.iotdb.metrics.MetricManager;
-
-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 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
index 5eb65e4..249902c 100644
--- 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
@@ -19,42 +19,119 @@
 
 package org.apache.iotdb.metrics.micrometer;
 
+import org.apache.iotdb.metrics.KnownMetric;
 import org.apache.iotdb.metrics.MetricManager;
+import org.apache.iotdb.metrics.config.MetricConfig;
+import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
 import org.apache.iotdb.metrics.micrometer.type.MicrometerCounter;
+import org.apache.iotdb.metrics.micrometer.type.MicrometerGauge;
+import org.apache.iotdb.metrics.micrometer.type.MicrometerHistogram;
+import org.apache.iotdb.metrics.micrometer.type.MicrometerRate;
+import org.apache.iotdb.metrics.micrometer.type.MicrometerTimer;
 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 org.apache.iotdb.metrics.utils.ReporterType;
 
+import io.micrometer.core.instrument.Clock;
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Metrics;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
+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 io.micrometer.jmx.JmxConfig;
+import io.micrometer.jmx.JmxMeterRegistry;
 import io.micrometer.prometheus.PrometheusConfig;
 import io.micrometer.prometheus.PrometheusMeterRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 
 public class MicrometerMetricManager implements MetricManager {
+  private static final Logger logger = LoggerFactory.getLogger(MicrometerMetricManager.class);
+
   Map<Meter.Id, IMetric> currentMeters;
+  boolean isEnable;
 
-  io.micrometer.prometheus.PrometheusMeterRegistry prometheusMeterRegistry;
+  io.micrometer.core.instrument.MeterRegistry meterRegistry;
+  MetricConfig metricConfig = MetricConfigDescriptor.getInstance().getMetricConfig();
 
   public MicrometerMetricManager() {
-    prometheusMeterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
+    meterRegistry = Metrics.globalRegistry;
     currentMeters = new ConcurrentHashMap<>();
+    isEnable = metricConfig.isEnabled();
+  }
+
+  @Override
+  public boolean init() {
+    logger.debug("micrometer init registry");
+    List<String> reporters = metricConfig.getReporterList();
+    for (String reporter : reporters) {
+      switch (ReporterType.get(reporter)) {
+        case JMX:
+          Metrics.addRegistry(new JmxMeterRegistry(JmxConfig.DEFAULT, Clock.SYSTEM));
+          break;
+        case PROMETHEUS:
+          Metrics.addRegistry(new PrometheusMeterRegistry(PrometheusConfig.DEFAULT));
+          break;
+        case IOTDB:
+          break;
+        default:
+          logger.warn("Unsupported report type {}, please check the config.", reporter);
+          return false;
+      }
+    }
+    return true;
   }
 
   public MeterRegistry getMeterRegistry() {
-    return prometheusMeterRegistry;
+    return meterRegistry;
+  }
+
+  public PrometheusMeterRegistry getPrometheusMeterRegistry() {
+    Set<MeterRegistry> meterRegistrySet = Metrics.globalRegistry.getRegistries();
+    for (MeterRegistry childMeterRegistry : meterRegistrySet) {
+      if (childMeterRegistry instanceof PrometheusMeterRegistry) {
+        return (PrometheusMeterRegistry) childMeterRegistry;
+      }
+    }
+    return null;
+  }
+
+  public JmxMeterRegistry getJmxMeterRegistry() {
+    Set<MeterRegistry> meterRegistrySet = Metrics.globalRegistry.getRegistries();
+    for (MeterRegistry childMeterRegistry : meterRegistrySet) {
+      if (childMeterRegistry instanceof JmxMeterRegistry) {
+        return (JmxMeterRegistry) childMeterRegistry;
+      }
+    }
+    return null;
   }
 
   @Override
   public Counter counter(String metric, String... tags) {
-    io.micrometer.core.instrument.Counter innerCounter =
-        prometheusMeterRegistry.counter(metric, tags);
+    if (!isEnable) {
+      return null;
+    }
+    io.micrometer.core.instrument.Counter innerCounter = meterRegistry.counter(metric, tags);
     return (Counter)
         currentMeters.computeIfAbsent(
             innerCounter.getId(), key -> new MicrometerCounter(innerCounter));
@@ -62,88 +139,312 @@ public class MicrometerMetricManager implements MetricManager {
 
   @Override
   public void count(int delta, String metric, String... tags) {
-    io.micrometer.core.instrument.Counter innerCounter =
-        prometheusMeterRegistry.counter(metric, tags);
+    io.micrometer.core.instrument.Counter innerCounter = meterRegistry.counter(metric, tags);
     innerCounter.increment(delta);
   }
 
   @Override
-  public void count(long delta, String metric, String... tags) {}
+  public void count(long delta, String metric, String... tags) {
+    io.micrometer.core.instrument.Counter innerCounter = meterRegistry.counter(metric, tags);
+    innerCounter.increment(delta);
+  }
 
   @Override
   public Gauge gauge(String metric, String... tags) {
-    return null;
+    if (!isEnable) {
+      return null;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.GAUGE, tags);
+    return (Gauge)
+        currentMeters.computeIfAbsent(id, key -> new MicrometerGauge(meterRegistry, metric, tags));
   }
 
   @Override
   public Histogram histogram(String metric, String... tags) {
-    return null;
+    if (!isEnable) {
+      return null;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.DISTRIBUTION_SUMMARY, tags);
+    return (Histogram)
+        currentMeters.computeIfAbsent(
+            id,
+            key -> {
+              io.micrometer.core.instrument.DistributionSummary distributionSummary =
+                  io.micrometer.core.instrument.DistributionSummary.builder(metric)
+                      .tags(tags)
+                      .register(meterRegistry);
+              return new MicrometerHistogram(distributionSummary);
+            });
   }
 
+  /**
+   * We only create a gauge(AtomicLong) to record the raw value, because we assume that the backend
+   * metrics system has the ability to calculate rate
+   *
+   * @param metric
+   * @param tags
+   * @return
+   */
   @Override
+  @Deprecated
   public Rate rate(String metric, String... tags) {
-    return null;
+    if (!isEnable) {
+      return null;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.GAUGE, tags);
+    return (Rate)
+        currentMeters.computeIfAbsent(
+            id,
+            key ->
+                new MicrometerRate(meterRegistry.gauge(metric, Tags.of(tags), new AtomicLong(0))));
   }
 
   @Override
   public Timer timer(String metric, String... tags) {
-    return null;
+    if (!isEnable) {
+      return null;
+    }
+    logger.info(metric + Arrays.toString(tags));
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.TIMER, tags);
+    return (Timer)
+        currentMeters.computeIfAbsent(
+            id,
+            key -> {
+              io.micrometer.core.instrument.Timer timer =
+                  io.micrometer.core.instrument.Timer.builder(metric)
+                      .tags(tags)
+                      .register(meterRegistry);
+              logger.info("create timer {}", metric);
+              return new MicrometerTimer(timer);
+            });
   }
 
   @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) {}
+  public void histogram(int value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.DISTRIBUTION_SUMMARY, tags);
+    ((Histogram)
+            currentMeters.computeIfAbsent(
+                id,
+                key -> {
+                  io.micrometer.core.instrument.DistributionSummary distributionSummary =
+                      io.micrometer.core.instrument.DistributionSummary.builder(metric)
+                          .tags(tags)
+                          .publishPercentileHistogram()
+                          .publishPercentiles(0)
+                          .register(meterRegistry);
+                  return new MicrometerHistogram(distributionSummary);
+                }))
+        .update(value);
+  }
 
   @Override
-  public void gauge(long value, String metric, String... tags) {}
+  public void histogram(long value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.DISTRIBUTION_SUMMARY, tags);
+    ((Histogram)
+            currentMeters.computeIfAbsent(
+                id,
+                key -> {
+                  io.micrometer.core.instrument.DistributionSummary distributionSummary =
+                      io.micrometer.core.instrument.DistributionSummary.builder(metric)
+                          .tags(tags)
+                          .publishPercentileHistogram()
+                          .publishPercentiles(0)
+                          .register(meterRegistry);
+                  return new MicrometerHistogram(distributionSummary);
+                }))
+        .update(value);
+  }
 
   @Override
-  public void meter(int value, String metric, String... tags) {}
+  public void gauge(int value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.GAUGE, tags);
+    ((Gauge)
+            (currentMeters.computeIfAbsent(
+                id, key -> new MicrometerGauge(meterRegistry, metric, tags))))
+        .set(value);
+  }
 
   @Override
-  public void meter(long value, String metric, String... tags) {}
+  public void gauge(long value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.GAUGE, tags);
+    ((Gauge)
+            (currentMeters.computeIfAbsent(
+                id, key -> new MicrometerGauge(meterRegistry, metric, tags))))
+        .set(value);
+  }
 
   @Override
-  public void timer(long delta, TimeUnit timeUnit, String metric, String... tags) {}
+  public void rate(int value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.GAUGE, tags);
+    ((Rate)
+            currentMeters.computeIfAbsent(
+                id,
+                key ->
+                    new MicrometerRate(
+                        meterRegistry.gauge(metric, Tags.of(tags), new AtomicLong(0)))))
+        .mark(value);
+  }
 
   @Override
-  public void timerStart(String metric, String... tags) {}
+  public void rate(long value, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.GAUGE, tags);
+    ((Rate)
+            currentMeters.computeIfAbsent(
+                id,
+                key ->
+                    new MicrometerRate(
+                        meterRegistry.gauge(metric, Tags.of(tags), new AtomicLong(0)))))
+        .mark(value);
+  }
 
   @Override
-  public void timerEnd(String metric, String... tags) {}
+  public synchronized void timer(long delta, TimeUnit timeUnit, String metric, String... tags) {
+    if (!isEnable) {
+      return;
+    }
+    Meter.Id id = MeterIdUtils.fromMetricName(metric, Meter.Type.TIMER, tags);
+    ((Timer)
+            currentMeters.computeIfAbsent(
+                id,
+                key -> {
+                  io.micrometer.core.instrument.Timer timer =
+                      io.micrometer.core.instrument.Timer.builder(metric)
+                          .tags(tags)
+                          .register(meterRegistry);
+                  return new MicrometerTimer(timer);
+                }))
+        .update(delta, timeUnit);
+  }
 
   @Override
-  public Map<String, String[]> getAllMetricKeys() {
-    return null;
+  public List<String[]> getAllMetricKeys() {
+    List<String[]> keys = new ArrayList<>(currentMeters.size());
+    List<Meter> meterList = meterRegistry.getMeters();
+    for (Meter meter : meterList) {
+      List<String> tags = new ArrayList<>(meter.getId().getTags().size() * 2 + 1);
+      tags.add(meter.getId().getName());
+      for (Tag tag : meter.getId().getTags()) {
+        tags.add(tag.getKey());
+        tags.add(tag.getValue());
+      }
+      keys.add(tags.toArray(new String[0]));
+    }
+    return keys;
   }
 
   @Override
   public Map<String[], Counter> getAllCounters() {
-    return null;
+    Map<String[], IMetric> iMetricMap = getMetricByType(Meter.Type.COUNTER);
+    Map<String[], Counter> counterMap = new HashMap<>();
+    iMetricMap.forEach((k, v) -> counterMap.put(k, (Counter) v));
+    return counterMap;
   }
 
   @Override
   public Map<String[], Gauge> getAllGauges() {
-    return null;
+    Map<String[], IMetric> iMetricMap = getMetricByType(Meter.Type.GAUGE);
+    Map<String[], Gauge> gaugeMap = new HashMap<>();
+    iMetricMap.forEach((k, v) -> gaugeMap.put(k, (Gauge) v));
+    return gaugeMap;
   }
 
   @Override
-  public Map<String[], Rate> getAllMeters() {
-    return null;
+  public Map<String[], Rate> getAllRates() {
+    Map<String[], IMetric> iMetricMap = getMetricByType(Meter.Type.OTHER);
+    Map<String[], Rate> rateMap = new HashMap<>();
+    iMetricMap.forEach((k, v) -> rateMap.put(k, (Rate) v));
+    return rateMap;
   }
 
   @Override
   public Map<String[], Histogram> getAllHistograms() {
-    return null;
+    Map<String[], IMetric> iMetricMap = getMetricByType(Meter.Type.DISTRIBUTION_SUMMARY);
+    Map<String[], Histogram> histogramMap = new HashMap<>();
+    iMetricMap.forEach((k, v) -> histogramMap.put(k, (Histogram) v));
+    return histogramMap;
   }
 
   @Override
   public Map<String[], Timer> getAllTimers() {
-    return null;
+    Map<String[], IMetric> iMetricMap = getMetricByType(Meter.Type.TIMER);
+    Map<String[], Timer> timerMap = new HashMap<>();
+    iMetricMap.forEach((k, v) -> timerMap.put(k, (Timer) v));
+    return timerMap;
+  }
+
+  private Map<String[], IMetric> getMetricByType(Meter.Type type) {
+    Map<String[], IMetric> iMetricMap = new HashMap<>();
+    for (Map.Entry<Meter.Id, IMetric> entry : currentMeters.entrySet()) {
+      if (entry.getKey().getType() == type) {
+        List<String> tags = new ArrayList<>(entry.getKey().getTags().size() * 2);
+        tags.add(entry.getKey().getName());
+        for (Tag tag : entry.getKey().getTags()) {
+          tags.add(tag.getKey());
+          tags.add(tag.getValue());
+        }
+        iMetricMap.put(tags.toArray(new String[0]), entry.getValue());
+      }
+    }
+    return iMetricMap;
+  }
+
+  @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() {
+    if (!isEnable) {
+      return;
+    }
+    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 boolean isEnable() {
+    return isEnable;
   }
 }
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
index 518a4d0..3639dbe 100644
--- 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
@@ -19,32 +19,63 @@
 
 package org.apache.iotdb.metrics.micrometer;
 
-import org.apache.iotdb.metrics.MetricFactory;
+import org.apache.iotdb.metrics.MetricManager;
 import org.apache.iotdb.metrics.MetricReporter;
+import org.apache.iotdb.metrics.config.MetricConfig;
+import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
+import org.apache.iotdb.metrics.utils.ReporterType;
 
 import com.sun.net.httpserver.HttpServer;
+import io.micrometer.jmx.JmxMeterRegistry;
 import io.micrometer.prometheus.PrometheusMeterRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.InetSocketAddress;
+import java.util.List;
 
 public class MicrometerMetricReporter implements MetricReporter {
-  MetricFactory micrometerMetricFactory;
-  Thread runThread;
+  private static final Logger logger = LoggerFactory.getLogger(MicrometerMetricReporter.class);
+  private MetricManager micrometerMetricManager;
+  private final MetricConfig metricConfig = MetricConfigDescriptor.getInstance().getMetricConfig();
+  private Thread runThread;
+
+  private JmxMeterRegistry jmxMeterRegistry;
 
   @Override
   public boolean start() {
+    List<String> reporters = metricConfig.getReporterList();
+    for (String reporter : reporters) {
+      switch (ReporterType.get(reporter)) {
+        case JMX:
+          startJmxReporter(
+              ((MicrometerMetricManager) micrometerMetricManager).getJmxMeterRegistry());
+          break;
+        case IOTDB:
+          break;
+        case PROMETHEUS:
+          startPrometheusReporter(
+              ((MicrometerMetricManager) micrometerMetricManager).getPrometheusMeterRegistry());
+          break;
+        default:
+          logger.warn("Dropwizard don't support reporter type {}", reporter);
+      }
+    }
+
+    return true;
+  }
+
+  private void startPrometheusReporter(PrometheusMeterRegistry prometheusMeterRegistry) {
     try {
-      HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
+      HttpServer server =
+          HttpServer.create(
+              new InetSocketAddress(Integer.parseInt(metricConfig.getPrometheusExporterPort())), 0);
       server.createContext(
           "/prometheus",
           httpExchange -> {
-            String response =
-                ((PrometheusMeterRegistry)
-                        ((MicrometerMetricManager) micrometerMetricFactory.getMetric("iotdb"))
-                            .getMeterRegistry())
-                    .scrape();
+            String response = prometheusMeterRegistry.scrape();
             httpExchange.sendResponseHeaders(200, response.getBytes().length);
             try (OutputStream os = httpExchange.getResponseBody()) {
               os.write(response.getBytes());
@@ -56,12 +87,16 @@ public class MicrometerMetricReporter implements MetricReporter {
     } catch (IOException e) {
       throw new RuntimeException(e);
     }
-    return true;
+  }
+
+  private void startJmxReporter(JmxMeterRegistry jmxMeterRegistry) {
+    logger.debug("start jmx reporter from micrometer");
+    jmxMeterRegistry.start();
   }
 
   @Override
-  public void setMetricFactory(MetricFactory metricFactory) {
-    micrometerMetricFactory = metricFactory;
+  public void setMetricManager(MetricManager metricManager) {
+    micrometerMetricManager = metricManager;
   }
 
   @Override
@@ -69,8 +104,10 @@ public class MicrometerMetricReporter implements MetricReporter {
     try {
       runThread.join();
     } catch (InterruptedException e) {
-      e.printStackTrace();
+      logger.warn("Failed to stop prometheus reporter", e);
     }
+
+    ((MicrometerMetricManager) micrometerMetricManager).getJmxMeterRegistry().stop();
     return true;
   }
 }
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
index 9fbfa6f..cdeb40a 100644
--- a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
@@ -22,13 +22,12 @@ package org.apache.iotdb.metrics.micrometer.type;
 import org.apache.iotdb.metrics.type.Counter;
 
 public class MicrometerCounter implements Counter {
+  io.micrometer.core.instrument.Counter counter;
 
   public MicrometerCounter(io.micrometer.core.instrument.Counter counter) {
     this.counter = counter;
   }
 
-  io.micrometer.core.instrument.Counter counter;
-
   @Override
   public void inc() {
     counter.increment();
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingFactory.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerGauge.java
similarity index 56%
rename from metrics/interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingFactory.java
rename to metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerGauge.java
index bce4ec8..e2c80b9 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/impl/DoNothingFactory.java
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerGauge.java
@@ -16,33 +16,32 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.metrics.impl;
 
-import org.apache.iotdb.metrics.KnownMetric;
-import org.apache.iotdb.metrics.MetricFactory;
-import org.apache.iotdb.metrics.MetricManager;
+package org.apache.iotdb.metrics.micrometer.type;
 
-import java.util.Collections;
-import java.util.Map;
+import org.apache.iotdb.metrics.type.Gauge;
 
-public class DoNothingFactory implements MetricFactory {
-  private DoNothingMetricManager metric = new DoNothingMetricManager();
+import io.micrometer.core.instrument.Tags;
 
-  @Override
-  public MetricManager getMetric(String namespace) {
-    return metric;
-  }
+import java.util.concurrent.atomic.AtomicLong;
 
-  @Override
-  public void enableKnownMetric(KnownMetric metric) {}
+public class MicrometerGauge implements Gauge {
+  private final AtomicLong atomicLong;
+
+  public MicrometerGauge(
+      io.micrometer.core.instrument.MeterRegistry meterRegistry,
+      String metricName,
+      String... tags) {
+    atomicLong = meterRegistry.gauge(metricName, Tags.of(tags), new AtomicLong(0));
+  }
 
   @Override
-  public Map<String, MetricManager> getAllMetrics() {
-    return Collections.emptyMap();
+  public long value() {
+    return atomicLong.get();
   }
 
   @Override
-  public boolean isEnable() {
-    return true;
+  public void set(long value) {
+    atomicLong.set(value);
   }
 }
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerHistogram.java
similarity index 57%
copy from metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
copy to metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerHistogram.java
index 9fbfa6f..f843fa1 100644
--- a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerHistogram.java
@@ -19,28 +19,34 @@
 
 package org.apache.iotdb.metrics.micrometer.type;
 
-import org.apache.iotdb.metrics.type.Counter;
+import org.apache.iotdb.metrics.type.Histogram;
 
-public class MicrometerCounter implements Counter {
+public class MicrometerHistogram implements Histogram {
 
-  public MicrometerCounter(io.micrometer.core.instrument.Counter counter) {
-    this.counter = counter;
-  }
+  io.micrometer.core.instrument.DistributionSummary distributionSummary;
 
-  io.micrometer.core.instrument.Counter counter;
+  public MicrometerHistogram(
+      io.micrometer.core.instrument.DistributionSummary distributionSummary) {
+    this.distributionSummary = distributionSummary;
+  }
 
   @Override
-  public void inc() {
-    counter.increment();
+  public void update(int value) {
+    distributionSummary.record(value);
   }
 
   @Override
-  public void inc(long n) {
-    counter.increment(n);
+  public void update(long value) {
+    distributionSummary.record(value);
   }
 
   @Override
   public long count() {
-    return (long) counter.count();
+    return distributionSummary.count();
+  }
+
+  @Override
+  public org.apache.iotdb.metrics.type.HistogramSnapshot takeSnapshot() {
+    return new MicrometerHistogramSnapshot(distributionSummary.takeSnapshot());
   }
 }
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerHistogramSnapshot.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerHistogramSnapshot.java
new file mode 100644
index 0000000..3c3aedb
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerHistogramSnapshot.java
@@ -0,0 +1,91 @@
+/*
+ * 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.type;
+
+import org.apache.iotdb.metrics.type.HistogramSnapshot;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Arrays;
+
+public class MicrometerHistogramSnapshot implements HistogramSnapshot {
+
+  io.micrometer.core.instrument.distribution.HistogramSnapshot histogramSnapshot;
+
+  public MicrometerHistogramSnapshot(
+      io.micrometer.core.instrument.distribution.HistogramSnapshot histogramSnapshot) {
+    this.histogramSnapshot = histogramSnapshot;
+  }
+
+  @Override
+  public double getValue(double quantile) {
+    int prevIndex = 0;
+    int i = 0;
+    for (i = 0; i < this.histogramSnapshot.percentileValues().length; i++) {
+      if (this.histogramSnapshot.percentileValues()[i].percentile() == quantile) {
+        prevIndex = i;
+        break;
+      } else if (this.histogramSnapshot.percentileValues()[i].percentile() > quantile) {
+        break;
+      }
+      prevIndex = i;
+    }
+
+    return this.histogramSnapshot.percentileValues()[prevIndex].value();
+  }
+
+  @Override
+  public long[] getValues() {
+    return Arrays.stream(this.histogramSnapshot.percentileValues())
+        .mapToLong(k -> (long) k.value())
+        .toArray();
+  }
+
+  @Override
+  public int size() {
+    return this.histogramSnapshot.percentileValues().length;
+  }
+
+  @Override
+  public double getMedian() {
+    return getValue(0.5);
+  }
+
+  @Override
+  public long getMax() {
+    return (long) this.histogramSnapshot.max();
+  }
+
+  @Override
+  public double getMean() {
+    return this.histogramSnapshot.mean();
+  }
+
+  @Override
+  public long getMin() {
+    // need distributionSummary to push 0 percentiles
+    return (long) getValue(0.0);
+  }
+
+  @Override
+  public void dump(OutputStream output) {
+    this.histogramSnapshot.outputSummary((PrintStream) output, 100);
+  }
+}
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerRate.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerRate.java
new file mode 100644
index 0000000..0789f1c
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerRate.java
@@ -0,0 +1,81 @@
+/*
+ * 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.type;
+
+import org.apache.iotdb.metrics.type.Rate;
+
+import com.codahale.metrics.Meter;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * could not publish to other metrics system exclude jmx and csv, because micrometer assumes that
+ * other metrics system have the ability to calculate rate. Details is at
+ * https://github.com/micrometer-metrics/micrometer/issues/1935.
+ *
+ * <p>Now, we only record a gauge for the rate record in micrometer, and we use dropwizard meter to
+ * calculate the meter.
+ */
+public class MicrometerRate implements Rate {
+  AtomicLong atomicLong;
+  Meter meter;
+
+  public MicrometerRate(AtomicLong atomicLong) {
+    this.atomicLong = atomicLong;
+    meter = new Meter();
+  }
+
+  @Override
+  public long getCount() {
+    return meter.getCount();
+  }
+
+  @Override
+  public double getOneMinuteRate() {
+    return meter.getOneMinuteRate();
+  }
+
+  @Override
+  public double getMeanRate() {
+    return meter.getMeanRate();
+  }
+
+  @Override
+  public double getFiveMinuteRate() {
+    return meter.getFiveMinuteRate();
+  }
+
+  @Override
+  public double getFifteenMinuteRate() {
+    return meter.getFifteenMinuteRate();
+  }
+
+  @Override
+  public void mark() {
+    atomicLong.set(1);
+    meter.mark();
+  }
+
+  @Override
+  public void mark(long n) {
+    atomicLong.set(n);
+    meter.mark(n);
+  }
+}
diff --git a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerTimer.java
similarity index 53%
copy from metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
copy to metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerTimer.java
index 9fbfa6f..07c68e4 100644
--- a/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerCounter.java
+++ b/metrics/micrometer-metrics/src/main/java/org/apache/iotdb/metrics/micrometer/type/MicrometerTimer.java
@@ -19,28 +19,36 @@
 
 package org.apache.iotdb.metrics.micrometer.type;
 
-import org.apache.iotdb.metrics.type.Counter;
+import org.apache.iotdb.metrics.type.HistogramSnapshot;
+import org.apache.iotdb.metrics.type.Rate;
+import org.apache.iotdb.metrics.type.Timer;
 
-public class MicrometerCounter implements Counter {
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 
-  public MicrometerCounter(io.micrometer.core.instrument.Counter counter) {
-    this.counter = counter;
-  }
+public class MicrometerTimer implements Timer {
+
+  io.micrometer.core.instrument.Timer timer;
+  MicrometerRate micrometerRate;
 
-  io.micrometer.core.instrument.Counter counter;
+  public MicrometerTimer(io.micrometer.core.instrument.Timer timer) {
+    this.timer = timer;
+    micrometerRate = new MicrometerRate(new AtomicLong(0));
+  }
 
   @Override
-  public void inc() {
-    counter.increment();
+  public void update(long duration, TimeUnit unit) {
+    timer.record(duration, unit);
+    micrometerRate.mark(duration);
   }
 
   @Override
-  public void inc(long n) {
-    counter.increment(n);
+  public HistogramSnapshot takeSnapshot() {
+    return new MicrometerHistogramSnapshot(timer.takeSnapshot());
   }
 
   @Override
-  public long count() {
-    return (long) counter.count();
+  public Rate getImmutableRate() {
+    return micrometerRate;
   }
 }
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
deleted file mode 100644
index 6860085..0000000
--- a/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricFactory
+++ /dev/null
@@ -1 +0,0 @@
-# # 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 a [...]
\ 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
deleted file mode 100644
index 3138baf..0000000
--- a/metrics/micrometer-metrics/src/main/resources/META-INF.services/org.apache.iotdb.metrics.micrometer.MicrometerMetricReporter
+++ /dev/null
@@ -1 +0,0 @@
-# # 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 a [...]
\ No newline at end of file
diff --git a/metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager b/metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager
new file mode 100644
index 0000000..235ab43
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricManager
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+org.apache.iotdb.metrics.micrometer.MicrometerMetricManager
\ No newline at end of file
diff --git a/metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter b/metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter
new file mode 100644
index 0000000..4a14a74
--- /dev/null
+++ b/metrics/micrometer-metrics/src/main/resources/META-INF/services/org.apache.iotdb.metrics.MetricReporter
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+org.apache.iotdb.metrics.micrometer.MicrometerMetricReporter
\ No newline at end of file
diff --git a/metrics/pom.xml b/metrics/pom.xml
index b7b9b10..6666aeb 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -35,6 +35,6 @@
     <modules>
         <module>interface</module>
         <module>micrometer-metrics</module>
+        <module>dropwizard-metrics</module>
     </modules>
-
 </project>
diff --git a/server/pom.xml b/server/pom.xml
index d1ce0ef..fb23f01 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -196,6 +196,16 @@
             <artifactId>netty-buffer</artifactId>
             <version>4.1.27.Final</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.iotdb</groupId>
+            <artifactId>metrics-interface</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.iotdb</groupId>
+            <artifactId>micrometer-metrics</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/server/src/assembly/resources/conf/iotdb-metric.properties b/server/src/assembly/resources/conf/iotdb-metric.properties
new file mode 100644
index 0000000..4fbc6bb
--- /dev/null
+++ b/server/src/assembly/resources/conf/iotdb-metric.properties
@@ -0,0 +1,30 @@
+#
+# 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.
+#
+
+enable_metric=true
+metric_reporter_list=jmx
+push_period_in_second=5
+prometheus_exporter_port=8090
+iotdb_ip=127.0.0.1
+iotdb_port=6667
+iotdb_sg=iotdb
+iotdb_user=root
+iotdb_passwd=root
+
+
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 8d97690..9625efa 100755
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -66,6 +66,7 @@ import org.apache.iotdb.db.utils.MmapUtil;
 import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.db.utils.UpgradeUtils;
 import org.apache.iotdb.db.writelog.recover.TsFileRecoverPerformer;
+import org.apache.iotdb.metrics.type.Timer;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
@@ -273,6 +274,10 @@ public class StorageGroupProcessor {
   // DEFAULT_POOL_TRIM_INTERVAL_MILLIS
   private long timeWhenPoolNotEmpty = Long.MAX_VALUE;
 
+  private Timer write_total_timer;
+
+  private Timer read_total_timer;
+
   /** get the direct byte buffer from pool, each fetch contains two ByteBuffer */
   public ByteBuffer[] getWalDirectByteBuffer() {
     ByteBuffer[] res = new ByteBuffer[2];
@@ -384,6 +389,24 @@ public class StorageGroupProcessor {
         DEFAULT_POOL_TRIM_INTERVAL_MILLIS,
         TimeUnit.MILLISECONDS);
     recover();
+    read_total_timer =
+        IoTDB.serverMetricManager.timer(
+            "read_latency",
+            "sg",
+            logicalStorageGroupName,
+            "user",
+            "total",
+            "host",
+            config.getRpcAddress());
+    write_total_timer =
+        IoTDB.serverMetricManager.timer(
+            "write_latency",
+            "sg",
+            logicalStorageGroupName,
+            "user",
+            "total",
+            "host",
+            config.getRpcAddress());
   }
 
   public String getLogicalStorageGroupName() {
@@ -783,6 +806,7 @@ public class StorageGroupProcessor {
     if (!isAlive(insertRowPlan.getTime())) {
       throw new OutOfTTLException(insertRowPlan.getTime(), (System.currentTimeMillis() - dataTTL));
     }
+    long startTime = System.currentTimeMillis();
     if (enableMemControl) {
       StorageEngine.blockInsertionIfReject();
     }
@@ -813,6 +837,18 @@ public class StorageGroupProcessor {
     } finally {
       writeUnlock();
     }
+    long end = System.currentTimeMillis();
+    logger.info("timer insert cost {} millis", end - startTime);
+    IoTDB.serverMetricManager.timer(
+        end - startTime,
+        TimeUnit.MILLISECONDS,
+        "insert_row_latency",
+        "sg",
+        logicalStorageGroupName,
+        "user",
+        insertRowPlan.getLoginUserName(),
+        "host",
+        config.getRpcAddress());
   }
 
   /**
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index c35ae48..f55532d 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.auth.authorizer.IAuthorizer;
 import org.apache.iotdb.db.auth.entity.PathPrivilege;
 import org.apache.iotdb.db.auth.entity.Role;
 import org.apache.iotdb.db.auth.entity.User;
+import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.StorageEngine;
@@ -147,6 +148,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_CANCELLED;
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_CHILD_PATHS;
@@ -185,6 +187,7 @@ public class PlanExecutor implements IPlanExecutor {
   private IAuthorizer authorizer;
 
   private static final String INSERT_MEASUREMENTS_FAILED_MESSAGE = "failed to insert measurements ";
+  private IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
 
   public PlanExecutor() throws QueryProcessException {
     queryRouter = new QueryRouter();
@@ -1099,6 +1102,7 @@ public class PlanExecutor implements IPlanExecutor {
 
   @Override
   public void insert(InsertRowPlan insertRowPlan) throws QueryProcessException {
+    long startTime = System.currentTimeMillis();
     try {
       insertRowPlan.setMeasurementMNodes(
           new MeasurementMNode[insertRowPlan.getMeasurements().length]);
@@ -1109,6 +1113,16 @@ public class PlanExecutor implements IPlanExecutor {
       if (insertRowPlan.getFailedMeasurements() != null) {
         checkFailedMeasurments(insertRowPlan);
       }
+      IoTDB.serverMetricManager.timer(
+          System.currentTimeMillis() - startTime,
+          TimeUnit.MILLISECONDS,
+          "insert_latency",
+          "sg",
+          "root", // TODO infer from insertRowPlan.getDeviceId()
+          "user",
+          insertRowPlan.getLoginUserName(),
+          "host",
+          config.getRpcAddress());
     } catch (StorageEngineException | MetadataException e) {
       if (IoTDBDescriptor.getInstance().getConfig().isEnableStatMonitor()) {
         StatMonitor.getInstance().updateFailedStatValue();
@@ -1135,6 +1149,7 @@ public class PlanExecutor implements IPlanExecutor {
 
   @Override
   public void insertTablet(InsertTabletPlan insertTabletPlan) throws QueryProcessException {
+    long startTime = System.currentTimeMillis();
     try {
       insertTabletPlan.setMeasurementMNodes(
           new MeasurementMNode[insertTabletPlan.getMeasurements().length]);
@@ -1143,6 +1158,16 @@ public class PlanExecutor implements IPlanExecutor {
       if (insertTabletPlan.getFailedMeasurements() != null) {
         checkFailedMeasurments(insertTabletPlan);
       }
+      IoTDB.serverMetricManager.timer(
+          System.currentTimeMillis() - startTime,
+          TimeUnit.MILLISECONDS,
+          "insert_tablet_latency",
+          "sg",
+          "root", // TODO infer from insertTabletPlan.getDeviceId()
+          "user",
+          insertTabletPlan.getLoginUserName(),
+          "host",
+          config.getRpcAddress());
     } catch (StorageEngineException | MetadataException e) {
       if (IoTDBDescriptor.getInstance().getConfig().isEnableStatMonitor()) {
         StatMonitor.getInstance().updateFailedStatValue();
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 b3442a3..7ad371a 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
@@ -53,14 +53,14 @@ public class IoTDB implements IoTDBMBean {
   private static final Logger logger = LoggerFactory.getLogger(IoTDB.class);
   private final String mbeanName =
       String.format("%s:%s=%s", IoTDBConstant.IOTDB_PACKAGE, IoTDBConstant.JMX_TYPE, "IoTDB");
-  private RegisterManager registerManager = new RegisterManager();
+  private final RegisterManager registerManager = new RegisterManager();
   public static MManager metaManager = MManager.getInstance();
 
   public static IoTDB getInstance() {
     return IoTDBHolder.INSTANCE;
   }
 
-  public static MetricManager serverMetricManager = MetricService.getMetric("iotdb");
+  public static final MetricManager serverMetricManager = MetricService.getMetricManager();
 
   public static void main(String[] args) {
     if (args.length > 0) {
@@ -153,6 +153,7 @@ public class IoTDB implements IoTDBMBean {
     logger.info("Deactivating IoTDB...");
     registerManager.deregisterAll();
     JMXService.deregisterMBean(mbeanName);
+    MetricService.stop();
     logger.info("IoTDB is deactivated.");
   }
 
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 e4fd01c..3a02261 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
@@ -84,7 +84,6 @@ 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;
@@ -212,8 +211,6 @@ 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();
@@ -502,6 +499,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
           processor.parseSQLToPhysicalPlan(
               statement, sessionIdZoneIdMap.get(req.getSessionId()), req.fetchSize);
 
+      physicalPlan.setLoginUserName(sessionIdUsernameMap.get(req.getSessionId()));
+
       return physicalPlan.isQuery()
           ? internalExecuteQueryStatement(
               statement,
@@ -528,6 +527,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
           processor.parseSQLToPhysicalPlan(
               statement, sessionIdZoneIdMap.get(req.getSessionId()), req.fetchSize);
 
+      physicalPlan.setLoginUserName(sessionIdUsernameMap.get(req.getSessionId()));
+
       return physicalPlan.isQuery()
           ? internalExecuteQueryStatement(
               statement,
@@ -553,6 +554,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
 
       PhysicalPlan physicalPlan =
           processor.rawDataQueryReqToPhysicalPlan(req, sessionIdZoneIdMap.get(req.getSessionId()));
+      physicalPlan.setLoginUserName(sessionIdUsernameMap.get(req.getSessionId()));
       return physicalPlan.isQuery()
           ? internalExecuteQueryStatement(
               "",
@@ -697,6 +699,25 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       if (!(plan instanceof ShowQueryProcesslistPlan)) {
         queryTimeManager.unRegisterQuery(queryId);
       }
+
+      LOGGER.info(
+          "{}, {}, {}",
+          plan.getOperatorType().name(),
+          plan.getLoginUserName(),
+          config.getRpcAddress());
+
+      IoTDB.serverMetricManager.timer(
+          System.currentTimeMillis() - startTime,
+          TimeUnit.MILLISECONDS,
+          "query_latency",
+          "sg",
+          "root",
+          "query_type",
+          plan.getOperatorType().name(),
+          "user",
+          plan.getLoginUserName(),
+          "host",
+          config.getRpcAddress());
       return resp;
     } catch (Exception e) {
       releaseQueryResourceNoExceptions(queryId);
@@ -1148,7 +1169,6 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
           req.deviceIds.get(0),
           req.getTimestamps().get(0));
     }
-    counter.inc();
 
     List<TSStatus> statusList = new ArrayList<>();
 
@@ -1176,6 +1196,18 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       }
     }
 
+    long startTime = System.currentTimeMillis();
+    IoTDB.serverMetricManager.timer(
+        System.currentTimeMillis() - startTime,
+        TimeUnit.MILLISECONDS,
+        "insert_records_latency",
+        "sg",
+        "root",
+        "user",
+        sessionIdUsernameMap.get(req.getSessionId()),
+        "host",
+        config.getRpcAddress());
+
     return isAllSuccessful
         ? RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS)
         : RpcUtils.getStatus(statusList);
@@ -1657,6 +1689,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
 
   private TSStatus checkAuthority(PhysicalPlan plan, long sessionId) {
     List<PartialPath> paths = plan.getPaths();
+    plan.setLoginUserName(sessionIdUsernameMap.get(sessionId));
     try {
       if (!checkAuthorization(paths, plan, sessionIdUsernameMap.get(sessionId))) {
         return RpcUtils.getStatus(