Magic v1 does not support record headers! 问题如何解决!过来看看你就知道了。
某天登录测试环境,发现登录验证码加载失败!F12查看请求,发现服务器硬盘空间不足。然后就顺其自然去找原因了。
输入 find . -type f -size +500M -print0 | xargs -0 du -h 查找服务器上大文件,结果出现了一个超级大的日志文件,高达33GB,就是它把服务器的硬盘给耗尽了。把它删除了, 前端加载验证码的问题就解决了。
但是呢,值得思考的一点,为什么测试环境一直以来都没问题,今天会出现这种问题呢?我们决定顺藤摸瓜,追溯下去。
然后,从33G的日志文件中抽取了一部分日志信息拿来分析。
很快,我们就定位到了错误代码位于 MemoryRecordBuilder.appenWithOffset() line:385。
仔细阅读了一下代码,发现它在这里判断了头部的参数!这里要交代一下背景,我们其中一个项目接入了kafka,但是我们是没有没有附加header的参数的。所以,这里就会抛出Magic v1 does not support record headers!这个异常。那么,问题来了,到底是谁偷偷地帮我们添加了这样的参数呢?
后来去咨询了一下同事,发现最近项目中接入了skywalking。那问题大概率是出在它身上了。
目标很明确了,直接去找skywalking,看看它又有什么说辞。
在服务器上找到skywalking的相关jar包,把它拉下来放到idea上分析一波。
首先看的是skywalking-agent.jar。大致看了一下它的目录结构,我把焦点关注放在了SkyWalkingAgent这个类上。
很快,我在代码中看到了PluginFinder pluginFinder 这个类,又联想起了先前在服务器上看到pluigns目录下面有kafka相关的插件。
看到这里,不禁窃喜,赶紧把这个jar包拉下来,剥开它的神秘外衣企图窥探一番。
先看了一波定义,发现kafka版本和我们项目现在用的正好匹配上了。然后展开目录结构,看看那些类名,我想这里已经很直接了,KafkaProducerInterceptor 这个类名是在是太具吸引力了。让我忍不住点开去看。so,点它。
点开以后,好家伙,仿佛突然发现了桃源圣地的渔夫一样,喜悦之色再也掩盖不住了。就是圈住的这行代码,在给我们的hear附加参数。那看到这里,问题的根本原因我们已经找到了。所以,我们要怎么解决它呢?建议,第一,你可以升级你的kafka版本;第二,你可以在插件中把这个插件给移除了。很遗憾,这两种方式我们都没来得及尝试,因为我们用来一种更加粗鲁暴力的动作去蹂躏它,你们猜猜会是什么?/阴险
想要更多吗?还想知道它在header里面塞了什么东西?让它如此充实。请继续往下看!
我们定位代码到最后,发现,它在往header里面塞入了tarceId用来做链路跟踪。这也正是skywalking的核心所在。
完!