当下成熟的互联网公司都建立有从基础设施到应用程序的全方位监控系统,力求及时发现故障进行处理并为优化程序提供性能数据支持,降低整体运维成本。国内外商业的APM有Compuware、iMaster、博睿Bonree、听云、New Relic、云智慧、OneAPM、AppDyn、Amics等。 本文主要针对Java技术体系介绍APM的关键实现技术以及业界主流APM工具的功能特点。

一、APM核心功能

APM被形象的称为应用程序的私人医生,越来越收到青睐,比起通过日志方式记录关键数据显然要更加实用,APM主要包含如下核心功能:

  • 1.应用系统存活检测
  • 2.应用程序性能指标检测(CPU利用率、内存利用率等等。。。)
  • 3.应用程序关键事件检测
  • 4.检测数据持久化存储并能够多维度查询
  • 5.服务调用跟踪
  • 6.监控告警

二、关键技术

2.1 获取JVM性能数据

Java程序运行时性能指标可通过Java.lang.Runtime、java.lang.Management中的方法采集。除此之外,著名的Metrics类库也能够通过这些底层技术获取Java程序性能指标。Cpu利用率等基础数据的采集仅仅是性能监控的一部分,Metrics提供了更为丰富的五个基本度量类型,可在此基础上开发满足需求的监控指标。

  • 1.Gauges(度量)
  • 2.Counters(计数器)
  • 3.Histograms(直方图数据)
  • 4.Meters(TPS计算器)
  • 5.Timers(计时器)

参考文章:

2.2 服务调用追踪

大型系统中每次请求往往都由若干个独立的服务调用组成,一次从上游到下游的调用被称为一次Trace,为了监控程序性能,需要知道每个独立服务的执行时间以及网络通信开销时间,Google曾经发表过一个介绍其内部实现Dapper的论文,Twitter参照此论文实现了一个名为Zipkin的服务调用追中系统并已开源。

Trace系统设计的核心技术就是拦截每次服务请求,在请求中加入标识符,记录一次完整的Trace各阶段的执行时间。当然也可以侵入式的写监控代码主动向Trace Server发送执行时间。

2.3 时间序列

应用程序向APM发送的采集数据,通常都是格式,为了实现节约存储空间、计时查询,通常使用时间序列数据库存储采集数据。

参考文章:

2.4 告警

当采集到应用程序的性能数据后,除了人为主动的在系统上查看之外,另一个主要的使用功能点就是,监控系统根据设定的报警规则主动报警。实现触发告警有多种方法,常见的方法有:周期性主动轮询采集到的性能数据,并且根据报警规则,进行报警处理;除此之外,通过流式计算方法也可以进行报警处理,这里推荐使用基于postgresql数据库的pipelinedb,通过sql的方式设定监控规则,当到达报警条件时,通过数据库触发器调用外部函数进行告警处理。

三、开源APM

3.1 ZipKin

ZipKin是Twitter开源的Trace工具,通过Java程序中引入客户端,可隐式拦截Http、Thrift等形式服务调用。通过Http、Kafka、Scribe等方式同步监控数据到服务端,ZipKin带有Web UI,但没有告警功能。

参考文章:

3.2 大众点评网 CAT

Cat是大众点评开源的功能完备的APM系统,支持JVM性能数据采集、服务Trace、告警等功能,但需要写监控代码。

参考文章:

  • 1.大众点评网监控平台剖析http://www.infoq.com/cn/presentations/public-comments-monitoring-platform-analyse/

3.4 Prometheus

Prometheus从官方介绍来说,他是一个开源的系统监控和报警工具,最初由SoundCloud推出。自2012成立以来,许多公司和组织都采用了Prometheus,项目有一个非常活跃的开发者和用户社区。它现在是一个独立的开源项目,并独立于任何公司。Prometheus具有以下主要特性:

  • 1.多维度数据模型(由键/值对确定的时间序列数据模型)。
  • 2.具有一个灵活的查询语言来利用这些维度。
  • 3.不依赖分布式存储;单个服务器节点工作。
  • 4.时间序列的采集是通过HTTP pull的形式,解决很多push架构的问题。
  • 5.通过中介网关支持短时间序列数据的收集。
  • 6.监控目标是通过服务发现或静态配置。
  • 7.多种数据展示面板支持,例如Grafana。

Prometheus主要缺点:

  • 1.单机缺点,单机下存储量有限,根据你的监控量局限你的存储时间。
  • 2.内存占用率大,prometheus集成了leveldb,一个能高效插入数据的数据库,在ssd盘下io占用比较高。同时可能会有大量数据堆积内存。但是这是可以配置的。

Prometheus既可以使用定时轮询应用程序Http接口获取性能数据,也可以使用嵌入到应用程序中Prometheus client主动收集数据推送给Prometheus Server。除了收集应用程序性能数据外,Prometheus还可以收集主机性能数据,真对不同性能指标Prometheus提供了不同的Exports,也可以自己开发Exports收集数据传递给Prometheus。Prometheus只支持性能采集告警,不支持服务Trace追中。

3.5 Hawkular

Hawkular是一个功能完备的APM系统,应用程序中嵌入Hawkular客户端,主动将采集数据通过Http或者Kafka传递给Hawkular。Hawkular支持JVM性能数据采集、服务Trace、告警等功能。其中JVM性能数据采集使用JMX,服务Trace使用Zipkin客户端。

3.6 Pinpoint

韩国开源的一个功能完备的APM系统,支持JVM性能数据采集、服务Trace、告警等功能。

3.7 Appdash

Appdash是sourcegraph开源的一款用Go实现的分布式系统跟踪工具套件,它同样是以google的 dapper为原型设计和实现的,目前用于sourcegraph平台的性能跟踪和监控。

3.8 Apache HTrace

Apache HTrace是Cloudera开源出来的一个分布式系统跟踪框架,支持HDFS和HBase等系统。该项目目前还在孵化阶段。

3.9 京东Hydra

京东开源的基于Dubbo的调用分布跟踪系统,类似ZipKin,功能不够完善。

3.10 Cicada

宜人贷开源的类似ZipKin分布式跟踪系统,功能不够完善。

3.11 Spring Boot Admin

可视化展示Spring Boot Metrics,监控数据不能持久化存储,没有Trace功能,没有监控告警功能,但可周期性采集metrics,发送给其他监控软件如slack进行告警处理,同时也可以实现监控数据存储。

我们希望一个功能完善的APM系统具有JVM性能监控、服务调用追中、监控告警功能,大众点评Cat、PinPoint、Hawkular相对来讲功能更为完备,推荐使用。

附录A 闭源APM

  • 1.Google Dapper
  • 2.淘宝 鹰眼Tracing
  • 3.新浪Watchman
  • 4.美团 MTrace

应用性能管理(APM, Application Performance Management)的更多相关文章

  1. Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文

    Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文 ...

  2. Pinpoint - 应用性能管理(APM)平台实践之部署篇

    0.0 前言 国内的APM行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的APM企业,例如APPdynamic,Dynamic,NewRelic ...

  3. Application Architecture Determines Application Performance

     Application Architecture Determines Application Performance Randy Stafford AppliCATion ARCHiTECTuR ...

  4. 场景5 Performance Management

    场景5 Performance Management 性能调优(不能重启数据库) 索引 资源管理器 性能优化 统计分析 SQL性能分析 SPM (SQL执行计划管理) 堆表 :数据存储无序 位图索引 ...

  5. The Impact of Garbage Collection on Application Performance

    As we’ve seen, the performance of the garbage collector is not determined by the number of dead obje ...

  6. Boost application performance using asynchronous I/O-ref

    http://www.ibm.com/developerworks/linux/library/l-async/?S_TACT=105AGX52&S_CMP=cn-a-l Introducti ...

  7. 独立安装Oracle Hyperion Enterprise Performance Management 验证过程

    在安装EPM的过程中,都是安装既定的操作手册进行,只是一个过程的重复,对自己安装不会留下深刻的印象.根据自己学习体会,制定安装步骤,去验证自己学习过程中的体会,加深学习印象,解决安装中遇到的问题,模仿 ...

  8. APM (应用性能管理)

    在信息科学和系统控制领域,APM是用来监控和管理应用软件是否有效运行的.APM通过监测和分析应用的表现去保证软件应用的良好运行,APM已经商用. 基本定义 APM = Application Perf ...

  9. 开源APM应用性能管理工具调研

    近期在设计一个DevOps平台.希望整合一个APM工具进来,由于APM既可用于性能測试也可用于运维性能监控,是典型的Dev+Ops产品. 商业的APM工具国内外已经有不少成熟产品了,而开源的好像不多见 ...

随机推荐

  1. html 颜色在线取色器

    推荐一个链接 还不错 http://www.atool.org/colorpicker.php

  2. Excel 函数使用

    字符串 20180613 转为日期  2018-06-13,单元格内输入如下公式 =DATE(LEFT(),MID(,),RIGHT()) IF 函数内的或.与 =IF(AND(A=B,C=D),&q ...

  3. IIS7下设置上传大小的限制

    一.找到修改大小的配置文件和配置节点 打开你系统盘(我是C盘),找到 C:\Windows\System32\inetsrv\config\schema目录,该目录下有一个IIS_schema.xml ...

  4. java Maven项目右键没有maven菜单项的解决方案!

    修改项目.project文件,确保有maven2Builder和maven2Nature2个标签: <?xml version="1.0" encoding="UT ...

  5. Python学习---线程锁/信号量/条件变量同步/线程池1221

    线程锁 问题现象: 多线程情况下,CPU遇到阻塞会进行线程的切换,所以导致执行了tmp-=1的值还未赋值给num=tmp,另一个线程2又开始了tmp -=1,所以导致最后的值重复赋值给了num,所以出 ...

  6. myeclipse 复制项目不包含svn或CVS目录

    目前只记录到2个方法:(SVN和CVS都适用) 方法一:导出法 1.右击需要cp的目录,点击export,General/File System 2.next 3.确认你选择的目录,并勾选:Creat ...

  7. java native方法及JNI实例

    前言 今天在读java.lang.Object 源码中时发现一个 一个hashCode方法: public native int hashCode() 原因Java很好,使用的人很多.应用极广,但是J ...

  8. spring注入bean的三种方法

    在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...

  9. 二十五、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制

    在我们用 IntelliJ IDEA 向 SVN 或者 Git 提交代码的时候,IntelliJ IDEA 提供了一个自动分析代码的功能,即Perform code analysis: 如上图所示,当 ...

  10. 【luogu P1351 联合权值】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1351 做了些提高组的题,不得不说虽然NOIP考察的知识点虽然基本上都学过,但是做起题来还是需要动脑子的. 题 ...