SkyWalking 環(huán)境搭建
在本課時中,我們將安裝并體驗 SkyWalking 的基本使用,下面是使用到的相關(guān)軟件包:
- apache-skywalking-apm-6.2.0.tar.gz
下載地址:https://archive.apache.org/dist/skywalking/6.2.0/
- elasticsearch-6.6.1.tar.gz
下載地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.1.tar.gz
- kibana-6.6.1-darwin-x86_64.tar.gz
下載地址:https://artifacts.elastic.co/downloads/kibana/kibana-6.6.1-darwin-x86_64.tar.gz
ElasticSearch 安裝
下載完 elasticsearch-6.6.1.tar.gz 包之后,使用如下命令進行解壓縮:
tar?-zxf?elasticsearch-6.6.1.tar.gz
解壓完成之后,進入得到的 elasticsearch-6.6.1 目錄中,執(zhí)行如下命令后臺啟動 ElasticSearch 服務(wù):
./bin/elasticsearch?-d
ElasticSearch 啟動的相關(guān)日志可以通過下面的命令進行查看:
tail?-f?logs/elasticsearch.log
最后,我們可以請求 localhost:9200 這地址,看到下圖輸出的這段 JSON 即安裝成功:
Kibana 安裝
Kibana 是一個開源的分析和可視化平臺,主要用于和 Elasticsearch 一起工作,輕松實現(xiàn) ElasticSearch 的查詢和管理。這里使用 ElasticSearch 作為 SkyWalking 的后端存儲,在后續(xù)調(diào)試 SkyWalking 源碼時,可能會直接查詢 ElasticSearch 中的某些索引,所以這里一并安裝 Kibana。
下載完 kibana-6.6.1-darwin-x86_64.tar.gz 安裝包之后,我們使用如下命令進行解壓:
tar?-zxf??kibana-6.6.1-darwin-x86_64.tar.gz
解壓完成后進入 kibana-6.6.1-darwin-x86_64 目錄,修改 config/kibana.yml 文件:
#?指定上述?ElasticSearch監(jiān)聽的地址,其他配置不變
elasticsearch.hosts:?["http://localhost:9200"]
之后執(zhí)行如下命令,啟動 Kibana 服務(wù):
./bin/kibana
最后我們通過訪問 http://localhost:5601/ 地址即可進入 Kibana 界面:
SkyWalking 安裝
下載完成 apache-skywalking-apm-6.2.0.tar.gz 包之后,執(zhí)行如下命令解壓縮:
tar?-zxf?apache-skywalking-apm-6.2.0.tar.gz
解壓完成之后進入 apache-skywalking-apm-bin 目錄,編輯 config/application.yml 文件,將其中 ElasticSearch 配置項以及其子項的全部注釋去掉,將 h2 配置項及其子項全部注釋掉,如下圖所示,這樣 SkyWalking 就從默認(rèn)的存儲 h2 切換成了 ElasticSearch :
接下來執(zhí)行 ./bin/startup.sh 文件即可啟動 SkyWalking OAP 以及 UI 界面,看到的輸出如下:
>./bin/startup.sh
SkyWalking?OAP?started?successfully!
SkyWalking?Web?Application?started?successfully!
我們可以在 logs/skywalking-oap-server.log 以及 logs/webapp.log?兩個日志文件中查看到 SkyWalking OAP 以及 UI 項目的相關(guān)日志,這里不再展開。
最后訪問 http://127.0.0.1:8080/ 即可看到 SkyWalking 的 Rocketbot UI界面。
Skywalking Agent 目錄結(jié)構(gòu)
SkyWalking Agent 使用了 Java ?Agent 技術(shù),可以在無需手工埋點的情況下,通過 JVM 接口在運行時將監(jiān)控代碼段插入已有 Java 應(yīng)用中,實現(xiàn)對 Java 應(yīng)用的監(jiān)控。SkyWalking Agent 會將服務(wù)運行過程中獲得的監(jiān)控數(shù)據(jù)通過 gRPC 發(fā)送給后端的 OAP 集群進行分析和存儲。
SkyWalking 目前提供的 Agent 插件在 apache-skywalking-apm-bin/agent 目錄下:
agent
????├──?activations
????│???├──?apm-toolkit-log4j-1.x-activation-6.2.0.jar
????│???├──?...
????│???└──?apm-toolkit-trace-activation-6.2.0.jar
????├──?config?#?Agent?配置文件
????│???└──?agent.config
????├──?logs?#?日志文件
????├──?optional-plugins?#?可選插件
????│???├──?apm-customize-enhance-plugin-6.2.0.jar
????│???├──?apm-gson-2.x-plugin-6.2.0.jar
????│???└──?...?...
????├──?plugins?#?當(dāng)前生效插件
????│???├──?apm-activemq-5.x-plugin-6.2.0.jar
????│???├──?tomcat-7.x-8.x-plugin-6.2.0.jar
????│???├──?spring-commons-6.2.0.jar
????│???└──?...?...
????└──?skywalking-agent.jar
其中,agent.config 文件是 SkyWalking Agent 的唯一配置文件。plugins 目錄存儲了當(dāng)前 Agent 生效的插件。optional-plugins 目錄存儲了一些可選的插件(這些插件可能會影響整個系統(tǒng)的性能或是有版權(quán)問題),如果需要使用這些插件,需將相應(yīng) jar 包移動到 plugins 目錄下。最后的 skywalking-agent.jar 是 Agent 的核心 jar 包,由它負(fù)責(zé)讀取 agent.config 配置文件,加載上述插件 jar 包,運行時收集到 的 Trace 和 Metrics 數(shù)據(jù)也是由它發(fā)送到 OAP 集群的。
skywalking-demo 示例
下面搭建 demo-webapp、demo-provider 兩個 Spring-Boot 項目,并且接入 SkyWalking Agent 進行監(jiān)控,具體結(jié)構(gòu)如下:
demo-webapp 會 Dubbo 遠(yuǎn)程調(diào)用 demo-provider 的接口,而 Dubbo 依賴了 Zookeeper,所以要先安裝 Zookeeper。首先下載 zookeeper-3.4.14.tar.gz 包(下載地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/)。下載完成之后執(zhí)行如下命令解壓縮:
tar?-zxf?zookeeper-3.4.14.tar.gz
解壓完成之后,進入 zookeeper-3.4.14 目錄,拷貝 conf/zoo_sample.cfg 文件并重命名為 conf/zoo.cfg,之后執(zhí)行如下命令啟動 Zookeeper:
>./bin/zkServer.sh?start
#?下面為輸出內(nèi)容
ZooKeeper?JMX?enabled?by?default
Using?config:?/Users/xxx/zookeeper-3.4.14/bin/../conf/zoo.cfg?#?配置文件
Starting?zookeeper?...?STARTED?#?啟動成功
下面在 IDEA 中創(chuàng)建 skywalking-demo 項目,并在其中創(chuàng)建 demo-api、demo-webapp、demo-provider 兩個 Module,如下圖所示:
在 skywalking-demo 下面的 pom.xml 中,將父 pom 指向 spring-boot-starter-parent 并添加 demo-api 作為公共依賴,如下所示:
<project?xmlns=...">
????<modelVersion>4.0.0</modelVersion>
????<parent>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-starter-parent</artifactId>
????????<version>2.1.1.RELEASE</version>
????</parent>
????<groupId>com.xxx</groupId>
????<artifactId>skywalking-demo</artifactId>
????<packaging>pom</packaging>
????<version>1.0-SNAPSHOT</version>
????<modules>
????????<module>demo-api</module>
????????<module>demo-webapp</module>
????????<module>demo-provider</module>
????</modules>
????<dependencyManagement>
????????<dependencies>
????????????<dependency>
????????????????<groupId>com.xxx</groupId>
????????????????<artifactId>demo-api</artifactId>
????????????????<version>1.0-SNAPSHOT</version>
????????????</dependency>
????????</dependencies>
????</dependencyManagement>
</project>
在 demo-api 中只定義了 HelloService 接口,它是 Dubbo Provider 和 Dubbo Consumer 依賴的公共接口,如下:
public?interface?HelloService?{
????String?say(String?name)?throws?Exception;
}
demo-provider 模塊
這里的 demo-provider 扮演了 Dubbo Provider 的角色,在其 pom.xml 文件中引入了 Spring Boot 以及集成 Dubbo 相關(guān)的依賴,如下所示:
<dependencies>
????<!--?引入公共API接口?-->
????<dependency>
????????<groupId>com.xxx</groupId>
????????<artifactId>demo-api</artifactId>
????????<version>1.0-SNAPSHOT</version>
????</dependency>
????<!--?引入spring-boot-starter以及dubbo和curator的依賴?-->
????<dependency>
????????<groupId>com.alibaba.boot</groupId>
????????<artifactId>dubbo-spring-boot-starter</artifactId>
????????<version>0.2.0</version>
????</dependency>
????<!--?Spring?Boot相關(guān)依賴?-->
????<dependency>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-starter</artifactId>
????</dependency>
</dependencies>
demo-provider 模塊中的 DefaultHelloService 實現(xiàn)了 HelloService 接口,如下所示:
@Service
@Component
public?class?DefaultHelloService?implements?HelloService?{
????public?String?say(String?name)?throws?Exception{
????????Thread.sleep(2000);
????????return?“hello”?+?name;
????}
}
在 resource/application.yml 配置文件中將 DefaultHelloService 實現(xiàn)注冊到 Zookeeper上對外暴露為 Dubbo Provider,具體配置如下:
dubbo:
??application:
????name:?demo-provider?#?Dubbo?Provider?的名字
??registry:
????#?注冊中心地址,即前面啟動的Zookeeper地址
????address:?zookeeper://127.0.0.1:2181?
??protocol:
????name:?dubbo?#?指定通信協(xié)議
????port:?20880?#?通信端口,這里指的是與消費者間的通信協(xié)議與端口
??provider:
????timeout:?10000?#?配置全局調(diào)用服務(wù)超時時間,dubbo默認(rèn)是1s,肯定不夠用呀
????retries:?0?#?不進行重試
????delay:?-1
在 DemoProviderApplication 中提供 Spring Boot 的啟動 main() 方法,如下所示:
@EnableDubbo?//?添加對?Dubbo支持的注解
@SpringBootApplication
public?class?DemoProviderApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(DemoProviderApplication.class,?args);
????}
}
為了引入 Skywalking Agent 插件,還需要將 apache-skywalking-apm-bin/agent/config 目錄下的 agent.config 配置文件拷貝到 demo-provider 模塊的 resource 目錄下,并修改其中的 agent.service_name:
#?The?service?name?in?UI
agent.service_name=${SW_AGENT_NAME:demo-provider}
很明顯,agent.config 是一個 KV 結(jié)構(gòu)的配置文件,類似于 properties 文件,value 部分使用 "${}" 包裹,其中使用冒號(":")分為兩部分,前半部分是可以覆蓋該配置項的系統(tǒng)環(huán)境變量名稱,后半部分為默認(rèn)值。例如這里的 agent.service_name 配置項,如果系統(tǒng)環(huán)境變量中指定了 SW_AGENT_NAME 值(注意,全是大寫),則優(yōu)先使用環(huán)境變量中指定的值,如果環(huán)境變量未指定,則使用 demo-provider 這個默認(rèn)值。
除了系統(tǒng)環(huán)境變量的覆蓋方式,SkyWalking Agent 還支持另外兩種覆蓋默認(rèn)值的方式:
- JVM 配置覆蓋
例如這里的 agent.service_name 配置項,如果在 JVM 啟動之前,明確中指定了下面的 JVM 配置:
-Dskywalking.agent.service_name?=?demo-provider
#?"skywalking."是?Skywalking環(huán)境變量的默認(rèn)前綴
則會使用該配置值覆蓋 agent.config 配置文件中默認(rèn)值。
- 探針配置覆蓋
如果將 Java Agent 配置為如下:
-javaagent:/path/skywalking-agent.jar=agent.service_name=demo-provider
#?默認(rèn)格式是?-javaagent:agent.jar=[option1]=[value1],[option2]=[value2]
則會使用該 Java Agent 配置值覆蓋 agent.config 配置文件中 agent.service_name 默認(rèn)值。
如果四種配置同時出現(xiàn),則優(yōu)先級如下:
探針配置?>?JVM配置?>?系統(tǒng)環(huán)境變量配置?>?agent.config文件默認(rèn)值
編輯好 agent.config 配置文件之后,我們需要在啟動 demo-provider 之前通過參數(shù)告訴 JVM SkyWalking Agent 配置文件的位置,IDEA 中的配置如下圖所示:
最后啟動 DemoProviderApplication 這個入口類,可以看到如下輸出:
#?查找到?agent.config?配置文件
INFO?2020-02-01?12:12:07:574?main?SnifferConfigInitializer?:??Config?file?found?in?...?agent.config.?
#?查找到?agent目錄
DEBUG?2020-02-01?12:12:07:650?main?AgentPackagePath?:??The?beacon?class?location?is?jar:file:/Users/xxx/...?
#?Dubbo?Provider?注冊成功
2020-02-01?12:12:16.105??INFO?58600?---?[main]?c.a.d.r.zookeeper.ZookeeperRegistry??????:??[DUBBO]?Register:?dubbo://172.17.32.91:20880/com.xxx.service.HelloService
#?demo-provider?啟動成功
2020-02-01?12:12:16.269??INFO?58600?---?[???????????main]?com.xxx.DemoProviderApplication??????????:?Started?DemoProviderApplication?in?4.635?seconds?(JVM?running?for?9.005)
demo-webapp 模塊
完成 demo-provider 模塊的啟動之后,我們繼續(xù)來開發(fā) demo-webapp 模塊,其 pom.xml 與 demo-provider 中的 pom.xml 相比,多引入了 spring-boot 對 Web開發(fā)的依賴,以及 SkyWalking 提供的 apm-toolkit-trace 依賴用來獲取 TraceId:
??<dependency>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--?apm-toolkit-trace?這個依賴主要用來獲取?TraceId?-->
<dependency>
????<groupId>org.apache.skywalking</groupId>
????<artifactId>apm-toolkit-trace</artifactId>
????<version>6.2.0</version>
</dependency>
首先,在 HelloWorldController 中提供了兩個接口:
- /hello/{words} 接口:通過 Dubbo 遠(yuǎn)程調(diào)用 demo-provider 暴露的接口。
- /err 接口:直接拋出 RuntimeException 異常。
HelloWorldController 的具體實現(xiàn)如下:
@RestController
@RequestMapping("/")
public?class?HelloWorldController?{
????@Reference
????private?HelloService?helloService;
????“/hello/{words}”)
????public?String?hello(@PathVariable(“words”)?String?words)?
????????????throws?Exception{
????????Thread.sleep(1000);
????????//?TraceContext?工具類定義在?apm-toolkit-trace?依賴包中
????????log.info(“traceId:{}”,?TraceContext.traceId());
????????ActiveSpan.tag(“hello-trace”,?words);
????????String?say?=?helloService.say(words);
????????Thread.sleep(1000);
????????return?say;
????}
????“/err”)
????public?String?err()?{
????????String?traceId?=??TraceContext.traceId();
????????log.info(“traceId:{}”,?traceId);
????????ActiveSpan.tag(“error-trace?activation”,?“error”);
????????throw?new?RuntimeException(“err”);
????}
在 resources/application.yml 文件中會配置 demo-webapp 監(jiān)聽的端口、Zookeeper 地址以及 Dubbo Consumer 的名稱等等,具體配置如下:
server:
??port:?8000
dubbo:
??application:
????name:?demo-webapp?#?Dubbo?Consumer名字
??registry:
????address:?zookeeper://127.0.0.1:2181?#?注冊中心地址,即?Zookeeper地址
demo-webpp 模塊也需要在 resource 目錄下添加 agent.config 配置文件,并修改其 agent.service_name 配置項,如下所示:
#?The?service?name?in?UI
agent.service_name=${SW_AGENT_NAME:demo-webapp}
demo-webpp 模塊的入口 main() 方法與 demo-provider 相同,不再贅述。
為了接入 SkyWalking Agent,啟動 demo-webapp 項目之前也需要配置相應(yīng)的 VM options 參數(shù),指定 agent.config 配置文件的地址,如下圖所示:
最后,啟動 demo-webapp 項目,通過瀏覽器訪問?http://localhost:8000/hello/xxx?地址得到正常相應(yīng),訪問?http://localhost:8000/err?得到 500 響應(yīng),即表示啟動成功。
到此為止,SkyWalking Agent 的基本接入方式就介紹完了,在后面分析和改造 SkyWalking 源碼時,還可以使用 demo-webapp 和 demo-provider 這兩個應(yīng)用來產(chǎn)生 Trace 和 Metrics 數(shù)據(jù)。
SkyWalking Rocketbot 使用
搭建完 SkyWalking 環(huán)境以及相關(guān)示例之后,我們來看如何使用 SkyWalking 提供的 UI 界面—— Skywalking Rocketbot。在前面執(zhí)行的 ./bin/startup.sh 腳本,除了啟動后端 OAP 服務(wù),同時還會啟動 Skywalking Rocketbot(位于 webapp 目錄下的 skywalking-webapp.jar)。
如下圖所示,在 Skywalking Rocketbot 首頁頂部(1)處,有四個主 Tab 頁,在【儀表盤】這個 Tab 中,(2)處可以選擇查詢的服務(wù)(Service)、端點(Endpoint) 以及服務(wù)實例(ServiceInstance)。在(3)處可以選擇展示的不同維度,下圖展示了 Global 這個全局視圖:
其中有五個面板((4)~(8)),分別是:
- Global Heatmap 面板:熱力圖,從全局展示了某段時間請求的熱度。
- Global Percent Response 面板?:展示了全局請求響應(yīng)時間的 P99、P95、P75 等分位數(shù)。
- Global Brief 面板:展示了 SkyWalking 能感知到的 Service、Endpoint 的個數(shù)。
- Global Top Troughput 面板:展示了吞吐量前幾名的服務(wù)。
- Global Top Slow Endpoint 面板:展示了耗時前幾名的 Endpoint。
除了 SkyWalking Rocketbot 默認(rèn)提供的這些面板,我們還可以點擊(2)處左邊的鎖型按鈕,自定義 Global 面板。另外,我們還可以通過(9)處的時間選擇框選擇自定義查詢的時間段。
將(3)處切換到 Service 面板,可以看到針對 Service 的監(jiān)控面板,如下圖所示:
- Service (Avg) ResponseTime 面板:展示了指定服務(wù)的(平均)耗時。
- Service (Avg) Throughput 面板:展示了指定服務(wù)的(平均)吞吐量。
- Service (Avg) SLA 面板:展示了指定服務(wù)的(平均)SLA(Service Level Agreement,服務(wù)等級協(xié)議)。
- Service Percent Response 面板:展示了指定服務(wù)響應(yīng)時間的分位數(shù)。
- Service Slow Endpoint 面板:展示了指定服務(wù)中耗時比較長的 Endpoint 信息。
- Running ServiceInstance 面板:展示了指定服務(wù)下的實例信息。
將(3)處切換到 Endpoint 面板,可以看到針對 Endpoint 的監(jiān)控面板,基本功能與 Service 面板類似,這里不再展開。
將(3)處切換到 Instance 面板,可以看到針對 ServiceInstance 的監(jiān)控面板,如下圖所示:
? ? ?
在 ServiceInstance 面板中展示了很多 ServiceInstance 相關(guān)的監(jiān)控信息,例如,JVM 內(nèi)存使用情況、GC 次數(shù)、GC 耗時、CPU 使用率、ServiceInstance SLA 等等信息,這里不再一一展開介紹。
下面我們切換到【拓?fù)鋱D】這個主 Tab,如下圖所示,在(1)處展示當(dāng)前整個業(yè)務(wù)服務(wù)的拓?fù)鋱D。點擊拓?fù)鋱D中的任意節(jié)點,可在(2)處看到服務(wù)相應(yīng)的狀態(tài)信息,其中包括響應(yīng)的平均耗時、SLA 等監(jiān)控信息。點擊拓?fù)鋱D中任意一條邊,可在(3)處看到一條調(diào)用鏈路的監(jiān)控信息,其中會分別從客戶端(上游調(diào)用方)和服務(wù)端(下游接收方)來觀測這條調(diào)用鏈路的狀態(tài),其中展示了該條鏈路的耗時、吞吐量、SLA 等信息:
下面我們切換到【追蹤】這個主 Tab來查詢 Trace 信息,如下圖所示。在(1)、(2)處可以選擇 Trace 的查詢條件,其中可以指定 Trace 涉及到的 Service、ServiceInstance、Endpoint 以及Trace 的狀態(tài)繼續(xù)模糊查詢,還可以指定 TraceId 和時間范圍進行精確查詢。在(3)處展示了 Trace 的簡略信息,下圖中 "/err" 接口這條 Trace 被顯示為紅色表示該 Trace 關(guān)聯(lián)的請求出現(xiàn)了異常。在(4)和(5)處展示了 Trace 的具體信息以及所有 Span 信息,我們可以通過(6)處按鈕調(diào)整 Span 的展示方式:
點擊 Trace 中的 Span,就可以將該 Span 的具體信息展示出來,如下下圖所示,點擊"/err" 接口相關(guān) Trace 中的 Span,即可看到相應(yīng)的 TRuntimeException 異常信息:
最后,我們將主 Tab 也切換到【告警】,這里展示了 Skywalking 發(fā)出來的告警信息,如下圖所示,這里也提供了相應(yīng)的查詢條件和關(guān)鍵字搜索框。
總結(jié)
本課時搭建 SkyWalking 的運行環(huán)境,完成 ElasticSearch、Kibana、Skywalking 等的安裝,并搭建了 skywalking-demo 項目作為演示示例,帶同學(xué)們上手體驗了 Skywalking Agent 的接入的流程。文章來源:http://www.zghlxwxcb.cn/news/detail-409100.html
最后介紹了 SkyWalking Rocketbot UI 界面強大的功能,包括 Service、Endpoint、ServiceInstance 等不同級別的監(jiān)控,展示了整個服務(wù)的拓?fù)鋱D、Trace 查詢以及告警信息查詢等功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-409100.html
到了這里,關(guān)于第02講:鏈路追蹤利器,快速上手 SkyWalking的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!