微服务之分布式跟踪系统(springboot+pinpoint)
这篇文章介绍一下在微服务(springboot开发)的项目中使用pintpoint监控的过程及效果展示。
背景
随着项目微服务的进行,微服务数量逐渐增加,服务间的调用也越来越复杂,我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪,而通过调研多个开源APM工具后,最终我们选择了pintpoint。github地址是:pinpoint, 选择它有4个方面原因:
- pinpoint是基于java开发的,利于项目后期对源代码的修改
- 集成pinpoint不需要修改一行代码
- pinpoint有非常直观的UI,符合项目的当前需求
- pinpoint的社区还是挺活跃,一般提问题第二天就有项目的committer回复
Pinpoint
简介
Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。在使用上力图简单高效,通过在启动时安装agent,不需要修改哪怕一行代码,最小化性能损失(3%).

盗用一张官网上的图,通过源码你也能发现,pinpoint包含3个主要的组件:
- Collector, 收集应用中agent发送的数据并存储到Hbase中
- Agent, 是和应用一起启动的和应用共享JVM,定时发送数据给Collector
- Web UI, 从hbase中读取数据并展示给用户,之后会有demo展示其功能
支持的模块
- JDK 6+
- Tomcat 6/7/8, Jetty 8/9
- Spring, Spring Boot
- Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient
- Thrift Client, Thrift Service
- MySQL, Oracle, MSSQL, CUBRID, DBCP, POSTGRESQL
- Arcus, Memcached, Redis
- iBATIS, MyBatis
- gson, Jackson, Json Lib
- log4j, Logback
分布式追踪原理
pinpoint的实现是基于Google Dapper论文,Google dapper提出了一个简单的解决方案来解决分布式追踪的问题。这个解决方案通过在发送消息时添加应用级别的标签作为消息之间的关联。例如,在HTTP请求中的HTTP header中为消息添加一个标签信息并使用这个标签跟踪消息。
如下图所示,在微服务之间的一次请求过程,请求经过的每个节点时都会生成一组TxId,SpanId,pSpanId并发送到collector中,TxId体现了三次不同的RPC作为单个事务被相互关联,同时Pinpoint可以通过SpanId,pSpanId发现关联的n个Span,并将这n个span排列为继承树结构。

简单效果

实战集成
打包
项目使用的是pinpoint 1.6.2, 官网已经有更新了,目前功能够用,不打算更新。
- 在打包之前你需要将jdk6,jdk7,jdk8在要打包的机器上装好,通过下面3个命令export出来,我也不知道为什么打包这个需要装3个版本的jdk, 确实有点反人类。
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
export JAVA_6_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
- 将代码从github中clone下来,打开agent/src/main/resoucrs-local/pinpoint.config,修改如下几点,resource-release下的文件也是一样
- profiler.collector.ip=collector部署的机器ip
- profiler.sampling.rate=10 ## 按照10%概率抽样
- 打开web/src/main/resources/hbase.properties, 修改hbase的连接地址:
hbase.client.host=hbase地址
hbase.client.port=hbase端口
- 打开collector/src/main/resources/hbase.properties, 修改hbase的连接地址:
hbase.client.host=hbase地址
hbase.client.port=hbase端口
- 在主目录下输入mvn package -DskipTests=true打包, 会生成下面3个重要的文件,留好它们后面需要用
web/target/pinpoint-web-1.6.2.war
collector/target/pinpoint-collector-1.6.2.war
agent/target/pinpoint-agent-1.6.2.tar.gz
部署collecor和web
下载最新的tomcat,解压缩将上面的war包部署到webapps目录下,如下是部署的例子,其中
- portal部署文件: ROOT.war, 这个是由build打包过程中的web/target/pinpoint-web-1.6.2.war重命名而来
- collector部署文件:collector.war这个是由build打包过程中的collector/target/pinpoint-collector-1.6.2.war重命名而来

- 启动tomcat, 检查一下tomcat的log没有错误.
访问tomcat的地址,如果部署正常,则能看见UI,只是目前没有数据
部署agent
由于项目是springboot开发,采用内嵌的tomcat容器,打成jar包后,启动的时候采用如下脚本:
export APPLICATION_NAME=TEST
tar xvf pinpoint-agent.tar.gz
exec java -jar -Xms768m -Xmx768m -javaagent:./pinpoint-bootstrap-1.6.2.jar -Dspring.profiles.active=dev -Dpinpoint.agentId=myvm -Dpinpoint.applicationName=$APPLICATION_NAME xxx.jar
启动后再刷新一下web ui的界面,会发现已经有一个应用的数据显示的。
功能展示
服务响应时间的分布:

研究特定请求的调用栈:

优缺点总结
优点:
- 使用字节码增强(字节码增强和AOP)使得pinpoint不需要现有代码的修改,可以随时切换。
- 直观的图形化的界面,支持分布式的集群监控,能够对同一个服务不同instance同时记录。
- 提供报警机制,可以自由定制。
- 可开发插件定制需要的指标,例如rabbitmq插件。
缺点:
- 字节码增强技术让应用容易造成风险。如果问题发生在pinpoint中,它会影响应用。
- 文档目前比较少,社区还没有很活跃。
总结
目前中文文档较少,github上有中文翻译:
https://github.com/naver/pinpoint/wiki#video-clips
https://www.gitbook.com/book/skyao/leaning-pinpoint/details
点击右上方pdf下载,其中有很好的中文翻译
笔者注:
如何实现追踪?
答:RPC靠字节码增强,增加追踪id
性能损耗是否很大?
答:官网上说损耗在百分之几,可能是一般情况,系统压力不大的情况下。
我们在压力测试环境上使用了pinpont,使用前后的性能损失能达到30%~50%之间,redis的查询增加到几百毫秒。
转载:https://blog.csdn.net/toxie6415176/article/details/80271370
微服务之分布式跟踪系统(springboot+pinpoint)的更多相关文章
- 微服务之分布式跟踪系统(springboot+zipkin+mysql)
通过上一节<微服务之分布式跟踪系统(springboot+zipkin)>我们简单熟悉了zipkin的使用,但是收集的数据都保存在内存中重启后数据丢失,不过zipkin的Storage除了 ...
- 基于SkyWalking的分布式跟踪系统 - 微服务监控
上一篇文章我们搭建了基于SkyWalking分布式跟踪环境,今天聊聊使用SkyWalking监控我们的微服务(DUBBO) 服务案例 假设你有个订单微服务,包含以下组件 MySQL数据库分表分库(2台 ...
- 基于SkyWalking的分布式跟踪系统 - 环境搭建
前面的几篇文章我们聊了基于Metrics的监控Prometheus,利用Prometheus和Grafana可以全方位监控你的服务器及应用的性能指标,在出现异常时利用Alertmanager告警及时通 ...
- 基于SkyWalking的分布式跟踪系统 - 异常告警
通过前面2篇文章我们搭建了SW的基础环境,监控了微服务,能了解所有服务的运行情况.但是当出现服务响应慢,接口耗时严重时我们需要立即定位到问题,这就需要我们今天的主角--监控告警,同时此篇也是SW系列的 ...
- 最近整理出了有关大数据,微服务,分布式,Java,Python,Web前端,产品运营,交互等1.7G的学习资料,有视频教程,源码,课件,工具,面试题等等。这里将珍藏多年的资源免费分享给各位小伙伴们
大数据,微服务,分布式,Java,Python,Web前端,产品运营,交互 领取方式在篇尾!!! 基础篇.互联网架构,高级程序员必备视频,Linux系统.JVM.大型分布式电商项目实战视频...... ...
- SpringCloud微服务架构分布式组件如何共享session对象
一.简单做一个背景说明1.为说明问题,本文简单微服务架构示例如下 2.组件说明分布式架构,每个组件都是集群或者主备.具体说明如下:zuul service:网关,API调用都走zuul service ...
- Go微服务全链路跟踪详解
在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪. 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链. 该ID称为Correlati ...
- 面试刷题37:微服务是什么?springcloud,springboot是什么?
面试中被问到为什么要使用微服务架构?springcloud的核心组件有哪些? 拿我们国家的兵种来说,如何把战争这个单体架构微服务化,就是根据适用的场景,拆分出不同的兵种(微服务) 然后每个兵种之间通过 ...
- 【微服务系列】Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
一.正面解读 Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确,Struts主要负责表示层 ...
随机推荐
- 限定某个目录禁止解析php 、限制user_agent 、php的配制文件、PHP的动态扩展模块
1. 限定某个目录禁止解析php(有些目录用户可以上传文件或图片,可能会被恶意者上传其它文件):编辑:/usr/local/apache2.4/conf/extra/httpd-vhosts.conf ...
- 如何解决VMware 12 安装Ubuntu 16.04时无网络连接问题
刚安装玩Ubuntu,打开后上网没有网络连接 ,点击右上角的数据连接,显示已经启动联网,但是用火狐还是无法上网: 解决方法如下: 先查看虚拟机的网络适配器:点击虚拟机左上角的编辑,里面有个网络适配器 ...
- Spring Boot 揭秘
SpringBoot基础 微服务 解决大一统的服务化架构的问题 代码冲突问题 交付复杂,影响面大 测试困难 微服务的好处 可扩展性 隔离性 灵活性,多语言多技术生态 微服务的挑战 保持微服务的互通性 ...
- Caused by: java.sql.SQLException: ORA-24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据
今天客户说报告草稿保存不了,跟踪错误bug,了解到以下reason: 异常出现的环境:oracle11g + Hibernate 错误分析:这是oracle 11g在clob字段中的一个bug,ora ...
- SimpleDateFormat未抛出ParseException
关于SimpleDateFormat的不严格性[技术探讨]今天一组员写了几段Java代码,发现如下问题: SimpleDateFormat sdf = new SimpleDateFor ...
- Js 字符串的三大操作
回顾: var num = str.length:字符个数 str = str.toLowerCase()/toUpperCase() var char = str.charAt(index) :指 ...
- xenserver开启虚拟机时提示找不到存储介质,强制关闭和重启都没用
具体报错内容为: this vm needs storage that cannot be seen from that host 该错误的原因是该虚拟机使用了外部存储介质,例如,我就是因为当初规划x ...
- python 用type()创建类
type()可以查看一个类型,也可以查看变量的类型 class Hello1(object): def hello(self, name = 'world'): print('Hello, %s' % ...
- day10 内容大纲
01 去年内容回顾 01 去年内容回顾 *args **kwargs: 万能参数,动态参数 * 魔性用法: 函数的定义时,* ** 聚合. 函数的执行时,* ** 打散. 形参顺序: 位置参数,*ar ...
- Kafka 文件存储机制那些事 - 美团技术团队
出处:https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html 自己总结: Kafka 文件存储机制_结构图:https://ww ...