星尘监控只统计平均耗时、最大耗时、最小耗时,很多时候,容易出现“被平均”的情况。为了提升监控效果,星尘监控计划增加TP95和TP99的监控指标,也就是统计95%位置以及99%位置的耗时值。TP95表示在该统计区间内,95%的耗时都小于该值。
示例数据如下(三天内可以直接从星尘查阅 http://star.newlifex.com/Monitors/traceData?appId=4&date=2021-05-26&name=TraceMinuteStat-FindByTrace):
星尘客户端(集成在应用内),针对TraceMinuteStat-FindByTrace埋点的多次调用,在客户端本地完成统计,得到次数、错误数、平均耗时、最大耗时、最小耗时,然后每分钟上传一次。例如,最下面一行,14:06的时候上传了一行数据,说明14:05~14:06这一分钟内,该埋点共有51次调用,平均耗时29ms,最大465ms,最小1ms。具体是哪51次调用,星尘之后抽样上传一点数据,意思一下就好。因此无法通过全量明细数据计算TP95和TP99。这里举例的51次调用,测试需要,恰巧全部上传了:
数据导出Csv,精简字段后整理如下:
Success,Cost,Error,CreateIP,CreateTime 1,5,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,407,,127.0.0.1,2021/5/26 14:06 1,5,,127.0.0.1,2021/5/26 14:06 1,13,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,42,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,8,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,8,,127.0.0.1,2021/5/26 14:06 1,11,,127.0.0.1,2021/5/26 14:06 1,229,,127.0.0.1,2021/5/26 14:06 1,6,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,5,,127.0.0.1,2021/5/26 14:06 1,125,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,5,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,2,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,53,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,6,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,4,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,3,,127.0.0.1,2021/5/26 14:06 1,5,,127.0.0.1,2021/5/26 14:06 1,1,,127.0.0.1,2021/5/26 14:06 1,465,,127.0.0.1,2021/5/26 14:06 1,5,,127.0.0.1,2021/5/26 14:06 1,5,,127.0.0.1,2021/5/26 14:06 1,5,,127.0.0.1,2021/5/26 14:06
实际上就是统计Cost字段,已经有了平均耗时、最大耗时、最小耗时等。在客户端计算该埋点的TP95和TP99问题并不是特别大。星尘线上经验里面,已知最繁忙接口每分钟3万次调用,利用数组存储这3万次耗时,上传前计算TP95和TP99,计算量很小,内存占用量小于120k字节,然后把计算得到的分钟级TP95和TP99传上去。
那么星尘服务端就有了该接口的分钟级统计数据,包括TP95和TP99,大概会显示在这里:
就假设在最小耗时右边,再加两个列(TP95和TP99)吧。需要重申的是,51次调用的明细,并不会全部传到服务端,这里只是因为测试需要,恰巧传上来了而已。
我们在Excel里面计算一下TP95和TP99,排序公式:=RANK(B2,B:B,1),TP95计算公式:=INDEX(B:B,MATCH(ROUND(COUNT(B:B)*0.95,0),C:C,0))
计算得到TP95是125,TP99是407。
那么这一次埋点上传到服务端的分钟级统计就是:51、0、29、465、1、125、407
星尘监控服务端需要定期计算小时级和每日级的埋点统计。如何去计算该埋点的小时级TP95和TP99呢?
一个小时内,最多有60个分钟级统计,也就是有60对TP95和TP99,当然还有别的一些数据(次数、平均耗时、最大耗时、最小耗时),这是我们所能利用的全部数据。
当然,我们也可以继续修改星尘客户端,让它在计算TP95和TP99时,计算并上传更多的数据,但是不可能上传全部埋点的实际耗时值。