大众点评Cat源码阅读(九)——报表部分内存数据结构及数值计算公式

一、内存报表数据结构

TransactionReport报表的数据结构如下:

输入图片说明

CrossReport内存报表数据结构

输入图片说明

数据示例:

<?xml version="1.0" encoding="utf-8"?>
<cross-report domain="monitor-cat" startTime="2017-12-28 18:00:00" endTime="2017-12-28 18:59:59">
   <domain>monitor-cat</domain>
   <domain>monitor-dubbo</domain>
   <ip>10.15.83.181</ip>
   <local id="10.15.83.181">


      <remote id="10.15.83.181(monitor-cat):Pigeon.Client" role="Pigeon.Client" app="monitor-cat" ip="10.15.83.181(monitor-cat)">
         <type id="PigeonService" totalCount="19" failCount="0" failPercent="0.00" avg="0.00" sum="28.89" tps="0.00">
            <name id="DubboProviderService.getProviderServiceName" totalCount="19" failCount="0" failPercent="0.00" avg="0.00" sum="28.89" tps="0.00"/>
         </type>
      </remote>


      <remote id="10.15.83.181(monitor-dubbo):Pigeon.Server" role="Pigeon.Server" app="monitor-dubbo" ip="10.15.83.181(monitor-dubbo)">
         <type id="PigeonCall" totalCount="19" failCount="0" failPercent="0.00" avg="0.00" sum="461.26" tps="0.00">
            <name id="DubboProviderService.getProviderServiceName" totalCount="19" failCount="0" failPercent="0.00" avg="0.00" sum="461.26" tps="0.00"/>
         </type>
      </remote>


   </local>
</cross-report>

二、计算公式

2.1 95线、99线

详见:

com.dianping.cat.consumer.transaction.TransactionStatisticsComputer.computeLineValue(Map<Integer, AllDuration>, double)
/**
	 * 统计95线,99.9线。
	 * 思路:
	 *    求请求的总数,假设是100,求线余下的数目,如果是95线,那余下是5,
	 *    将之前统计的durations放进treeMap里面,倒序
	 *    从前向后遍历,找到第5个元素,拿到对应的值
	 *    
	 *    基本上是按照95线的定义来取数的
	 * @param durations
	 * @param percent
	 * @return
	 */
	private double computeLineValue(Map<Integer, AllDuration> durations, double percent) {
		int totalCount = 0;
		Map<Integer, AllDuration> sorted = new TreeMap<Integer, AllDuration>(TransactionComparator.DESC);

		sorted.putAll(durations);

		for (AllDuration duration : durations.values()) {
			totalCount += duration.getCount();
		}

		int remaining = (int) (totalCount * (100 - percent) / 100);

		for (Entry<Integer, AllDuration> entry : sorted.entrySet()) {
			remaining -= entry.getValue().getCount();

			if (remaining <= 0) {
				return entry.getKey();
			}
		}

		return 0.0;
	}

2.2 方差

位置:

com.dianping.cat.consumer.transaction.TransactionStatisticsComputer.std(long, double, double, double)
/**
	  * sum2 = sum2 + sum;
	 * 求方差 value = sum2/count  - 均值*均值
	 *      value = 开方(value)
	 * 
	 * 
	 * @param count
	 * @param avg
	 * @param sum2
	 * @param max
	 * @return
	 */
	double std(long count, double avg, double sum2, double max) {
		double value = sum2 / count - avg * avg;

		if (value <= 0 || count <= 1) {
			return 0;
		} else if (count == 2) {
			return max - avg;
		} else {
			return Math.sqrt(value);
		}
	}

转载于:https://my.oschina.net/liangxiao/blog/1595818

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值