首页 > 其他分享 >关于「日志采样」的一些思考及实践

关于「日志采样」的一些思考及实践

时间:2024-02-02 10:32:25浏览次数:25  
标签:采样 异步 请求 api 线程 思考 日志

一、背景:

系统日志可用于追踪用户操作轨迹,异常情况下,合理的日志有助于快速排查、定位问题,毫无疑问,打印日志对于系统是很重要的。

当业务规模较小时,大家都倾向于享受日志带来的便利,从而忽略日志带来的潜在的负面影响,缺乏对日志的管控。在JD当前用户量、业务规模下,绝大多数C端系统、甚至B端系统都是高吞吐的,毫无疑问,过大的日志量对系统的性能、磁盘IO有着显著负面影响,赶上大促时,问题尤为突出。日志在为我们提供便利的同时,也无时无刻成为一根刺,时不时刺我们一下。

作为一个共性问题,由于集团暂没推出统一的日志框架,不少团队都会尝试基于log4j、logback 进行轻度的封装,通过跟配置中心联动,增加一些诸如 '动态降级' 的功能、来缓解日志带来的负面影响。降级带来的效果是显著的,但同时也让系统丧失了记录 '操作轨迹' 的能力,从而又带来了新的问题。

此时,很容易想到,可以通过对 '请求' 采样,实现请求日志的采样输出,并通过控制采样比例平衡不同场景下日志对性能的影响,系统吞吐量较大时,降级采样比例,系统吞吐量较低时,提高采样比例。

二、正文:

在请求入口处,通过一定的采样算法,计算当前请求是否采样,并借助 Java 的 ThreadLocal 机制,可以实现当前请求线程的日志采样。但是,大部分关注日志性能的系统,往往处理逻辑也是复杂的,会有各样的异步运算逻辑,因此,大量的日志不一定来自请求线程,更多的可能来自子线程、线程池线程,甚至嵌套在线程池线程下的线程。

如何将请求线程、子线程、线程池线程统一协调起来,实现 '采样标识' 的跨线程透传,从而确保请求维度采样的一致性,是本文关注的重点,希望可以给大家提供一些思路、并附上我们业务场景下的具体案例。

(1) 可以像 Transmittable Thread Local 一样,通过对线程池类、或者任务类(Runnable、Callable)进行包装,将透传逻辑封装起来,JD内部比较典型的用法有 pfinder、jade。

必须承认,使用这种方式实现是有一定优势的,但是奈何现在各团队都有自己独特功能的线程池包装类,并已经在业务系统中广泛使用,如果此时再增加一个处理 '日志采样' 的包装,会出现嵌套包装的情况,这样会让程序变得混乱,增加理解成本,由于各包装实现之间缺乏磨合,甚至面临不可控的风险,这样做甚至有 '添乱' 的嫌疑,我认为至少在当前的环境下是不可取的。

(2)直接粗暴一些,在业务系统中,涉及子线程、线程池的地方,通过代码 '显式的' 将 '采样标识' 不断透传。

这样做是能达到目的的,但是,会有大量的逻辑代码和业务耦合的情况(线程池越多,业务越复杂,耦合越严重),虽然单系统改造量不大(当然,这个也是因系统而异),但是辐射面太广,需要各业务系统都要配合改造,同时有影响业务逻辑的风险,也不可取。

(3)将请求线程的控制逻辑跟具体业务解耦开来,封装为一个组件,并在组件中提供合适的 api,将组件复用于各业务系统,并根据业务系统具体情况,来决策是否使用 api 来处理异步线程(子线程、线程池线程的统一简称)的情况。

在没有特别合适的、集团级统一api的情况下,这是一种较为务实的做法,通过接入抽象组件来控制请求线程的日志采样,并通过扩展 api 来协调请求线程和异步线程的采样一致性,并根据业务系统的实际情况,来决策是否需要 '修改代码' 来协调异步线程。

如果业务系统中使用异步线程的处理逻辑较少,只接入组件,进行请求线程的日志采样即可

如果业务系统中大量使用异步线程做逻辑,可接入组件再针对必要的地方通过扩展 api 来协调请求线程和异步线程的采样一致性

除上述外,应该还有其他的办法,比如 AOP 机制,但是 AOP 只能到最低方法粒度,对于存量系统来说,改造量还是偏大,如果是新系统开发,可以考虑。


最后,上面的思考都是偏向全局的,在具体实现时,需要考虑、斟酌的细节还有很多、下面抛砖引玉列出一些,希望对大家拓展思路有所帮助!

采样的算法,是 '随机' 还是 '对 traceId 取模',然后通过配置中心控制取样比例

甚至跟入参关联起来,对特定场景(对哪个接口、方法,按什么规则进行入参筛选)进行采样,即所谓场景化采样

扩展 api 应该提供哪些功能,怎么封装能做到让业务应用改动量最少?

怎么保证全局(包括异步线程日志)请求 traceId 的一致性,这方面其实 pfinder 也有方案可供参考

采样比例的最小粒度,是 百分之一、千分之一、还是万分之一?

整系统使用一个采样概率(即当前请求命中采样时,各级别都打),还是各级别分别设置(分别设置时还要考虑联动)

通常,我们倾向于,如果需要对当前请求进行采样,可能 info、error 一块打,也可能只打 error,但是不太可能只打 info 不打 error,所以需要有一个策略去控制

当大量 error 产生时,怎么收敛日志?控制打印速率?甚至可以晋级一步,将磁盘IO 和打印速率联动

三、实践:

促销交易这边目前恰好在做这方面相关的技术改造,通过在目前既存日志组件(通过 JD JSF 前置过滤器实现)基础上,实现请求线程的日志采样,并提供扩展 api 给业务系统,实现整体上请求维度的日志采样,从而尽可能的减少业务系统的改造,以下流程图描述了大致落地过程,供参考,有兴趣的可以评论区留言进一步探讨具体落地细节。

关于「日志采样」的一些思考及实践_封装


涉及异步线程时,使用扩展 api 改造也相对简洁:

// 改造前,线程池任务执行逻辑
threadPoolExecutor.execute(() -> "your business logic");

// 使用扩展 api 改造后,对 '线程池执行逻辑' 进行包装,实现 '采样标识' 的跨线程透传
threadPoolExecutor.execute(XxxUtils.wrap(() -> "your business logic"));

作者:京东零售 卢吉欣

来源:京东云开发者社区 转载请注明来源

标签:采样,异步,请求,api,线程,思考,日志
From: https://blog.51cto.com/u_15714439/9543302

相关文章

  • 关于「日志采样」的一些思考及实践
    一、背景:系统日志可用于追踪用户操作轨迹,异常情况下,合理的日志有助于快速排查、定位问题,毫无疑问,打印日志对于系统是很重要的。当业务规模较小时,大家都倾向于享受日志带来的便利,从而忽略日志带来的潜在的负面影响,缺乏对日志的管控。在JD当前用户量、业务规模下,绝大多数C端系统、......
  • 【思考待定】系统的权限如何管理呢?
    1  思考最近在整理我的个人系统,系统最重要的也是比较复杂的就是权限控制:权限基本分两大类:资源权限和数据权限。资源权限:比如页面、菜单、按钮呀、接口都属于资源权限数据权限:比如仅自己、仅部门等,操作数据的范围权限而一个系统从全局的视角来看的话,从上到下的话我想的是......
  • 质量保障:成本和价值的思考
    去年写了很多关于质量保障的文章,体系建设的方法论不少,技术实践的案例也覆盖了绝大多数测试活动范畴。有粉丝在公众号后台留言说:看了很多方法论和技术案例,但是落地产生成果为什么这么难?老实说,这个问题其实很好回答:高投入可能有高质量,低投入几乎不会有高质量。质量保障这件事,谈到......
  • AI生成前端组件的价值思考
    想法来源这个想法来源于我自己的需求,我自己首先就是最精准的目标用户,在这个AI时代,我希望AI可以帮我尽量多地干活。结合自己的日常独立开发情况,发现花在调前端组件样式上的时间很多,因此思考能不能让AI把这部分活接过去,或者能提高一些效率也行。适合用户外行或刚入门的前端开发......
  • 浮木云学习日志(6)---代码导出
    随着对浮木云的了解愈加深入,不知不觉已经形成5篇随笔记录了,新进来的小伙伴想跟我一样了解浮木云的话,可直接进入官网浮木云-产品设计开发智能助手进行了解使用,如果不太清楚使用的话,可直接查看我之前的5篇小记,帮助你快速入门。之前刚介绍浮木云的时候,发现这个小众平台具有导出源代......
  • DOCKER安全及日志管理
    DOCKER安全及日志管理容器的安全性问题的根源在于容器和宿主机共享内核。如果容器里的应用导致Linux内核崩溃,那么整个系统可能都会崩溃。与虚拟机是不同的,虚拟机并没有与主机共享内核,虚拟机崩溃一般不会导致宿主机崩溃。 Docker架构缺陷与安全机制1.容器之间的局域网攻击......
  • 【idea系列】控制台日志打印乱码
    0x00中文乱码idea控制台输出日志为中文乱码,如图:0x01解决方案1.idea配置支持中文字体2.tomcat运行环境配置utf-8新增内容:-Dfile.encoding=UTF-83.idea配置vmoption新增内容:-Dfile.encoding=UTF-84.重启idea一定要记得重启idea。5.结果......
  • 基于文本环境下的强化学习算法:文本游戏环境下的强化学习的一些思考?文本比图像的抽象度
    这里说一个个人的思考,那就是:文本比图像的抽象度更高,或许基于文本的强化学习算法更加强大。基于文本环境的强化学习算法一直被认为是比较小众的一个场景,一般认为文本的AI处理能力是不如图片的,尤其文本对事物描述的能力是十分有限的,但是随着ChatGPT-3.5的大火,或许这个状况得到了......
  • MYSQL日志
    要开启MySQL的二进制日志(binlog),需按照以下步骤进行操作:1.打开MySQL配置文件:首先,找到MySQL的配置文件my.cnf(或my.ini,视操作系统而定)。2.找到并修改binlog相关配置:在配置文件中找到以下几个参数,如果没有则手动添加:[mysqld]log-bin=mysql-bin#开启binlog,设置binlog......
  • 如何对混合日志进行自动化解析
    本文分享自华为云社区《【AIOps】日志分析领域难题:如何对混合日志进行自动化解析?》,作者:DevAI。AIOps智能运维,是指将AI应用于运维领域,基于已有的运维数据通过AI的方式来解决传统运维没办法解决的问题;本文聚焦在AIOps领域的日志解析子课题。现有的日志解析器 (logparser) 在实际......