APM(Application Performance Management)理論模型
Dapper,大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng)
zipkin
簡介
Zipkin是一種分布式跟蹤系統(tǒng)。它有助于收集解決微服務(wù)架構(gòu)中的延遲問題所需的時序數(shù)據(jù)。它管理這些數(shù)據(jù)的收集和查找。Zipkin的設(shè)計基于Google Dapper論文。

使用和配置
zipkin-collector項目和zipkin-ui項目
Spring Cloud Sleuth是spring推出的分布式鏈路追蹤工具,借鑒了 Dapper, Zipkin和HTrace.可以和spring-cloud項目完美契合。下面是zipkin-collector的pom依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>zipkin-collector</artifactId>
<name>zipkin-collector</name>
<parent>
<groupId>io.choerodon</groupId>
<artifactId>choerodon-framework-parent</artifactId>
<version>0.8.0.RELEASE</version>
</parent>
<properties>
<choerodon.starters.version>0.6.3.RELEASE</choerodon.starters.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin</artifactId>
<version>1.31.3</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
<version>1.31.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.choerodon</groupId>
<artifactId>choerodon-starter-hitoa</artifactId>
<version>${choerodon.starters.version}</version>
</dependency>
</dependencies>
<build>
<finalName>app</finalName>
</build>
</project>
zipkin的通信方式支持http和message queue(kafka,rabbitMQ),但是http通信方式影響到主程序,所以這里采用kafka異步消息的方式通信。

使用elasticsearch存儲客戶端發(fā)送來的數(shù)據(jù)
接下來是配置zipkin-ui服務(wù),pom依賴和配置如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>zipkin-ui</artifactId>
<parent>
<groupId>io.choerodon</groupId>
<artifactId>choerodon-framework-parent</artifactId>
<version>0.7.0.RELEASE</version>
</parent>
<properties>
<choerodon.starters.version>0.5.4.RELEASE</choerodon.starters.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin</artifactId>
<version>1.31.3</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>1.31.3</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
<version>1.31.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.choerodon</groupId>
<artifactId>choerodon-starter-hitoa</artifactId>
<version>${choerodon.starters.version}</version>
</dependency>
</dependencies>
<build>
<finalName>app</finalName>
</build>
</project>

客戶端服務(wù)需要加入如下依賴
<dependency><!--如果服務(wù)需要zipkin監(jiān)控功能則需要此依賴-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>
然后客戶端作如下配置,配置kafka以及采樣率

啟動服務(wù)后發(fā)請求,訪問zipkin-ui(http:localhost:9030)的服務(wù)端口即可查看可視化調(diào)用鏈了

pinpoint
簡介
Pinpoint是一個APM(應(yīng)用程序性能管理)工具,適用于用Java / PHP編寫的大型分布式系統(tǒng)。有如下特性:
- 一目了然地了解您的應(yīng)用程序拓撲
- 實時監(jiān)控您的應(yīng)用程序
- 獲得每個事務(wù)的代碼級可見性
- 在不更改一行代碼的情況下安裝APM代理
- 對性能的影響最?。ㄙY源使用量增加約3%)
- 報警
pointpoint概述與技術(shù)細節(jié)以及中文翻譯
中文翻譯圖片丟失,但在英文文檔里面可以找到對應(yīng)圖片
本地搭建
本地使用docker部署pinpoint-docker,版本為1.8.0
執(zhí)行如下命令一鍵搭建,鏡像比較大
git clone https://github.com/naver/pinpoint-docker.git
cd pinpoint-docker
docker-compose pull && docker-compose up -d
docker-compose會啟動如下服務(wù)
- Pinpoint-Web Server(ui界面)
- Pinpoint-Collector
- Pinpoint-Agent(ready to be used)
- Pinpoint-Flink
- Pinpoint-Zookeeper
- Pinpoint-Hbase
- Pinpoint-QuickStart(a sample application)

配置應(yīng)用代理
下載release-1.8.0的pinpoint-agent包并解壓
在JVM啟動腳本增加下列三行代碼
-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar #絕對路徑
-Dpinpoint.agentId=test #必須在pinpoinit安裝的全部服務(wù)器集群中全局唯一. 最簡單的讓它保持唯一的方法是使用hostname($HOSTNAME),因為hostname一般不會重復(fù). 如果需要在服務(wù)器集群中運行多個JVM,請在hostname前面增加一個前綴來避免重復(fù)
-Dpinpoint.applicationName=api-gateway#服務(wù)名稱,在ui界面顯示

代理會在應(yīng)用程序啟動前,用字節(jié)碼增強技術(shù)注入Interceptor,然后代理使用UDP/TCP+Thrift發(fā)送數(shù)據(jù)到collector,collector負責(zé)持久化和處理數(shù)據(jù),然后web ui從HBase中拿到數(shù)據(jù)進行展示
采樣率
在pinpoint-agent-1.8.0/pinpoint.config配置采樣率
#采樣率為數(shù)字的倒數(shù),1即1/1=100%,2表示1/2=50%
profiler.sampling.rate=1
使用
ui界面訪問http://localhost:8079
pinpoint的功能還是很強大的,可以監(jiān)控Jvm內(nèi)存使用情況,Jvm永久帶使用占用空間,Cpu使用情況,每秒處理的消息數(shù)(S標識操作系統(tǒng),U標識此應(yīng)用),Jvm線程情況,單請求平均響應(yīng)時間等,顆粒度很細,缺點是環(huán)境搭建比較繁瑣,高并發(fā)情況下,代理對吞吐量的影響比skywalking和zipkin都大,后續(xù)會介紹性能的對比



skywalking
簡介
SkyWalking是一個開源的APM系統(tǒng),包括監(jiān)控,跟蹤,診斷Cloud Native架構(gòu)中分布式系統(tǒng)的功能。
核心功能如下。
- 服務(wù),服務(wù)實例,端點指標分析
- 根本原因分析
- 服務(wù)拓撲圖分析
- 服務(wù),服務(wù)實例和端點依賴性分析
- 慢服務(wù)和端點檢測
- 性能優(yōu)化
- 分布式跟蹤和上下文傳播
- 報警
SkyWalking支持從多個來源和多種格式收集遙測(痕跡和指標)數(shù)據(jù),包括
1.SkyWalking格式的Java,.NET Core和NodeJS自動儀器代理
2.Istio遙測格式
3.Zipkin v1 / v2格式

部署
- 5.0.0-GA版本只能和5.x版本的elasticsearch匹配,使用6.x版本會連不上elasticsearch
- run bin/startup.sh即可啟動
- 需要配置好服務(wù)器的時區(qū)和時間
配置agent
1.拷貝agent目錄到所需位置. 日志,插件和配置都包含在包中,請不要改變目錄結(jié)構(gòu).
2.增加JVM啟動參數(shù), -javaagent:/path/to/skywalking-agent/skywalking-agent.jar. 參數(shù)值為skywalking-agent.jar的絕對路徑。
3.支持插件,插件全部放置在 /plugins 目錄中.新的插件,也只需要在啟動階段,放在目錄中,就自動生效,刪除則失效.
4.可以在/agent/config/agent.conf 配置每個應(yīng)用的agent.application_code,也可以通過vm參數(shù)來覆蓋代理配置-javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.application_code=gateway-helper
配置成功后,ui界面訪問:http://localhost:8080,使用admin/admin登陸
集群部署
https://github.com/apache/incubator-skywalking/blob/5.x/docs/cn/Deploy-backend-in-cluster-mode-CN.md
性能
UI界面





采樣率
在/agent/config/agent.config文件里配置,skywalking默認的采樣率是100%
# 每3秒取樣的次數(shù),負數(shù)的含義是盡可能多的取樣,即100%取樣
agent.sample_n_per_3_secs=-1
zipkin,pinpoint和skywalking的比較
性能(摘自https://juejin.im/post/5a7a9e0af265da4e914b46f1)
選用了一個常見的基于Spring的應(yīng)用程序,他包含Spring Boot, Spring MVC,redis客戶端,mysql。 監(jiān)控這個應(yīng)用程序,每個trace,探針會抓取5個span(1 Tomcat, 1 SpringMVC, 2 Jedis, 1 Mysql)。這邊基本和 skywalkingtest 的測試應(yīng)用差不多。
模擬了三種并發(fā)用戶:500,750,1000。使用jmeter測試,每個線程發(fā)送30個請求,設(shè)置思考時間為10ms。使用的采樣率為1,即100%,這邊與生產(chǎn)可能有差別。pinpoint默認的采樣率為20,即50%,通過設(shè)置agent的配置文件改為100%。zipkin默認也是1。組合起來,一共有12種。下面看下匯總表:

從上表可以看出,在三種鏈路監(jiān)控組件中,skywalking的探針對吞吐量的影響最小,zipkin的吞吐量居中。pinpoint的探針對吞吐量的影響較為明顯,在500并發(fā)用戶時,測試服務(wù)的吞吐量從1385降低到774,影響很大。然后再看下CPU和memory的影響,在內(nèi)部服務(wù)器進行的壓測,對CPU和memory的影響都差不多在10%之內(nèi)。
collector的可擴展性、 全面的調(diào)用鏈路數(shù)據(jù)分析、對于開發(fā)透明,容易開關(guān)等
參閱這篇文章