skywalking實現(xiàn)分布式系統(tǒng)鏈路追蹤

一泪蔫、背景

????隨著微服務的越來越流行喘批,我們服務之間的調用關系就顯得越來越復雜,我們急需一個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厌丑、StorageUI負責存儲數(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 服務的地址

idea中使用

六限煞、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 的界面

skywalking.jpg

八瓶蚂、實戰(zhàn)

1宣吱、忽略某些url不被追蹤

1征候、第一步將 apm-trace-ignore-plugin-8.0.1.jar 從optional-plugins 移動到 plugins 目錄中

引入忽略url插件

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;
    }
Trace注解的使用

4弧可、自定義顯示服務實例

默認服務實例的名字是 uuid@hostname,這個在某些時候不一定好區(qū)分裁良,因為我們希望自定義一個 instanceName 名字

1年鸳、默認的實現(xiàn)

默認的服務實例

2搔确、自定義實現(xiàn)

使用 -Dskywalking.agent.instance_name=自定義的服務名即可。

自定義實例服務名

5座硕、配置記錄的過期時間

修改記錄在skywalking中的保存的時間

修改 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模庐、參考文檔

https://github.com/apache/skywalking/blob/master/docs/en/FAQ/Compatible-with-other-javaagent-bytecode-processing.md

九、項目源碼

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一起使用的處理

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悴了,隨后出現(xiàn)的幾起案子违寿,更是在濱河造成了極大的恐慌藤巢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件才沧,死亡現(xiàn)場離奇詭異温圆,居然都是意外死亡孩革,警方通過查閱死者的電腦和手機膝蜈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來非剃,“玉大人窍帝,你說我怎么就攤上這事”剑” “怎么了压怠?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵菌瘫,是天一觀的道長。 經常有香客問我雇盖,道長崔挖,這世上最難降的妖魔是什么庵寞? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任脓鹃,我火速辦了婚禮瘸右,結果婚禮上渐白,老公的妹妹穿的比我還像新娘。我一直安慰自己栋齿,他們只是感情好瓦堵,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布菇用。 她就那樣靜靜地躺著惋鸥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耐量。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天廊蜒,我揣著相機與錄音山叮,去河邊找鬼添履。 笑死缝龄,一個胖子當著我的面吹牛挂谍,可吹牛的內容都是我干的。 我是一名探鬼主播炼绘,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼俺亮,長吁一口氣:“原來是場噩夢啊……” “哼疟呐!你這毒婦竟也來了脚曾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤启具,失蹤者是張志新(化名)和其女友劉穎本讥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲁冯,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡拷沸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了薯演。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撞芍。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跨扮,靈堂內的尸體忽然破棺而出序无,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站碗降,受9級特大地震影響动看,放射性物質發(fā)生泄漏菱皆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疲陕。 院中可真熱鬧,春花似錦诅岩、人聲如沸按厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穗慕。三九已至,卻和暖如春术浪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硕并。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琉兜。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓桑滩,卻偏偏與公主長得像幌氮,于是被迫代替她去往敵國和親该互。 傳聞我的和親對象是個殘疾皇子蔓搞,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355