开发pinpoint插件log4j2

pinpoint是一个非常优秀的APM工具,适用于使用Java构建的大型分布式系统。受到论文 Dapper的启发,pinpoint提供了一套体验很好的调用链分析视图。

00 前言

首先,说明一下开发pinpoint的log4j2插件的初衷,我们最近在做微服务治理和PAAS平台,当我们做到微服务监控的时候,就遇到微服务治理中的一个重要问题,就是大量微服务被创建,并上线运行,它们之间的调用关系是怎样的?其中的数据流向是什么样?如果我们对这些信息没有一个全面的掌握的话,微服务化的系统简直就成了一堆乱麻,出了问题完全不知道从何下手。

其次,最近流行的微服务解决方案:service Mesh,又在微服务中加入了很多独立进程的组件,它们来完成微服务的治理工作,当数据流量经过它们的时候,数据是否能够完整,这些组件是否是处在正常工作的状态?都需要我们监控掌握。

这些问题不仅需要各自的监控告警,还需要一个整体调用链的监控。这时我们就选择了Pinpoint调用链监控工具,在众多的调用链监控工具(cat、skywalking、zipkin等)中,我们选择它主要从以下几个方面考虑:

  • 代码的侵入程度
  • 插件生态的完整性
  • 监控的力度
  • 是否符合标准规范(openTrancing)

综合以上的种种考虑,选择了pinpoint来实现这个调用链的监控功能。

但是由于我们选择的微服务技术栈的先进性,有个别功能pinpoint的现有插件不能完成监控,于是就需要我们做一定的定制性开发。

第一个要实现的就是log4j2日志组件的pinpoint插件,这个插件的功能就是将调用链的一些信息放在log插件的MDC中,以方便将这些信息输出打印到日志文件中。

为什么选择log4j2作为log日志的输出组件呢?官方的pinpoint插件中包含有log4j和logback的插件,如果选择这两个日志组件,pinpoint不需要改造即可完成功能需求。我们的理由是,首先log4j不能满足我们的日志文件切分和滚动覆盖的需求,logback有一些性能问题。从log日志组件的发展上看,logack是log4j的升级版,log4j2是logback的升级版,每一个升级版本都做了很多优化。所以从需求和性能出发我们选择最新的log4j2.

可能读者们还有一个疑问,为什么需要将调用链的信息打印到日志文件中呢?这是因为,当系统运行出现问题的时候,我们需要快速排查这个问题,这时候需要能将各个监控信息快速关联起来,更多有关联的信息,才有助于我们排查问题,否则一堆孤立的信息对我们帮助是不大的。通常我们的日志信息是存储在日志中心(ELK)的,我们通过一定的格式化手段将每条日志信息中都带有调用链的tranceId信息,这时我们就可以拿在pinpoint中的任意一条调用链的tranceId,到日志中心搜索出对应的所有的日志。

各种理由准备充分,确定要开发log4j2的pinpoint日志插件了。

01 准备工作

在开发之前需要做几个准备工作,以便我们能够顺利开展log4j2的插件开发。

  1. 下载源代码之前,先将代码:naver/pinpoint,fork一份到自己的仓库,方便自己提交代码。
  2. 从自己github仓库中下载fork的pinpoint源代码。
  3. 进入根目录pinpoint/下整体编译一下:mvn clean install -Dmaven.test.skip=true,如果网络好的话,很快就能编译成功。
  4. 使用IDEA打开源代码。

02 开发代码

在开发pinpoint插件之前,需要阅读一下官方文档中的pinpoint插件开发指南。但是我们现在要开发的log4j2的插件功能相对简单,从上述描述中,可以知道,主要就是将pinpoint调用链相关信息输出到日志中。

首先我们查看一下,log4j和logback的插件是如何开发的,我们模仿一下即可。主要包括一下几点:

  • 在plugins模块下创建log4j2的maven子模块,创建完成如下图:


    log4j2-module
  • 在pom中添加log4j2的依赖:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.10.0</version>
    <scope>provided</scope>
</dependency>
  • 找到代码插入点 org.apache.logging.log4j.ThreadContext
  • 在拦截器中,将需要的信息插入到其中。
  • 这样信息就到了log的 MDC 中。

完整的代码参见我的github。log4j2的插件代码参考官方github中的一个issue问题。

03 编译

在编译之前需要注意几点:

  • 在plugins的pom文件中添加log4j2的maven坐标:
<dependency>
    <groupId>com.navercorp.pinpoint</groupId>
    <artifactId>pinpoint-log4j2-plugin</artifactId>
    <version>${project.version}</version>
</dependency>
  • 修改编译的jdk版本,由jdk1.6升级为jdk1.7,原因是我们依赖的log4j2的jar要求jdk的版本是1.7+,在总的pom文件中修改(操作系统的环境变量JAVA_7_HOME要存在):
<jdk.version>1.7</jdk.version>
<jdk.home>${env.JAVA_7_HOME}</jdk.home>
  • 升级了jdk版本之后,编译会发现,pinpoint中有个模块是依赖jdk1.6的,就是 pinpoint-profiler-optional-jdk6,它是一个可选的模块,于是需要我们在编译的是排除掉。

这样最后我们编译的命令就是:mvn -pl '!com.navercorp.pinpoint:pinpoint-profiler-optional-jdk6' clean install -Dmaven.test.skip=true,不出意外我们应该能编译成功。

最后编译完成之后,可以在agent模块的target目录下找到我们需要的最新的agent包,拿走替换原来的agent即可实现支持log4j2了,当然需要在pinpoint.config中需要配置开启:profiler.log4j2.logging.transactioninfo=true

04 结束

到此为止,完成了第一个pinpoint插件的开发,相对比较简单,继续深入学习pinpoint的实现原理,希望能根据项目需求开发更多的插件,以实现我们全链路连贯性监控的目标。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容