You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ta...@apache.org on 2023/03/12 14:50:45 UTC
[iotdb] branch rel/1.1 updated: [IOTDB-5627] Optimize Schedule related metrics and Update Performance Overview Dashboard (#9223) (#9300)
This is an automated email from the ASF dual-hosted git repository.
tanxinyu pushed a commit to branch rel/1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/1.1 by this push:
new 4346eddd71 [IOTDB-5627] Optimize Schedule related metrics and Update Performance Overview Dashboard (#9223) (#9300)
4346eddd71 is described below
commit 4346eddd71e39c01eb8e2b63bcf2f4baf90573e7
Author: ZhangHongYin <46...@users.noreply.github.com>
AuthorDate: Sun Mar 12 22:50:40 2023 +0800
[IOTDB-5627] Optimize Schedule related metrics and Update Performance Overview Dashboard (#9223) (#9300)
---
.../consensus/iot/IoTConsensusServerImpl.java | 11 +
.../ratis/ApplicationStateMachineProxy.java | 19 +
.../iotdb/consensus/simple/SimpleConsensus.java | 15 +
...pache-IoTDB-Performance-Overview-Dashboard.json | 1518 ++++++++++++++++----
docs/UserGuide/Monitor-Alert/Metric-Tool.md | 109 +-
docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md | 82 +-
.../iotdb/commons/service/metric/enums/Metric.java | 12 +
.../metric/enums}/PerformanceOverviewMetrics.java | 86 +-
.../org/apache/iotdb/db/auth/AuthorityChecker.java | 2 +-
.../statemachine/DataRegionStateMachine.java | 8 +-
.../IoTConsensusDataRegionStateMachine.java | 8 +-
.../iotdb/db/engine/storagegroup/DataRegion.java | 127 +-
.../db/engine/storagegroup/TsFileProcessor.java | 77 +-
.../execution/executor/RegionWriteExecutor.java | 10 +-
.../metric/PerformanceOverviewMetricsManager.java | 323 +++--
.../db/mpp/plan/execution/QueryExecution.java | 8 +-
.../db/mpp/plan/parser/StatementGenerator.java | 49 +-
.../db/mpp/plan/planner/plan/node/PlanNode.java | 10 -
.../db/mpp/plan/scheduler/AsyncPlanNodeSender.java | 16 +-
.../plan/scheduler/AsyncSendPlanNodeHandler.java | 28 +-
.../scheduler/FragmentInstanceDispatcherImpl.java | 4 +
21 files changed, 1807 insertions(+), 715 deletions(-)
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java b/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
index 16e378cde4..3aadc12f57 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.client.IClientManager;
import org.apache.iotdb.commons.client.exception.ClientManagerException;
import org.apache.iotdb.commons.service.metric.MetricService;
import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
import org.apache.iotdb.commons.service.metric.enums.Tag;
import org.apache.iotdb.consensus.IStateMachine;
import org.apache.iotdb.consensus.common.DataSet;
@@ -221,7 +222,17 @@ public class IoTConsensusServerImpl {
indexedConsensusRequest.getSearchIndex());
}
IConsensusRequest planNode = stateMachine.deserializeRequest(indexedConsensusRequest);
+ long startWriteTime = System.nanoTime();
TSStatus result = stateMachine.write(planNode);
+ MetricService.getInstance()
+ .timer(
+ System.nanoTime() - startWriteTime,
+ TimeUnit.NANOSECONDS,
+ Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString(),
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.ENGINE);
+
long writeToStateMachineEndTime = System.nanoTime();
// statistic the time of writing request into stateMachine
MetricService.getInstance()
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
index 2fd055baa7..da94ded6b0 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
@@ -19,10 +19,15 @@
package org.apache.iotdb.consensus.ratis;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.service.metric.MetricService;
+import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
+import org.apache.iotdb.commons.service.metric.enums.Tag;
import org.apache.iotdb.consensus.IStateMachine;
import org.apache.iotdb.consensus.common.DataSet;
import org.apache.iotdb.consensus.common.request.ByteBufferConsensusRequest;
import org.apache.iotdb.consensus.common.request.IConsensusRequest;
+import org.apache.iotdb.metrics.utils.MetricLevel;
import org.apache.ratis.proto.RaftProtos;
import org.apache.ratis.proto.RaftProtos.RaftConfigurationProto;
@@ -103,6 +108,7 @@ public class ApplicationStateMachineProxy extends BaseStateMachine {
@Override
public CompletableFuture<Message> applyTransaction(TransactionContext trx) {
+ boolean isLeader = false;
RaftProtos.LogEntryProto log = trx.getLogEntry();
updateLastAppliedTermIndex(log.getTerm(), log.getIndex());
@@ -114,6 +120,7 @@ public class ApplicationStateMachineProxy extends BaseStateMachine {
&& trx.getClientRequest().getMessage() instanceof RequestMessage) {
RequestMessage requestMessage = (RequestMessage) trx.getClientRequest().getMessage();
applicationRequest = requestMessage.getActualRequest();
+ isLeader = true;
} else {
applicationRequest =
new ByteBufferConsensusRequest(
@@ -132,7 +139,19 @@ public class ApplicationStateMachineProxy extends BaseStateMachine {
}
IConsensusRequest deserializedRequest =
applicationStateMachine.deserializeRequest(applicationRequest);
+
+ long startWriteTime = System.nanoTime();
TSStatus result = applicationStateMachine.write(deserializedRequest);
+ if (isLeader) {
+ MetricService.getInstance()
+ .timer(
+ System.nanoTime() - startWriteTime,
+ TimeUnit.NANOSECONDS,
+ Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString(),
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.ENGINE);
+ }
if (firstTry) {
finalStatus = result;
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java b/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java
index 0a112d1bbf..e5db5ba9fd 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java
@@ -22,6 +22,10 @@ package org.apache.iotdb.consensus.simple;
import org.apache.iotdb.common.rpc.thrift.TEndPoint;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.consensus.ConsensusGroupId;
+import org.apache.iotdb.commons.service.metric.MetricService;
+import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
+import org.apache.iotdb.commons.service.metric.enums.Tag;
import org.apache.iotdb.commons.utils.FileUtils;
import org.apache.iotdb.consensus.IConsensus;
import org.apache.iotdb.consensus.IStateMachine;
@@ -36,6 +40,7 @@ import org.apache.iotdb.consensus.exception.ConsensusGroupAlreadyExistException;
import org.apache.iotdb.consensus.exception.ConsensusGroupNotExistException;
import org.apache.iotdb.consensus.exception.IllegalPeerEndpointException;
import org.apache.iotdb.consensus.exception.IllegalPeerNumException;
+import org.apache.iotdb.metrics.utils.MetricLevel;
import org.apache.iotdb.rpc.TSStatusCode;
import org.slf4j.Logger;
@@ -50,6 +55,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -121,7 +127,16 @@ class SimpleConsensus implements IConsensus {
status = new TSStatus(TSStatusCode.SYSTEM_READ_ONLY.getStatusCode());
status.setMessage("Fail to do non-query operations because system is read-only.");
} else {
+ long startWriteTime = System.nanoTime();
status = impl.write(request);
+ MetricService.getInstance()
+ .timer(
+ System.nanoTime() - startWriteTime,
+ TimeUnit.NANOSECONDS,
+ Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString(),
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.ENGINE);
}
return ConsensusWriteResponse.newBuilder().setStatus(status).build();
}
diff --git a/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json b/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json
index 7620f7914e..23796fcceb 100644
--- a/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json
+++ b/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json
@@ -69,7 +69,7 @@
"fiscalYearStartMonth": 0,
"graphTooltip": 1,
"id": null,
- "iteration": 1677469194439,
+ "iteration": 1678345679839,
"links": [],
"liveNow": false,
"panels": [
@@ -694,6 +694,844 @@
"title": "Performance",
"type": "row"
},
+ {
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "empty",
+ "result": {
+ "index": 0,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ },
+ {
+ "options": {
+ "match": "null+nan",
+ "result": {
+ "index": 1,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "ns"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 10
+ },
+ "id": 56,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": true,
+ "expr": "sum(rate(session_idle_time_sum{instance=\"$instance\"}[1m])) / sum(rate(session_idle_time_count{instance=\"$instance\"}[1m]))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "Average Idle",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m])) / sum(rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) * 1000000000",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "Average Busy",
+ "refId": "A"
+ }
+ ],
+ "title": "Session Idle Time",
+ "type": "timeseries"
+ },
+ {
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 5,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "__systemRef": "hideSeriesFrom",
+ "matcher": {
+ "id": "byNames",
+ "options": {
+ "mode": "exclude",
+ "names": [
+ "Total"
+ ],
+ "prefix": "All except:",
+ "readOnly": true
+ }
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": false,
+ "tooltip": false,
+ "viz": true
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 10
+ },
+ "id": 54,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom"
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "thrift_connections{instance=~\"$instance\", name=~\".*Client.*\"}",
+ "interval": "",
+ "legendFormat": "Total",
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "thrift_active_threads{instance=~\"$instance\", name=~\".*Client.*\"}",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "Active",
+ "refId": "B"
+ }
+ ],
+ "title": "Client Connection",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 0,
+ "y": 18
+ },
+ "id": 22,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "performance_overview_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+ "hide": false,
+ "legendFormat": "{{type}} - {{interface}} - 99",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m]) / rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) by (instance, interface, type)",
+ "hide": false,
+ "legendFormat": "{{type}} - {{interface}} - avg",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Time Consumed Of Operation",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "empty",
+ "result": {
+ "index": 0,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ },
+ {
+ "options": {
+ "match": "null+nan",
+ "result": {
+ "index": 1,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 8,
+ "y": 18
+ },
+ "id": 50,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "sum(rate(entry_seconds_sum{instance=\"$instance\"}[1m]) / rate(entry_seconds_count{instance=\"$instance\"}[1m])) by (instance, name)",
+ "hide": false,
+ "legendFormat": "{{name}}",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Average Time Consumed Of Interface",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 16,
+ "y": 18
+ },
+ "id": 57,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "entry_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+ "hide": false,
+ "legendFormat": "{{name}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "P99 Time Consumed Of Interface",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 0,
+ "y": 26
+ },
+ "id": 11,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "queue{instance=~\"$instance\"}",
+ "legendFormat": "{{name}}-{{status}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Task Number",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "empty",
+ "result": {
+ "index": 0,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ },
+ {
+ "options": {
+ "match": "null+nan",
+ "result": {
+ "index": 1,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 8,
+ "y": 26
+ },
+ "id": 51,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(cost_task_seconds_sum{instance=~\"$instance\"}[1m])/rate(cost_task_seconds_count{instance=~\"$instance\"}[1m])",
+ "hide": false,
+ "legendFormat": "{{name}}",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Average Time Consumed of Task",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 16,
+ "y": 26
+ },
+ "id": 13,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "cost_task_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+ "legendFormat": "{{name}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "P99 Time Consumed of Task",
+ "type": "timeseries"
+ },
{
"datasource": {
"type": "prometheus",
@@ -751,9 +1589,110 @@
"h": 8,
"w": 10,
"x": 0,
- "y": 10
+ "y": 34
+ },
+ "id": 21,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])",
+ "hide": false,
+ "legendFormat": "operation {{type}} {{interface}}",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(entry_seconds_count{instance=~\"$instance\"}[1m])",
+ "hide": false,
+ "legendFormat": "rpc {{name}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "OPS",
+ "type": "timeseries"
+ },
+ {
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 7,
+ "x": 10,
+ "y": 34
},
- "id": 21,
+ "id": 45,
"options": {
"legend": {
"calcs": [
@@ -777,26 +1716,16 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])",
+ "exemplar": true,
+ "expr": "rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])",
"hide": false,
- "legendFormat": "operation {{type}} {{interface}}",
+ "interval": "",
+ "legendFormat": "{{stage}}",
"range": true,
"refId": "B"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
- "editorMode": "code",
- "expr": "rate(entry_seconds_count{instance=~\"$instance\"}[1m])",
- "hide": false,
- "legendFormat": "rpc {{name}}",
- "range": true,
- "refId": "A"
}
],
- "title": "OPS",
+ "title": "OPS Of Stage",
"type": "timeseries"
},
{
@@ -855,10 +1784,10 @@
"gridPos": {
"h": 8,
"w": 7,
- "x": 10,
- "y": 10
+ "x": 17,
+ "y": 34
},
- "id": 45,
+ "id": 27,
"options": {
"legend": {
"calcs": [
@@ -883,7 +1812,7 @@
},
"editorMode": "code",
"exemplar": true,
- "expr": "rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])",
+ "expr": "rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])",
"hide": false,
"interval": "",
"legendFormat": "{{stage}}",
@@ -891,14 +1820,10 @@
"refId": "B"
}
],
- "title": "OPS Of Stage",
+ "title": "OPS Of Schedule",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
"description": "",
"fieldConfig": {
"defaults": {
@@ -949,11 +1874,11 @@
},
"gridPos": {
"h": 8,
- "w": 7,
- "x": 17,
- "y": 10
+ "w": 8,
+ "x": 0,
+ "y": 42
},
- "id": 27,
+ "id": 64,
"options": {
"legend": {
"calcs": [
@@ -978,7 +1903,7 @@
},
"editorMode": "code",
"exemplar": true,
- "expr": "rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])",
+ "expr": "rate(performance_overview_local_detail_seconds_count{instance=\"$instance\"}[1m])",
"hide": false,
"interval": "",
"legendFormat": "{{stage}}",
@@ -986,14 +1911,10 @@
"refId": "B"
}
],
- "title": "OPS Of Schedule",
+ "title": "OPS Of Local Schedule Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
"description": "",
"fieldConfig": {
"defaults": {
@@ -1038,17 +1959,17 @@
}
]
},
- "unit": "s"
+ "unit": "none"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 8,
- "x": 0,
- "y": 18
+ "x": 8,
+ "y": 42
},
- "id": 22,
+ "id": 65,
"options": {
"legend": {
"calcs": [
@@ -1056,7 +1977,9 @@
],
"displayMode": "table",
"placement": "right",
- "showLegend": true
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
},
"tooltip": {
"mode": "multi",
@@ -1070,33 +1993,31 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "performance_overview_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+ "exemplar": true,
+ "expr": "rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\"}[1m])",
"hide": false,
- "legendFormat": "{{type}} - {{interface}} - 99",
+ "interval": "",
+ "legendFormat": "{{stage}}",
"range": true,
- "refId": "A"
+ "refId": "B"
},
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
- "editorMode": "code",
- "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m]) / rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) by (instance, interface, type)",
+ "exemplar": true,
+ "expr": "rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\"}[1m])",
"hide": false,
- "legendFormat": "{{type}} - {{interface}} - avg",
- "range": true,
- "refId": "B"
+ "interval": "",
+ "legendFormat": "consensus",
+ "refId": "A"
}
],
- "title": "Time Consumed Of Operation",
+ "title": "OPS Of Storage Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
"description": "",
"fieldConfig": {
"defaults": {
@@ -1131,28 +2052,7 @@
"mode": "off"
}
},
- "mappings": [
- {
- "options": {
- "match": "empty",
- "result": {
- "index": 0,
- "text": "0"
- }
- },
- "type": "special"
- },
- {
- "options": {
- "match": "null+nan",
- "result": {
- "index": 1,
- "text": "0"
- }
- },
- "type": "special"
- }
- ],
+ "mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
@@ -1162,17 +2062,17 @@
}
]
},
- "unit": "s"
+ "unit": "none"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 8,
- "x": 8,
- "y": 18
+ "x": 16,
+ "y": 42
},
- "id": 50,
+ "id": 66,
"options": {
"legend": {
"calcs": [
@@ -1180,7 +2080,9 @@
],
"displayMode": "table",
"placement": "right",
- "showLegend": true
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
},
"tooltip": {
"mode": "multi",
@@ -1194,21 +2096,19 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "sum(rate(entry_seconds_sum{instance=\"$instance\"}[1m]) / rate(entry_seconds_count{instance=\"$instance\"}[1m])) by (instance, name)",
+ "exemplar": true,
+ "expr": "rate(performance_overview_engine_detail_seconds_count{instance=\"$instance\"}[1m])",
"hide": false,
- "legendFormat": "{{name}}",
+ "interval": "",
+ "legendFormat": "{{stage}}",
"range": true,
"refId": "B"
}
],
- "title": "Average Time Consumed Of Interface",
+ "title": "OPS Of Engine Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
"description": "",
"fieldConfig": {
"defaults": {
@@ -1243,7 +2143,28 @@
"mode": "off"
}
},
- "mappings": [],
+ "mappings": [
+ {
+ "options": {
+ "match": "empty",
+ "result": {
+ "index": 0,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ },
+ {
+ "options": {
+ "match": "null+nan",
+ "result": {
+ "index": 1,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ }
+ ],
"thresholds": {
"mode": "absolute",
"steps": [
@@ -1259,11 +2180,11 @@
},
"gridPos": {
"h": 8,
- "w": 8,
- "x": 16,
- "y": 18
+ "w": 12,
+ "x": 0,
+ "y": 50
},
- "id": 57,
+ "id": 46,
"options": {
"legend": {
"calcs": [
@@ -1285,14 +2206,16 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "entry_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+ "exemplar": true,
+ "expr": "sum(rate(performance_overview_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])) by (instance, stage)",
"hide": false,
- "legendFormat": "{{name}}",
+ "interval": "",
+ "legendFormat": "{{stage}}",
"range": true,
- "refId": "A"
+ "refId": "B"
}
],
- "title": "P99 Time Consumed Of Interface",
+ "title": "Average Time Consumed Of Stage",
"type": "timeseries"
},
{
@@ -1333,7 +2256,7 @@
"mappings": [
{
"options": {
- "match": "empty",
+ "match": "null+nan",
"result": {
"index": 0,
"text": "0"
@@ -1343,7 +2266,7 @@
},
{
"options": {
- "match": "null+nan",
+ "match": "empty",
"result": {
"index": 1,
"text": "0"
@@ -1361,17 +2284,17 @@
}
]
},
- "unit": "ns"
+ "unit": "s"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
- "x": 0,
- "y": 26
+ "x": 12,
+ "y": 50
},
- "id": 56,
+ "id": 58,
"options": {
"legend": {
"calcs": [
@@ -1394,30 +2317,19 @@
},
"editorMode": "code",
"exemplar": true,
- "expr": "sum(rate(session_idle_time_sum{instance=\"$instance\"}[1m])) / sum(rate(session_idle_time_count{instance=\"$instance\"}[1m]))",
+ "expr": "sum(rate(performance_overview_schedule_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])) by (stage)",
"hide": false,
"interval": "",
- "legendFormat": "Average Idle",
+ "legendFormat": "{{stage}}",
"range": true,
"refId": "B"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
- "exemplar": true,
- "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m])) / sum(rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) * 1000000000",
- "hide": false,
- "interval": "",
- "legendFormat": "Average Busy",
- "refId": "A"
}
],
- "title": "Session Idle Time",
+ "title": "Average Time Consumed Of Schedule Stage",
"type": "timeseries"
},
{
+ "description": "",
"fieldConfig": {
"defaults": {
"color": {
@@ -1428,7 +2340,7 @@
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
- "fillOpacity": 5,
+ "fillOpacity": 10,
"gradientMode": "none",
"hideFrom": {
"legend": false,
@@ -1451,64 +2363,60 @@
"mode": "off"
}
},
- "mappings": [],
+ "mappings": [
+ {
+ "options": {
+ "match": "null+nan",
+ "result": {
+ "index": 0,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ },
+ {
+ "options": {
+ "match": "empty",
+ "result": {
+ "index": 1,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ }
+ ],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": [
- {
- "__systemRef": "hideSeriesFrom",
- "matcher": {
- "id": "byNames",
- "options": {
- "mode": "exclude",
- "names": [
- "Total"
- ],
- "prefix": "All except:",
- "readOnly": true
- }
- },
- "properties": [
- {
- "id": "custom.hideFrom",
- "value": {
- "legend": false,
- "tooltip": false,
- "viz": true
- }
}
]
- }
- ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
},
"gridPos": {
"h": 8,
- "w": 12,
- "x": 12,
- "y": 26
+ "w": 8,
+ "x": 0,
+ "y": 58
},
- "id": 54,
+ "id": 60,
"options": {
"legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom"
+ "calcs": [
+ "mean"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
},
"tooltip": {
- "mode": "single",
- "sort": "none"
+ "mode": "multi",
+ "sort": "desc"
}
},
"targets": [
@@ -1518,32 +2426,17 @@
"uid": "${DS_PROMETHEUS}"
},
"exemplar": true,
- "expr": "thrift_connections{instance=~\"$instance\", name=~\".*Client.*\"}",
- "interval": "",
- "legendFormat": "Total",
- "refId": "A"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
- "exemplar": true,
- "expr": "thrift_active_threads{instance=~\"$instance\", name=~\".*Client.*\"}",
+ "expr": "sum(rate(performance_overview_local_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_local_detail_seconds_count{instance=\"$instance\"}[1m])) by (stage)",
"hide": false,
"interval": "",
- "legendFormat": "Active",
- "refId": "B"
+ "legendFormat": "{{stage}}",
+ "refId": "A"
}
],
- "title": "Client Connection",
+ "title": " Average Time Consumed Of Local Schedule Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
"description": "",
"fieldConfig": {
"defaults": {
@@ -1581,7 +2474,7 @@
"mappings": [
{
"options": {
- "match": "empty",
+ "match": "null+nan",
"result": {
"index": 0,
"text": "0"
@@ -1591,7 +2484,7 @@
},
{
"options": {
- "match": "null+nan",
+ "match": "empty",
"result": {
"index": 1,
"text": "0"
@@ -1615,11 +2508,11 @@
},
"gridPos": {
"h": 8,
- "w": 12,
- "x": 0,
- "y": 34
+ "w": 8,
+ "x": 8,
+ "y": 58
},
- "id": 46,
+ "id": 61,
"options": {
"legend": {
"calcs": [
@@ -1640,22 +2533,30 @@
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
- "editorMode": "code",
- "expr": "sum(rate(performance_overview_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])) by (instance, stage)",
+ "exemplar": true,
+ "expr": "abs(sum(rate(performance_overview_local_detail_seconds_sum{instance=\"$instance\", stage=\"storage\"}[1m])) - sum(rate(performance_overview_storage_detail_seconds_sum{instance=\"$instance\", stage=\"engine\"}[1m]))) / sum(rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\", stage=\"engine\"}[1m]))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "consensus",
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "rate(performance_overview_storage_detail_seconds_sum{instance=\"$instance\", stage=\"engine\"}[1m]) / rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\", stage=\"engine\"}[1m])",
"hide": false,
+ "interval": "",
"legendFormat": "{{stage}}",
- "range": true,
"refId": "B"
}
],
- "title": "Average Time Consumed Of Stage",
+ "title": "Average Time Consumed Of Storage Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
"description": "",
"fieldConfig": {
"defaults": {
@@ -1690,7 +2591,28 @@
"mode": "off"
}
},
- "mappings": [],
+ "mappings": [
+ {
+ "options": {
+ "match": "null+nan",
+ "result": {
+ "index": 0,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ },
+ {
+ "options": {
+ "match": "empty",
+ "result": {
+ "index": 1,
+ "text": "0"
+ }
+ },
+ "type": "special"
+ }
+ ],
"thresholds": {
"mode": "absolute",
"steps": [
@@ -1706,11 +2628,11 @@
},
"gridPos": {
"h": 8,
- "w": 12,
- "x": 12,
- "y": 34
+ "w": 8,
+ "x": 16,
+ "y": 58
},
- "id": 24,
+ "id": 47,
"options": {
"legend": {
"calcs": [
@@ -1731,15 +2653,15 @@
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
- "editorMode": "code",
- "expr": "performance_overview_detail_seconds{instance=\"$instance\", quantile=\"0.99\"}",
+ "exemplar": true,
+ "expr": "rate(performance_overview_engine_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_engine_detail_seconds_count{instance=\"$instance\"}[1m])",
"hide": false,
+ "interval": "",
"legendFormat": "{{stage}}",
- "range": true,
"refId": "A"
}
],
- "title": "P99 Time Consumed Of Stage",
+ "title": "Average Time Consumed Of Engine Stage",
"type": "timeseries"
},
{
@@ -1781,28 +2703,7 @@
"mode": "off"
}
},
- "mappings": [
- {
- "options": {
- "match": "null+nan",
- "result": {
- "index": 0,
- "text": "0"
- }
- },
- "type": "special"
- },
- {
- "options": {
- "match": "empty",
- "result": {
- "index": 1,
- "text": "0"
- }
- },
- "type": "special"
- }
- ],
+ "mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
@@ -1814,15 +2715,43 @@
},
"unit": "s"
},
- "overrides": []
+ "overrides": [
+ {
+ "__systemRef": "hideSeriesFrom",
+ "matcher": {
+ "id": "byNames",
+ "options": {
+ "mode": "exclude",
+ "names": [
+ "analyzer",
+ "authority",
+ "parser",
+ "planner"
+ ],
+ "prefix": "All except:",
+ "readOnly": true
+ }
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": false,
+ "tooltip": false,
+ "viz": true
+ }
+ }
+ ]
+ }
+ ]
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
- "y": 42
+ "y": 66
},
- "id": 47,
+ "id": 24,
"options": {
"legend": {
"calcs": [
@@ -1844,21 +2773,17 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "sum(rate(performance_overview_schedule_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])) by (stage)",
+ "expr": "performance_overview_detail_seconds{instance=\"$instance\", quantile=\"0.99\"}",
"hide": false,
"legendFormat": "{{stage}}",
"range": true,
- "refId": "B"
+ "refId": "A"
}
],
- "title": "Average Time Consumed Of Schedule Stage",
+ "title": "P99 Time Consumed Of Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
"description": "",
"fieldConfig": {
"defaults": {
@@ -1911,7 +2836,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 42
+ "y": 66
},
"id": 28,
"options": {
@@ -1935,8 +2860,10 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
+ "exemplar": true,
"expr": "performance_overview_schedule_detail_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
"hide": false,
+ "interval": "",
"legendFormat": "{{stage}}",
"range": true,
"refId": "A"
@@ -1946,10 +2873,7 @@
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
+ "description": "",
"fieldConfig": {
"defaults": {
"color": {
@@ -1992,7 +2916,8 @@
"value": null
}
]
- }
+ },
+ "unit": "s"
},
"overrides": []
},
@@ -2000,9 +2925,9 @@
"h": 8,
"w": 8,
"x": 0,
- "y": 50
+ "y": 74
},
- "id": 11,
+ "id": 59,
"options": {
"legend": {
"calcs": [
@@ -2024,20 +2949,20 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "queue{instance=~\"$instance\"}",
- "legendFormat": "{{name}}-{{status}}",
+ "exemplar": true,
+ "expr": "performance_overview_local_detail_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{stage}}",
"range": true,
"refId": "A"
}
],
- "title": "Task Number",
+ "title": "P99 Time Consumed Of Local Schedule Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
+ "description": "",
"fieldConfig": {
"defaults": {
"color": {
@@ -2071,28 +2996,7 @@
"mode": "off"
}
},
- "mappings": [
- {
- "options": {
- "match": "empty",
- "result": {
- "index": 0,
- "text": "0"
- }
- },
- "type": "special"
- },
- {
- "options": {
- "match": "null+nan",
- "result": {
- "index": 1,
- "text": "0"
- }
- },
- "type": "special"
- }
- ],
+ "mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
@@ -2110,9 +3014,9 @@
"h": 8,
"w": 8,
"x": 8,
- "y": 50
+ "y": 74
},
- "id": 51,
+ "id": 62,
"options": {
"legend": {
"calcs": [
@@ -2134,21 +3038,34 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "rate(cost_task_seconds_sum{instance=~\"$instance\"}[1m])/rate(cost_task_seconds_count{instance=~\"$instance\"}[1m])",
+ "exemplar": true,
+ "expr": "sum(performance_overview_local_detail_seconds{instance=~\"$instance\", quantile=\"0.99\", stage=\"storage\"}) - sum(performance_overview_storage_detail_seconds{instance=~\"$instance\", quantile=\"0.99\", stage=\"engine\"})",
"hide": false,
- "legendFormat": "{{name}}",
+ "instant": false,
+ "interval": "",
+ "legendFormat": "consensus",
"range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "performance_overview_storage_detail_seconds{instance=~\"$instance\", quantile=\"0.99\", stage=\"engine\"}",
+ "hide": false,
+ "instant": false,
+ "interval": "",
+ "legendFormat": "{{stage}}",
"refId": "B"
}
],
- "title": "Average Time Consumed of Task",
+ "title": "P99 Time Consumed Of Storage Stage",
"type": "timeseries"
},
{
- "datasource": {
- "type": "prometheus",
- "uid": "${DS_PROMETHEUS}"
- },
+ "description": "",
"fieldConfig": {
"defaults": {
"color": {
@@ -2200,9 +3117,9 @@
"h": 8,
"w": 8,
"x": 16,
- "y": 50
+ "y": 74
},
- "id": 13,
+ "id": 63,
"options": {
"legend": {
"calcs": [
@@ -2224,13 +3141,16 @@
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
- "expr": "cost_task_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
- "legendFormat": "{{name}}",
+ "exemplar": true,
+ "expr": "performance_overview_engine_detail_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{stage}}",
"range": true,
"refId": "A"
}
],
- "title": "P99 Time Consumed of Task",
+ "title": "P99 Time Consumed Of Engine Stage",
"type": "timeseries"
},
{
@@ -2243,7 +3163,7 @@
"h": 1,
"w": 24,
"x": 0,
- "y": 58
+ "y": 82
},
"id": 34,
"panels": [],
@@ -2315,7 +3235,7 @@
"h": 8,
"w": 8,
"x": 0,
- "y": 59
+ "y": 83
},
"id": 15,
"options": {
@@ -2415,7 +3335,7 @@
"h": 8,
"w": 8,
"x": 8,
- "y": 59
+ "y": 83
},
"id": 18,
"options": {
@@ -2519,7 +3439,7 @@
"h": 8,
"w": 8,
"x": 16,
- "y": 59
+ "y": 83
},
"id": 17,
"options": {
@@ -2620,7 +3540,7 @@
"h": 8,
"w": 8,
"x": 0,
- "y": 67
+ "y": 91
},
"id": 48,
"options": {
@@ -2733,7 +3653,7 @@
"h": 8,
"w": 8,
"x": 8,
- "y": 67
+ "y": 91
},
"id": 52,
"options": {
@@ -2821,7 +3741,7 @@
"h": 8,
"w": 8,
"x": 16,
- "y": 67
+ "y": 91
},
"id": 49,
"options": {
@@ -2982,7 +3902,7 @@
"h": 8,
"w": 8,
"x": 0,
- "y": 75
+ "y": 99
},
"id": 44,
"options": {
@@ -3143,7 +4063,7 @@
"h": 8,
"w": 8,
"x": 8,
- "y": 75
+ "y": 99
},
"id": 16,
"options": {
@@ -3319,7 +4239,7 @@
"h": 8,
"w": 8,
"x": 16,
- "y": 75
+ "y": 99
},
"id": 20,
"options": {
@@ -3352,7 +4272,7 @@
"type": "timeseries"
}
],
- "refresh": "10s",
+ "refresh": "30s",
"schemaVersion": 35,
"style": "dark",
"tags": [],
@@ -3425,6 +4345,6 @@
"timezone": "browser",
"title": "Apache IoTDB Performance Overview Dashboard",
"uid": "ZRfEph04k",
- "version": 2,
+ "version": 4,
"weekStart": ""
}
\ No newline at end of file
diff --git a/docs/UserGuide/Monitor-Alert/Metric-Tool.md b/docs/UserGuide/Monitor-Alert/Metric-Tool.md
index eb298ed263..e8145023c1 100644
--- a/docs/UserGuide/Monitor-Alert/Metric-Tool.md
+++ b/docs/UserGuide/Monitor-Alert/Metric-Tool.md
@@ -124,7 +124,7 @@ carefully evaluated. The current Core-level metrics are as follows:
#### 4.1.2. Interface
| Metric | Tags | Type | Description |
-| --------------------- |------------------------------------| --------- | -------------------------------------------------------------- |
+| --------------------- | ---------------------------------- | --------- | -------------------------------------------------------------- |
| thrift_connections | name="ConfigNodeRPC" | AutoGauge | The number of thrift internal connections in ConfigNode |
| thrift_connections | name="InternalRPC" | AutoGauge | The number of thrift internal connections in DataNode |
| thrift_connections | name="MPPDataExchangeRPC" | AutoGauge | The number of thrift internal connections in MPP |
@@ -152,14 +152,18 @@ carefully evaluated. The current Core-level metrics are as follows:
| performance_overview_detail | stage="analyzer" | Timer | The time consumed on analyzing statement |
| performance_overview_detail | stage="planner" | Timer | The time consumed on planning |
| performance_overview_detail | stage="scheduler" | Timer | The time consumed on scheduling |
-| performance_overview_schedule_detail | stage="schema_validate" | Timer | The time consumed on schema validation |
-| performance_overview_schedule_detail | stage="trigger" | Timer | The time consumed on trigger |
-| performance_overview_schedule_detail | stage="consensus" | Timer | The time consumed on consensus |
-| performance_overview_schedule_detail | stage="lock" | Timer | The time consumed on grabbing lock in DataRegion |
-| performance_overview_schedule_detail | stage="memory_block" | Timer | The time consumed on insert memory control |
-| performance_overview_schedule_detail | stage="wal" | Timer | The time consumed on writing wal |
-| performance_overview_schedule_detail | stage="memtable" | Timer | The time consumed on writing memtable |
-| performance_overview_schedule_detail | stage="last_cache" | Timer | The time consumed on updating last cache |
+| performance_overview_schedule_detail | stage="local_scheduler" | Timer | The time consumed on local scheduler |
+| performance_overview_schedule_detail | stage="remote_scheduler" | Timer | The time consumed on remote scheduler |
+| performance_overview_local_detail | stage="schema_validate" | Timer | The time consumed on schema validation |
+| performance_overview_local_detail | stage="trigger" | Timer | The time consumed on trigger |
+| performance_overview_local_detail | stage="storage" | Timer | The time consumed on consensus |
+| performance_overview_storage_detail | stage="engine" | Timer | The time consumed on write stateMachine |
+| performance_overview_engine_detail | stage="lock" | Timer | The time consumed on grabbing lock in DataRegion |
+| performance_overview_engine_detail | stage="create_memtable_block" | Timer | The time consumed on creating new memtable |
+| performance_overview_engine_detail | stage="memory_block" | Timer | The time consumed on insert memory control |
+| performance_overview_engine_detail | stage="wal" | Timer | The time consumed on writing wal |
+| performance_overview_engine_detail | stage="memtable" | Timer | The time consumed on writing memtable |
+| performance_overview_engine_detail | stage="last_cache" | Timer | The time consumed on updating last cache |
#### 4.1.5. Task Statistics
@@ -301,14 +305,14 @@ carefully evaluated. The current Core-level metrics are as follows:
#### 4.2.4. Memory
-| Metric | Tags | Type | Description |
-| ------ | ------------------------------------ | --------- | ------------------------------------------------------------------ |
-| mem | name="database_{name}" | AutoGauge | The memory usage of DataRegion in DataNode, Unit: byte |
-| mem | name="chunkMetaData_{name}" | AutoGauge | The memory usage of chunkMetaData when writting TsFile, Unit: byte |
-| mem | name="IoTConsensus" | AutoGauge | The memory usage of IoTConsensus, Unit: byte |
-| mem | name="IoTConsensusQueue" | AutoGauge | The memory usage of IoTConsensus Queue, Unit: byte |
-| mem | name="IoTConsensusSync" | AutoGauge | The memory usage of IoTConsensus SyncStatus, Unit: byte |
-| mem | name="schema_region_total_usage" | AutoGauge | The memory usage of all SchemaRegion, Unit: byte |
+| Metric | Tags | Type | Description |
+| ------ | -------------------------------- | --------- | ------------------------------------------------------------------ |
+| mem | name="database_{name}" | AutoGauge | The memory usage of DataRegion in DataNode, Unit: byte |
+| mem | name="chunkMetaData_{name}" | AutoGauge | The memory usage of chunkMetaData when writting TsFile, Unit: byte |
+| mem | name="IoTConsensus" | AutoGauge | The memory usage of IoTConsensus, Unit: byte |
+| mem | name="IoTConsensusQueue" | AutoGauge | The memory usage of IoTConsensus Queue, Unit: byte |
+| mem | name="IoTConsensusSync" | AutoGauge | The memory usage of IoTConsensus SyncStatus, Unit: byte |
+| mem | name="schema_region_total_usage" | AutoGauge | The memory usage of all SchemaRegion, Unit: byte |
#### 4.2.5. Compaction
@@ -418,16 +422,45 @@ carefully evaluated. The current Core-level metrics are as follows:
#### 4.2.16 Schema Engine
-| Metric | Tags | Type | Description |
-| ------------- | ------------------------------------------------------------ | --------- | -------------------------------------- |
-| schema_engine | name="schema_region_total_mem_usage" | AutoGauge | Memory usgae for all SchemaRegion |
-| schema_engine | name="schema_region_mem_capacity" | AutoGauge | Memory capacity for all SchemaRegion |
-| schema_engine | name="schema_engine_mode" | Gauge | Mode of SchemaEngine |
-| schema_engine | name="schema_region_consensus" | Gauge | Consensus protocol of SchemaRegion |
-| schema_engine | name="schema_region_number" | AutoGauge | Number of SchemaRegion |
-| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]" | AutoGauge | Memory usgae for each SchemaRegion |
+| Metric | Tags | Type | Description |
+| ------------- | ------------------------------------------------------------------ | --------- | -------------------------------------- |
+| schema_engine | name="schema_region_total_mem_usage" | AutoGauge | Memory usgae for all SchemaRegion |
+| schema_engine | name="schema_region_mem_capacity" | AutoGauge | Memory capacity for all SchemaRegion |
+| schema_engine | name="schema_engine_mode" | Gauge | Mode of SchemaEngine |
+| schema_engine | name="schema_region_consensus" | Gauge | Consensus protocol of SchemaRegion |
+| schema_engine | name="schema_region_number" | AutoGauge | Number of SchemaRegion |
+| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]" | AutoGauge | Memory usgae for each SchemaRegion |
| schema_region | name="schema_region_series_cnt", region="SchemaRegion[{regionId}]" | AutoGauge | Timeseries count for each SchemaRegion |
+#### 4.2.17 Write Performance
+
+| Metric | Tags | Type | Description |
+| ------------------------- | :-------------------------------------------------------------------- | --------- | ------------------------------------------------------ |
+| wal_node_num | name="wal_nodes_num" | AutoGauge | Num of WALNode |
+| wal_cost | stage="make_checkpoint" type="<checkpoint_type>" | Timer | Time cost of make checkpoints for all checkpoint type |
+| wal_cost | type="serialize_one_wal_info_entry" | Timer | Time cost of serialize one WALInfoEntry |
+| wal_cost | stage="sync_wal_buffer" type="<force_flag>" | Timer | Time cost of sync WALBuffer |
+| wal_buffer | name="used_ratio" | Histogram | Used ratio of WALBuffer |
+| wal_cost | stage="serialize_wal_entry" type="serialize_wal_entry_total" | Timer | Time cost of WALBuffer serialize task |
+| wal_node_info | name="effective_info_ratio" type="<wal_node_id>" | Histogram | Effective info ratio of WALNode |
+| wal_node_info | name="oldest_mem_table_ram_when_cause_snapshot" type="<wal_node_id>" | Histogram | Ram of oldest memTable when cause snapshot |
+| wal_node_info | name="oldest_mem_table_ram_when_cause_flush" type="<wal_node_id>" | Histogram | Ram of oldest memTable when cause flush |
+| flush_sub_task_cost | type="sort_task" | Timer | Time cost of sort series in flush sort stage |
+| flush_sub_task_cost | type="encoding_task" | Timer | Time cost of sub encoding task in flush encoding stage |
+| flush_sub_task_cost | type="io_task" | Timer | Time cost of sub io task in flush io stage |
+| flush_cost | stage="write_plan_indices" | Timer | Time cost of write plan indices |
+| flush_cost | stage="sort" | Timer | Time cost of flush sort stage |
+| flush_cost | stage="encoding" | Timer | Time cost of flush encoding stage |
+| flush_cost | stage="io" | Timer | Time cost of flush io stage |
+| pending_flush_task | type="pending_task_num" | AutoGauge | Num of pending flush task num |
+| pending_flush_task | type="pending_sub_task_num" | AutoGauge | Num of pending flush sub task num |
+| flushing_mem_table_status | name="mem_table_size" region="DataRegion[<data_region_id>]" | Histogram | Size of flushing memTable |
+| flushing_mem_table_status | name="total_point_num" region="DataRegion[<data_region_id>]" | Histogram | Point num of flushing memTable |
+| flushing_mem_table_status | name="series_num" region="DataRegion[<data_region_id>]" | Histogram | Series num of flushing memTable |
+| flushing_mem_table_status | name="avg_series_points_num" region="DataRegion[<data_region_id>]" | Histogram | Point num of flushing memChunk |
+| flushing_mem_table_status | name="tsfile_compression_ratio" region="DataRegion[<data_region_id>]" | Histogram | TsFile Compression ratio of flushing memTable |
+| flushing_mem_table_status | name="flush_tsfile_size" region="DataRegion[<data_region_id>]" | Histogram | TsFile size of flushing memTable |
+
### 4.3. Normal level Metrics
#### 4.3.1. Cluster
@@ -478,13 +511,13 @@ the sidebar `org.apache.iotdb.db.service` to view the cache hit ratio:
> For metrics whose Metric Name is name and Tags are K1=V1, ..., Kn=Vn, the mapping is as follows, where value is a
> specific value
-| Metric Type | Mapping [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value [...]
-| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value [...]
-| Histogram | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
-| Rate | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m5"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
-| Timer | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
+| Metric Type | Mapping [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value [...]
+| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value [...]
+| Histogram | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
+| Rate | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m5"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
+| Timer | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
#### 5.2.2. Config File
@@ -760,12 +793,12 @@ data source for Apache IoTDB Dashboard.
> For metrics whose Metric Name is name and Tags are K1=V1, ..., Kn=Vn, the mapping is as follows, taking root.__
> system.metric.`clusterName`.`nodeType`.`nodeId` as an example by default
-| Metric Type | Mapping [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
-| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
-| Histogram | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
-| Rate | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15 [...]
+| Metric Type | Mapping [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
+| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
+| Histogram | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
+| Rate | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15 [...]
| Timer | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName` [...]
#### 5.3.2. Obtain metrics
diff --git a/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md b/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md
index 9ea70137c2..e09b74ac4b 100644
--- a/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md
+++ b/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md
@@ -103,7 +103,7 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
#### 4.1.2. 接口层统计
| Metric | Tags | Type | Description |
-| --------------------- |------------------------------------| --------- | ----------------------------------- |
+| --------------------- | ---------------------------------- | --------- | ----------------------------------- |
| thrift_connections | name="ConfigNodeRPC" | AutoGauge | ConfigNode 的内部 Thrift 连接数 |
| thrift_connections | name="InternalRPC" | AutoGauge | DataNode 的内部 Thrift 连接数 |
| thrift_connections | name="MPPDataExchangeRPC" | AutoGauge | MPP 框架的内部 Thrift 连接数 |
@@ -131,14 +131,18 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
| performance_overview_detail | stage="analyzer" | Timer | 语句分析总耗时 |
| performance_overview_detail | stage="planner" | Timer | 请求规划总耗时 |
| performance_overview_detail | stage="scheduler" | Timer | 请求执行总耗时 |
-| performance_overview_schedule_detail | stage="schema_validate" | Timer | 元数据验证总耗时 |
-| performance_overview_schedule_detail | stage="trigger" | Timer | Trigger 触发总耗时 |
-| performance_overview_schedule_detail | stage="consensus" | Timer | 共识层总耗时 |
-| performance_overview_schedule_detail | stage="lock" | Timer | DataRegion 抢锁总耗时 |
-| performance_overview_schedule_detail | stage="memory_block" | Timer | 内存控制阻塞总耗时 |
-| performance_overview_schedule_detail | stage="wal" | Timer | 写入 Wal 总耗时 |
-| performance_overview_schedule_detail | stage="memtable" | Timer | 写入 Memtable 总耗时 |
-| performance_overview_schedule_detail | stage="last_cache" | Timer | 更新 LastCache 总耗时 |
+| performance_overview_schedule_detail | stage="local_scheduler" | Timer | 本地请求执行总耗时 |
+| performance_overview_schedule_detail | stage="remote_scheduler" | Timer | 远程请求执行总耗时 |
+| performance_overview_local_detail | stage="schema_validate" | Timer | 元数据验证总耗时 |
+| performance_overview_local_detail | stage="trigger" | Timer | Trigger 触发总耗时 |
+| performance_overview_local_detail | stage="storage" | Timer | 共识层总耗时 |
+| performance_overview_storage_detail | stage="engine" | Timer | DataRegion 抢锁总耗时 |
+| performance_overview_engine_detail | stage="lock" | Timer | DataRegion 抢锁总耗时 |
+| performance_overview_engine_detail | stage="create_memtable_block" | Timer | 创建新的 Memtable 耗时 |
+| performance_overview_engine_detail | stage="memory_block" | Timer | 内存控制阻塞总耗时 |
+| performance_overview_engine_detail | stage="wal" | Timer | 写入 Wal 总耗时 |
+| performance_overview_engine_detail | stage="memtable" | Timer | 写入 Memtable 总耗时 |
+| performance_overview_engine_detail | stage="last_cache" | Timer | 更新 LastCache 总耗时 |
#### 4.1.5. 任务统计
@@ -280,14 +284,14 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
| cache | name="DataPartition", type="all" | Counter | DataPartition Cache 的访问次数 |
#### 4.2.4. 内存统计
-| Metric | Tags | Type | Description |
-| ------ | ------------------------------------ | --------- | ------------------------------------------------- |
-| mem | name="database_{name}" | AutoGauge | DataNode内对应DataRegion的内存占用,单位为byte |
-| mem | name="chunkMetaData_{name}" | AutoGauge | 写入TsFile时的ChunkMetaData的内存占用,单位为byte |
-| mem | name="IoTConsensus" | AutoGauge | IoT共识协议的内存占用,单位为byte |
-| mem | name="IoTConsensusQueue" | AutoGauge | IoT共识协议用于队列的内存占用,单位为byte |
-| mem | name="IoTConsensusSync" | AutoGauge | IoT共识协议用于同步的内存占用,单位为byte |
-| mem | name="schema_region_total_usage" | AutoGauge | 所有SchemaRegion的总内存占用,单位为byte |
+| Metric | Tags | Type | Description |
+| ------ | -------------------------------- | --------- | ------------------------------------------------- |
+| mem | name="database_{name}" | AutoGauge | DataNode内对应DataRegion的内存占用,单位为byte |
+| mem | name="chunkMetaData_{name}" | AutoGauge | 写入TsFile时的ChunkMetaData的内存占用,单位为byte |
+| mem | name="IoTConsensus" | AutoGauge | IoT共识协议的内存占用,单位为byte |
+| mem | name="IoTConsensusQueue" | AutoGauge | IoT共识协议用于队列的内存占用,单位为byte |
+| mem | name="IoTConsensusSync" | AutoGauge | IoT共识协议用于同步的内存占用,单位为byte |
+| mem | name="schema_region_total_usage" | AutoGauge | 所有SchemaRegion的总内存占用,单位为byte |
#### 4.2.5. 合并统计
@@ -397,15 +401,15 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
#### 4.2.16 元数据引擎统计
-| Metric | Tags | Type | Description |
-| ------------- | ------------------------------------------------------------ | --------- | ---------------------------------------------- |
-| schema_engine | name="schema_region_total_mem_usage" | AutoGauge | SchemaRegion 全局内存使用量 |
-| schema_engine | name="schema_region_mem_capacity" | AutoGauge | SchemaRegion 全局可用内存 |
-| schema_engine | name="schema_engine_mode" | Gauge | SchemaEngine 模式 |
-| schema_engine | name="schema_region_consensus" | Gauge | 元数据管理引擎共识协议 |
-| schema_engine | name="schema_region_number" | AutoGauge | SchemaRegion 个数 |
-| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]" | AutoGauge | 每个 SchemaRegion 分别的内存使用量 |
-| schema_region | name="schema_region_series_cnt", region="SchemaRegion[{regionId}]" | AutoGauge | 每个 SchemaRegion 分别的时间序列数 |
+| Metric | Tags | Type | Description |
+| ------------- | ------------------------------------------------------------------ | --------- | ---------------------------------- |
+| schema_engine | name="schema_region_total_mem_usage" | AutoGauge | SchemaRegion 全局内存使用量 |
+| schema_engine | name="schema_region_mem_capacity" | AutoGauge | SchemaRegion 全局可用内存 |
+| schema_engine | name="schema_engine_mode" | Gauge | SchemaEngine 模式 |
+| schema_engine | name="schema_region_consensus" | Gauge | 元数据管理引擎共识协议 |
+| schema_engine | name="schema_region_number" | AutoGauge | SchemaRegion 个数 |
+| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]" | AutoGauge | 每个 SchemaRegion 分别的内存使用量 |
+| schema_region | name="schema_region_series_cnt", region="SchemaRegion[{regionId}]" | AutoGauge | 每个 SchemaRegion 分别的时间序列数 |
### 4.3. Normal 级别监控指标
@@ -452,13 +456,13 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
> 对于 Metric Name 为 name, Tags 为 K1=V1, ..., Kn=Vn 的监控指标有如下映射,其中 value 为具体值
-| 监控指标类型 | 映射关系 [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value [...]
-| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value [...]
-| Histogram | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
-| Rate | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m5"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
-| Timer | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
+| 监控指标类型 | 映射关系 [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value [...]
+| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value [...]
+| Histogram | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
+| Rate | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m5"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
+| Timer | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
#### 5.2.2. 修改配置文件
@@ -709,12 +713,12 @@ static_configs:
> 对于 Metric Name 为 name, Tags 为 K1=V1, ..., Kn=Vn 的监控指标有如下映射,以默认写到 root.__system.metric.`clusterName`.`nodeType`.`nodeId` 为例
-| 监控指标类型 | 映射关系 [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
-| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
-| Histogram | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
-| Rate | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15 [...]
+| 监控指标类型 | 映射关系 [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
+| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value [...]
+| Histogram | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
+| Rate | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15 [...]
| Timer | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName` [...]
#### 5.3.2. 获取监控指标
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java
index efc66b7ffb..075a882788 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java
@@ -87,6 +87,18 @@ public enum Metric {
PERFORMANCE_OVERVIEW,
PERFORMANCE_OVERVIEW_DETAIL,
PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+ PERFORMANCE_OVERVIEW_STORAGE_DETAIL,
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ WAL_NODE_NUM,
+ WAL_NODE_INFO,
+ WAL_BUFFER,
+ PENDING_FLUSH_TASK,
+ WAL_COST,
+ FLUSH_COST,
+ FLUSH_SUB_TASK_COST,
+ FLUSHING_MEM_TABLE_STATUS,
+ DATA_REGION_MEM_COST,
SCHEMA_REGION,
SCHEMA_ENGINE,
SESSION_IDLE_TIME;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetrics.java b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/PerformanceOverviewMetrics.java
similarity index 68%
rename from server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetrics.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/PerformanceOverviewMetrics.java
index 0c7b437470..9b59cefc7d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetrics.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/PerformanceOverviewMetrics.java
@@ -17,10 +17,8 @@
* under the License.
*/
-package org.apache.iotdb.db.mpp.metric;
+package org.apache.iotdb.commons.service.metric.enums;
-import org.apache.iotdb.commons.service.metric.enums.Metric;
-import org.apache.iotdb.commons.service.metric.enums.Tag;
import org.apache.iotdb.metrics.AbstractMetricService;
import org.apache.iotdb.metrics.metricsets.IMetricSet;
import org.apache.iotdb.metrics.utils.MetricInfo;
@@ -65,62 +63,102 @@ public class PerformanceOverviewMetrics implements IMetricSet {
private static final String PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL =
Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString();
+ public static final String LOCAL_SCHEDULE = "local_scheduler";
+ public static final String REMOTE_SCHEDULE = "remote_scheduler";
+ static {
+ metricInfoMap.put(
+ LOCAL_SCHEDULE,
+ new MetricInfo(
+ MetricType.TIMER,
+ PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ Tag.STAGE.toString(),
+ LOCAL_SCHEDULE));
+ metricInfoMap.put(
+ REMOTE_SCHEDULE,
+ new MetricInfo(
+ MetricType.TIMER,
+ PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ Tag.STAGE.toString(),
+ REMOTE_SCHEDULE));
+ }
+
+ private static final String PERFORMANCE_OVERVIEW_LOCAL_DETAIL =
+ Metric.PERFORMANCE_OVERVIEW_LOCAL_DETAIL.toString();
public static final String SCHEMA_VALIDATE = "schema_validate";
public static final String TRIGGER = "trigger";
- public static final String CONSENSUS = "consensus";
- public static final String LOCK = "lock";
- public static final String MEMORY_BLOCK = "memory_block";
- public static final String WAL = "wal";
- public static final String MEMTABLE = "memtable";
- public static final String LAST_CACHE = "last_cache";
+ public static final String STORAGE = "storage";
static {
metricInfoMap.put(
SCHEMA_VALIDATE,
new MetricInfo(
MetricType.TIMER,
- PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
Tag.STAGE.toString(),
SCHEMA_VALIDATE));
metricInfoMap.put(
TRIGGER,
new MetricInfo(
- MetricType.TIMER, PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL, Tag.STAGE.toString(), TRIGGER));
+ MetricType.TIMER, PERFORMANCE_OVERVIEW_LOCAL_DETAIL, Tag.STAGE.toString(), TRIGGER));
metricInfoMap.put(
- CONSENSUS,
+ STORAGE,
new MetricInfo(
- MetricType.TIMER,
- PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
- Tag.STAGE.toString(),
- CONSENSUS));
+ MetricType.TIMER, PERFORMANCE_OVERVIEW_LOCAL_DETAIL, Tag.STAGE.toString(), STORAGE));
+ }
+
+ private static final String PERFORMANCE_OVERVIEW_STORAGE_DETAIL =
+ Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString();
+ public static final String ENGINE = "engine";
+
+ static {
+ metricInfoMap.put(
+ ENGINE,
+ new MetricInfo(
+ MetricType.TIMER, PERFORMANCE_OVERVIEW_STORAGE_DETAIL, Tag.STAGE.toString(), ENGINE));
+ }
+
+ private static final String PERFORMANCE_OVERVIEW_ENGINE_DETAIL =
+ Metric.PERFORMANCE_OVERVIEW_ENGINE_DETAIL.toString();
+ public static final String LOCK = "lock";
+ public static final String MEMORY_BLOCK = "memory_block";
+ public static final String CREATE_MEMTABLE_BLOCK = "create_memtable_block";
+ public static final String WAL = "wal";
+ public static final String MEMTABLE = "memtable";
+ public static final String LAST_CACHE = "last_cache";
+
+ static {
metricInfoMap.put(
LOCK,
new MetricInfo(
- MetricType.TIMER, PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL, Tag.STAGE.toString(), LOCK));
+ MetricType.TIMER, PERFORMANCE_OVERVIEW_ENGINE_DETAIL, Tag.STAGE.toString(), LOCK));
+ metricInfoMap.put(
+ CREATE_MEMTABLE_BLOCK,
+ new MetricInfo(
+ MetricType.TIMER,
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ Tag.STAGE.toString(),
+ CREATE_MEMTABLE_BLOCK));
metricInfoMap.put(
MEMORY_BLOCK,
new MetricInfo(
MetricType.TIMER,
- PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
Tag.STAGE.toString(),
MEMORY_BLOCK));
metricInfoMap.put(
WAL,
new MetricInfo(
- MetricType.TIMER, PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL, Tag.STAGE.toString(), WAL));
+ MetricType.TIMER, PERFORMANCE_OVERVIEW_ENGINE_DETAIL, Tag.STAGE.toString(), WAL));
metricInfoMap.put(
MEMTABLE,
new MetricInfo(
- MetricType.TIMER,
- PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
- Tag.STAGE.toString(),
- MEMTABLE));
+ MetricType.TIMER, PERFORMANCE_OVERVIEW_ENGINE_DETAIL, Tag.STAGE.toString(), MEMTABLE));
metricInfoMap.put(
LAST_CACHE,
new MetricInfo(
MetricType.TIMER,
- PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
Tag.STAGE.toString(),
LAST_CACHE));
}
diff --git a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
index c661c27421..62738656df 100644
--- a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
+++ b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
@@ -122,7 +122,7 @@ public class AuthorityChecker {
return onQueryException(
e, OperationType.CHECK_AUTHORITY.getName(), TSStatusCode.EXECUTE_STATEMENT_ERROR);
} finally {
- PerformanceOverviewMetricsManager.getInstance().recordAuthCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordAuthCost(System.nanoTime() - startTime);
}
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java
index 8fb012081b..4ce6d3fd9d 100644
--- a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java
+++ b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java
@@ -37,7 +37,6 @@ import org.apache.iotdb.db.engine.snapshot.SnapshotLoader;
import org.apache.iotdb.db.engine.snapshot.SnapshotTaker;
import org.apache.iotdb.db.engine.storagegroup.DataRegion;
import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceManager;
-import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
import org.apache.iotdb.db.mpp.plan.planner.plan.FragmentInstance;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertMultiTabletsNode;
@@ -239,12 +238,7 @@ public class DataRegionStateMachine extends BaseStateMachine {
@Override
public TSStatus write(IConsensusRequest request) {
try {
- PlanNode planNode = (PlanNode) request;
- if (planNode.getMetricTime() != 0) {
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleConsensusCost(System.nanoTime() - planNode.getMetricTime());
- }
- return write(planNode);
+ return write((PlanNode) request);
} catch (IllegalArgumentException e) {
logger.error(e.getMessage(), e);
return new TSStatus(TSStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
diff --git a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java
index 3ccb5de8c8..26d52eed22 100644
--- a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java
+++ b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.consensus.common.request.IConsensusRequest;
import org.apache.iotdb.consensus.common.request.IndexedConsensusRequest;
import org.apache.iotdb.consensus.common.request.IoTConsensusRequest;
import org.apache.iotdb.db.engine.storagegroup.DataRegion;
-import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
import org.apache.iotdb.db.wal.buffer.WALEntry;
@@ -58,12 +57,7 @@ public class IoTConsensusDataRegionStateMachine extends DataRegionStateMachine {
}
return new TSStatus().setSubStatus(subStatus);
} else {
- PlanNode planNode = (PlanNode) request;
- if (planNode.getMetricTime() != 0) {
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleConsensusCost(System.nanoTime() - planNode.getMetricTime());
- }
- return write(planNode);
+ return write((PlanNode) request);
}
} catch (IllegalArgumentException e) {
logger.error(e.getMessage(), e);
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
index 7f2a19a410..9fe0e3346f 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
@@ -16,6 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
+
package org.apache.iotdb.db.engine.storagegroup;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
@@ -168,7 +169,7 @@ public class DataRegion implements IDataRegionForQuery {
/**
* All newly generated chunks after merge have version number 0, so we set merged Modification
- * file version to 1 to take effect
+ * file version to 1 to take effect.
*/
private static final int MERGE_MOD_START_VERSION_NUM = 1;
@@ -185,9 +186,9 @@ public class DataRegion implements IDataRegionForQuery {
* partitionLatestFlushedTimeForEachDevice)
*/
private final ReadWriteLock insertLock = new ReentrantReadWriteLock();
- /** condition to safely delete data region */
+ /** condition to safely delete data region. */
private final Condition deletedCondition = insertLock.writeLock().newCondition();
- /** data region has been deleted or not */
+ /** data region has been deleted or not. */
private volatile boolean deleted = false;
/** closeStorageGroupCondition is used to wait for all currently closing TsFiles to be done. */
private final Object closeStorageGroupCondition = new Object();
@@ -195,53 +196,54 @@ public class DataRegion implements IDataRegionForQuery {
* avoid some tsfileResource is changed (e.g., from unsealed to sealed) when a query is executed.
*/
private final ReadWriteLock closeQueryLock = new ReentrantReadWriteLock();
- /** time partition id in the database -> tsFileProcessor for this time partition */
+ /** time partition id in the database -> tsFileProcessor for this time partition. */
private final TreeMap<Long, TsFileProcessor> workSequenceTsFileProcessors = new TreeMap<>();
- /** time partition id in the database -> tsFileProcessor for this time partition */
+ /** time partition id in the database -> tsFileProcessor for this time partition. */
private final TreeMap<Long, TsFileProcessor> workUnsequenceTsFileProcessors = new TreeMap<>();
// upgrading sequence TsFile resource list
- private List<TsFileResource> upgradeSeqFileList = new LinkedList<>();
- /** sequence tsfile processors which are closing */
- private CopyOnReadLinkedList<TsFileProcessor> closingSequenceTsFileProcessor =
+ private final List<TsFileResource> upgradeSeqFileList = new LinkedList<>();
+ /** sequence tsfile processors which are closing. */
+ private final CopyOnReadLinkedList<TsFileProcessor> closingSequenceTsFileProcessor =
new CopyOnReadLinkedList<>();
- // upgrading unsequence TsFile resource list
- private List<TsFileResource> upgradeUnseqFileList = new LinkedList<>();
+ /** upgrading unsequence TsFile resource list. */
+ private final List<TsFileResource> upgradeUnseqFileList = new LinkedList<>();
- /** unsequence tsfile processors which are closing */
- private CopyOnReadLinkedList<TsFileProcessor> closingUnSequenceTsFileProcessor =
+ /** unsequence tsfile processors which are closing. */
+ private final CopyOnReadLinkedList<TsFileProcessor> closingUnSequenceTsFileProcessor =
new CopyOnReadLinkedList<>();
- private AtomicInteger upgradeFileCount = new AtomicInteger();
+ private final AtomicInteger upgradeFileCount = new AtomicInteger();
- private AtomicBoolean isSettling = new AtomicBoolean();
+ private final AtomicBoolean isSettling = new AtomicBoolean();
- /** data region id */
- private String dataRegionId;
- /** database name */
- private String databaseName;
- /** database system directory */
+ /** data region id. */
+ private final String dataRegionId;
+ /** database name. */
+ private final String databaseName;
+ /** database system directory. */
private File storageGroupSysDir;
- /** manage seqFileList and unSeqFileList */
- private TsFileManager tsFileManager;
+ /** manage seqFileList and unSeqFileList. */
+ private final TsFileManager tsFileManager;
- /** manage tsFileResource degrade */
- private TsFileResourceManager tsFileResourceManager = TsFileResourceManager.getInstance();
+ /** manage tsFileResource degrade. */
+ private final TsFileResourceManager tsFileResourceManager = TsFileResourceManager.getInstance();
/**
* time partition id -> version controller which assigns a version for each MemTable and
* deletion/update such that after they are persisted, the order of insertions, deletions and
* updates can be re-determined. Will be empty if there are not MemTables in memory.
*/
- private HashMap<Long, VersionController> timePartitionIdVersionControllerMap = new HashMap<>();
+ private final HashMap<Long, VersionController> timePartitionIdVersionControllerMap =
+ new HashMap<>();
/**
* when the data in a database is older than dataTTL, it is considered invalid and will be
* eventually removed.
*/
private long dataTTL = Long.MAX_VALUE;
- /** file system factory (local or hdfs) */
- private FSFactory fsFactory = FSFactoryProducer.getFSFactory();
- /** file flush policy */
+ /** file system factory (local or hdfs). */
+ private final FSFactory fsFactory = FSFactoryProducer.getFSFactory();
+ /** file flush policy. */
private TsFileFlushPolicy fileFlushPolicy;
/**
* The max file versions in each partition. By recording this, if several IoTDB instances have the
@@ -250,20 +252,20 @@ public class DataRegion implements IDataRegionForQuery {
* across different instances. partition number -> max version number
*/
private Map<Long, Long> partitionMaxFileVersions = new HashMap<>();
- /** database info for mem control */
+ /** database info for mem control. */
private final DataRegionInfo dataRegionInfo = new DataRegionInfo(this);
- /** whether it's ready from recovery */
+ /** whether it's ready from recovery. */
private boolean isReady = false;
- /** close file listeners */
+ /** close file listeners. */
private List<CloseFileListener> customCloseFileListeners = Collections.emptyList();
- /** flush listeners */
+ /** flush listeners. */
private List<FlushListener> customFlushListeners = Collections.emptyList();
private ILastFlushTimeMap lastFlushTimeMap;
/**
* record the insertWriteLock in SG is being hold by which method, it will be empty string if on
- * one holds the insertWriteLock
+ * one holds the insertWriteLock.
*/
private String insertWriteLockHolder = "";
@@ -273,10 +275,10 @@ public class DataRegion implements IDataRegionForQuery {
private IDTable idTable;
- private final QueryMetricsManager QUERY_METRICS = QueryMetricsManager.getInstance();
+ private final QueryMetricsManager queryMetricsManager = QueryMetricsManager.getInstance();
/**
- * constrcut a database processor
+ * construct a database processor.
*
* @param systemDir system dir path
* @param dataRegionId data region id e.g. 1
@@ -300,7 +302,7 @@ public class DataRegion implements IDataRegionForQuery {
logger.error("create database system Directory {} failed", storageGroupSysDir.getPath());
}
- // if use id table, we use id table flush time manager
+ // if you use id table, we use id table flush time manager
if (config.isEnableIDTable()) {
idTable = IDTableManager.getInstance().getIDTableDirectly(databaseName);
lastFlushTimeMap = new IDTableLastFlushTimeMap(idTable, tsFileManager);
@@ -383,20 +385,20 @@ public class DataRegion implements IDataRegionForQuery {
this.isSettling.set(isSettling);
}
- /** this class is used to store recovering context */
+ /** this class is used to store recovering context. */
private class DataRegionRecoveryContext {
- /** number of files to be recovered */
+ /** number of files to be recovered. */
private final long numOfFilesToRecover;
- /** when the change of recoveredFilesNum exceeds this, log check will be triggered */
+ /** when the change of recoveredFilesNum exceeds this, log check will be triggered. */
private final long filesNumLogCheckTrigger;
- /** number of already recovered files */
+ /** number of already recovered files. */
private long recoveredFilesNum;
- /** last recovery log time */
+ /** last recovery log time. */
private long lastLogTime;
- /** last recovery log files num */
+ /** last recovery log files num. */
private long lastLogCheckFilesNum;
- /** recover performers of unsealed TsFiles */
- private List<UnsealedTsFileRecoverPerformer> recoverPerformers = new ArrayList<>();
+ /** recover performers of unsealed TsFiles. */
+ private final List<UnsealedTsFileRecoverPerformer> recoverPerformers = new ArrayList<>();
public DataRegionRecoveryContext(long numOfFilesToRecover) {
this.numOfFilesToRecover = numOfFilesToRecover;
@@ -630,7 +632,7 @@ public class DataRegion implements IDataRegionForQuery {
/**
* use old seq file to update latestTimeForEachDevice, globalLatestFlushedTimeForEachDevice,
- * partitionLatestFlushedTimeForEachDevice and timePartitionIdVersionControllerMap
+ * partitionLatestFlushedTimeForEachDevice and timePartitionIdVersionControllerMap.
*/
@SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
private void updateLatestFlushedTime() throws IOException {
@@ -746,7 +748,7 @@ public class DataRegion implements IDataRegionForQuery {
}
}
- /** check if the tsfile's time is smaller than system current time */
+ /** check if the tsfile's time is smaller than system current time. */
private void checkTsFileTime(File tsFile) throws DataRegionException {
String[] items = tsFile.getName().replace(TSFILE_SUFFIX, "").split(FILE_NAME_SEPARATOR);
long fileTime = Long.parseLong(items[0]);
@@ -760,12 +762,12 @@ public class DataRegion implements IDataRegionForQuery {
}
}
- /** submit unsealed TsFile to WALRecoverManager */
+ /** submit unsealed TsFile to WALRecoverManager. */
private WALRecoverListener recoverUnsealedTsFile(
TsFileResource unsealedTsFile, DataRegionRecoveryContext context, boolean isSeq) {
UnsealedTsFileRecoverPerformer recoverPerformer =
new UnsealedTsFileRecoverPerformer(
- unsealedTsFile, isSeq, idTable, performer -> context.recoverPerformers.add(performer));
+ unsealedTsFile, isSeq, idTable, context.recoverPerformers::add);
// remember to close UnsealedTsFileRecoverPerformer
return WALRecoverManager.getInstance().addRecoverPerformer(recoverPerformer);
}
@@ -839,7 +841,7 @@ public class DataRegion implements IDataRegionForQuery {
}
}
- /** recover sealed TsFile */
+ /** recover sealed TsFile. */
private void recoverSealedTsFiles(
TsFileResource sealedTsFile, DataRegionRecoveryContext context, boolean isSeq) {
try (SealedTsFileRecoverPerformer recoverPerformer =
@@ -884,7 +886,7 @@ public class DataRegion implements IDataRegionForQuery {
TimePartitionManager.getInstance()
.registerTimePartitionInfo(
new TimePartitionInfo(
- new DataRegionId(Integer.valueOf(dataRegionId)),
+ new DataRegionId(Integer.parseInt(dataRegionId)),
partitionId,
false,
Long.MAX_VALUE,
@@ -908,7 +910,7 @@ public class DataRegion implements IDataRegionForQuery {
}
/**
- * insert one row of data
+ * insert one row of data.
*
* @param insertRowNode one row of data
*/
@@ -922,8 +924,7 @@ public class DataRegion implements IDataRegionForQuery {
}
long startTime = System.nanoTime();
writeLock("InsertRow");
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleLockCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleLockCost(System.nanoTime() - startTime);
try {
if (deleted) {
return;
@@ -935,7 +936,7 @@ public class DataRegion implements IDataRegionForQuery {
TimePartitionManager.getInstance()
.registerTimePartitionInfo(
new TimePartitionInfo(
- new DataRegionId(Integer.valueOf(dataRegionId)),
+ new DataRegionId(Integer.parseInt(dataRegionId)),
timePartitionId,
true,
Long.MAX_VALUE,
@@ -974,8 +975,7 @@ public class DataRegion implements IDataRegionForQuery {
}
long startTime = System.nanoTime();
writeLock("insertTablet");
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleLockCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleLockCost(System.nanoTime() - startTime);
try {
if (deleted) {
return;
@@ -1023,7 +1023,7 @@ public class DataRegion implements IDataRegionForQuery {
TimePartitionManager.getInstance()
.registerTimePartitionInfo(
new TimePartitionInfo(
- new DataRegionId(Integer.valueOf(dataRegionId)),
+ new DataRegionId(Integer.parseInt(dataRegionId)),
beforeTimePartition,
true,
Long.MAX_VALUE,
@@ -1068,8 +1068,8 @@ public class DataRegion implements IDataRegionForQuery {
lastFlushTimeMap.getGlobalFlushedTime(insertTabletNode.getDevicePath().getFullPath());
startTime = System.nanoTime();
tryToUpdateBatchInsertLastCache(insertTabletNode, globalLatestFlushedTime);
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleUpdateLastCacheCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleUpdateLastCacheCost(
+ System.nanoTime() - startTime);
if (!noFailure) {
throw new BatchProcessException(results);
@@ -1174,8 +1174,8 @@ public class DataRegion implements IDataRegionForQuery {
long startTime = System.nanoTime();
tryToUpdateInsertLastCache(insertRowNode, globalLatestFlushTime);
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleUpdateLastCacheCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleUpdateLastCacheCost(
+ System.nanoTime() - startTime);
// check memtable size and may asyncTryToFlush the work memtable
if (tsFileProcessor.shouldFlush()) {
@@ -1719,8 +1719,8 @@ public class DataRegion implements IDataRegionForQuery {
timeFilter,
false);
- QUERY_METRICS.recordQueryResourceNum(SEQUENCE_TSFILE, seqResources.size());
- QUERY_METRICS.recordQueryResourceNum(UNSEQUENCE_TSFILE, unseqResources.size());
+ queryMetricsManager.recordQueryResourceNum(SEQUENCE_TSFILE, seqResources.size());
+ queryMetricsManager.recordQueryResourceNum(UNSEQUENCE_TSFILE, unseqResources.size());
QueryDataSource dataSource = new QueryDataSource(seqResources, unseqResources);
dataSource.setDataTTL(dataTTL);
@@ -3097,8 +3097,7 @@ public class DataRegion implements IDataRegionForQuery {
}
long startTime = System.nanoTime();
writeLock("InsertRowsOfOneDevice");
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleLockCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleLockCost(System.nanoTime() - startTime);
try {
if (deleted) {
return;
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
index a7dace8019..2d078e4109 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
@@ -96,33 +96,33 @@ import static org.apache.iotdb.db.mpp.metric.QueryResourceMetricSet.WORKING_MEMT
@SuppressWarnings("java:S1135") // ignore todos
public class TsFileProcessor {
- /** logger fot this class */
+ /** logger fot this class. */
private static final Logger logger = LoggerFactory.getLogger(TsFileProcessor.class);
- /** storgae group name of this tsfile */
+ /** storgae group name of this tsfile. */
private final String storageGroupName;
- /** IoTDB config */
+ /** IoTDB config. */
private final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
- /** whether it's enable mem control */
+ /** whether it's enable mem control. */
private final boolean enableMemControl = config.isEnableMemControl();
- /** database info for mem control */
+ /** database info for mem control. */
private DataRegionInfo dataRegionInfo;
- /** tsfile processor info for mem control */
+ /** tsfile processor info for mem control. */
private TsFileProcessorInfo tsFileProcessorInfo;
- /** sync this object in query() and asyncTryToFlush() */
+ /** sync this object in query() and asyncTryToFlush(). */
private final ConcurrentLinkedDeque<IMemTable> flushingMemTables = new ConcurrentLinkedDeque<>();
- /** modification to memtable mapping */
+ /** modification to memtable mapping. */
private List<Pair<Modification, IMemTable>> modsToMemtable = new ArrayList<>();
- /** writer for restore tsfile and flushing */
+ /** writer for restore tsfile and flushing. */
private RestorableTsFileIOWriter writer;
- /** tsfile resource for index this tsfile */
+ /** tsfile resource for index this tsfile. */
private final TsFileResource tsFileResource;
/** time range index to indicate this processor belongs to which time range */
@@ -140,35 +140,35 @@ public class TsFileProcessor {
*/
private volatile boolean shouldClose;
- /** working memtable */
+ /** working memtable. */
private IMemTable workMemTable;
- /** last flush time to flush the working memtable */
+ /** last flush time to flush the working memtable. */
private long lastWorkMemtableFlushTime;
/** this callback is called before the workMemtable is added into the flushingMemTables. */
private final UpdateEndTimeCallBack updateLatestFlushTimeCallback;
- /** wal node */
+ /** wal node. */
private final IWALNode walNode;
- /** whether it's a sequence file or not */
+ /** whether it's a sequence file or not. */
private final boolean sequence;
- /** total memtable size for mem control */
+ /** total memtable size for mem control. */
private long totalMemTableSize;
private static final String FLUSH_QUERY_WRITE_LOCKED = "{}: {} get flushQueryLock write lock";
private static final String FLUSH_QUERY_WRITE_RELEASE =
"{}: {} get flushQueryLock write lock released";
- /** close file listener */
- private List<CloseFileListener> closeFileListeners = new ArrayList<>();
+ /** close file listener. */
+ private final List<CloseFileListener> closeFileListeners = new ArrayList<>();
- /** flush file listener */
- private List<FlushListener> flushListeners = new ArrayList<>();
+ /** flush file listener. */
+ private final List<FlushListener> flushListeners = new ArrayList<>();
- private final QueryMetricsManager QUERY_METRICS = QueryMetricsManager.getInstance();
+ private final QueryMetricsManager queryMetricsManager = QueryMetricsManager.getInstance();
@SuppressWarnings("squid:S107")
TsFileProcessor(
@@ -226,7 +226,10 @@ public class TsFileProcessor {
public void insert(InsertRowNode insertRowNode) throws WriteProcessException {
if (workMemTable == null) {
+ long startTime = System.nanoTime();
createNewWorkingMemTable();
+ PerformanceOverviewMetricsManager.recordCreateMemtableBlockCost(
+ System.nanoTime() - startTime);
}
long[] memIncrements = null;
@@ -243,8 +246,8 @@ public class TsFileProcessor {
insertRowNode.getDevicePath().getFullPath(), insertRowNode.getMeasurements(),
insertRowNode.getDataTypes(), insertRowNode.getValues());
}
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleMemoryBlockCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleMemoryBlockCost(
+ System.nanoTime() - startTime);
}
long startTime = System.nanoTime();
@@ -254,7 +257,7 @@ public class TsFileProcessor {
throw walFlushListener.getCause();
}
} catch (Exception e) {
- if (enableMemControl && memIncrements != null) {
+ if (enableMemControl) {
rollbackMemoryInfo(memIncrements);
}
throw new WriteProcessException(
@@ -263,8 +266,7 @@ public class TsFileProcessor {
storageGroupName, tsFileResource.getTsFile().getAbsolutePath()),
e);
} finally {
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleWalCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleWalCost(System.nanoTime() - startTime);
}
startTime = System.nanoTime();
@@ -283,8 +285,7 @@ public class TsFileProcessor {
tsFileResource.updateEndTime(
insertRowNode.getDeviceID().toStringID(), insertRowNode.getTime());
}
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleMemTableCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleMemTableCost(System.nanoTime() - startTime);
}
private void createNewWorkingMemTable() throws WriteProcessException {
@@ -307,7 +308,10 @@ public class TsFileProcessor {
throws WriteProcessException {
if (workMemTable == null) {
+ long startTime = System.nanoTime();
createNewWorkingMemTable();
+ PerformanceOverviewMetricsManager.recordCreateMemtableBlockCost(
+ System.nanoTime() - startTime);
}
long[] memIncrements = null;
@@ -333,8 +337,8 @@ public class TsFileProcessor {
start,
end);
}
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleMemoryBlockCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleMemoryBlockCost(
+ System.nanoTime() - startTime);
}
} catch (WriteProcessException e) {
for (int i = start; i < end; i++) {
@@ -354,13 +358,12 @@ public class TsFileProcessor {
for (int i = start; i < end; i++) {
results[i] = RpcUtils.getStatus(TSStatusCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
- if (enableMemControl && memIncrements != null) {
+ if (enableMemControl) {
rollbackMemoryInfo(memIncrements);
}
throw new WriteProcessException(e);
} finally {
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleWalCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleWalCost(System.nanoTime() - startTime);
}
startTime = System.nanoTime();
@@ -389,8 +392,7 @@ public class TsFileProcessor {
tsFileResource.updateEndTime(
insertTabletNode.getDeviceID().toStringID(), insertTabletNode.getTimes()[end - 1]);
}
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleMemTableCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleMemTableCost(System.nanoTime() - startTime);
}
@SuppressWarnings("squid:S3776") // high Cognitive Complexity
@@ -1424,8 +1426,8 @@ public class TsFileProcessor {
tsFileResource.getTsFile().getName(),
e);
} finally {
- QUERY_METRICS.recordQueryResourceNum(FLUSHING_MEMTABLE, flushingMemTables.size());
- QUERY_METRICS.recordQueryResourceNum(WORKING_MEMTABLE, workMemTable != null ? 1 : 0);
+ queryMetricsManager.recordQueryResourceNum(FLUSHING_MEMTABLE, flushingMemTables.size());
+ queryMetricsManager.recordQueryResourceNum(WORKING_MEMTABLE, workMemTable != null ? 1 : 0);
flushQueryLock.readLock().unlock();
if (logger.isDebugEnabled()) {
@@ -1442,7 +1444,8 @@ public class TsFileProcessor {
pathToReadOnlyMemChunkMap, pathToChunkMetadataListMap, tsFileResource));
}
} finally {
- QUERY_METRICS.recordExecutionCost(GET_QUERY_RESOURCE_FROM_MEM, System.nanoTime() - startTime);
+ queryMetricsManager.recordExecutionCost(
+ GET_QUERY_RESOURCE_FROM_MEM, System.nanoTime() - startTime);
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
index 8aae71cb30..71e870cc67 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
@@ -116,8 +116,10 @@ public class RegionWriteExecutor {
boolean hasFailedTriggerBeforeInsertion =
result.equals(TriggerFireResult.FAILED_NO_TERMINATION);
- planNode.setMetricTime(System.nanoTime());
+ long startWriteTime = System.nanoTime();
writeResponse = DataRegionConsensusImpl.getInstance().write(groupId, planNode);
+ PerformanceOverviewMetricsManager.recordScheduleStorageCost(
+ System.nanoTime() - startWriteTime);
// fire Trigger after the insertion
if (writeResponse.isSuccessful()) {
@@ -132,7 +134,7 @@ public class RegionWriteExecutor {
triggerCostTime += (System.nanoTime() - startTime);
}
}
- PerformanceOverviewMetricsManager.getInstance().recordScheduleTriggerCost(triggerCostTime);
+ PerformanceOverviewMetricsManager.recordScheduleTriggerCost(triggerCostTime);
return writeResponse;
}
@@ -224,8 +226,8 @@ public class RegionWriteExecutor {
}
return response;
} finally {
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleSchemaValidateCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleSchemaValidateCost(
+ System.nanoTime() - startTime);
}
boolean hasFailedMeasurement = insertNode.hasFailedMeasurements();
String partialInsertMessage = null;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java b/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java
index b3a441d280..1dbab30601 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java
@@ -21,157 +21,194 @@ package org.apache.iotdb.db.mpp.metric;
import org.apache.iotdb.commons.service.metric.MetricService;
import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
import org.apache.iotdb.commons.service.metric.enums.Tag;
+import org.apache.iotdb.metrics.type.Timer;
import org.apache.iotdb.metrics.utils.MetricLevel;
-import java.util.concurrent.TimeUnit;
-
public class PerformanceOverviewMetricsManager {
- private final MetricService metricService = MetricService.getInstance();
+ private static final MetricService metricService = MetricService.getInstance();
+
+ // region overview
+ private static final String PERFORMANCE_OVERVIEW_DETAIL =
+ Metric.PERFORMANCE_OVERVIEW_DETAIL.toString();
+ private static final Timer AUTH_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.AUTHORITY);
+ private static final Timer PARSER_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.PARSER);
+ private static final Timer ANALYZE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.ANALYZER);
+ private static final Timer PLAN_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.PLANNER);
+ private static final Timer SCHEDULE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.SCHEDULER);
/** Record the time cost in authority stage. */
- public void recordAuthCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.AUTHORITY);
+ public static void recordAuthCost(long costTimeInNanos) {
+ AUTH_TIMER.updateNanos(costTimeInNanos);
}
/** Record the time cost in parse stage. */
- public void recordParseCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.PARSER);
- }
-
- public void recordAnalyzeCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.ANALYZER);
- }
-
- public void recordPlanCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.PLANNER);
- }
-
- public void recordScheduleCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.SCHEDULER);
- }
-
- public void recordScheduleSchemaValidateCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.SCHEMA_VALIDATE);
- }
-
- public void recordScheduleTriggerCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.TRIGGER);
- }
-
- public void recordScheduleConsensusCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.CONSENSUS);
- }
-
- public void recordScheduleLockCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.LOCK);
- }
-
- public void recordScheduleMemoryBlockCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.MEMORY_BLOCK);
- }
-
- public void recordScheduleWalCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.WAL);
- }
-
- public void recordScheduleMemTableCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.MEMTABLE);
- }
-
- public void recordScheduleUpdateLastCacheCost(long costTimeInNanos) {
- metricService.timer(
- costTimeInNanos,
- TimeUnit.NANOSECONDS,
- Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
- MetricLevel.IMPORTANT,
- Tag.STAGE.toString(),
- PerformanceOverviewMetrics.LAST_CACHE);
- }
-
- public static PerformanceOverviewMetricsManager getInstance() {
- return PerformanceOverviewMetricsManager.PerformanceOverviewMetricsManagerHolder.INSTANCE;
- }
-
- private static class PerformanceOverviewMetricsManagerHolder {
-
- private static final PerformanceOverviewMetricsManager INSTANCE =
- new PerformanceOverviewMetricsManager();
-
- private PerformanceOverviewMetricsManagerHolder() {
- // empty constructor
- }
+ public static void recordParseCost(long costTimeInNanos) {
+ PARSER_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordAnalyzeCost(long costTimeInNanos) {
+ ANALYZE_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordPlanCost(long costTimeInNanos) {
+ PLAN_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleCost(long costTimeInNanos) {
+ SCHEDULE_TIMER.updateNanos(costTimeInNanos);
+ }
+ // endregion
+
+ // region schedule
+ private static final String PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL =
+ Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString();
+ private static final Timer LOCAL_SCHEDULE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.LOCAL_SCHEDULE);
+ private static final Timer REMOTE_SCHEDULE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.REMOTE_SCHEDULE);
+
+ public static void recordScheduleLocalCost(long costTimeInNanos) {
+ LOCAL_SCHEDULE_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleRemoteCost(long costTimeInNanos) {
+ REMOTE_SCHEDULE_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ // endregion
+
+ // region local schedule
+ private static final String PERFORMANCE_OVERVIEW_LOCAL_DETAIL =
+ Metric.PERFORMANCE_OVERVIEW_LOCAL_DETAIL.toString();
+ private static final Timer SCHEMA_VALIDATE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.SCHEMA_VALIDATE);
+ private static final Timer TRIGGER_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.TRIGGER);
+ private static final Timer STORAGE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.STORAGE);
+
+ public static void recordScheduleSchemaValidateCost(long costTimeInNanos) {
+ SCHEMA_VALIDATE_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleTriggerCost(long costTimeInNanos) {
+ TRIGGER_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleStorageCost(long costTimeInNanos) {
+ STORAGE_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ // endregion
+
+ // region engine
+ private static final String PERFORMANCE_OVERVIEW_ENGINE_DETAIL =
+ Metric.PERFORMANCE_OVERVIEW_ENGINE_DETAIL.toString();
+ private static final Timer LOCK_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.LOCK);
+ private static final Timer CREATE_MEMTABLE_BLOCK_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.CREATE_MEMTABLE_BLOCK);
+ private static final Timer MEMORY_BLOCK_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.MEMORY_BLOCK);
+ private static final Timer WAL_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.WAL);
+ private static final Timer MEMTABLE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.MEMTABLE);
+ private static final Timer LAST_CACHE_TIMER =
+ metricService.getOrCreateTimer(
+ PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+ MetricLevel.IMPORTANT,
+ Tag.STAGE.toString(),
+ PerformanceOverviewMetrics.LAST_CACHE);
+
+ public static void recordScheduleLockCost(long costTimeInNanos) {
+ LOCK_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordCreateMemtableBlockCost(long costTimeInNanos) {
+ CREATE_MEMTABLE_BLOCK_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleMemoryBlockCost(long costTimeInNanos) {
+ MEMORY_BLOCK_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleWalCost(long costTimeInNanos) {
+ WAL_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleMemTableCost(long costTimeInNanos) {
+ MEMTABLE_TIMER.updateNanos(costTimeInNanos);
+ }
+
+ public static void recordScheduleUpdateLastCacheCost(long costTimeInNanos) {
+ LAST_CACHE_TIMER.updateNanos(costTimeInNanos);
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
index 1d0bec9209..de474a5db2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
@@ -211,7 +211,7 @@ public class QueryExecution implements IQueryExecution {
if (context.getQueryType() == QueryType.READ) {
initResultHandle();
}
- PerformanceOverviewMetricsManager.getInstance().recordPlanCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordPlanCost(System.nanoTime() - startTime);
schedule();
}
@@ -281,8 +281,7 @@ public class QueryExecution implements IQueryExecution {
try {
result = new Analyzer(context, partitionFetcher, schemaFetcher).analyze(statement);
} finally {
- PerformanceOverviewMetricsManager.getInstance()
- .recordAnalyzeCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordAnalyzeCost(System.nanoTime() - startTime);
}
return result;
}
@@ -310,8 +309,7 @@ public class QueryExecution implements IQueryExecution {
syncInternalServiceClientManager,
asyncInternalServiceClientManager);
this.scheduler.start();
- PerformanceOverviewMetricsManager.getInstance()
- .recordScheduleCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordScheduleCost(System.nanoTime() - startTime);
}
// Use LogicalPlanner to do the logical query plan and logical optimization
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
index ef0e19cdca..d848a9a45e 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
@@ -146,7 +146,7 @@ public class StatementGenerator {
queryStatement.setSelectComponent(selectComponent);
queryStatement.setFromComponent(fromComponent);
queryStatement.setWhereCondition(whereCondition);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return queryStatement;
}
@@ -180,7 +180,7 @@ public class StatementGenerator {
lastQueryStatement.setSelectComponent(selectComponent);
lastQueryStatement.setFromComponent(fromComponent);
lastQueryStatement.setWhereCondition(whereCondition);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return lastQueryStatement;
}
@@ -236,7 +236,7 @@ public class StatementGenerator {
whereCondition.setPredicate(predicate);
queryStatement.setWhereCondition(whereCondition);
}
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return queryStatement;
}
@@ -250,7 +250,7 @@ public class StatementGenerator {
insertStatement.setMeasurements(insertRecordReq.getMeasurements().toArray(new String[0]));
insertStatement.setAligned(insertRecordReq.isAligned);
insertStatement.fillValues(insertRecordReq.values);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -266,7 +266,7 @@ public class StatementGenerator {
insertStatement.setValues(insertRecordReq.getValues().toArray(new Object[0]));
insertStatement.setNeedInferType(true);
insertStatement.setAligned(insertRecordReq.isAligned);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -295,7 +295,7 @@ public class StatementGenerator {
}
insertStatement.setDataTypes(dataTypes);
insertStatement.setAligned(insertTabletReq.isAligned);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -334,7 +334,7 @@ public class StatementGenerator {
insertTabletStatementList.add(insertTabletStatement);
}
insertStatement.setInsertTabletStatementList(insertTabletStatementList);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -358,7 +358,7 @@ public class StatementGenerator {
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -384,7 +384,7 @@ public class StatementGenerator {
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -409,7 +409,7 @@ public class StatementGenerator {
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -436,7 +436,7 @@ public class StatementGenerator {
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return insertStatement;
}
@@ -447,7 +447,7 @@ public class StatementGenerator {
DatabaseSchemaStatement statement =
new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE);
statement.setStorageGroupPath(parseStorageGroupRawString(storageGroup));
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -464,7 +464,7 @@ public class StatementGenerator {
statement.setTags(req.tags);
statement.setAttributes(req.attributes);
statement.setAlias(req.measurementAlias);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -493,7 +493,7 @@ public class StatementGenerator {
statement.setTagsList(req.tagsList);
statement.setAttributesList(req.attributesList);
statement.setAliasList(req.measurementAlias);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -526,7 +526,7 @@ public class StatementGenerator {
statement.setTagsList(req.tagsList);
statement.setAttributesList(req.attributesList);
statement.setAliasList(req.measurementAliasList);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -538,7 +538,7 @@ public class StatementGenerator {
parseStorageGroupRawString(path);
}
statement.setPrefixPath(storageGroups);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -553,7 +553,7 @@ public class StatementGenerator {
statement.setPathList(pathList);
statement.setDeleteStartTime(req.getStartTime());
statement.setDeleteEndTime(req.getEndTime());
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -644,7 +644,7 @@ public class StatementGenerator {
CreateSchemaTemplateStatement statement =
new CreateSchemaTemplateStatement(
req.getName(), measurements, dataTypes, encodings, compressors, alignedPrefix.keySet());
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -669,7 +669,7 @@ public class StatementGenerator {
default:
break;
}
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return result;
}
@@ -678,7 +678,7 @@ public class StatementGenerator {
long startTime = System.nanoTime();
SetSchemaTemplateStatement statement =
new SetSchemaTemplateStatement(req.getTemplateName(), new PartialPath(req.getPrefixPath()));
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -688,14 +688,14 @@ public class StatementGenerator {
UnsetSchemaTemplateStatement statement =
new UnsetSchemaTemplateStatement(
req.getTemplateName(), new PartialPath(req.getPrefixPath()));
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
public static DropSchemaTemplateStatement createStatement(TSDropSchemaTemplateReq req) {
final long startTime = System.nanoTime();
DropSchemaTemplateStatement statement = new DropSchemaTemplateStatement(req.getTemplateName());
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -707,7 +707,7 @@ public class StatementGenerator {
pathPatternList.add(new PartialPath(pathPatternString));
}
DeleteTimeSeriesStatement statement = new DeleteTimeSeriesStatement(pathPatternList);
- PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
return statement;
}
@@ -757,8 +757,7 @@ public class StatementGenerator {
}
return astVisitor.visit(tree);
} finally {
- PerformanceOverviewMetricsManager.getInstance()
- .recordParseCost(System.nanoTime() - startTime);
+ PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java
index 0e85bd9461..280ebe48e9 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java
@@ -45,8 +45,6 @@ public abstract class PlanNode implements IConsensusRequest {
private PlanNodeId id;
- private volatile long metricTime = 0L;
-
protected PlanNode(PlanNodeId id) {
requireNonNull(id, "id is null");
this.id = id;
@@ -64,14 +62,6 @@ public abstract class PlanNode implements IConsensusRequest {
public abstract void addChild(PlanNode child);
- public long getMetricTime() {
- return metricTime;
- }
-
- public void setMetricTime(long metricTime) {
- this.metricTime = metricTime;
- }
-
@Override
public abstract PlanNode clone();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java
index 957f638ed1..f19de2323f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java
@@ -16,6 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
+
package org.apache.iotdb.db.mpp.plan.scheduler;
import org.apache.iotdb.common.rpc.thrift.TEndPoint;
@@ -34,8 +35,8 @@ import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicLong;
import static com.google.common.util.concurrent.Futures.immediateFuture;
@@ -44,8 +45,8 @@ public class AsyncPlanNodeSender {
private final IClientManager<TEndPoint, AsyncDataNodeInternalServiceClient>
asyncInternalServiceClientManager;
private final List<FragmentInstance> instances;
- private final CountDownLatch countDownLatch;
private final Map<Integer, TSendPlanNodeResp> instanceId2RespMap;
+ private final AtomicLong pendingNumber;
public AsyncPlanNodeSender(
IClientManager<TEndPoint, AsyncDataNodeInternalServiceClient>
@@ -53,15 +54,16 @@ public class AsyncPlanNodeSender {
List<FragmentInstance> instances) {
this.asyncInternalServiceClientManager = asyncInternalServiceClientManager;
this.instances = instances;
- this.countDownLatch = new CountDownLatch(instances.size());
this.instanceId2RespMap = new ConcurrentHashMap<>();
+ this.pendingNumber = new AtomicLong(instances.size());
}
public void sendAll() {
+ long startSendTime = System.nanoTime();
for (int i = 0; i < instances.size(); ++i) {
FragmentInstance instance = instances.get(i);
AsyncSendPlanNodeHandler handler =
- new AsyncSendPlanNodeHandler(i, countDownLatch, instanceId2RespMap);
+ new AsyncSendPlanNodeHandler(i, pendingNumber, instanceId2RespMap, startSendTime);
try {
TSendPlanNodeReq sendPlanNodeReq =
new TSendPlanNodeReq(
@@ -78,7 +80,11 @@ public class AsyncPlanNodeSender {
}
public void waitUntilCompleted() throws InterruptedException {
- countDownLatch.await();
+ synchronized (pendingNumber) {
+ while (pendingNumber.get() != 0) {
+ pendingNumber.wait();
+ }
+ }
}
public Future<FragInstanceDispatchResult> getResult() {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java
index 9b8f88b9ae..d0cb0e9679 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java
@@ -18,6 +18,7 @@
*/
package org.apache.iotdb.db.mpp.plan.scheduler;
+import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
import org.apache.iotdb.mpp.rpc.thrift.TSendPlanNodeResp;
import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
@@ -25,26 +26,34 @@ import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.thrift.async.AsyncMethodCallback;
import java.util.Map;
-import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicLong;
public class AsyncSendPlanNodeHandler implements AsyncMethodCallback<TSendPlanNodeResp> {
private final int instanceId;
- private final CountDownLatch countDownLatch;
+ private final AtomicLong pendingNumber;
private final Map<Integer, TSendPlanNodeResp> instanceId2RespMap;
+ private final long sendTime;
public AsyncSendPlanNodeHandler(
int instanceId,
- CountDownLatch countDownLatch,
- Map<Integer, TSendPlanNodeResp> instanceId2RespMap) {
+ AtomicLong pendingNumber,
+ Map<Integer, TSendPlanNodeResp> instanceId2RespMap,
+ long sendTime) {
this.instanceId = instanceId;
- this.countDownLatch = countDownLatch;
+ this.pendingNumber = pendingNumber;
this.instanceId2RespMap = instanceId2RespMap;
+ this.sendTime = sendTime;
}
@Override
public void onComplete(TSendPlanNodeResp tSendPlanNodeResp) {
instanceId2RespMap.put(instanceId, tSendPlanNodeResp);
- countDownLatch.countDown();
+ if (pendingNumber.decrementAndGet() == 0) {
+ PerformanceOverviewMetricsManager.recordScheduleRemoteCost(System.nanoTime() - sendTime);
+ synchronized (pendingNumber) {
+ pendingNumber.notifyAll();
+ }
+ }
}
@Override
@@ -56,6 +65,11 @@ public class AsyncSendPlanNodeHandler implements AsyncMethodCallback<TSendPlanNo
resp.setStatus(
RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode(), errorMsg));
instanceId2RespMap.put(instanceId, resp);
- countDownLatch.countDown();
+ if (pendingNumber.decrementAndGet() == 0) {
+ PerformanceOverviewMetricsManager.recordScheduleRemoteCost(System.nanoTime() - sendTime);
+ synchronized (pendingNumber) {
+ pendingNumber.notifyAll();
+ }
+ }
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java
index 0425b4fc72..3226884b56 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.db.mpp.common.MPPQueryContext;
import org.apache.iotdb.db.mpp.execution.executor.RegionExecutionResult;
import org.apache.iotdb.db.mpp.execution.executor.RegionReadExecutor;
import org.apache.iotdb.db.mpp.execution.executor.RegionWriteExecutor;
+import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
import org.apache.iotdb.db.mpp.metric.QueryMetricsManager;
import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
import org.apache.iotdb.db.mpp.plan.planner.plan.FragmentInstance;
@@ -177,6 +178,7 @@ public class FragmentInstanceDispatcherImpl implements IFragInstanceDispatcher {
new AsyncPlanNodeSender(asyncInternalServiceClientManager, remoteInstances);
asyncPlanNodeSender.sendAll();
// sync dispatch to local
+ long localScheduleStartTime = System.nanoTime();
for (FragmentInstance localInstance : localInstances) {
try (SetThreadName threadName = new SetThreadName(localInstance.getId().getFullId())) {
dispatchOneInstance(localInstance);
@@ -190,6 +192,8 @@ public class FragmentInstanceDispatcherImpl implements IFragInstanceDispatcher {
TSStatusCode.INTERNAL_SERVER_ERROR, "Unexpected errors: " + t.getMessage())));
}
}
+ PerformanceOverviewMetricsManager.recordScheduleLocalCost(
+ System.nanoTime() - localScheduleStartTime);
// wait until remote dispatch done
try {
asyncPlanNodeSender.waitUntilCompleted();