package com.alibaba.doris.dataserver.monitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.dataserver.action.ActionType;
import com.alibaba.doris.dataserver.action.data.BaseActionType;
import com.alibaba.doris.dataserver.core.Request;
import com.alibaba.doris.dataserver.core.RequestFilter;
import com.alibaba.doris.dataserver.core.RequestFilterChian;
import com.alibaba.doris.dataserver.core.Response;
import com.alibaba.doris.dataserver.monitor.support.PerfTracker;
import com.alibaba.doris.dataserver.monitor.support.PrefTrackerKey;
import com.alibaba.doris.dataserver.monitor.support.PrefTrackerUnit;
public class PrefRequestFilter implements RequestFilter {
public void doFilter(Request request, Response response, RequestFilterChian filterChain) {
if (!needStat(request)) {
filterChain.doFilter(request, response);
return;
}
PrefTrackerUnit trackerWithNameSpace = null;
long start = 0;
int bytes = 0;
try {
String operation = request.getActionData().getActionType().getName();
Key keyObject = request.getKey();
String key = keyObject.getKey();
String namespace = String.valueOf(keyObject.getNamespace());
bytes = key.length() + namespace.length();
if (request.getValue() != null && request.getValue().getValueBytes() != null) {
bytes += request.getValue().getValueBytes().length;
}
// 基于name space的跟踪器
trackerWithNameSpace = PerfTracker.getTraker(new PrefTrackerKey(operation, namespace));
start = System.currentTimeMillis();
// 增加并发数 用于统计最大并发数
trackerWithNameSpace.incConcurrencyLevel();
} catch (Exception ignorPrefException) {
logger.error("doFilter", ignorPrefException);
}
// 处理具体业务
filterChain.doFilter(request, response);
try {
// 减少并发数
trackerWithNameSpace.decConcurrencyLevel();
// 记录延迟
int latency = (int) (System.currentTimeMillis() - start);
trackerWithNameSpace.trackLatency(latency);
// 记录字节数valueOf
trackerWithNameSpace.trackBytes(bytes);
} catch (Exception ignorPrefException) {
logger.error("doFilter", ignorPrefException);
}
}
private boolean needStat(Request request) {
ActionType operation = request.getActionData().getActionType();
if (BaseActionType.SET.equals(operation) || BaseActionType.GET.equals(operation)
|| BaseActionType.DELETE.equals(operation) || BaseActionType.CAD.equals(operation)
|| BaseActionType.CAS.equals(operation)) {
return request != null && request.getActionData() != null && request.getKey() != null
&& !"null".equals(String.valueOf(request.getKey().getNamespace()));
} else {
return false;
}
}
protected final Logger logger = LoggerFactory.getLogger(PrefRequestFilter.class);
}