主要用于服务的打点、数值分布以及延时统计。
实现分成下面几个部分:
1.客户端sdk;
2.发送进程;
3.接收进程;
4.web客户端展示;
1.sdk:
提供类似如下的接口:
log(name, count, value)
name是统计名称,与业务相关;
count是计数器;
value是分布的值,比如延迟;
count与value可以不同时存在,看具体使用需求。
业务进程调用sdk发送,sdk可以在业务进程内按时间做一个聚合,然后写入本地。
2.发送:
有一个专门的发送进程,负责将本地的聚合数据发送至远程数据服务器,可以是kafka等。这样业务进程的压力小。
3.接受:
接受聚合数据,落地存储。es,nosql之类的。需要支持多维度查询。
4.web展示:
grafana等。
工具类Util提供一个count接口:
count(name, c)。
Util存一个map,这里的name就是key,name可以是要监控的接口名。c表示接口调用次数,调一次接口c就是1。所以c一般就是1。Util会把name的value加一个c。这样这个name的value就会一直递增下去。我们可以让这个Util每隔一段时间t就发送一次map,这里可以做成异步的。下游有一个接收器,取到map的value就显示与上一个周期发来的value的差,那么这个数就可以表示在这个周期内接口的调用次数。最后可以把这个做成折线图,就做出一个简单的服务监控系统。
当然还可以监控延迟:
count(name,c,time),这里的time表示生成这个c的接口的调用的时间。还是周期性的发送map,只不过如果有time值,那么就在这个周期内按time排序,返回周期内time的最大值,平均值等,用来度量这个周期的平均延迟或者最大延迟。
当然设计的时候这个Util应该提供static方法,map应该是concurrentHashmap,而且value加c的时候要注意并发,最好使用atomic包。