首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

日志开源组件(六)Adaptive Sampling 自适应采样

业务背景

有时候日志的信息比较多,怎么样才可以让系统做到自适应采样呢?

拓展阅读

日志开源组件(一)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

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OJTneBPCIt3Yz6-j0CuTNonQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券