Skywalking介紹 Skywalking是一個國產的開源框架,2015年有吳晟個人開源,2017年加入Apache孵化器,國人開源的產品,主要開發人員來自於華為,2019年4月17日Apache董事會批准SkyWalking成為頂級項目,支持Java、.Net、NodeJs等探針,數據存儲支持 ...
Skywalking介紹
Skywalking是一個國產的開源框架,2015年有吳晟個人開源,2017年加入Apache孵化器,國人開源的產品,主要開發人員來自於華為,2019年4月17日Apache董事會批准SkyWalking成為頂級項目,支持Java、.Net、NodeJs
等探針,數據存儲支持Mysql、Elasticsearch等,跟Pinpoint一樣採用位元組碼註入的方式實現代碼的無侵入,探針採集數據粒度粗,但性能表現優秀,且對雲原生支持,目前增長勢頭強勁,社區活躍
使用版本
當前使用版本信息為:apache-skywalking-apm-es7-8.7.0
數據存儲方式
Skywalking
預設使用的是H2
,本次實戰主要使用的ElasticSearch
來存儲相對應的鏈路數據。Skywalking
本身還支持mysql、tidb、influxdb、postgresql
等數據存儲方式
Skywalking的安裝以及使用
安裝及運行(本次安裝主要是在windows)
- 下載對應的二進位軟體包
(apache-skywalking-apm-es7-8.7.0.tar)
,並且解壓到指定的文件夾下麵 - 涉及到的主要目錄為:
bin(存放對應的命令)、config(相關的配置文件)、agent(代理jar包)
- 進入bin目錄直接執行目錄下對應的
startup.bat
即可運行Skywalking
,預設是運行在8080埠;啟動成功後即可在瀏覽器輸入地址即可訪問:127.0.0.1:8080
。運行界面如圖所示: - 首次訪問沒有上圖相關的圖示數據,因為還未對項目進行代理做數據採集
運行SpringBoot
項目,並對其進行監控
運行其要進行監控的項目,增加代理參數,代理參數如下:
java -jar -javaagent:H:\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -DSW_AGENT_NAME=demo -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
啟動完項目後,就可以在SkyWalking看到該項目對應的訪問數據以及對應的拓撲圖
採集數據持久化
-
Skywalking
預設是通過H2對採集數據進行存取的,並且沒有做相對應的持久化,相關配置在config
文件夾中application.xml
文件中的121行:selector: ${SW_STORAGE:H2}
。為了方便以及做持久化本實戰主要將數據存放在ElasticSearch
中 -
修改數據存取方式為
elasticsearch7
,只需要將selector修改為對應的elasticsearch7即可:selector: ${SW_STORAGE:elasticsearch7}
-
配置elasticsearch:
nameSpace: ${SW_NAMESPACE:"elasticsearch"} //一定為要和elasticsearch中的cluster_name相對應 clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
-
重啟SkyWalking之後,後期採集數據就存放在了ElasticSearch中了
註:在使用elasticsearch時需要註意其版本號,負責SkyWalking Collect將啟動失敗,本實戰其對應的版本為7.2.0
加入日誌採集
1、引入日誌採集相關的jar包:
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.5.0</version>
</dependency>
2、在項目resource目錄下新建logback.xml
文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<property name="logData" value="./logDatas" />
<property name="appName" value="accessLog" />
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<appender name="CONSOLE_OUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%-15(%d{HH:mm:ss.SSS}) %msg%n</pattern>
</layout>
</appender>
<appender name="LOG_DEMO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logData}/logDataDemo.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 指定生成日誌保存地址 -->
<fileNamePattern>${logData}/%d{yyyy-MM-dd}/${appName}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>1MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>
%-15(%d{yyyy-MM-dd HH:mm:ss} [info]) %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="msystem-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<!-- 日誌輸出編碼 -->
<encoder>
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字元寬度%msg:日誌消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE_OUT" />
</root>
<!--輸出到指定日誌文件-->
<logger name="outToFile" level="INFO" additivity="false">
<appender-ref ref="LOG_DEMO"/>
<appender-ref ref="msystem-log"/>
</logger>
</configuration>
3、重新啟動對應的SpringBoot項目,然後訪問對應的路徑即可收集到相關的數據
也可以在其追蹤數據中查看起對應的日誌
對某個介面/端點增加性能剖析,從而找出系統瓶頸
1、增加對應的端點對應進行性能剖析(故意對log/test2方法中sleep
4秒)
@GetMapping("/test2")
public Result<ArrayList<Map<String, Object>>> test2() throws InterruptedException {
final ArrayList<Map<String, Object>> maps = new ArrayList<>();
Thread.sleep(4000);
maps.add(new HashMap<String,Object>() {{
put("name","張三");
put("age",12);
}});
maps.add(new HashMap<String,Object>() {{
put("name","李四");
put("age",32);
}});
return Result.success(maps);
}
2、訪問起對應的地址(http://127.0.0.1:8802/demo/log/test2?name=1&age=12&sex=1),在收集期間,儘量多訪問幾次,訪問次數少有可能無法採集到
3、查看相應的分析報告,從而找出具體瓶頸
點擊分析就會出現如下圖所示信息
通過分析可以看出耗時的主要控制器和方法,以及對應的行號
全鏈路慄子
1、上述實例中並未涉及到對應的資料庫和redis以及其他的服務交互,所以在拓撲圖中看到的數據是非常單一的
2、如果在應用中有資料庫、redis以及其他服務的調用在起拓撲圖中會清晰的看到具體的調用關係,實例如下圖:
3、當其中一個服務不可用時,其拓撲圖會標識某個業務為不健康的(紅色),下圖是因為手動關閉了redis的服務
4、介面請求異常會在相對應的追蹤頁面看到紅色標註的信息,通過點擊查看日誌可以看到報錯信息