blob: 785ead42a2f2baf0b060c1c8a6498a37ff95b3b5 [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;
public class DataExchangeCostMetricSet implements IMetricSet {
private static final DataExchangeCostMetricSet INSTANCE = new DataExchangeCostMetricSet();
private DataExchangeCostMetricSet() {
// empty constructor
}
// region tsblock related
public static final String LOCAL = "local";
public static final String REMOTE = "remote";
private static final String SOURCE_HANDLE_GET_TSBLOCK = "source_handle_get_tsblock";
public static final String SOURCE_HANDLE_GET_TSBLOCK_LOCAL =
SOURCE_HANDLE_GET_TSBLOCK + "_" + LOCAL;
public static final String SOURCE_HANDLE_GET_TSBLOCK_REMOTE =
SOURCE_HANDLE_GET_TSBLOCK + "_" + REMOTE;
private static final String SOURCE_HANDLE_DESERIALIZE_TSBLOCK =
"source_handle_deserialize_tsblock";
public static final String SOURCE_HANDLE_DESERIALIZE_TSBLOCK_LOCAL =
SOURCE_HANDLE_DESERIALIZE_TSBLOCK + "_" + LOCAL;
public static final String SOURCE_HANDLE_DESERIALIZE_TSBLOCK_REMOTE =
SOURCE_HANDLE_DESERIALIZE_TSBLOCK + "_" + REMOTE;
private static final String SINK_HANDLE_SEND_TSBLOCK = "sink_handle_send_tsblock";
public static final String SINK_HANDLE_SEND_TSBLOCK_LOCAL =
SINK_HANDLE_SEND_TSBLOCK + "_" + LOCAL;
public static final String SINK_HANDLE_SEND_TSBLOCK_REMOTE =
SINK_HANDLE_SEND_TSBLOCK + "_" + REMOTE;
private Timer sourceHandleGetTsBlockLocalTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer sourceHandleGetTsBlockRemoteTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer sourceHandleDeserializeTsBlockLocalTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer sourceHandleDeserializeTsBlockRemoteTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer sinkHandleSendTsBlockLocalTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer sinkHandleSendTsBlockRemoteTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private void bindTsBlock(AbstractMetricService metricService) {
sourceHandleGetTsBlockLocalTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SOURCE_HANDLE_DESERIALIZE_TSBLOCK,
Tag.TYPE.toString(),
LOCAL);
sourceHandleGetTsBlockRemoteTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SOURCE_HANDLE_DESERIALIZE_TSBLOCK,
Tag.TYPE.toString(),
REMOTE);
sourceHandleDeserializeTsBlockLocalTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SOURCE_HANDLE_GET_TSBLOCK,
Tag.TYPE.toString(),
LOCAL);
sourceHandleDeserializeTsBlockRemoteTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SOURCE_HANDLE_GET_TSBLOCK,
Tag.TYPE.toString(),
REMOTE);
sinkHandleSendTsBlockLocalTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SINK_HANDLE_SEND_TSBLOCK,
Tag.TYPE.toString(),
LOCAL);
sinkHandleSendTsBlockRemoteTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SINK_HANDLE_SEND_TSBLOCK,
Tag.TYPE.toString(),
REMOTE);
}
private void unbindTsBlock(AbstractMetricService metricService) {
sourceHandleGetTsBlockLocalTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
sourceHandleGetTsBlockRemoteTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
sourceHandleDeserializeTsBlockLocalTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
sourceHandleDeserializeTsBlockRemoteTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
sinkHandleSendTsBlockLocalTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
sinkHandleSendTsBlockRemoteTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
Arrays.asList(
SOURCE_HANDLE_DESERIALIZE_TSBLOCK,
SOURCE_HANDLE_DESERIALIZE_TSBLOCK,
SINK_HANDLE_SEND_TSBLOCK)
.forEach(
operation -> {
Arrays.asList(LOCAL, REMOTE)
.forEach(
type -> {
metricService.remove(
MetricType.TIMER,
Metric.DATA_EXCHANGE_COST.toString(),
Tag.OPERATION.toString(),
operation,
Tag.TYPE.toString(),
type);
});
});
}
// endregion
// region data block related
public static final String CALLER = "caller";
public static final String SERVER = "server";
private static final String SEND_NEW_DATA_BLOCK_EVENT_TASK = "send_new_data_block_event_task";
public static final String SEND_NEW_DATA_BLOCK_EVENT_TASK_CALLER =
SEND_NEW_DATA_BLOCK_EVENT_TASK + "_" + CALLER;
public static final String SEND_NEW_DATA_BLOCK_EVENT_TASK_SERVER =
SEND_NEW_DATA_BLOCK_EVENT_TASK + "_" + SERVER;
private static final String ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK =
"on_acknowledge_data_block_event_task";
public static final String ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK_CALLER =
ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK + "_" + CALLER;
public static final String ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK_SERVER =
ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK + "_" + SERVER;
private static final String GET_DATA_BLOCK_TASK = "get_data_block_task";
public static final String GET_DATA_BLOCK_TASK_CALLER = GET_DATA_BLOCK_TASK + "_" + CALLER;
public static final String GET_DATA_BLOCK_TASK_SERVER = GET_DATA_BLOCK_TASK + "_" + SERVER;
private Timer sendNewDataBlockEventCallerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer sendNewDataBlockEventServerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer onAcknowledgeDataBlockEventCallerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer onAcknowledgeDataBlockEventServerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer getDataBlockCallerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private Timer getDataBlockServerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
private void bindDataBlock(AbstractMetricService metricService) {
sendNewDataBlockEventCallerTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SEND_NEW_DATA_BLOCK_EVENT_TASK,
Tag.TYPE.toString(),
CALLER);
sendNewDataBlockEventServerTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
SEND_NEW_DATA_BLOCK_EVENT_TASK,
Tag.TYPE.toString(),
SERVER);
onAcknowledgeDataBlockEventCallerTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK,
Tag.TYPE.toString(),
CALLER);
onAcknowledgeDataBlockEventServerTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK,
Tag.TYPE.toString(),
SERVER);
getDataBlockCallerTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
GET_DATA_BLOCK_TASK,
Tag.TYPE.toString(),
CALLER);
getDataBlockServerTimer =
metricService.getOrCreateTimer(
Metric.DATA_EXCHANGE_COST.toString(),
MetricLevel.IMPORTANT,
Tag.OPERATION.toString(),
GET_DATA_BLOCK_TASK,
Tag.TYPE.toString(),
SERVER);
}
private void unbindDataBlock(AbstractMetricService metricService) {
sendNewDataBlockEventCallerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
sendNewDataBlockEventServerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
onAcknowledgeDataBlockEventCallerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
onAcknowledgeDataBlockEventServerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
getDataBlockCallerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
getDataBlockServerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
Arrays.asList(
SEND_NEW_DATA_BLOCK_EVENT_TASK,
ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK,
GET_DATA_BLOCK_TASK)
.forEach(
operation -> {
Arrays.asList(CALLER, SERVER)
.forEach(
type -> {
metricService.remove(
MetricType.TIMER,
Metric.DATA_EXCHANGE_COST.toString(),
Tag.OPERATION.toString(),
operation,
Tag.TYPE.toString(),
type);
});
});
}
// endregion
@Override
public void bindTo(AbstractMetricService metricService) {
bindTsBlock(metricService);
bindDataBlock(metricService);
}
@Override
public void unbindFrom(AbstractMetricService metricService) {
unbindTsBlock(metricService);
unbindDataBlock(metricService);
}
public void recordDataExchangeCost(String stage, long costTimeInNanos) {
switch (stage) {
case SOURCE_HANDLE_GET_TSBLOCK_LOCAL:
sourceHandleGetTsBlockLocalTimer.updateNanos(costTimeInNanos);
break;
case SOURCE_HANDLE_GET_TSBLOCK_REMOTE:
sourceHandleGetTsBlockRemoteTimer.updateNanos(costTimeInNanos);
break;
case SOURCE_HANDLE_DESERIALIZE_TSBLOCK_LOCAL:
sourceHandleDeserializeTsBlockLocalTimer.updateNanos(costTimeInNanos);
break;
case SOURCE_HANDLE_DESERIALIZE_TSBLOCK_REMOTE:
sourceHandleDeserializeTsBlockRemoteTimer.updateNanos(costTimeInNanos);
break;
case SINK_HANDLE_SEND_TSBLOCK_LOCAL:
sinkHandleSendTsBlockLocalTimer.updateNanos(costTimeInNanos);
break;
case SINK_HANDLE_SEND_TSBLOCK_REMOTE:
sinkHandleSendTsBlockRemoteTimer.updateNanos(costTimeInNanos);
break;
case GET_DATA_BLOCK_TASK_SERVER:
getDataBlockServerTimer.updateNanos(costTimeInNanos);
break;
case GET_DATA_BLOCK_TASK_CALLER:
getDataBlockCallerTimer.updateNanos(costTimeInNanos);
break;
case ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK_SERVER:
onAcknowledgeDataBlockEventServerTimer.updateNanos(costTimeInNanos);
break;
case ON_ACKNOWLEDGE_DATA_BLOCK_EVENT_TASK_CALLER:
onAcknowledgeDataBlockEventCallerTimer.updateNanos(costTimeInNanos);
break;
case SEND_NEW_DATA_BLOCK_EVENT_TASK_SERVER:
sendNewDataBlockEventServerTimer.updateNanos(costTimeInNanos);
break;
case SEND_NEW_DATA_BLOCK_EVENT_TASK_CALLER:
sendNewDataBlockEventCallerTimer.updateNanos(costTimeInNanos);
break;
default:
break;
}
}
public static DataExchangeCostMetricSet getInstance() {
return INSTANCE;
}
}