业务背景
有时候日志的信息比较多,怎么样才可以让系统做到自适应采样呢?
拓展阅读
日志开源组件(一)java 注解结合 spring aop 实现自动输出日志[1]
日志开源组件(二)java 注解结合 spring aop 实现日志traceId唯一标识[2]
日志开源组件(三)java 注解结合 spring aop 自动输出日志新增拦截器与过滤器[3]
日志开源组件(四)如何动态修改 spring aop 切面信息?让自动日志输出框架更好用[4]
日志开源组件(五)如何将 dubbo filter 拦截器原理运用到日志拦截器中?[5]
自适应采样
是什么?
系统生成的日志可以包含大量信息,包括错误、警告、性能指标等,但在实际应用中,处理和分析所有的日志数据可能会对系统性能和资源产生负担。
自适应采样在这种情况下发挥作用,它能够根据当前系统状态和日志信息的重要性,智能地决定哪些日志需要被采样记录,从而有效地管理和分析日志数据。
采样的必要性
日志采样系统会给业务系统额外增加消耗,很多系统在接入的时候会比较排斥。
给他们一个百分比的选择,或许是一个不错的开始,然后根据实际需要选择合适的比例。
自适应采样是一个对用户透明,同时又非常优雅的方案。
如何通过 java 实现自适应采样?
接口定义
首先我们定义一个接口,返回 boolean。
根据是否为 true 来决定是否输出日志。
百分比概率采样
我们先实现一个简单的概率采样。
0-100 的值,让用户指定,按照百分比决定是否采样。
实现起来也非常简单,直接一个随机数,然后比较大小即可。
自适应采样
思路
我们计算一下当前日志的 QPS,让输出的概率和 QPS 称反比。
代码实现
每次累加次数超过限定次数之后,我们就更新一下对应的日志概率。
最后的概率计算和上面的百分比类似,不再赘述。
自适应代码-改良
问题
上面的自适应算法一般情况下都可以运行的很好。
但是有一种情况会不太好,那就是流量从高峰期到低峰期。
比如凌晨11点是请求高峰期,我们的输出日志概率很低。深夜之后请求数会很少,想达到累计值就会很慢,这个时间段就会导致日志输出很少。
如何解决这个问题呢?
思路
我们可以通过固定时间窗口的方式,来定时调整流量概率。
java 实现
我们初始化一个定时任务,1min 定时更新一次。
其中更新概率的逻辑和上面类似:
小结
让系统自动化分配资源,是一种非常好的思路,可以让资源利用最大化。
实现起来也不是很困难,实际要根据我们的业务量进行观察和调整。
开源地址
auto-log https://github.com/houbb/auto-log
References
日志开源组件(一)java 注解结合 spring aop 实现自动输出日志:https://houbb.github.io/2023/08/06/auto-log-01-overview
日志开源组件(二)java 注解结合 spring aop 实现日志traceId唯一标识:https://houbb.github.io/2023/08/06/auto-log-02-trace-id
日志开源组件(三)java 注解结合 spring aop 自动输出日志新增拦截器与过滤器:https://houbb.github.io/2023/08/06/auto-log-03-filter
日志开源组件(四)如何动态修改 spring aop 切面信息?让自动日志输出框架更好用:https://houbb.github.io/2023/08/06/auto-log-04-dynamic-aop
日志开源组件(五)如何将 dubbo filter 拦截器原理运用到日志拦截器中?:https://houbb.github.io/2023/08/06/auto-log-05-dubbo-interceptor
领取专属 10元无门槛券
私享最新 技术干货