APM钉钉告警二次开发pinpoint(附带源码)

一.简介

Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控、方法执行详情查看、应用状态信息监控等功能。基于GoogleDapper论文进行的实现,与另一款开源的全链路分析工具Zipkin类似,但相比Zipkin提供了无侵入式、代码维度的监控等更多的特性

二.主要功能

服务拓扑图:对整个系统中应用的调用关系进行了可视化的展示,单击某个服务节点,可以显示该节点的详细信息,比如当前节点状态、请求数量等

实时活跃线程图:监控应用内活跃线程的执行情况,对应用的线程执行性能可以有比较直观的了解

请求响应散点图:以时间维度进行请求计数和响应时间的展示,拖过拖动图表可以选择对应的请求查看执行的详细情况

请求调用栈查看:对分布式环境中每个请求提供了代码维度的可见性,可以在页面中查看请求针对到代码维度的执行详情,帮助查找请求的瓶颈和故障原因。

应用状态、机器状态检查:通过这个功能可以查看相关应用程序的其他的一些详细信息,比如CPU使用情况,内存状态、垃圾收集状态,TPS和JVM信息等参数。

三.架构组成

Pinpoint 主要由 3 个组件外加 Hbase 数据库组成,三个组件分别为:Agent、Collector 和Web UI。

  1. HBase (用于存储)
  2. Agent组件:用于收集应用端监控数据,无侵入式,只需要在启动命令中加入部分参数即可
  3. Collector组件:数据收集模块,接收Agent发送过来的监控数据,并存储到HBase
  4. WebUI:监控展示模块,展示系统调用关系、调用详情、应用状态等,并支持报警等功能

四.部署安装

(一)常用安装方式

1.在网上百度下载别人打好的war包进行部署使用,可调试监控,但是不可进行二次开发配置监控预警。

2.拉去官方代码

git?clone?https://github.com/naver/pinpoint-docker.gitgit clone https://gitee.com/mirrors/Pinpoint.git

安装步骤:

1.HBase

搭建 HBase 集群 - Apache HBase

运行./hbase-start

创建 HBase Schemas- 在hbase shell上执行
/scripts/hbase-create.hbase初始化数据库

2. 构建Pinpoint (仅当从源代码开始构建时需要)

Clone Pinpoint - git clone $PINPOINT_GIT_REPOSITORY

设置 JAVA_6_HOME 环境变量到 JDK 6 home 目录.

设置 JAVA_7_HOME 环境变量到 JDK 7+ home 目录.

设置 JAVA_8_HOME 环境变量到 JDK 8 home 目录.

设置 JAVA_9_HOME 环境变量到 JDK 9 home 目录.

设置 JAVA_HOME 环境变量到 JDK home 目录.

注意:不是开玩笑,必须同时安装四个版本jdk,而且要设置5个javahome环境变量,而且必须是jdk不能是openjdk!!!!!!!!!!!!!!!!!!!!!!

(10.7.xxx.xx服务器已安装该环境,如需打包pinpoint可自行使用)

在pinpoint根目录运行 mvn install -Dmaven.test.skip=true

3. Pinpoint Collector

部署 pinpoint-collector-$VERSION.war 到web容器

配置
pinpoint-collector.properties, hbase.properties.

启动容器

4. Pinpoint Web

部署 pinpoint-web-$VERSION.war 到web容器

配置 pinpoint-web.properties, hbase.properties.

启动容器

5.Pinpoint Agent

解压/移动 pinpoint-agent/ 到一个方便的位置 ($AGENT_PATH).

设置 -javaagent:$
AGENT_PATH/pinpoint-bootstrap-$VERSION.jar JVM 参数以便将agent附加到java应用

设置 -Dpinpoint.agentId 和
-Dpinpoint.applicationName 命令行参数

用上面的设置启动 java 应用

(二)安装参考文档

1.https://skyao.gitbooks.io/learning-pinpoint/content/installation/guide.html

2.https://naver.github.io/pinpoint/quickstart.html

四.使用规范

(一)服务地址

1.[http://10.7.xxx.xx:8085]无相关账号密码,后期可对应进行二次开发

(二)使用操作

仪表板:可针对应用节点的服务,端点,实例进行细度监控图标展示可针对数据库数据源的相关sql以及iqps等常用参数进行监控展示

拓扑图:各种图表应用实例全局展示,各种高大上

链路追踪:监控细度在接口级别

告警:可进行20多种监控数据的告警,可针对项目进行二次开发配置钉钉邮件

五.相关注意事项

1.traceid添加

可参考官方文档,描述很详细,无代码侵入,支持log4j,log4j2,logback
https://github.com/naver/pinpoint/blob/master/doc/per-request_feature_guide.md

traceid加入项目日志可进行日志查询时链路追踪,方便定位故障。

例如:使用logback

修改配置
pinpoint-agent/pinpoint.config

profiler.logback.logging.transactioninfo=true

修改项目配置logback.xml

%d{HH:mm}?%-5level?%logger{36}-?[TxId?:?%X{PtxId}?,?SpanId?:?%X{PspanId}]?%msg%n


2.消息通知配置

配置相关消息通知,目前已配置钉钉和邮件。

相关配置:

1.配置菜单页面

配置菜单

注册用户

创建用户组

添加用户到用户组

设置告警规则

2.熟悉相应告警规则和参数:

SLOW?COUNT?/?慢请求数当应用发出的慢请求数量超过配置阈值时触发。?SLOW?RATE?/?慢请求比例当应用发出的慢请求百分比超过配置阈值时触发。?ERROR?COUNT?/?请求失败数当应用发出的失败请求数量超过配置阈值时触发。?ERROR?RATE?/?请求失败率当应用发出的失败请求百分比超过配置阈值时触发。?TOTAL?COUNT?/?总数量当应用发出的所有请求数量超过配置阈值时触发。以上规则中,请求是当前应用发送出去的,当前应用是请求的发起者。以下规则中,请求是发送给当前应用的,当前应用是请求的接收者。SLOW?COUNT?TO?CALLEE?/?被调用的慢请求数量当发送给应用的慢请求数量超过配置阈值时触发。?SLOW?RATE?TO?CALLEE?/?被调用的慢请求比例当发送给应用的慢请求百分比超过配置阈值时触发。?ERROR?COUNT?TO?CALLEE?/?被调用的请求错误数当发送给应用的请求失败数量超过配置阈值时触发。?ERROR?RATE?TO?CALLEE?/?被调用的请求错误率当发送给应用的请求失败百分比超过配置阈值时触发。?TOTAL?COUNT?TO?CALLEE?/?被调用的总数量当发送给应用的所有请求数量超过配置阈值时触发。?下面两条规则和请求无关,只涉及到应用的状态HEAP?USAGE?RATE?/?堆内存使用率当应用的堆内存使用率超过配置阈值时触发。?JVM?CPU?USAGE?RATE?/?JVM?CPU使用率当应用的CPU使用率超过配置阈值时触发。


3.钉钉告警的实现和配置:

(一)代码二次开发实现

可参考代码库

git clone
https://gitee.com/xxx/xxxx.git(已进行二次开发存入私服)

【关注公众号“SRE运维部落”,回复 pinpoint 分享代码库地址给你】

主要是针对邮件发送实现类的修改,为方便快速实现钉钉告警,在邮件告警上添加了钉钉消息的触发方法

修改文件
/pinpoint-master/pinpoint-master_最初邮件可用版
/web/src/main/java/com/navercorp/pinpoint/web/alarm/SpringSmtpMailSender.java

其余也有针对消息内容进行开发优化,可参考代码变更即可。

产生的钉钉消息推送结果如下:

邮件消息推送如下:

(二)配置批处理属性

设置batch.properties文件中的batch.enable?标记为true:batch.enable=true


这里的 batch.server.ip 配置用于当有多台pinpointweb server时防止并发批处理程序. 仅当服务器IP地址和 batch.server.ip 设置的一致时才执行批处理。(设置为 127.0.0.1 将在所有的web服务器上启动批处理)

batch.server.ip=X.X.X.X

注:这种防止并发的方式有点简陋而原始,存在单点故障的风险,主要缺陷:万一配置的这台容许批处理的web服务器down机,告警功能就失效了。

(三)配置mysql

搭建mysql服务器并在jdbc.properties文件中配置连接信息:

jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:13306/pinpoint?characterEncoding=UTF-8jdbc.username=admin jdbc.password=admin

运行


pinpoint/web/src/main/resources/sql/CreateTableStatement-mysql.sql 和
pinpoint/web/src/main/resources/sql/SpringBatchJobReositorySchema-mysql.sql 来创建初始化表.

3.pinpoint删除应用程序名称和/或代理ID

一旦注册了应用程序名称和代理ID,它们就会保留在HBase中,直到它们的TTL过期(默认为1年)。但是,一旦不再使用它们,您可以使用管理API主动删除它们。

  • 删除应用名称- http://10.7.132.xx:8080/admin/removeApplicationName.pinpoint?applicationName=$APPLICATION_NAME&password=$PASSWORD
  • 删除代理程序ID- http://10.7.132.xx:8080/admin/removeAgentId.pinpoint?applicationName=$APPLICATION_NAME&agentId=$AGENT_ID&password=$PASSWORD 请注意,password参数的值是您admin.password在pinpoint-web.properties中定义的属性。保留此空白将使您无需密码参数即可调用管理API。
  • 默认密码admin微信关注我【SRE运维部落】,下期分享如何将告警钉钉邮件分发到不同开发团队,划清责任界限。