SkyWalking 是有個(gè)完整的 APM 系統(tǒng)念赶,被用于追蹤拗盒、監(jiān)控怖竭、診斷分布式系統(tǒng)。
SkyWalking 整體由 4 個(gè)部分組成:collector
锣咒、agent
、web
赞弥、storage
毅整。
應(yīng)用級(jí)別的接入,可以使用 SDK 形式接入绽左,也可以使用非侵入式的 Agent
形式接入悼嫉。agent
將數(shù)據(jù)轉(zhuǎn)化為 SkyWalking Trace 數(shù)據(jù)協(xié)議,通過 HTTP拼窥、gRPC 發(fā)送到 collector
戏蔑,collector
對(duì)收集到的數(shù)據(jù)進(jìn)行分析蹋凝、整合,最后存儲(chǔ)到 es 或 H2 中总棵,一般情況下鳍寂,H2 用于測(cè)試。
SkyWalking 特性
SkyWalking 主要功能
- 分布式只追蹤情龄、上下文傳輸
- 應(yīng)用迄汛、實(shí)例、服務(wù)性能指標(biāo)分析
- 根源分析
- 應(yīng)用拓?fù)浞治?/li>
- 應(yīng)用于服務(wù)依賴分析
- 慢服務(wù)檢測(cè)
- 性能優(yōu)化
SkyWalking 主要特性
- 多語言探針骤视、類庫(kù)
- Java 自動(dòng)探針鞍爱,追蹤、監(jiān)控程序時(shí)专酗,無需修改源碼
- 社區(qū)提供多語言探針:.NET睹逃、Node.js
- 多種后端存儲(chǔ):Elasticsearch、H2 等
- 支持 OpenTrancing:Java 自動(dòng)探針和 OpenTracing API 協(xié)同工作
- 輕量級(jí)祷肯、完善的后臺(tái)聚合和分析功能
- 現(xiàn)代化 Web UI
- 日志集成
- 應(yīng)用沉填、實(shí)例、服務(wù)的告警
- 支持接受其他跟蹤器數(shù)據(jù)格式
- Zipkin JSON躬柬、Thrift拜轨、Protobuf v1 和 v2 格式,由 OpenZipkin 庫(kù)提供支持
- Jaeger 采用 Zipkin Thrift 或 JSON v1/v2 格式
SkyWalking 測(cè)試用例代碼
Zuul
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
spring:
application:
name:
spring-cloud-apm-skywalking-zuul
server:
port: 9020
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
spring-cloud-apm-skywlaking-consumer:
path: /client/**
serviceId: spring-cloud-apm-skywlaking-consumer
ribbon:
eureka:
enabled: true
ReadTimeout: 30000
ConnectionTimeout: 30000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
OkToRetryOnAllOperations: false
hystrix:
threadpool:
default:
coreSize: 1000
maxQueueSize: 1000
queueSizeRejectionThreshold: 500
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 120001
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class SpringCloudApmSkywalkingZuulApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudApmSkywalkingZuulApplication.class, args);
}
}
Consumer
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
server:
port: 9021
spring:
application:
name: spring-cloud-apm-skywlaking-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class SpringCloudApmSkywlakingConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudApmSkywlakingConsumerApplication.class, args);
}
}
@FeignClient("spring-cloud-apm-skywalking-provider")
public interface SkyWalkingFeignService {
@RequestMapping(value = "/get-send-info", method = RequestMethod.GET)
String getSendInfo(@RequestParam("serviceName") String serviceName);
}
@RestController
public class SkyWalkingController {
private final SkyWalkingFeignService feignService;
@Autowired
public SkyWalkingController(SkyWalkingFeignService feignService) {
this.feignService = feignService;
}
@GetMapping(value = "/get-info")
public String getInfo(){
return feignService.getSendInfo("service");
}
}
Provider
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
server:
port: 9022
spring:
application:
name: spring-cloud-apm-skywalking-provider
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class SpringCloudApmSkywalkingProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudApmSkywalkingProviderApplication.class, args);
}
@GetMapping(value = "/get-send-info")
public String getSendInfo(@RequestParam("serviceName") String serviceName){
return serviceName + " --> " + "spring-cloud-apm-skywalking-provider";
}
}
SkyWalking 安裝
SkyWalking 依賴環(huán)境:
- 被監(jiān)控的應(yīng)用運(yùn)行在 JDK6+
- SkyWalking collector 和 WebUI 運(yùn)行在 JDK8+
- elasticsearch 5.x(集群可能不能使用)
下載 elasticsearch_5.6.10 版本
注意:一定要用 5.x 的 elasticsearch允青,否則會(huì)出現(xiàn)版本問題橄碾!
解壓安裝后,進(jìn)入 config/elasticsearch.yml
文件颠锉,修改 network.host
為 0.0.0.0
法牲。elasticsearch 不允許 root 用戶啟動(dòng),建立新用戶并賦權(quán):
useradd es
chown -R es:es /path/to/es
切換到 es 用戶琼掠,啟用 es
./bin/elasticsearch
控制臺(tái)報(bào)錯(cuò):
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修改 /etc/security/limits.conf
拒垃,增加如下配置:
* soft nofile 819200
* hard nofile 819200
修改 /etc/sysctl.conf
,增加配置:
vm.max_map_count=655360
重新加載配置:
sysctl -p
后臺(tái)啟動(dòng) es: ./bin/elasticsearch -d
查看 es 日志:tail -f logs/elasticsearch.log
瓷蛙,正常啟動(dòng)悼瓮。
瀏覽器訪問 elasticsearch,可見艰猬,默認(rèn)的 cluster name 為 elasticsearch
:
SkyWalking 目錄結(jié)構(gòu)
- agent:探針相關(guān)
- bin:collectorService横堡、webappService 啟動(dòng)腳本,其中 startup.* 是同事啟動(dòng)兩個(gè)腳本的合并命令
- config:Collector 的相關(guān)配置信息
- log:collector冠桃、web 的日志文件
- webapp:存放 SkyWalking 展示 UI 的 jar 和配置文件
SkyWalking 的默認(rèn)端口為:8080命贴、10800、11800、12800 等胸蛛,如果要修改端口污茵,需要修改 config 目錄下的 application.yml、webapp 下的 webapp.yml葬项。
修改 config/application.yml
文件泞当,clusterName 與 elasticsearch 的 cluster name 一致,其余采用默認(rèn)設(shè)置玷室。
啟動(dòng) SkyWalking
啟動(dòng) SkyWalking:
./bin/startup.sh
訪問 SkyWalking:
默認(rèn) 用戶名/密碼 為:admin/admin
監(jiān)控項(xiàng)目
創(chuàng)建目錄
創(chuàng)建四個(gè)目錄零蓉,分別對(duì)應(yīng):consumer、provider穷缤、zuul敌蜂、eureka-server 四個(gè)應(yīng)用,每個(gè)應(yīng)用使用一個(gè)對(duì)應(yīng)的 agent 進(jìn)行啟動(dòng)津肛,其中 agent 是 SkyWalking 的 agent 目錄章喉。
修改 agent.config
文件中 agent.application_code
,這項(xiàng)配置代表應(yīng)用身坐。對(duì)應(yīng)修改為 consumer
秸脱、provider
、zuul
部蛇、eureka
摊唇。將 eureka、zuul涯鲁、consumer巷查、provider 打包為 jar,上傳到對(duì)應(yīng)目錄中抹腿。
修改 es 內(nèi)存配置
elasticsearch 默認(rèn) JVM 內(nèi)存為 2g岛请,如果虛擬機(jī)內(nèi)存過小,無法啟動(dòng)警绩。如果略大于 JVM 內(nèi)存崇败,啟動(dòng)后無法啟動(dòng)其他組件。所以需要修稿 elasticsearch 的默認(rèn) JVM 內(nèi)存肩祥。修改 $ES_HOME/config/jvm.options
:
修改后重啟 es后室、SkyWalking
使用 top
命令查看使用內(nèi)存最高的應(yīng)用,使用 free
命令混狠,查看內(nèi)存總用量岸霹、剩余內(nèi)存。
依次啟動(dòng)四個(gè)應(yīng)用
啟動(dòng)時(shí)需要指定 JVM 內(nèi)存檀蹋,防止出現(xiàn)內(nèi)存不夠的情況松申。
-Xms
指定最小內(nèi)存,-Xmx
指定最大內(nèi)存
eureka
java -javaagent:/usr/local/src/soft/eureka/agent/skywalking-agent.jar -jar /usr/local/src/soft/eureka/spring-cloud-eureka-server-simple-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m
provider
java -javaagent:/usr/local/src/soft/provider/agent/skywalking-agent.jar -jar /usr/local/src/soft/provider/spring-cloud-apm-skywalking-provider-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m
consumer
java -javaagent:/usr/local/src/soft/consumer/agent/skywalking-agent.jar -jar /usr/local/src/soft/consumer/spring-cloud-apm-skywalking-consumer-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m
zuul
java -javaagent:/usr/local/src/soft/zuul/agent/skywalking-agent.jar -jar /usr/local/src/soft/zuul/spring-cloud-apm-skywalking-zuul-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m
確認(rèn)啟動(dòng)成功
使用 jps
命令查看啟動(dòng)進(jìn)程:
查看剩余內(nèi)存是否滿足正常運(yùn)行:
驗(yàn)證 SkyWalking
啟動(dòng)成功后訪問eureka: http://192.168.67.135:8761/
訪問 SkyWalking:
可見 4 個(gè) app 都啟動(dòng)成功了俯逾。使用 zuul 訪問 consumer贸桶,調(diào)用 provider:
再次查看 SkyWalking:
在 service 選項(xiàng)卡中可以看到每個(gè) service 的具體調(diào)用情況