blob: 27a238d3d8cc0b7ca4f0dd05ab4d76480ad18018 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.db.queryengine.metric;
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.impl.DoNothingMetricManager;
import org.apache.iotdb.metrics.metricsets.IMetricSet;
import org.apache.iotdb.metrics.type.Timer;
import org.apache.iotdb.metrics.utils.MetricLevel;
import org.apache.iotdb.metrics.utils.MetricType;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
public class QueryExecutionMetricSet implements IMetricSet {
private static final QueryExecutionMetricSet INSTANCE = new QueryExecutionMetricSet();
private QueryExecutionMetricSet() {
// empty constructor
}
// region query dispatch
public static final String WAIT_FOR_DISPATCH = "wait_for_dispatch";
public static final String DISPATCH_READ = "dispatch_read";
private Timer waitForDispatchTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer dispatchReadTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private void bindQueryDispatch(AbstractMetricService metricService) {
waitForDispatchTimer =
metricService.getOrCreateTimer(
Metric.DISPATCHER.toString(),
MetricLevel.IMPORTANT,
Tag.STAGE.toString(),
WAIT_FOR_DISPATCH);
dispatchReadTimer =
metricService.getOrCreateTimer(
Metric.DISPATCHER.toString(),
MetricLevel.IMPORTANT,
Tag.STAGE.toString(),
DISPATCH_READ);
}
private void unbindQueryDispatch(AbstractMetricService metricService) {
waitForDispatchTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
dispatchReadTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
Arrays.asList(WAIT_FOR_DISPATCH, DISPATCH_READ)
.forEach(
stage ->
metricService.remove(
MetricType.TIMER, Metric.DISPATCHER.toString(), Tag.STAGE.toString(), stage));
}
// endregion
// region query execution
public static final String LOCAL_EXECUTION_PLANNER = "local_execution_planner";
public static final String QUERY_RESOURCE_INIT = "query_resource_init";
public static final String GET_QUERY_RESOURCE_FROM_MEM = "get_query_resource_from_mem";
public static final String DRIVER_INTERNAL_PROCESS = "driver_internal_process";
public static final String WAIT_FOR_RESULT = "wait_for_result";
private Timer localExecutionPlannerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer queryResourceInitTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer getQueryResourceFromMemTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer driverInternalProcessTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer waitForResultTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private void bindQueryExecution(AbstractMetricService metricService) {
localExecutionPlannerTimer =
metricService.getOrCreateTimer(
Metric.QUERY_EXECUTION.toString(),
MetricLevel.IMPORTANT,
Tag.STAGE.toString(),
LOCAL_EXECUTION_PLANNER);
queryResourceInitTimer =
metricService.getOrCreateTimer(
Metric.QUERY_EXECUTION.toString(),
MetricLevel.IMPORTANT,
Tag.STAGE.toString(),
QUERY_RESOURCE_INIT);
getQueryResourceFromMemTimer =
metricService.getOrCreateTimer(
Metric.QUERY_EXECUTION.toString(),
MetricLevel.IMPORTANT,
Tag.STAGE.toString(),
GET_QUERY_RESOURCE_FROM_MEM);
driverInternalProcessTimer =
metricService.getOrCreateTimer(
Metric.QUERY_EXECUTION.toString(),
MetricLevel.IMPORTANT,
Tag.STAGE.toString(),
DRIVER_INTERNAL_PROCESS);
waitForResultTimer =
metricService.getOrCreateTimer(
Metric.QUERY_EXECUTION.toString(),
MetricLevel.IMPORTANT,
Tag.STAGE.toString(),
WAIT_FOR_RESULT);
}
private void unbindQueryExecution(AbstractMetricService metricService) {
localExecutionPlannerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
queryResourceInitTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
getQueryResourceFromMemTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
driverInternalProcessTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
waitForResultTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
Arrays.asList(
LOCAL_EXECUTION_PLANNER,
QUERY_RESOURCE_INIT,
GET_QUERY_RESOURCE_FROM_MEM,
DRIVER_INTERNAL_PROCESS,
WAIT_FOR_RESULT)
.forEach(
stage ->
metricService.remove(
MetricType.TIMER,
Metric.QUERY_EXECUTION.toString(),
Tag.STAGE.toString(),
stage));
}
// endregion
// region query aggregation
public static final String AGGREGATION_FROM_RAW_DATA = "aggregation_from_raw_data";
public static final String AGGREGATION_FROM_STATISTICS = "aggregation_from_statistics";
private Timer aggregationFromRawDataTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer aggregationFromStatisticsTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private void bindQueryAggregation(AbstractMetricService metricService) {
aggregationFromRawDataTimer =
metricService.getOrCreateTimer(
Metric.AGGREGATION.toString(), MetricLevel.IMPORTANT, Tag.FROM.toString(), "raw_data");
aggregationFromStatisticsTimer =
metricService.getOrCreateTimer(
Metric.AGGREGATION.toString(),
MetricLevel.IMPORTANT,
Tag.FROM.toString(),
"statistics");
}
private void unbindQueryAggregation(AbstractMetricService metricService) {
aggregationFromRawDataTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
aggregationFromStatisticsTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
Arrays.asList("raw_data", "statistics")
.forEach(
from ->
metricService.remove(
MetricType.TIMER, Metric.AGGREGATION.toString(), Tag.FROM.toString(), from));
}
// endregion
@Override
public void bindTo(AbstractMetricService metricService) {
bindQueryExecution(metricService);
bindQueryDispatch(metricService);
bindQueryAggregation(metricService);
}
@Override
public void unbindFrom(AbstractMetricService metricService) {
unbindQueryExecution(metricService);
unbindQueryDispatch(metricService);
unbindQueryAggregation(metricService);
}
public void recordExecutionCost(String stage, long costTimeInNanos) {
switch (stage) {
case WAIT_FOR_DISPATCH:
waitForDispatchTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case DISPATCH_READ:
dispatchReadTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case LOCAL_EXECUTION_PLANNER:
localExecutionPlannerTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case QUERY_RESOURCE_INIT:
queryResourceInitTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case GET_QUERY_RESOURCE_FROM_MEM:
getQueryResourceFromMemTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case DRIVER_INTERNAL_PROCESS:
driverInternalProcessTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case WAIT_FOR_RESULT:
waitForResultTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case AGGREGATION_FROM_RAW_DATA:
aggregationFromRawDataTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
case AGGREGATION_FROM_STATISTICS:
aggregationFromStatisticsTimer.update(costTimeInNanos, TimeUnit.NANOSECONDS);
break;
default:
break;
}
}
public static QueryExecutionMetricSet getInstance() {
return INSTANCE;
}
}