[cherry-pick]Add workload metric query_be_memory (#35911)
This commit is contained in:
@ -37,14 +37,12 @@ public class WorkloadActionMeta {
|
||||
}
|
||||
|
||||
static WorkloadActionType getWorkloadActionType(String strType) throws UserException {
|
||||
if (WorkloadActionType.CANCEL_QUERY.toString().equalsIgnoreCase(strType)) {
|
||||
return WorkloadActionType.CANCEL_QUERY;
|
||||
} else if (WorkloadActionType.MOVE_QUERY_TO_GROUP.toString().equalsIgnoreCase(strType)) {
|
||||
return WorkloadActionType.MOVE_QUERY_TO_GROUP;
|
||||
} else if (WorkloadActionType.SET_SESSION_VARIABLE.toString().equalsIgnoreCase(strType)) {
|
||||
return WorkloadActionType.SET_SESSION_VARIABLE;
|
||||
WorkloadActionType workloadActionType = WorkloadSchedPolicyMgr.STRING_ACTION_MAP.get(strType.toUpperCase());
|
||||
if (workloadActionType == null) {
|
||||
throw new UserException("invalid action type " + strType);
|
||||
} else {
|
||||
return workloadActionType;
|
||||
}
|
||||
throw new UserException("invalid action type " + strType);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
|
||||
@ -37,6 +37,8 @@ public interface WorkloadCondition {
|
||||
return WorkloadConditionBeScanRows.createWorkloadCondition(cm.op, cm.value);
|
||||
} else if (WorkloadMetricType.BE_SCAN_BYTES.equals(cm.metricName)) {
|
||||
return WorkloadConditionBeScanBytes.createWorkloadCondition(cm.op, cm.value);
|
||||
} else if (WorkloadMetricType.QUERY_BE_MEMORY_BYTES.equals(cm.metricName)) {
|
||||
return WorkloadConditionQueryBeMemory.createWorkloadCondition(cm.op, cm.value);
|
||||
}
|
||||
throw new UserException("invalid metric name:" + cm.metricName);
|
||||
}
|
||||
|
||||
@ -38,9 +38,14 @@ public class WorkloadConditionBeScanBytes implements WorkloadCondition {
|
||||
|
||||
public static WorkloadConditionBeScanBytes createWorkloadCondition(WorkloadConditionOperator op, String value)
|
||||
throws UserException {
|
||||
long longValue = Long.parseLong(value);
|
||||
if (longValue < 0) {
|
||||
throw new UserException("invalid scan bytes value, " + longValue + ", it requires >= 0");
|
||||
long longValue = -1;
|
||||
try {
|
||||
longValue = Long.parseLong(value);
|
||||
if (longValue < 0) {
|
||||
throw new NumberFormatException();
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
throw new UserException("invalid scan bytes value: " + value + ", it requires >= 0");
|
||||
}
|
||||
return new WorkloadConditionBeScanBytes(op, longValue);
|
||||
}
|
||||
|
||||
@ -38,9 +38,14 @@ public class WorkloadConditionBeScanRows implements WorkloadCondition {
|
||||
|
||||
public static WorkloadConditionBeScanRows createWorkloadCondition(WorkloadConditionOperator op, String value)
|
||||
throws UserException {
|
||||
long longValue = Long.parseLong(value);
|
||||
if (longValue < 0) {
|
||||
throw new UserException("invalid scan rows value, " + longValue + ", it requires >= 0");
|
||||
long longValue = -1;
|
||||
try {
|
||||
longValue = Long.parseLong(value);
|
||||
if (longValue < 0) {
|
||||
throw new NumberFormatException();
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
throw new UserException("invalid scan rows value: " + value + ", it requires >= 0");
|
||||
}
|
||||
return new WorkloadConditionBeScanRows(op, longValue);
|
||||
}
|
||||
|
||||
@ -40,16 +40,12 @@ public class WorkloadConditionMeta {
|
||||
}
|
||||
|
||||
private static WorkloadMetricType getMetricType(String metricStr) throws UserException {
|
||||
if (WorkloadMetricType.USERNAME.toString().equalsIgnoreCase(metricStr)) {
|
||||
return WorkloadMetricType.USERNAME;
|
||||
} else if (WorkloadMetricType.QUERY_TIME.toString().equalsIgnoreCase(metricStr)) {
|
||||
return WorkloadMetricType.QUERY_TIME;
|
||||
} else if (WorkloadMetricType.BE_SCAN_ROWS.toString().equalsIgnoreCase(metricStr)) {
|
||||
return WorkloadMetricType.BE_SCAN_ROWS;
|
||||
} else if (WorkloadMetricType.BE_SCAN_BYTES.toString().equalsIgnoreCase(metricStr)) {
|
||||
return WorkloadMetricType.BE_SCAN_BYTES;
|
||||
WorkloadMetricType metricType = WorkloadSchedPolicyMgr.STRING_METRIC_MAP.get(metricStr.toUpperCase());
|
||||
if (metricType == null) {
|
||||
throw new UserException("invalid metric name:" + metricStr);
|
||||
} else {
|
||||
return metricType;
|
||||
}
|
||||
throw new UserException("invalid metric name:" + metricStr);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
|
||||
@ -0,0 +1,56 @@
|
||||
// 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.doris.resource.workloadschedpolicy;
|
||||
|
||||
import org.apache.doris.common.UserException;
|
||||
|
||||
public class WorkloadConditionQueryBeMemory implements WorkloadCondition {
|
||||
|
||||
private long value;
|
||||
|
||||
private WorkloadConditionOperator op;
|
||||
|
||||
public WorkloadConditionQueryBeMemory(WorkloadConditionOperator op, long value) {
|
||||
this.value = value;
|
||||
this.op = op;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean eval(String strValue) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WorkloadMetricType getMetricType() {
|
||||
return WorkloadMetricType.QUERY_BE_MEMORY_BYTES;
|
||||
}
|
||||
|
||||
public static WorkloadConditionQueryBeMemory createWorkloadCondition(WorkloadConditionOperator op,
|
||||
String value) throws UserException {
|
||||
long longValue = -1;
|
||||
try {
|
||||
longValue = Long.parseLong(value);
|
||||
if (longValue < 0) {
|
||||
throw new NumberFormatException();
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
throw new UserException("invalid query be memory value: " + value + ", it requires >= 0");
|
||||
}
|
||||
return new WorkloadConditionQueryBeMemory(op, longValue);
|
||||
}
|
||||
}
|
||||
@ -37,9 +37,14 @@ public class WorkloadConditionQueryTime implements WorkloadCondition {
|
||||
|
||||
public static WorkloadConditionQueryTime createWorkloadCondition(WorkloadConditionOperator op, String value)
|
||||
throws UserException {
|
||||
long longValue = Long.parseLong(value);
|
||||
if (longValue < 0) {
|
||||
throw new UserException("invalid query time value, " + longValue + ", it requires >= 0");
|
||||
long longValue = -1;
|
||||
try {
|
||||
longValue = Long.parseLong(value);
|
||||
if (longValue < 0) {
|
||||
throw new NumberFormatException();
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
throw new UserException("invalid query time value: " + value + ", it requires >= 0");
|
||||
}
|
||||
return new WorkloadConditionQueryTime(op, longValue);
|
||||
}
|
||||
|
||||
@ -18,5 +18,5 @@
|
||||
package org.apache.doris.resource.workloadschedpolicy;
|
||||
|
||||
public enum WorkloadMetricType {
|
||||
USERNAME, QUERY_TIME, BE_SCAN_ROWS, BE_SCAN_BYTES
|
||||
USERNAME, QUERY_TIME, BE_SCAN_ROWS, BE_SCAN_BYTES, QUERY_BE_MEMORY_BYTES
|
||||
}
|
||||
|
||||
@ -22,7 +22,6 @@ import org.apache.doris.common.io.Text;
|
||||
import org.apache.doris.common.io.Writable;
|
||||
import org.apache.doris.persist.gson.GsonPostProcessable;
|
||||
import org.apache.doris.persist.gson.GsonUtils;
|
||||
import org.apache.doris.thrift.TCompareOperator;
|
||||
import org.apache.doris.thrift.TWorkloadAction;
|
||||
import org.apache.doris.thrift.TWorkloadActionType;
|
||||
import org.apache.doris.thrift.TWorkloadCondition;
|
||||
@ -31,7 +30,6 @@ import org.apache.doris.thrift.TWorkloadSchedPolicy;
|
||||
import org.apache.doris.thrift.TopicInfo;
|
||||
|
||||
import com.esotericsoftware.minlog.Log;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
@ -51,25 +49,6 @@ public class WorkloadSchedPolicy implements Writable, GsonPostProcessable {
|
||||
public static final ImmutableSet<String> POLICY_PROPERTIES = new ImmutableSet.Builder<String>()
|
||||
.add(ENABLED).add(PRIORITY).add(WORKLOAD_GROUP).build();
|
||||
|
||||
// used for convert fe type to thrift type
|
||||
private static ImmutableMap<WorkloadMetricType, TWorkloadMetricType> METRIC_MAP
|
||||
= new ImmutableMap.Builder<WorkloadMetricType, TWorkloadMetricType>()
|
||||
.put(WorkloadMetricType.QUERY_TIME, TWorkloadMetricType.QUERY_TIME)
|
||||
.put(WorkloadMetricType.BE_SCAN_ROWS, TWorkloadMetricType.BE_SCAN_ROWS)
|
||||
.put(WorkloadMetricType.BE_SCAN_BYTES, TWorkloadMetricType.BE_SCAN_BYTES).build();
|
||||
private static ImmutableMap<WorkloadActionType, TWorkloadActionType> ACTION_MAP
|
||||
= new ImmutableMap.Builder<WorkloadActionType, TWorkloadActionType>()
|
||||
.put(WorkloadActionType.MOVE_QUERY_TO_GROUP, TWorkloadActionType.MOVE_QUERY_TO_GROUP)
|
||||
.put(WorkloadActionType.CANCEL_QUERY, TWorkloadActionType.CANCEL_QUERY).build();
|
||||
|
||||
private static ImmutableMap<WorkloadConditionOperator, TCompareOperator> OP_MAP
|
||||
= new ImmutableMap.Builder<WorkloadConditionOperator, TCompareOperator>()
|
||||
.put(WorkloadConditionOperator.EQUAL, TCompareOperator.EQUAL)
|
||||
.put(WorkloadConditionOperator.GREATER, TCompareOperator.GREATER)
|
||||
.put(WorkloadConditionOperator.GREATER_EQUAL, TCompareOperator.GREATER_EQUAL)
|
||||
.put(WorkloadConditionOperator.LESS, TCompareOperator.LESS)
|
||||
.put(WorkloadConditionOperator.LESS_EQUAl, TCompareOperator.LESS_EQUAL).build();
|
||||
|
||||
@SerializedName(value = "id")
|
||||
long id;
|
||||
@SerializedName(value = "name")
|
||||
@ -255,12 +234,12 @@ public class WorkloadSchedPolicy implements Writable, GsonPostProcessable {
|
||||
List<TWorkloadCondition> condList = new ArrayList();
|
||||
for (WorkloadConditionMeta cond : conditionMetaList) {
|
||||
TWorkloadCondition tCond = new TWorkloadCondition();
|
||||
TWorkloadMetricType metricType = METRIC_MAP.get(cond.metricName);
|
||||
TWorkloadMetricType metricType = WorkloadSchedPolicyMgr.METRIC_MAP.get(cond.metricName);
|
||||
if (metricType == null) {
|
||||
return null;
|
||||
}
|
||||
tCond.setMetricName(metricType);
|
||||
tCond.setOp(OP_MAP.get(cond.op));
|
||||
tCond.setOp(WorkloadSchedPolicyMgr.OP_MAP.get(cond.op));
|
||||
tCond.setValue(cond.value);
|
||||
condList.add(tCond);
|
||||
}
|
||||
@ -268,7 +247,7 @@ public class WorkloadSchedPolicy implements Writable, GsonPostProcessable {
|
||||
List<TWorkloadAction> actionList = new ArrayList();
|
||||
for (WorkloadActionMeta action : actionMetaList) {
|
||||
TWorkloadAction tAction = new TWorkloadAction();
|
||||
TWorkloadActionType tActionType = ACTION_MAP.get(action.action);
|
||||
TWorkloadActionType tActionType = WorkloadSchedPolicyMgr.ACTION_MAP.get(action.action);
|
||||
if (tActionType == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -35,11 +35,15 @@ import org.apache.doris.persist.gson.GsonPostProcessable;
|
||||
import org.apache.doris.persist.gson.GsonUtils;
|
||||
import org.apache.doris.qe.ConnectContext;
|
||||
import org.apache.doris.service.ExecuteEnv;
|
||||
import org.apache.doris.thrift.TCompareOperator;
|
||||
import org.apache.doris.thrift.TUserIdentity;
|
||||
import org.apache.doris.thrift.TWorkloadActionType;
|
||||
import org.apache.doris.thrift.TWorkloadMetricType;
|
||||
import org.apache.doris.thrift.TopicInfo;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
@ -80,6 +84,14 @@ public class WorkloadSchedPolicyMgr extends MasterDaemon implements Writable, Gs
|
||||
.add("WorkloadGroup")
|
||||
.build();
|
||||
|
||||
public static final ImmutableMap<WorkloadConditionOperator, TCompareOperator> OP_MAP
|
||||
= new ImmutableMap.Builder<WorkloadConditionOperator, TCompareOperator>()
|
||||
.put(WorkloadConditionOperator.EQUAL, TCompareOperator.EQUAL)
|
||||
.put(WorkloadConditionOperator.GREATER, TCompareOperator.GREATER)
|
||||
.put(WorkloadConditionOperator.GREATER_EQUAL, TCompareOperator.GREATER_EQUAL)
|
||||
.put(WorkloadConditionOperator.LESS, TCompareOperator.LESS)
|
||||
.put(WorkloadConditionOperator.LESS_EQUAl, TCompareOperator.LESS_EQUAL).build();
|
||||
|
||||
public static final ImmutableSet<WorkloadActionType> FE_ACTION_SET
|
||||
= new ImmutableSet.Builder<WorkloadActionType>().add(WorkloadActionType.SET_SESSION_VARIABLE).build();
|
||||
|
||||
@ -93,7 +105,39 @@ public class WorkloadSchedPolicyMgr extends MasterDaemon implements Writable, Gs
|
||||
|
||||
public static final ImmutableSet<WorkloadMetricType> BE_METRIC_SET
|
||||
= new ImmutableSet.Builder<WorkloadMetricType>().add(WorkloadMetricType.BE_SCAN_ROWS)
|
||||
.add(WorkloadMetricType.BE_SCAN_BYTES).add(WorkloadMetricType.QUERY_TIME).build();
|
||||
.add(WorkloadMetricType.BE_SCAN_BYTES).add(WorkloadMetricType.QUERY_TIME)
|
||||
.add(WorkloadMetricType.QUERY_BE_MEMORY_BYTES).build();
|
||||
|
||||
// used for convert fe type to thrift type
|
||||
public static final ImmutableMap<WorkloadMetricType, TWorkloadMetricType> METRIC_MAP
|
||||
= new ImmutableMap.Builder<WorkloadMetricType, TWorkloadMetricType>()
|
||||
.put(WorkloadMetricType.QUERY_TIME, TWorkloadMetricType.QUERY_TIME)
|
||||
.put(WorkloadMetricType.BE_SCAN_ROWS, TWorkloadMetricType.BE_SCAN_ROWS)
|
||||
.put(WorkloadMetricType.BE_SCAN_BYTES, TWorkloadMetricType.BE_SCAN_BYTES)
|
||||
.put(WorkloadMetricType.QUERY_BE_MEMORY_BYTES, TWorkloadMetricType.QUERY_BE_MEMORY_BYTES).build();
|
||||
public static final ImmutableMap<WorkloadActionType, TWorkloadActionType> ACTION_MAP
|
||||
= new ImmutableMap.Builder<WorkloadActionType, TWorkloadActionType>()
|
||||
.put(WorkloadActionType.MOVE_QUERY_TO_GROUP, TWorkloadActionType.MOVE_QUERY_TO_GROUP)
|
||||
.put(WorkloadActionType.CANCEL_QUERY, TWorkloadActionType.CANCEL_QUERY).build();
|
||||
|
||||
public static final Map<String, WorkloadMetricType> STRING_METRIC_MAP = new HashMap<>();
|
||||
public static final Map<String, WorkloadActionType> STRING_ACTION_MAP = new HashMap<>();
|
||||
|
||||
static {
|
||||
for (WorkloadMetricType metricType : FE_METRIC_SET) {
|
||||
STRING_METRIC_MAP.put(metricType.toString(), metricType);
|
||||
}
|
||||
for (WorkloadMetricType metricType : BE_METRIC_SET) {
|
||||
STRING_METRIC_MAP.put(metricType.toString(), metricType);
|
||||
}
|
||||
|
||||
for (WorkloadActionType actionType : FE_ACTION_SET) {
|
||||
STRING_ACTION_MAP.put(actionType.toString(), actionType);
|
||||
}
|
||||
for (WorkloadActionType actionType : BE_ACTION_SET) {
|
||||
STRING_ACTION_MAP.put(actionType.toString(), actionType);
|
||||
}
|
||||
}
|
||||
|
||||
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user