前言
在使用微服务架构时,客户的一个请求可能会经过多个微服务、模块、中间件,那么如何确定客户端的一次操作背后调用了哪些微服务、模块、中间件,调用的先后顺序是怎样的,每个服务的性能如何?随着业务系统日趋复杂,系统中需要调用链的监控来解决这个问题。
Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具。一个分布式跟踪系统,基于google Dapper实现,用于基于java的大规模分布式系统,通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。pinpoint 有3个主要组件组成:Collector、Web、Agent,采用HBase进行存储。 Collector和Web都是WAR包,Agent采用一个JAVA应用程序加载。
安装部署
这里采用docker的方式部署pinpoint。相关的Dockerfile及docker-compose.yml参见https://gitee.com/tinylk/docker-pinpoint 。
构建docker镜像
- 进入 pinpoint-web目录 执行
docker build -t tinylk/pinpoint-web:1.8.2 .
命令构建镜像 - 进入 pinpoint-hbase目录 执行
docker build -t tinylk/pinpoint-hbase:1.8.2 .
命令构建镜像 - 进入 pinpoint-collector目录 执行
docker build -t tinylk/pinpoint-collector:1.8.2 .
命令构建镜像 - 进入 pinpoint-mysql
docker build -t tinylk/pinpoint-mysql:1.8.2 .
命令构建镜像
- 进行构建时会下载hbase与pinpoint的war包,如果需要加快速度可以实现下载好hbase与pinpoint放在本地web服务器上,然后修改Dockerfile中PINPOINT_REPOSITORY与HBASE_REPOSITORY的地址从本地服务器下载。pinpoint的下载地址为:https://github.com/naver/pinpoint/releases,hbase的下载地址为:http://archive.apache.org/dist/hbase,下载的版本请保持与Dockerfile中一致。
- pinpoint如果需要使用报警功能需要使用mysql,pinpoint-mysql中的建表sql文件来自于:https://github.com/naver/pinpoint/blob/master/doc/alarm.md。
- pinpoint的报警时发送邮件功能需要自己实现代码,pinpoint-web中的mail.zip为发送邮件功能实现。文件来自于https://github.com/naver/pinpoint-docker/tree/master/pinpoint-web/build
运行容器
运行docker-compose命令启动pinpoint。启动后使用浏览器打开http://localhost:58080地址访问pinpoint界面。
docker-compose up -d
- docker-compose.yml中pinpoint-web里面email相关配置请修改为自己的邮箱配置。
使用Pinpoint Agent收集调用信息
部署好pinpoint服务端后,就可以通过pinpoint agent来收集java应用信息。Pinpoint Agent采用javaagent无侵入的方式实现了应用调用信息的收集,原应用程序无需做任何改动。只需要在启动时增加javaagent参数。启动时参数如下:
Java -javaagent:/opt/pinpoint-agent-1.8.2/pinpoint-bootstrap-1.8.2.jar -Dpinpoint.agentId=demo1 -Dpinpoint.applicationName=demo –jar demo.jar
说明:
- javaagent 参数必须在 jar参数之前;
- pinpoint.agentId 应用实例的唯一标识(可以采用主机名+应用名);
- pinpoint.applicationName 相同的名称表示相同服务的一组应用实例;
- 启动前需要修改pinpoint.config 文件中的相应配置:
profiler.collector.ip (collector的ip地址 xxx.xxx.xxx.xxx) profiler.collector.tcp.port (collector's collector.tcpListenPort - default: 9994) profiler.collector.stat.port (collector's collector.udpStatListenPort - default: 9995) profiler.collector.span.port (collector's collector.udpSpanListenPort - default: 9996) profiler.sampling.rate=1(数据采样率,搜集数据的比率,默认为20即为1/20 5%,如想改为100%即设为1)
pinpoint的web界面
ServerMap – 可视化的方式显示服务的依赖关系及调用计数。.
CallStack – 每次请求的调用过程,查看故障点及瓶颈。
Inspector - 查看应用程序的其他详细信息,如CPU使用情况,内存/垃圾收集,TPS和JVM参数。
pinpoint的CallStack 界面需要从ServerMap界面右上角图表中用鼠标拖拽矩形框选择后进入。
报警邮件通知配置
Pinpoint-web会定期检查应用程序的状态,如果满足某些预先配置的规则时会触发警报。
Web模块中的后台批处理程序默认情况每3分钟检查一次预定义规则。 满足规则后,批处理程序将向注册到用户组的用户发送短信/电子邮件。
一.配置用户及规则
点击主界面右上角配置按钮,进入配置界面
注册用户
创建用户组
添加用户及用户组
设置报警通知规则
二.实现邮件发送代码及配置
为了使用报警功能,必须实现com.navercorp.pinpoint.web.alarm.AlarmMessageSender类的发送邮件和SMS的方法,并配置将其注册至Spring中。当警报触发时, AlarmMessageSender#sendEmail和 AlarmMessageSender#sendSms 方法将会被调用。(本部分已经在前面docker安装部署中配置好)
报警通知的详细内容介绍请参见:https://github.com/naver/pinpoint/blob/master/doc/alarm.md