use of com.alibaba.metrics.common.MetricObject in project dubbo by alibaba.
the class MetricsFilterTest method testInvokeMetricsMethodService.
public void testInvokeMetricsMethodService() {
IMetricManager metricManager = MetricManager.getIMetricManager();
metricManager.clear();
MetricsFilter metricsFilter = new MetricsFilter();
Invocation sayNameInvocation = new RpcInvocation("sayName", DemoService.class.getName(), "", new Class<?>[0], new Object[0]);
Invocation echoInvocation = new RpcInvocation("echo", DemoService.class.getName(), "", new Class<?>[] { Integer.class }, new Integer[] { 1 });
RpcContext.getContext().setRemoteAddress(host, url.getPort()).setLocalAddress(host, NetUtils.getAvailablePort());
RpcContext.getContext().setUrl(serviceInvoker.getUrl().addParameter(SIDE_KEY, PROVIDER_SIDE).addParameter(TIMEOUT_KEY, 300));
AppResponse response = AppResponseBuilder.create().build();
onInvokeReturns(response);
for (int i = 0; i < 50; i++) {
metricsFilter.invoke(serviceInvoker, sayNameInvocation);
metricsFilter.invoke(serviceInvoker, echoInvocation);
try {
metricsFilter.invoke(timeoutInvoker, sayNameInvocation);
} catch (RpcException e) {
// ignore
}
try {
metricsFilter.invoke(timeoutInvoker, echoInvocation);
} catch (RpcException e) {
// ignore
}
}
Protocol protocol = DubboProtocol.getDubboProtocol();
URL metricUrl = URL.valueOf("dubbo://" + url.getHost() + ":" + url.getPort() + "/" + MetricsService.class.getName() + "?" + METRICS_PORT + "=" + port);
Invoker<MetricsService> invoker = protocol.refer(MetricsService.class, metricUrl);
Invocation invocation = new RpcInvocation("getMetricsByGroup", DemoService.class.getName(), "", new Class<?>[] { String.class }, new Object[] { DUBBO_GROUP });
try {
Thread.sleep(15000);
} catch (Exception e) {
// ignore
}
String resStr = invoker.invoke(invocation).getValue().toString();
List<MetricObject> metricObjectList = new Gson().fromJson(resStr, new TypeToken<List<MetricObject>>() {
}.getType());
Map<String, Map<String, Object>> methodMetricMap = new HashMap<>();
for (int i = 0; i < metricObjectList.size(); i++) {
MetricObject object = metricObjectList.get(i);
String service = object.getTags().get("service");
String method = service + "." + object.getTags().get("method");
String metric = object.getMetric().substring(object.getMetric().lastIndexOf(".") + 1);
Map map = methodMetricMap.get(method);
if (map == null) {
map = new HashMap();
methodMetricMap.put(method, map);
}
map.put(metric, object.getValue());
}
Assertions.assertEquals(50.0, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void sayName()").get("success_bucket_count"));
Assertions.assertEquals(50.0, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void echo(Integer)").get("success_bucket_count"));
Assertions.assertEquals(50.0, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void sayName()").get("timeoutError_bucket_count"));
Assertions.assertEquals(50.0, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void echo(Integer)").get("timeoutError_bucket_count"));
Assertions.assertEquals(100.0 / 15, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void sayName()").get("qps"));
Assertions.assertEquals(100.0 / 15, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void echo(Integer)").get("qps"));
Assertions.assertEquals(50.0 / 100.0, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void sayName()").get("success_rate"));
Assertions.assertEquals(50.0 / 100.0, methodMetricMap.get("org.apache.dubbo.monitor.dubbo.service.DemoService.void echo(Integer)").get("success_rate"));
invoker.destroy();
}
use of com.alibaba.metrics.common.MetricObject in project dubbo by alibaba.
the class MetricsFilter method getThreadPoolMessage.
private List<MetricObject> getThreadPoolMessage() {
DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension();
Map<String, Object> executors = dataStore.get(EXECUTOR_SERVICE_COMPONENT_KEY);
List<MetricObject> threadPoolMetricList = new ArrayList<>();
for (Map.Entry<String, Object> entry : executors.entrySet()) {
ExecutorService executor = (ExecutorService) entry.getValue();
if (executor instanceof ThreadPoolExecutor) {
ThreadPoolExecutor tp = (ThreadPoolExecutor) executor;
threadPoolMetricList.add(value2MetricObject("threadPool.active", tp.getActiveCount(), MetricLevel.MAJOR));
threadPoolMetricList.add(value2MetricObject("threadPool.core", tp.getCorePoolSize(), MetricLevel.MAJOR));
threadPoolMetricList.add(value2MetricObject("threadPool.max", tp.getMaximumPoolSize(), MetricLevel.MAJOR));
threadPoolMetricList.add(value2MetricObject("threadPool.current", tp.getPoolSize(), MetricLevel.MAJOR));
}
}
return threadPoolMetricList;
}
use of com.alibaba.metrics.common.MetricObject in project dubbo by alibaba.
the class MetricsFilterTest method testInvokeMetricsService.
public void testInvokeMetricsService() {
IMetricManager metricManager = MetricManager.getIMetricManager();
metricManager.clear();
MetricsFilter metricsFilter = new MetricsFilter();
Invocation invocation = new RpcInvocation("sayName", DemoService.class.getName(), "", new Class<?>[0], new Object[0]);
RpcContext.getContext().setRemoteAddress(host, url.getPort()).setLocalAddress(host, NetUtils.getAvailablePort());
RpcContext.getContext().setUrl(serviceInvoker.getUrl().addParameter(SIDE_KEY, PROVIDER_SIDE).addParameter(TIMEOUT_KEY, 300));
AppResponse response = AppResponseBuilder.create().build();
onInvokeReturns(response);
for (int i = 0; i < 50; i++) {
try {
metricsFilter.invoke(serviceInvoker, invocation);
metricsFilter.invoke(timeoutInvoker, invocation);
} catch (RpcException e) {
// ignore
}
}
Protocol protocol = DubboProtocol.getDubboProtocol();
URL metricUrl = URL.valueOf("dubbo://" + url.getHost() + ":" + url.getPort() + "/" + MetricsService.class.getName() + "?" + METRICS_PORT + "=" + port);
Invoker<MetricsService> invoker = protocol.refer(MetricsService.class, metricUrl);
invocation = new RpcInvocation("getMetricsByGroup", DemoService.class.getName(), "", new Class<?>[] { String.class }, new Object[] { DUBBO_GROUP });
try {
Thread.sleep(5000);
} catch (Exception e) {
// ignore
}
String resStr = invoker.invoke(invocation).getValue().toString();
List<MetricObject> metricObjectList = new Gson().fromJson(resStr, new TypeToken<List<MetricObject>>() {
}.getType());
Map<String, Object> metricMap = new HashMap<>();
for (int i = 0; i < metricObjectList.size(); i++) {
MetricObject object = metricObjectList.get(i);
String metric = object.getMetric().substring(object.getMetric().lastIndexOf(".") + 1);
if ((double) object.getValue() > 0.0 && object.getMetricLevel().equals(MetricLevel.MAJOR))
metricMap.put(metric, object.getValue());
}
Assertions.assertEquals(50.0, metricMap.get("success_bucket_count"));
Assertions.assertEquals(50.0, metricMap.get("timeoutError_bucket_count"));
Assertions.assertEquals(100.0, metricMap.get("bucket_count"));
Assertions.assertEquals(100.0 / 5, metricMap.get("qps"));
Assertions.assertEquals(50.0 / 100.0, metricMap.get("success_rate"));
invoker.destroy();
}
use of com.alibaba.metrics.common.MetricObject in project dubbo by alibaba.
the class MetricsFilter method initMetricsInvoker.
private Invoker<MetricsService> initMetricsInvoker() {
return new Invoker<MetricsService>() {
@Override
public Class<MetricsService> getInterface() {
return MetricsService.class;
}
@Override
public Result invoke(Invocation invocation) throws RpcException {
String group = invocation.getArguments()[0].toString();
MetricRegistry registry = MetricManager.getIMetricManager().getMetricRegistryByGroup(group);
SortedMap<MetricName, FastCompass> fastCompasses = registry.getFastCompasses();
long timestamp = System.currentTimeMillis();
double rateFactor = TimeUnit.SECONDS.toSeconds(1);
double durationFactor = 1.0 / TimeUnit.MILLISECONDS.toNanos(1);
MetricsCollector collector = MetricsCollectorFactory.createNew(CollectLevel.NORMAL, Collections.EMPTY_MAP, rateFactor, durationFactor, null);
for (Map.Entry<MetricName, FastCompass> entry : fastCompasses.entrySet()) {
collector.collect(entry.getKey(), entry.getValue(), timestamp);
}
List<MetricObject> res = collector.build();
res.addAll(getThreadPoolMessage());
return AsyncRpcResult.newDefaultAsyncResult(JSON.toJSONString(res), invocation);
}
@Override
public URL getUrl() {
return URL.valueOf(protocolName + "://" + NetUtils.getIpByConfig() + ":" + port + "/" + MetricsService.class.getName());
}
@Override
public boolean isAvailable() {
return false;
}
@Override
public void destroy() {
}
};
}
Aggregations