代码开发
监控代码如下:
package com.niwodai.inf.cat.dubbo.connection;
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.Filter;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.RpcStatus;
import com.alibaba.fastjson.JSONObject;
import com.dianping.cat.Cat;
import com.dianping.cat.message.Event;
import com.niwodai.inf.cat.dubbo.DubboCat;
import com.niwodai.inf.common.serial.ServialContext;
/*
* @author Michael Feng
* @date 2017年7月31日
*/
@Activate(group = {Constants.PROVIDER, Constants.CONSUMER}, value={Constants.ACTIVES_KEY,Constants.EXECUTES_KEY} , order = -8999)
public class ActiveCntFilter implements Filter {
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
/** 开关判断 */
if(!DubboCat.isEnable()){
Result result = invoker.invoke(invocation);
return result;
}
try{
URL url = invoker.getUrl();
String sideKey = url.getParameter(Constants.SIDE_KEY);
String interfaceName =url.getServiceInterface();
String methodName = invocation.getMethodName();
RpcStatus count = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
String eventName = "";
int max = 0;
if(Constants.PROVIDER_SIDE.equals(sideKey)){
max = url.getMethodParameter(methodName, Constants.EXECUTES_KEY, 0);
eventName = "provider:(" + interfaceName+"."+ methodName + ")-SerialID:(" + ServialContext.getCurServial()+")";
}else if(Constants.CONSUMER_SIDE.equals(sideKey)){
max = invoker.getUrl().getMethodParameter(methodName, Constants.ACTIVES_KEY, 0);
eventName = "consumer:(" + interfaceName+"."+ methodName + ")-SerialID:(" + ServialContext.getCurServial()+")";
}
Cat.logEvent("DUBBO.NettyConnection", eventName, Event.SUCCESS, "max:" + max + JSONObject.toJSONString(count));
}catch(Exception e){
}
return invoker.invoke(invocation);
}
}
Dubbo SPI接口声明
在src/main/resource下新建目录
META-INF/INF
目录下新建文件,名称如下:
com.alibaba.dubbo.rpc.Filter
内容为:
activeCnt=com.niwodai.inf.cat.dubbo.connection.ActiveCntFilter
接入文档
1.服务提供方增加最大连接数,具体数字根据自己的服务情况来
executes="100"
技术中心 > Dubbo连接数及线程池监控 > 5.png
2. 服务消费方增加最大连接数,具体数字根据自己的服务情况来定
actives="100"
技术中心 > Dubbo连接数及线程池监控 > 3.png
备注:只要打开上面两个,dubbo连接数监控默认是加上的,可以通过disconf中配置的openCat开关来打开和关闭
openCat=true
监控结果示例(监控数据是在当前请求之前的数据,不包括本次的,活跃连接数,成功数都要少一个):
{"active":0,"averageElapsed":0,"averageTps":0,"failed":0,"failedAverageElapsed":0,"failedElapsed":0,
"failedMaxElapsed":0,"maxElapsed":0,"succeeded":0,"succeededAverageElapsed":0
,"succeededElapsed":0,"succeededMaxElapsed":0,"total":0,"totalElapsed":0}
max:设置的 最大连接数,消费端超过这个连接数,会等待,等待超时就异常;服务端超过这个连接数,直接异常。服务消费方:ActiveLimitFilter 服务提供方:ExecuteLimitFilter
active:当前活跃的连接数
averageElapsed:平均耗时
averageTps:平均每秒事务请求数,可以看着QPS TPS (transaction per second)
failed:调用失败的次数
failedAverageElapsed:调用失败的平均耗时
failedElapsed:失败的总耗时
failedMaxElapsed:失败调用最大耗时
maxElapsed:所有请求最大耗时
succeeded:成功的总次数
succeededAverageElapsed:平均请求的平均耗时
succeededMaxElapsed:成功请求的最大耗时
total:总的请求次数
totalElapsed:总的耗时