基于pinpoint改造的一种方式的思考(1)--agent 添加代理层

1.Pinpoint简介

  Pinpoint 是用 Java 编写的 APM(应用性能管理)工具,用于大规模分布式系统。在 Dapper(dapper.docx) 之后,Pinpoint 提供了一个解决方案,以帮助分析系统的总体结构以及分布式应用程序的组件之间是如何进行数据互联的。它采用java agent 的方式对 jvm应用的无侵入的改造。同时对性能的影响非常小(只增加约3%资源利用率)。 支持以下模块。

tomcat  6/7/8,Jetty 9
Spring, Spring Boot
Apache Http Client 3.x/4.x,JDK HttpConnector,GoogleHttpClinet,OkHttpClient,NingAsyncHttpClient
Thrift Cliet,Thirft Service
MySql,Oracle,MSSQL,CUBRID,DBCP,POSTGRESQL
Arcus,Memcached,Redis
IBATIS,MyBatis
Gson,Jackson,Json Lib
Log4j,Logback

2.Pinpoint架构

  以下是pinpoint的架构图,如图所示 Profiled Applications 是 对应的注入pinpoint agent的jvm容器。 其他分为3种消息:1.tcp 9994端口的 agent配置信息、Api信息、String信息、Exception信息。 2.udp 9995 端口 发送JVM内存使用情况,线程相关信息,每隔30秒一个包,每个包为6条信息。 3.Udp 9996 端口 这个端口数据是最关键也是数据最多的,是全链路Trace 报文。

  那么以上所有的消息都是通过Tcp/udp,Thrift协议发送到云端的Collector,collector收集数据并保存到hbase。 同时pinpoint web UI 读取Hbase数据展示链路等数据。

 

3.问题探讨

  提供pinpoint的架构和内在逻辑的分析,我们发现pinpoint agent 是其精华所在。但是他包含以下问题

1. agent数据直接发送到 固定的collector地址 没有服务发现,collector挂了数据就无法收到。
2. agent数据是原始数据,直接发送到Collector未进行压缩,未进行缓存
3. Collector在 agent Jvm 高并发环境下,只能最多进行1对3的收集,对于大规模 应用服务器情况下Collector显得非常无能。

4. 改造

如下图所示,我们增加 Mecury 的代理层。 它的作用有

1.提供Etcd 服务发现获取Load最低的Collector
2.对Agent发送的数据进行预处理:数据解析,数据压缩,定时发送到Collector。其中数据压缩可以用Snappy。
3.采用Golang 实现数据的收集,同时mecury 还充当获取服务器 监控数据发送到Collector
4. Mecury执行部分Java Shell指令对Jvm进行外部监控

当然Collector 我们也是采用golang进行重写,自此 Collector(golang 实现) 压力下降上千倍,在生产环境下可以支持1对300+agent的服务器。
这里写图片描述

 

5. 总结

以上对Pinpoint agent 和pinpoint Collector的 改造方案。我所在公司已经改造完成,并在生产环境大面积使用。
当然我们还有很多事情可以做,比对如何高效的实时报警,如何存储监控数据(hbase是否还能满足需求),如何做跨语言的监控,监控Ui如何展示全面实时。

 

©著作权归作者所有:来自51CTO博客作者李浩宇Alex的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Jaeger-实践处理相关计划
  2. 【PHP连接MySQL】我来手把手教你PHP怎么连接Mysql数据库
  3. 浅谈 Integer 类
  4. jedis五种数据类型的方法解释
  5. mysql架构和存储引擎
  6. redis源码之dict
  7. redis的两种持久化的机制,你真的了解么?
  8. 如何用nodeJs向别的服务器上传文件发送formData数据?
  9. 冷月手撕408之数据结构(3)-顺序表

随机推荐

  1. win8安装sql server2005方法
  2. sqoop简单操作-从mysql导入导出数据
  3. vs2012利用MFC开发基于对话框的小软件指
  4. 访问SqlServer时需要先登录服务器windows
  5. SQL问题 ,要连接两个无直接关联表
  6. 1)如何用语句来查看一个表内是否建了索引
  7. Scripts:创建手工的SQL PROFILE的脚本,老
  8. 求一SQL语句(如何按某列的值分组且取出每
  9. 高手是怎样炼成的:精妙SQL语句介绍
  10. 手把手教你mysql(十五)游标变量流程控制