Spring Cloud 學(xué)習(xí)(32) --- APM(二) SkyWalking

SkyWalking 是有個(gè)完整的 APM 系統(tǒng)念赶,被用于追蹤拗盒、監(jiān)控怖竭、診斷分布式系統(tǒng)。

SkyWalking 整體由 4 個(gè)部分組成:collector锣咒、agentweb赞弥、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ù)
  1. Java 自動(dòng)探針鞍爱,追蹤、監(jiān)控程序時(shí)专酗,無需修改源碼
  2. 社區(qū)提供多語言探針:.NET睹逃、Node.js
  • 多種后端存儲(chǔ):Elasticsearch、H2 等
  1. 支持 OpenTrancing:Java 自動(dòng)探針和 OpenTracing API 協(xié)同工作
  • 輕量級(jí)祷肯、完善的后臺(tái)聚合和分析功能
  • 現(xiàn)代化 Web UI
  • 日志集成
  • 應(yīng)用沉填、實(shí)例、服務(wù)的告警
  • 支持接受其他跟蹤器數(shù)據(jù)格式
  1. Zipkin JSON躬柬、Thrift拜轨、Protobuf v1 和 v2 格式,由 OpenZipkin 庫(kù)提供支持
  2. 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.host0.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

elasticsearch

SkyWalking 目錄結(jié)構(gòu)

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è)置玷室。

application.yml

啟動(dòng) SkyWalking

啟動(dòng) SkyWalking:

./bin/startup.sh
啟動(dòng) SkyWalking

訪問 SkyWalking:


訪問 SkyWalking

默認(rèn) 用戶名/密碼 為:admin/admin

SkyWalking Dashboard

監(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秸脱、providerzuul部蛇、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 jvm 參數(shù)

修改后重啟 es后室、SkyWalking

使用 top 命令查看使用內(nèi)存最高的應(yīng)用,使用 free 命令混狠,查看內(nèi)存總用量岸霹、剩余內(nèi)存。

free top 命令

依次啟動(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)程:

jps

查看剩余內(nèi)存是否滿足正常運(yùn)行:


free

驗(yàn)證 SkyWalking

啟動(dòng)成功后訪問eureka: http://192.168.67.135:8761/


eureka

訪問 SkyWalking:


SkyWalking

可見 4 個(gè) app 都啟動(dòng)成功了俯逾。使用 zuul 訪問 consumer贸桶,調(diào)用 provider:


zuul

再次查看 SkyWalking:


SkyWalking

在 service 選項(xiàng)卡中可以看到每個(gè) service 的具體調(diào)用情況


service
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桌肴,隨后出現(xiàn)的幾起案子皇筛,更是在濱河造成了極大的恐慌,老刑警劉巖坠七,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件水醋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡彪置,警方通過查閱死者的電腦和手機(jī)拄踪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拳魁,“玉大人惶桐,你說我怎么就攤上這事∨税茫” “怎么了姚糊?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)授舟。 經(jīng)常有香客問我救恨,道長(zhǎng),這世上最難降的妖魔是什么释树? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任肠槽,我火速辦了婚禮,結(jié)果婚禮上躏哩,老公的妹妹穿的比我還像新娘署浩。我一直安慰自己,他們只是感情好扫尺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布筋栋。 她就那樣靜靜地躺著,像睡著了一般正驻。 火紅的嫁衣襯著肌膚如雪弊攘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天姑曙,我揣著相機(jī)與錄音襟交,去河邊找鬼。 笑死伤靠,一個(gè)胖子當(dāng)著我的面吹牛捣域,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼焕梅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼迹鹅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贞言,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤斜棚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后该窗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弟蚀,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年酗失,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了义钉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡规肴,死狀恐怖断医,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奏纪,我是刑警寧澤鉴嗤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站序调,受9級(jí)特大地震影響醉锅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜发绢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一硬耍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧边酒,春花似錦经柴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氓涣,卻和暖如春牛哺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背劳吠。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工引润, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痒玩。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓淳附,卻偏偏與公主長(zhǎng)得像议慰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奴曙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容