APM(Application Performance Management)理論模型
Dapper,大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng)
zipkin
簡(jiǎn)介
Zipkin是一種分布式跟蹤系統(tǒng)。它有助于收集解決微服務(wù)架構(gòu)中的延遲問(wèn)題所需的時(shí)序數(shù)據(jù)。它管理這些數(shù)據(jù)的收集和查找。Zipkin的設(shè)計(jì)基于Google Dapper論文。
使用和配置
zipkin-collector項(xiàng)目和zipkin-ui項(xiàng)目
Spring Cloud Sleuth是spring推出的分布式鏈路追蹤工具,借鑒了 Dapper, Zipkin和HTrace.可以和spring-cloud項(xiàng)目完美契合。下面是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存儲(chǔ)客戶端發(fā)送來(lái)的數(shù)據(jù)
接下來(lái)是配置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以及采樣率
啟動(dòng)服務(wù)后發(fā)請(qǐng)求,訪問(wèn)zipkin-ui(http:localhost:9030)的服務(wù)端口即可查看可視化調(diào)用鏈了
pinpoint
簡(jiǎn)介
Pinpoint是一個(gè)APM(應(yīng)用程序性能管理)工具,適用于用Java / PHP編寫(xiě)的大型分布式系統(tǒng)。有如下特性:
- 一目了然地了解您的應(yīng)用程序拓?fù)?/li>
- 實(shí)時(shí)監(jiān)控您的應(yīng)用程序
- 獲得每個(gè)事務(wù)的代碼級(jí)可見(jiàn)性
- 在不更改一行代碼的情況下安裝APM代理
- 對(duì)性能的影響最小(資源使用量增加約3%)
- 報(bào)警
pointpoint概述與技術(shù)細(xì)節(jié)以及中文翻譯
中文翻譯圖片丟失,但在英文文檔里面可以找到對(duì)應(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會(huì)啟動(dòng)如下服務(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啟動(dòng)腳本增加下列三行代碼
-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar #絕對(duì)路徑
-Dpinpoint.agentId=test #必須在pinpoinit安裝的全部服務(wù)器集群中全局唯一. 最簡(jiǎn)單的讓它保持唯一的方法是使用hostname($HOSTNAME),因?yàn)閔ostname一般不會(huì)重復(fù). 如果需要在服務(wù)器集群中運(yùn)行多個(gè)JVM,請(qǐng)?jiān)趆ostname前面增加一個(gè)前綴來(lái)避免重復(fù)
-Dpinpoint.applicationName=api-gateway#服務(wù)名稱,在ui界面顯示
代理會(huì)在應(yīng)用程序啟動(dòng)前,用字節(jié)碼增強(qiáng)技術(shù)注入Interceptor,然后代理使用UDP/TCP+Thrift發(fā)送數(shù)據(jù)到collector,collector負(fù)責(zé)持久化和處理數(shù)據(jù),然后web ui從HBase中拿到數(shù)據(jù)進(jìn)行展示
采樣率
在pinpoint-agent-1.8.0/pinpoint.config配置采樣率
#采樣率為數(shù)字的倒數(shù),1即1/1=100%,2表示1/2=50%
profiler.sampling.rate=1
使用
ui界面訪問(wèn)http://localhost:8079
pinpoint的功能還是很強(qiáng)大的,可以監(jiān)控Jvm內(nèi)存使用情況,Jvm永久帶使用占用空間,Cpu使用情況,每秒處理的消息數(shù)(S標(biāo)識(shí)操作系統(tǒng),U標(biāo)識(shí)此應(yīng)用),Jvm線程情況,單請(qǐng)求平均響應(yīng)時(shí)間等,顆粒度很細(xì),缺點(diǎn)是環(huán)境搭建比較繁瑣,高并發(fā)情況下,代理對(duì)吞吐量的影響比skywalking和zipkin都大,后續(xù)會(huì)介紹性能的對(duì)比
skywalking
簡(jiǎn)介
SkyWalking是一個(gè)開(kāi)源的APM系統(tǒng),包括監(jiān)控,跟蹤,診斷Cloud Native架構(gòu)中分布式系統(tǒng)的功能。
核心功能如下。
- 服務(wù),服務(wù)實(shí)例,端點(diǎn)指標(biāo)分析
- 根本原因分析
- 服務(wù)拓?fù)鋱D分析
- 服務(wù),服務(wù)實(shí)例和端點(diǎn)依賴性分析
- 慢服務(wù)和端點(diǎn)檢測(cè)
- 性能優(yōu)化
- 分布式跟蹤和上下文傳播
- 報(bào)警
SkyWalking支持從多個(gè)來(lái)源和多種格式收集遙測(cè)(痕跡和指標(biāo))數(shù)據(jù),包括
1.SkyWalking格式的Java,.NET Core和NodeJS自動(dòng)儀器代理
2.Istio遙測(cè)格式
3.Zipkin v1 / v2格式
部署
- 5.0.0-GA版本只能和5.x版本的elasticsearch匹配,使用6.x版本會(huì)連不上elasticsearch
- run bin/startup.sh即可啟動(dòng)
- 需要配置好服務(wù)器的時(shí)區(qū)和時(shí)間
配置agent
1.拷貝agent目錄到所需位置. 日志,插件和配置都包含在包中,請(qǐng)不要改變目錄結(jié)構(gòu).
2.增加JVM啟動(dòng)參數(shù), -javaagent:/path/to/skywalking-agent/skywalking-agent.jar. 參數(shù)值為skywalking-agent.jar的絕對(duì)路徑。
3.支持插件,插件全部放置在 /plugins 目錄中.新的插件,也只需要在啟動(dòng)階段,放在目錄中,就自動(dòng)生效,刪除則失效.
4.可以在/agent/config/agent.conf 配置每個(gè)應(yīng)用的agent.application_code
,也可以通過(guò)vm參數(shù)來(lái)覆蓋代理配置-javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.application_code=gateway-helper
配置成功后,ui界面訪問(wèn):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默認(rèn)的采樣率是100%
# 每3秒取樣的次數(shù),負(fù)數(shù)的含義是盡可能多的取樣,即100%取樣
agent.sample_n_per_3_secs=-1
zipkin,pinpoint和skywalking的比較
性能(摘自https://juejin.im/post/5a7a9e0af265da4e914b46f1)
選用了一個(gè)常見(jiàn)的基于Spring的應(yīng)用程序,他包含Spring Boot, Spring MVC,redis客戶端,mysql。 監(jiān)控這個(gè)應(yīng)用程序,每個(gè)trace,探針會(huì)抓取5個(gè)span(1 Tomcat, 1 SpringMVC, 2 Jedis, 1 Mysql)。這邊基本和 skywalkingtest 的測(cè)試應(yīng)用差不多。
模擬了三種并發(fā)用戶:500,750,1000。使用jmeter測(cè)試,每個(gè)線程發(fā)送30個(gè)請(qǐng)求,設(shè)置思考時(shí)間為10ms。使用的采樣率為1,即100%,這邊與生產(chǎn)可能有差別。pinpoint默認(rèn)的采樣率為20,即50%,通過(guò)設(shè)置agent的配置文件改為100%。zipkin默認(rèn)也是1。組合起來(lái),一共有12種。下面看下匯總表:
從上表可以看出,在三種鏈路監(jiān)控組件中,skywalking的探針對(duì)吞吐量的影響最小,zipkin的吞吐量居中。pinpoint的探針對(duì)吞吐量的影響較為明顯,在500并發(fā)用戶時(shí),測(cè)試服務(wù)的吞吐量從1385降低到774,影響很大。然后再看下CPU和memory的影響,在內(nèi)部服務(wù)器進(jìn)行的壓測(cè),對(duì)CPU和memory的影響都差不多在10%之內(nèi)。
collector的可擴(kuò)展性、 全面的調(diào)用鏈路數(shù)據(jù)分析、對(duì)于開(kāi)發(fā)透明,容易開(kāi)關(guān)等
參閱這篇文章