一泪蔫、背景
????隨著微服務的越來越流行喘批,我們服務之間的調用關系就顯得越來越復雜,我們急需一個APM
工具來分析系統(tǒng)中存在的各種性能指標問題以及調用關系婿滓。目前主流的APM工具有CAT
粥喜、Zipkin
额湘、Pinpoint
以及SkyWalking
,本文主要簡單介紹一下SkyWalking
的搭建嗡官。
二毯焕、SkyWalking的組成
SkyWalking
主要的幾個組成模塊。
1婆咸、Agent
主要負責從系統(tǒng)中采集各種指標尚骄,鏈路數(shù)據(jù)侵续,發(fā)送給 oap
服務。
2需五、oap
服務接收Agent
發(fā)送過來的數(shù)據(jù)警儒,存儲眶根,執(zhí)行分析,提供查詢和報警功能记劝。
3厌丑、Storage
和UI
負責存儲數(shù)據(jù)以及查看數(shù)據(jù)怒竿。
三扩氢、使用 docker-compose 搭建一個 oap 和 ui 服務
version: '3'
services:
elasticsearch7:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0
container_name: elasticsearch7
restart: always
ports:
- 9023:9200
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
networks:
- skywalking
volumes:
- elasticsearch7:/usr/share/elasticsearch/data
oap:
image: apache/skywalking-oap-server:8.0.1-es7
container_name: oap
depends_on:
- elasticsearch7
links:
- elasticsearch7
restart: always
ports:
- 9022:11800
- 9021:12800
networks:
- skywalking
volumes:
- ./ext-config:/skywalking/ext-config
ui:
image: apache/skywalking-ui:8.0.1
container_name: ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 9020:8080
environment:
SW_OAP_ADDRESS: oap:12800
networks:
- skywalking
networks:
skywalking:
driver: bridge
volumes:
elasticsearch7:
driver: local
1录豺、docker-compose文件的目錄
skywalking
├── ext-config
│ └── application.yml
├── ext-libs
├── skywalking.yml
└── temp.txt
2饭弓、訪問
http://localhost:9020
3弟断、注意事項
1阀趴、如果我們想覆蓋oap
鏡像中的/skywalking/config
目錄下的配置文件苍匆,我們可以在 docker
中掛載一個/skywalking/ext-config
目錄锉桑,將配置文件丟到此目錄中即可。
2攻柠、如果我們想覆蓋oap
鏡像中的/skywalking/oap-libs
目錄下的jar,我們可以在 docker
中掛載一個/skywalking/ext-libs
目錄瑰钮,將新的jar包丟到此目錄中即可微驶,但是已經存在的jar包無法被覆蓋。
3苟耻、使用的版本是 8.0.1
扶檐,數(shù)據(jù)持久化到 es7
中
四款筑、全局日志追蹤 traceId 的使用
方案一:
1、引入依賴
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.0.1</version>
</dependency>
2杈湾、修改 logback.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- Logback Configuration. -->
<configuration debug="false">
<!-- ConsoleAppender:把日志輸出到控制臺 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern><![CDATA[
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{tid}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
]]></Pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
方案二
參考如下鏈接 https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/Application-toolkit-trace.md
五漆撞、idea 或 jar 中使用
使用如下命令,需要折成一行
java
-javaagent:(agentjar包的位置)(eg: /Users/huan/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar )
-Dskywalking.agent.service_name=xxxxx-service
-Dskywalking.collector.backend_service=127.0.0.1:9022 -jar xxxx.jar
-javaagent
指定 agent jar 包的位置
-Dskywalking.agent.service_name
指定服務名
-Dskywalking.collector.backend_service
指定 oap 服務的地址
六限煞、skywalking的目錄解釋
apache-skywalking-apm-bin-es7
├── LICENSE
├── NOTICE
├── README.txt
├── agent
├── activations
├── bootstrap-plugins
├── config -- agent 的配置文件,比如我們上一步使用 -Dskywalking.agent.service_name配置的這些
├── logs
├── optional-plugins 可選插件 (將optional-plugins目錄的jar包放到 plugins 目錄下即可啟動這些插件)
├── plugins 啟用的插件
└── skywalking-agent.jar 我們自己的服務需要使用 -javaagent 指定到這個jar的位置
├── bin oap/ui 的啟動腳本
├── config 配置文件
├── licenses
├── oap-libs
├── tools
└── webapp ui界面
七奋献、訪問 skywalking 的界面
八瓶蚂、實戰(zhàn)
1宣吱、忽略某些url不被追蹤
1征候、第一步將 apm-trace-ignore-plugin-8.0.1.jar 從optional-plugins 移動到 plugins 目錄中
2疤坝、配置忽略url
方法一: 在 agent/config
目錄下創(chuàng)建 apm-trace-ignore-plugin.config
文件
trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:需要忽略的url}
eg:trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:/xxx/**}
方法二: 直接使用環(huán)境變量
-Dskywalking.trace.ignore_path=需要忽略的url路徑
注意:
1、忽略路徑是支持 ant
風格的锅睛。
2现拒、忽略多個url使用英文的逗號
分隔望侈。
2、追蹤子線程的信息
1扛点、引入依賴
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.0.1</version>
</dependency>
2岂丘、使用@TraceCrossThread注解或使用SupplierWrapper/RunnableWrapper/TraceCrossThread
@GetMapping("tractThread")
public String tractThread() {
log.info("準備自己線程信息");
new Thread(RunnableWrapper.of(() -> log.info("子線程的信息"))).start();
return "trace thread";
}
此處演示RunnableWrapper.of
包裝Runnable
線程。
3铜邮、如果某個方法SkyWalking沒有追蹤,但是想追蹤并輸出一些額外的tag信息等
1扔茅、引入依賴
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.0.1</version>
</dependency>
2召娜、自己想加入的方法使用 @Trace 注解修飾
@GetMapping("tractAnnotation")
public User traceAnnotation(
@RequestParam("name") String name
) {
log.info("從前端接收到的參數(shù):[{}]", name);
User user = trace(name);
ActiveSpan.tag("new-tag", user.toString());
ActiveSpan.info("輸出信息");
log.info("tractId:[{}]", TraceContext.traceId());
return user;
}
@Trace(operationName = "添加自定義的方法")
@Tags({
@Tag(key = "從方法參數(shù)中獲取值", value = "arg[0]"),
@Tag(key = "從返回值中獲取值", value = "returnedObj.name")
})
private User trace(String name) {
log.info("如果此方法沒有被SkyWalking收集玖瘸,但是又需要被收集到檀咙,可以加上@Trace注解");
User user = new User();
user.setName("創(chuàng)建的名字");
return user;
}
4弧可、自定義顯示服務實例
默認服務實例的名字是 uuid@hostname
,這個在某些時候不一定好區(qū)分裁良,因為我們希望自定義一個 instanceName
名字
1年鸳、默認的實現(xiàn)
2搔确、自定義實現(xiàn)
使用 -Dskywalking.agent.instance_name=自定義的服務名
即可。
5座硕、配置記錄的過期時間
修改
application.yml
配置文件中的信息华匾。
6机隙、和其它agent使用時候的處理
1、問題
當我們和其它的agent一起使用時旭旭,比如Arthas
持寄,其它的agent可能工作的不是那么好。
2稍味、解決方案
jar程序啟動命令增加如下JVM參數(shù)
-Dskywalking.agent.is_cache_enhanced_class=true -Dskywalking.agent.class_cache_mode=MEMORY
3模庐、參考文檔
九、項目源碼
docker-compose.yml文件 https://gitee.com/huan1993/configuration/blob/master/docker/compose/skywalking/skywalking.yml
java代碼 https://gitee.com/huan1993/skywalking
十屑彻、參考鏈接
SkyWalking官網(wǎng) http://skywalking.apache.org/zh/
SkyWalking的docker github地址 https://github.com/apache/skywalking-docker
elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html
skywalking中文文檔 https://skyapm.github.io/document-cn-translation-of-skywalking/
agent config https://github.com/apache/skywalking/blob/v8.0.1/docs/en/setup/service-agent/java-agent/README.md#table-of-agent-configuration-properties
skywalking和其它agent一起使用的處理