主頁 > 軟體工程 > 有了這款工具,定位線上問題事半功倍|云效工程師指北

有了這款工具,定位線上問題事半功倍|云效工程師指北

2022-04-08 09:00:29 軟體工程

大家好,我叫劉玄,負責云效流水線的開發,程式員在日常作業中經常會遇到一些線上問題需要排查,本文的主人公程式員小張也不例外,但排查的程序卻時常令他困擾不已,讓我們一起看看他遇到了哪些問題,又是怎么解決的,

焦頭爛額的一天

那是一個陽光明媚的上午,小張來到工位,打開電腦,備上咖啡,精神滿滿的開始了一天的作業,正在小張噼里啪啦的敲著鍵盤,認真Coding之時,釘釘群里的一個釘,打破了寧靜,客服人員反饋,有客戶遇到了一個問題,需要開發人員排查,小張排查了線上日志,發現用戶的請求比較多,日志也比較多,沒有定位到關鍵資訊,小張只能又讓客服找用戶提供更具體的資訊,在和用戶反復進行溝通之后,小張最侄訓了半個多小時才定位到了問題,

忙碌的一天很快結束,正當小張準備下班,籌劃著下班之后怎么happy時,電話報警的聲音,又把他拉回了現實,小張收到后端服務RT高的告警后,趕緊排查多個后臺應用的監控資訊和日志,雖然很快從Nginx日志定位到了有問題的請求資訊,但小張很難精確的找到這個請求對應的應用日志,所以花費了很長時間才定位到問題:一個第三方服務例外,導致部分功能受影響,定位到原因后,及時采取了降級手段,系統恢復正常,

尋求解決問題的方案

過完了焦頭爛額的一天,小張覺得現在處理問題的效率太低,大把的時間花在了問題定位上,而之所以排查的這么慢,是因為系統采用微服務架構,一個請求會涉及到多個服務,并且每個服務還會呼叫DB、快取以及其他第三方服務,大致鏈路如下:

 

image.png

 

小張想,應該有成熟的技術方案,能夠標識整個請求鏈路,將例外服務節點清晰標注,小張借助搜索工具,發現有一種解決方案,鏈路追蹤,剛好適合自己的場景,

鏈路追蹤工具可以將一次分布式請求還原成完整的呼叫鏈路,將整個請求的呼叫情況進行展示,比如各個服務上的耗時、各個服務的請求狀態、具體調度到各個服務的哪臺機器上等資訊,

改造系統

期望的效果

根據前面遇到的兩個問題,小張期望:

  1. 用戶請求遇到問題時候,可以獲取到一個traceId,只要提供了這個traceId,就可以看到這個請求在各個服務之間的呼叫路徑,并且可以通過這個traceId查到所有應用中相關的日志,
  2. 當收到RT告警時,也能夠從Nginx的日志中找到這個traceId,

接入鏈路追蹤

經過技術選型,小張選擇阿里云的產品鏈路追蹤Tracing Analysis作為自己鏈路追蹤的服務端,

阿里云鏈路追蹤Tracing Analysis提供了完整的呼叫鏈路還原、呼叫請求量統計、鏈路拓撲、應用依賴分析等工具,可以幫助用戶快速分析和診斷分布式應用架構下的性能瓶頸,提高微服務時代下的開發診斷效率,

阿里云鏈路追蹤Tracing Analysis支持多種常見的鏈路追蹤工具,例如Zipkin、Skywalking、Jaeper等,小張選擇使用Skywalking作為鏈路追蹤資料埋點,

在阿里云上開通完鏈路追蹤Tracing Analysis 產品之后,就可以在集群配置中獲取到Skywalking的接入點,更詳細的接入指南參考阿里云官方檔案,

由于小張的系統是基于spring boot,所以只需要在啟動命令中加入以下內容即可,

 

-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=<Tracing Analysis上的接入點>"
-DSW_AGENT_NAME=<Tracing Analysis的應用名稱>"
-javaagent:skywalking-agent.jar=<Tracing Analysis的authentication資訊>"

重新啟動應用后,鏈路追蹤埋點資料就會收集到鏈路追蹤Tracing Analysis 上了,

日志中列印traceId

為了能夠通過traceId搜索到所有的日志,也需要在的應用的日志中展示traceId資訊,具體方式如下:

在應用中引入以下依賴: 

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>6.6.0</version>
</dependency>

 

修改logback組態檔,例如:tid即為 Skywalking 的traceId,

 

<property name="LOG_PATTERN" value="https://www.cnblogs.com/yyds114/archive/2022/04/07/[%d{'yyyy-MM-dd HH:mm:ss,SSS',GMT+8:00}] %-5p [%.10t][%X{CU}][%X{tid}]    %logger{36}[%L] - %m%n"/>
<appender name="CONSOLE" >
    <encoder >
        <layout >
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
    </encoder>
</appender>

   

以上改動就可以在日志中看到traceId了,如下圖所示:圖中標紅的TID值即為traceId,

 

image.png

 

同時小張也在系統出現例外資訊時,將traceId透出給用戶,用戶反饋問題時只需要提供traceId即可,相應的,需要在代碼中把traceId寫入到回應體中,如下所示: 

 

String traceId = TraceContext.traceId();
result.setTraceId(traceId);

   

Nginx日志中列印traceId

為了在收到系統RT告警時,也可以獲得traceId,需要修改Nginx配置,

接入Skywalking之后,系統間呼叫的請求都會帶上名稱為sw6的header (其中6為對應的Skywalking版本號),Header值的的格式為:1-TRACEID-SEGMENTID-3-PARENT_SERVICE-PARENT_INSTANCE-PARENT_ENDPOINT-IPPORT從這個值中提取出TRACEID,也就是第一個和第二個橫杠之間的部分,再進行BASE64 decode就可以獲取到traceId,

然后需要在Nginx 的log_format 配置添加對應的Header,如下如下:

 

log_format main 'http_sw6:$http_sw6; http_ns_client_ip:$http_ns_client_ip; time_local:$time_local; request_time:$request_time; upstream_response_time:$upstream_response_time; request:$request_method http://$host$request_uri; request_length:$request_length; upstream_cache_status:$upstream_cache_status; httpStatus:$status; body_bytes_sent:$body_bytes_sent; http_referer:$http_referer; http_user_agent:$http_user_agent; http_x_forwarded_for:$http_x_forwarded_for; remote_addr:$remote_addr;';

  

然后就可以在Nginx日志中看到了相應的值了,如圖:

 

image.png

 

解決鏈路追蹤多執行緒丟失traceId 的問題

小張在測驗鏈路追蹤時,發現在多執行緒的使用場景中,只有一個子執行緒能夠正確獲取到traceId,而其它執行緒中的traceId會出現丟失,為了解決上述問題,小張使用@TraceCrossThread注解對Callable和Runnable進行增強,@TraceCrossThread為Skywalking提供的注解,Skywalking通過增強被此注解注釋的類,以此來實作traceId的跨執行緒傳遞,示例代碼如下,

 

import org.apache.skywalking.apm.toolkit.trace.TraceCrossThread;

@TraceCrossThread
public class TraceableRunnable implements Runnable {
    
    private final Runnable runnable;
    
    public TraceableRunnable(final Runnable runnable) {
        this.runnable = runnable;
    }
    
    @Override
    public void run() {
       runnable.run();
    }
}

  

import java.util.concurrent.Callable;
import org.apache.skywalking.apm.toolkit.trace.TraceCrossThread;

@TraceCrossThread
public class TraceableCallable<T> implements Callable<T> {
    
    private final Callable<T> callable;
    
    public TraceableCallable(final Callable<T> callable) {
        this.callable = callable;    
    }
    
    @Override
    public T call() throws Exception {
         return callable.call();
    }
}

 

后續提交執行緒任務時使用改造后的TraceableCallable和TraceableRunnable 即可解決多執行緒丟失traceId 的問題,

 

完成以上改造后,以下圖為例,用戶每一次的請求都會有對應的traceId,便于將整個請求鏈路展示出來,

 

image.png

 

輕松應對線上問題

又一個陽光明媚的早上,小張埋頭作業時,又有客服反饋用戶問題,這個時候小張不慌不忙的根據用戶提供traceId,在阿里鏈路追蹤https://tracing.console.aliyun.com/上查看呼叫鏈路,很快定位到例外節點,示例如下:圖中狀態為紅色的節點就是例外節點,圖中示例表示由于某個sql執行出現例外,

 

image.png

 

輕松應對一天作業后,小張在下班前又收到應用RT過高的告警, 由于Nginx日志中列印了traceId資訊,很快就可以定位到耗時的請求,示例如下:

 

image.png

 

 

image.png

 

圖中耗時比較長的節點,是由于呼叫第三方服務造成,小張根據情況,對服務進行降級,很快就解決RT過高的問題,防止問題擴散,

接入了鏈路追蹤以后,小張在定位線上問題的耗時大大縮短,可以有更多的時間專注其他作業,

以上就是小張是如何通過使用鏈路追蹤從焦頭爛額的排查線上問題到從容定位線上問題的轉變,希望對仍未使用鏈路追蹤技術的同學有些幫助,本故事純屬虛構,如有雷同,純屬巧合,


點擊下方鏈接,即可免費體驗云效流水線Flow,

https://www.aliyun.com/product/yunxiao/flow?

 

lQLPDhtDba1KT2_NBDjNB4CwgwE-eOLUK_gCPyXeUECTAA_1920_1080.png

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457557.html

標籤:其他

上一篇:有了這款工具,定位線上問題事半功倍|云效工程師指北

下一篇:【軟工】軟體工程基礎知識【第一版】

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more