# apm **Repository Path**: a198720/apm ## Basic Information - **Project Name**: apm - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-01-24 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README APM调研报告 微服务服务监控的主要目的是监控微服务应用程序的状态,内存,cpu,服务请求,服务拓扑图等信息. --- ## 背景 - 调研背景和调研目的 在我们目前的微服务(基于Spring Cloud架构体系)架构下,分布式追踪开始变的越来越重要. 在开发测试阶段可以帮助我们更快的发现架构和一些设计有问题的地方;在生产环境,可以帮助我们统计服务器性能和一些部署相关的问题,还可以帮助我们解决和分析一些未知的问题.同时随着服务数量越来越多,针对微服务的优化分析就变的越来越重要了. 需要一个统一的工具平台为微服务提供性能数据分析.所以调研目前世面上存在的应用程序监控工具-zipkin+spring boot admin,pinpoint,skywaling. - 需要解决的问题 - 比如根据微服务cpu和内存的平均使用量来来给微服务分配一个合理的cpu和内存值. - 监控微服务的健康状态. - 监控服务请求的消耗时长,统计出来消耗时间比较大的请求进行服务优化. - 了解微服务之间的依赖关系.服务和数据库的依赖关系 ## 结论 ​ 在目前的微服务或者分布式架构下(目前内部采用的spring cloud架构体系),分布式追踪变得很重要,在开发测试可以帮助我们更快发现架构或者一些设计有问题的地方,在生产上可以帮我们统计和分析服务器性能和一些部署相关的问题,还可以帮我帮助我们解决或者分析一些未知的问题,**skywalking的定位是apm**,不仅提供了**自动分布式追踪**,还可以通过**手动埋探针**的方式去处理我们的一些特殊问题,同时他支持了**很多中间件和jvm监控**,这是目前一些分布式追踪未能解决的问题,例如个人原先使用的是spring cloud sleuth zipkin,不能解决kafka等一些中间件和jvm的问题,也不支持自己去追踪自己想要了解的链路信息。在这些方面skywalking做的还是比较好,通过探针的方式来进行监控做到**代码0侵入性**,而**开销也不是很大**,据官方说在4000tps目前只会多占你当前应用所占cpu的百分之十,意思你的应用占用10%的CPU,加上skywalking你的应用会占到11%,只是在原应用的基础之上增加1%的消耗. ​ 综上来说,skywalking 能够完全满足我们分布式系统监控,统计,分析性能的需要. 所以建议选择skywalking . ## 架构和原理 ### zipkin + spring boot admin - https://zipkin.io/pages/architecture.html - Zipkin是 [Twitter ](http://www.liuhaihua.cn/archives/tag/twitter)的一个 [开源项目 ](http://www.liuhaihua.cn/archives/tag/%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae),它基于 [Google ](http://www.liuhaihua.cn/archives/tag/google)Dapper实现。我们可以使用它来收集各个 [服务器 ](http://www.liuhaihua.cn/archives/tag/host)上请求链路的跟踪数据,并通过它提供的 [REST ](http://www.liuhaihua.cn/archives/tag/rest)[API ](http://www.liuhaihua.cn/archives/tag/api)接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向 [开发 ](http://www.liuhaihua.cn/archives/tag/%e5%bc%80%e5%8f%91)的API接口之外,它也提供了方便的 [UI ](http://www.liuhaihua.cn/archives/tag/ui)组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。 - `Spring Boot Admin`是一个管理和监控`Spring Boot`应用程序的开源软件。每个应用都认为是一个客户端,通过`HTTP`或者`服务注册发现Spring Cloud`(Eureka、Consul等等)注册到`admin server`中进行展示,`Spring Boot Admin UI`部分使用`AngularJs`将数据展示在前端 ![1540720675993](assets/1540720675993.png) 上图展示了Zipkin的基础架构,它主要有4个核心组件构成: - Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。 - Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。 - RESTful API:API组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。 - Web UI:UI组件,基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。 ### pinpoint - https://github.com/openzipkin/zipkin - https://github.com/naver/pinpoint pinpoint是开源在github上的一款APM监控工具,它是用Java编写的,用于大规模分布式系统监控。它对性能的影响较小(只增加约3%资源利用率),安装agent是无侵入式的,只需要在被测试的Tomcat中加上3句话,打下探针,就可以监控整套程序了 ![img](assets/00bb8e5140bb482bb77b586f129dd02a.png) Pinpoint 主要由 3 个组件外加 Hbase 数据库组成,三个组件分别为:Agent、Collector 和 Web UI。 ### skywalking ​ SkyWalking 创建与2015年,提供分布式追踪功能。从5.x开始,项目进化为一个完整功能的[Application Performance Management](https://en.wikipedia.org/wiki/Application_performance_management)系统。 他被用于追踪、监控和诊断分布式系统,特别是使用微服务架构,云原生或容积技术。提供以下主要功能: - 分布式追踪和上下文传输 - 应用、实例、服务性能指标分析 - 根源分析 - 应用拓扑分析 - 应用和服务依赖分析 - 慢服务检测 - 性能优化 特点:  - Java自动探针,不需要修改应用程序源代码 ,并且支持多种开源中间件,框架与类库 - 核心的Collector为纯Java后端实现,提供RESTful和gRPC接口。兼容接受其他语言探针发送数据。 - 支持多种语言的apm收集.java,.NET和Node.js。 ![img](assets/68747470733a2f2f736b7977616c6b696e67746573742e6769746875622e696f2f706167652d7265736f75726365732f352e302f6172636869746563747572652e706e67.png) 主要分三部分: 1. skywalking-agent:探针,用来收集和发送数据到收集器. 作用是使用JavaAgent字节码增强技术将Agent的代码织入程序中,完成Agent无代码侵入地获取程序内方法的上下文并进行增强和收集信息并发送给Collector;与Collector进行心跳,表明Agent客户端的存活。 2. skywalking-collector:链路数据集器,数据可以落地ElasticSearch或H2. 作用是维护存活的Agent实例,并收集从Agent发送至Collector的数据,进行处理及持久化; 3. skywalking-web:web可视化平台,用来展示落地的数据. 作用是将Collector收集的参数进行不同维度的展示 ## 安装部署 ### spring boot admin + zipkin - - https://github.com/openzipkin/zipkin/tree/master/zipkin-server 主要有以下步骤: - 安装es - 安装消息中间件rabbitmq - 安装zipkin - 安装spring boot admin - 安装应用程序客户端代理 ### pinpoint - https://naver.github.io/pinpoint/1.7.3/installation.html - https://github.com/naver/pinpoint-docker 主要也是分为以下几个步骤 1. 安装hbase 2. 安装collector 3. 安装web 4. 安装agent ![1540719204295](assets/1540719204295.png) ### skywalking - https://github.com/apache/incubator-skywalking - https://github.com/JaredTan95/skywalking-docker collector和web部署比较简单可以按官方文档https://github.com/apache/incubator-skywalking/blob/master/docs/cn/Quick-start-CN.md去操作 #### 1. 安装es ```shell docker run -d \ --name=elasticsearch \ -p 9200:9200 \ -p 9300:9300 \ --restart=always \ -e cluster.name=elasticsearch \ -e network.publish_host=192.168.100.101 \ -e xpack.security.enabled=false \ -v /data/docker/app/es/data:/usr/share/elasticsearch/data \ wutang/elasticsearch-shanghai-zone ``` #### 2. 安装collector ```shell docker run -d \ --name collector \ --network=host \ -e ZK_ADDRESSES=192.168.100.103:2181 \ -e NAMING_BIND_HOST=192.168.100.102 \ -e BIND_HOST=192.168.100.102 \ -e AGENT_JETTY_BIND_HOST=192.168.100.102 \ -e UI_JETTY_BIND_HOST=192.168.100.102 \ -e ES_CLUSTER_NAME=elasticsearch \ -e ES_CLUSTER_SNIFFER=true \ -e ES_ADDRESSES=192.168.100.101:9300 \ wutang/skywalking-collector:5.x-zk ``` #### 3. 安装sky-web ```shell docker run -d \ --name web \ -p 8080:8080 \ -e UI_RIBBON_LIST_SERVERS=192.168.100.102:10800 \ skywalking-web:5.x ``` #### 4. 应用程序安装agent ```shell docker run -d \ --name skywalk-eureka \ -p 8762:8762 \ -e SERVER_PORT=8762 \ -e SW_APPLICATION_CODE=eureka3 \ -e SW_COLLECTOR_DIRECT_SERVERS=10.122.23.134:11800 \ -e SW_NAMESPACE=default \ skywalk-eureka ``` ### 总结 ​ 综上来看: spring boot admin + zipkin 部署步骤稍微繁琐一些. skywalking 和 pinpoint 比较简洁. ## 快照 ### spring boot admin + zipkin #### 首页 *Dashboard with desktop notifications* ![Screenshot application list](assets/screenshot.png) #### details View application health, info and details ![Screenshot details](assets/screenshot-details.png) #### metrics *View metric counters and gauges* -度量计算 ![Screenshot metrics](assets/screenshot-metrics.png) #### logfile *View logfile (with follow)* ![Screenshot logfile](assets/screenshot-logfile.png) #### environment *View and change Spring environment (via Spring Cloud)* ![Screenshot environment](assets/screenshot-environment.png) #### loggers *Manage Logback logger levels* ![Screenshot logging](assets/screenshot-logging.png) #### JMX *View and use JMX beans via jolokia* JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。 ![Screenshot jmx](assets/screenshot-jmx.png) #### threads *View thread dump* ![Screenshot threads](assets/screenshot-threads.png) #### http traces *View http request traces* ![Screenshot traces](assets/screenshot-trace.png) #### jorunal *View history of registered applications* ![Screenshot journal](assets/screenshot-journal.png) ### pinpoint #### 首页 ![demo1](assets/626593-20161127170111128-1200872745.png) ![demo2](assets/626593-20161127170112425-1118844343.png) #### 应用详情 ![demo3](assets/626593-20161127170113362-2104316814.png) ### skywalking #### 首页展示 ![1540548286856](assets/1540548286856.png) 首页主要展示了8个方面: - 展示应用数量 - 展示服务数量 - 数据缓存 - MQ: 消息中间件数量 - calls healmap 请求调用热力图 - Avg Application Alarm 应用告警 默认响应时长超过2000ms 则告警,可以设置阀值 - Slow Service 列出比较慢的请求服务 - Application Throughput 应用吞吐量,**是指应用程序每分钟被调用的次数**(cpm,即 Calls Per Minute),吞**吐量可以反映应用系统对于用户请求的响应能力**。 #### 服务拓扑图 展示了服务和服务,服务与关系型数据库,服务与非关系型数据库,服务与消息中间件等的关系. ![1540689846279](assets/1540689846279.png) ![1540689987381](assets/1540689987381.png) #### 应用程序-Application ![1540690166931](assets/1540690166931.png) 具体详情: ![1540690248930](assets/1540690248930.png) #### 服务-Service 这里的服务指的是每一次的服务请求 ![1540694103879](assets/1540694103879.png) ![1540694114600](assets/1540694114600.png) #### Alarm 针对application,主机,服务的告警. ![img](assets/20180607212556131) #### Service Trace ![1540695499398](assets/1540695499398.png) ![1540696005188](assets/1540696005188.png) ## 对比和优劣 参考 [调用选型](D:\work\sorting-data\service-trace\reference\调用链选型之Zipkin,Pinpoint,SkyWalking,CAT.md) - skywalking的定位是**apm**,不仅提供了**自动分布式追踪**,还可以通过手动埋探针的方式去处理我们的一些特殊问题,同时他支持了很多中间件和jvm监控,这是目前一些分布式追踪未能解决的问题,例如解决kafka等一些中间件和jvm的问题,支持自己去追踪自己想要了解的链路信息。在这些方面skywalking做的还是比较好,通过探针的方式来进行监控做到代码0侵入性,而开销也不是很大,据官方说在4000tps目前只会多占你**当前应用所占cpu的百分之十**,意思你的应用占用10%的CPU,加上skywalking你的应用会占到11%(**只增加约1%资源利用率**),个人认为这种开销是都会被大家所接收. - java 语言 方便后续改造,升级,扩展 - 安装组件较少(es,collector,webUI,agent) - 监控分析粒度比较细 - 页面功能展示比较丰富,最全面 - 数据存储(es,h2) - 支持代理插件比较多 - agent 支持语言: java,.net.nodejs - 应用程序耦合性: 低耦合 - spring cloud sleuth zipkin + spring boot admin,不能解决kafka等一些中间件的问题,也不支持自己去追踪自己想要了解的链路信息。 - java 语言 - 安装组件比较多(rabbitmq,zipkin,spring boot admin,agent) - 监控分析粒度比较粗 - 页面功能展示较多 - 数据存储(es,mysql,Cassandra,内存) - 支持插件比较多 - zipkin agent 支持语言: c#,go,java,javascript,ruby,scala,php. - 应用程序耦合性: 低耦合,相比skywalking 和 pinpoint 耦合高些 - pinpoint是开源在github上的一款**APM**监控工具,它是用Java编写的,用于大规模分布式系统监控。它对性能的影响最小(**只增加约3%资源利用率**),安装agent是无侵入式的 - java 语言 - 安装组件较少(hbase,collector,webUI,agent) - 监控分析粒度中等 - 页面功能展示相对较少 - 数据存储(hbase) - 支持代理插件比较多 - agent支持语言: java 语言 - 应用程序耦合性: 低耦合 ## TO-DO 主要内容: - 调研工作只是开始,未来还需要做的事情,如后续方案的深入调研和完善,其他相关技术的调研等