SkyWalking之APM無侵入可觀測原理分析

一、 簡介(為什么需要用到可觀測能力)

????????隨著微服務的開發模式的興起,早期的單體架構系統已拆分為很多的子系統,各個子系統封裝為微服務,各服務間通過HTTP協議RESET API或者RPC協議進行調用。

? ? ? ? 在單體服務或者微服務較少的情況下,當我們遇到問題時可以直接簡單、快速地通過日志進行分析,并迅速判斷是A服務還是B服務存在問題,以此快速恢復服務。

????????但是,在大型企業中,系統數量已經到達了幾十個、甚至上百個,每個系統都有不同的架構和調用協議,那么此時這些系統之間的調用關系會變得錯綜復雜。當某個API接口的業務邏輯很復雜、且調用鏈路很長,涉及的系統或微服務較多,一旦其中一環出現問題,想要快速定位問題和解決問題那就太難了,如果還是按照早期一一查看日志的方式進行排查,無疑對運維和開發人員是一場噩夢.....

????????那么有什么方式能夠做到快速定位和分析,并且在應用不改造的情況下實施呢?此時就需要一套APM(應用性能管理(Application Performance Management))系統,將我們業務開發與運維制定的規范嵌入APM系統,在可視化UI面板+告警快速地,通過服務調用鏈的拓撲圖進行問題定位。

????????APM系統開源的其實有很多產品,例如韓國主導的Pinpoint、大眾點評的CAT、推特的ZipKin、CNCF的Jaeger以及本文重點介紹的Apache SkyWalking. 感興趣的同學都可以一一了解和使用。

????????APM重點關注三個指標數據: 1、Metrics ?2、Logging ?3、Tracing

????????Peter Bourgon在參加完2017 Distributed Tracing Summit后發表的一篇博文,簡潔扼要地介紹了指標(Metrics)、鏈路(Tracing)、日志(Logging)三者的定義和關系。這三種數據在可觀察性中都有各自的發揮空間,但每種數據都沒辦法完全被其他數據代替。

????????我們從一個典型的服務問題排查過程來看:

  1. 通過各式各樣的預設報警發現異常(通常是Metrics/Logging)
  2. 打開監控大盤查找異常的曲線,并通過查詢找到異常的模塊(Metrics)
  3. 對這個模塊以及關聯日志進行查詢分析,找到核心的報錯信息(Logging)
  4. 通過詳細的調用鏈數據定位到引起問題的代碼(Tracing)

二、SkyWalking

????????SkyWalking 由中國華為和 Apache 開源社區共同開發,目前已成為 Apache 基金會下的頂級項目之一,作者吳晟。

????????SkyWalking 是基于 Apache 開源生態的分布式應用性能監控系統。它提供了面向云原生架構的 APM(Application Performance Management)解決方案,支持多種語言的應用和多種方式的部署,具有以下特點:

????????分布式追蹤:支持多種語言、多種協議的應用追蹤,可獲取全鏈路的請求數據。

????????應用拓撲圖:根據追蹤數據自動生成應用程序拓撲,便于系統管理員快速定位故障。

????????監控告警:具有豐富的監控指標和告警規則,支持第三方告警接口。

????????插件化體系:可通過插件模塊實現對不同類型服務的監控和數據收集。

2.1 無侵入式說明

????????SkyWalking Agent采集調用鏈信息的客戶端對業務是無感的、非侵入式的。 那也就意味著,你的項目代碼無須修改一行代碼就能加入SkyWalking的采集、監控、調用鏈追蹤。

? ? ? ? 原始項目接入SkyWalking很輕松、門檻很低。 底層大概得原理是:JAVA本身就提供JAVAAGENT的機制以及采用動態修改字節碼技術的方式,Agent在JVM底層幫我們把調用鏈采集上報的過程透明化了,開發人員作為業務層寫代碼是無感的。

? ? ? ? 注意:無侵入方式實現

  1. 應用服務器中需要安裝SkyWalking-agent.jar
  2. 應用需要重啟,并且在啟動參數中添加相關配置,在后面案例中會提供詳細的參

接下來我會使用入門案例做個簡單初步分析和驗證.

三、案例驗證(使用JAVA:SpringBoot工程+PHP)

3.1?安裝SkyWalking的OAP系統安裝包

下載:? SkyWalking的OAP壓縮包

下載頁面:?Downloads | Apache SkyWalking

3.2 上傳下載好的OAP的tar包

3.3?運行OAP

1、解壓 apache-skywalking-apm-9.7.0.tar.gz

tar -zxvf apache-skywalking-apm-9.7.0.tar.gz

2、進入 apache-skywalking-apm-bin

3、在啟動OAP之前需要確定機器上是否安裝JDK

注意SkyWalking新版安裝包需要JDK11以上,否則無法啟動

Linux 上安裝及卸載JDK(包含yum方式)-CSDN博客

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/skywalking/oap/server/starter/OAPServerStartUp has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

該錯誤告訴我們,我們的類是在比嘗試運行它的版本更高的Java版本下編譯的。 更具體地說,在這種情況下,我們使用Java 11編譯了我們的類,并嘗試使用Java 8運行它。

作為參考,讓我們快速看一下Java版本號。 如果我們需要下載適當的Java版本,這將很方便。主版本號和次版本號存儲在類字節碼中的字節六和七中。讓我們看看主要版本號如何映射到Java版本:45 = Java 1.146 = Java 1.247 = Java 1.348 = Java 1.449 = Java 550 = Java 651 = Java 752 = Java 853 = Java 954 = Java 1055 = Java 1156 = Java 1257 = Java 13

4、進入bin目錄有啟動腳本,我們先啟動oapService.sh(服務端)、再啟動webappService.sh(UI客戶端)

sh oapService.sh 
sh webappService.sh

5、啟動完畢,執行jps程序查看進程有沒有正常拉起來

如果JPS無法使用,則參考linux環境下JPS命令未找到-CSDN博客

6、正常會出現上面兩個進程,如果沒有拉起來在logs目錄可以查看錯誤信息進行排查,如無問題則繼續往下

7、訪問SkyWalking 8080 UI界面,默認端口8080

http://$ip:8080

???????目前剛開始服務列表這些是空的, SkyWalking支持多種數據存儲介質例如默認內存、MySQL、ES等等,一般生產環境使用ES集群進行存儲,我們測試直接不用改什么配置,默認采用內存的形式。那就意味著如果服務重啟,則之前的測試數據會丟失。

3.4?Trace調用鏈追蹤的基本原理介紹

? ? ? ?Trace調用鏈追蹤,例如A->B->C->D ?存在4個微服務的調用鏈關系。 假設我們通過HTTP協議進行交互,該怎么把調用鏈信息拿到呢??

? ? ? ? Google的Dapper論文中提到了一種分布式調用鏈追蹤的實現方式, 市面上的APM系統調用鏈追蹤大部分是參考這篇論文實現的。 每個調用鏈可以使用TraceId進行標識,每個服務被調用稱為一個Span會伴隨一個SpanId, 每當父服務調用子服務的時候會將TraceId以及父層的SpanId往子服務傳遞,子服務收到后,記錄父層傳遞的SpanId作為自己Span的父id, ?最后2個服務都會把調用信息上報到APM的服務端,例如SkyWalking的某個端口。

? ? ? ? 最后SkyWalking因為采集到了這些Span的信息,Span信息記錄著父子關系、調用時間信息、TraceId等等,經過UI繪制,就能把這一次調用的TraceId的所有Span進行串聯,最終形成調用鏈拓撲圖。

? ? ? ? 接下來我們部署一個SpringBoot項目和一個PHP項目,很簡單的鏈路,SpringBoot調用PHP項目的HTTP接口,我們來看下SkyWalking的UI界面以及分析原理驗證。

3.5?運行項目
? ? ? ? 我本地搭建了一套SpringBoot項目,但是如果只是簡單運行,那肯定和我們的SkyWalking還沒進行結合。那怎么結合起來呢? ?那就是通過運行的時候,設置參數,和SkyWalking Agent進行結合。

????????我們上面提到過,使用SkyWalking Agent最大的好處就是【無代碼侵入】,那也就是意味著我們的源代碼無須做任何變更, 只需要在運行java -jar JAR包的時候額外加入一下參數即可:

? ? ? 下載Agent:

下載后進行解壓,我將使用兩種方式驗證;

本地IDEA運行和Linux環境下運行,但注意運行需要同時配置JVM啟動參數

# skywalking‐agent.jar的本地磁盤的路徑
-javaagent:F:\Apache\skywalking-agent\skywalking-agent.jar
# 在skywalking上顯示的服務名
-Dskywalking.agent.service_name=SkyWalking-Test
# skywalking的collector服務的IP及端口
-Dskywalking.collector.backend_service=192.168.20.128:11800
  • 本地IDEA運行SpringBoot工程

?????????????????????

訪問接口,即可在UI界面上展示信息

服務列表信息

查看調用service調用拓撲圖

查看調用鏈詳細信息

  • Linux上運行

通過官網Tar包,啟動一直報錯

啟動命令:
java -javaagent:/user/local/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=TestDemo-Adaptee -Dskywalking.collector.backend_service=[IP]:11800 -jar /user/local/TestDemo-Adaptee-0.0.1-SNAPSHOT.jar錯誤:
Error opening zip file or JAR manifest missing : /user/local/skywalking-agent/skywalking-agent.jar
Error occurred during initialization of VM
agent library failed to init: instrument

官網Tar包下載地址:???????Index of /skywalking/java-agent

下載Agent包:
wget https://dlcdn.apache.org/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz解壓:
tar -zxvf apache-skywalking-java-agent-9.0.0.tgz

博主解壓完后出現兩個文件:tgz.1和skywalking-agent文件夾

需要再次解壓tgz.1壓縮包

解壓:
tar -zxvf apache-skywalking-java-agent-9.0.0.tgz

啟動

執行上面啟動命令后即可

???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696491.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696491.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696491.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

8:00面試,8:05就出來了 ,問的實在是....

從外包出來,沒想到竟然死在了另一家廠子 自從加入這家公司,每天都在加班,錢倒是給的不少,所以我也就忍了。沒想到12月一紙通知,所有人都不許加班,薪資直降30%,頓時有吃不起飯的趕腳。 好在有個…

AI推介-大語言模型LLMs論文速覽(arXiv方向):2024.02.05-2024.02.10

相關LLMs論文大多都是應用型文章,少部分是優化prompt/參數量級等等… 有一些應用文還是值得參考的,當工作面臨一個新的場景,可以學習下他人是如何結合LLMs與實際應用中的鏈接。 LLMs論文速覽:2024.02.05-2024.02.10: …

ESP8266智能家居(2)——8266發布數據到mqtt服務器

1.公共服務器 學習物聯網就離不開服務器,如果你資金充足的話,可以自己購買或者租用一個服務器。本次我選擇,使用免費的公共MQTT服務器。它的端口及Broker信息如下: 網址為: 免費的公共 MQTT 服務器 | EMQ (emqx.com)h…

LLMChain使用 | RouterChain的使用 - 用本地大模型搭建多Agents

單個本地大模型搭建參考博客 單個Chain:面對一個需求,我們需要創建一個llmchain,設置一個prompt模板,這個chain能夠接收一個用戶input,并輸出一個結果;多個Chain:考慮到同時面對多個需求&#x…

動態規劃背包問題

前言 動態規劃背包問題是一類經典的優化問題,涉及到選擇物品以最大化某個目標值(通常是價值或利潤),同時受到某種約束(如重量、體積或時間)。背包問題可以分為多種類型,例如0-1背包問題、完全背…

第三百六十回

文章目錄 1. 概念介紹2. 實現方法2.1 環繞效果2.2 立體效果 3. 示例代碼4. 內容總結 我們在上一章回中介紹了"自定義SlideImageSwitch組件"相關的內容,本章回中將介紹兩種陰影效果.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本…

設計模式-創建型模式-原型模式

原型模式(Prototype Pattern):使用原型實例指定創建對象的種類,并且通過克隆這些原型創建新的對象。原型模式是一種對象創建型模式。原型模式其實就是從一個對象再創建另外一個可定制的對象,而且不需知道任何創建的細節…

微信小程序開發學習筆記——2.8媒體組件image的src三種引入方式

>>跟著b站up主“咸蝦米_”學習微信小程序開發中,把學習記錄存到這方便后續查找。 課程連接: https://www.bilibili.com/video/BV19G4y1K74d?p11 image:https://developers.weixin.qq.com/miniprogram/dev/component/image.html 一…

如何在Python中執行Shell腳本?

Python執行Shell命令 1、背景概述2、Python集成Shell及數據交互 1、背景概述 Python作為一種強大的腳本語言,其易用性和靈活性使得它成為自動化任務的理想選擇。在Python中執行Shell腳本可以實現一些操作系統級的功能,使程序更加靈活、易理解和易維護 在…

Redis-內存管理

Redis是基于內存存儲的,非關系型,鍵值對數據庫。因此,對Redis來說,內存空間的管理至關重要。那Redis是如何內存管理的呢? 一、最大內存限制 Redis 提供了 maxmemory 參數允許用戶設置 Redis 可以使用的最大內存大小。…

js設計模式:依賴注入模式

作用: 在對象外部完成兩個對象的注入綁定等操作 這樣可以將代碼解耦,方便維護和擴展 vue中使用use注冊其他插件就是在外部創建依賴關系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…

Elastic Search:構建語義搜索體驗

當你逐步熟悉 Elastic 時,你將使用 Elasticsearch Relevance Engine? (ESRE),該引擎旨在為 AI 搜索應用程序提供支持。 借助 ESRE,你可以利用一套開發人員工具,包括 Elastic 的文本搜索、向量數據庫和我們用于語義搜索的專有轉換…

ngnix網站服務詳解

一 Nginx的簡介 1 Nginx: ①Nginx 是開源、高性能、高可靠的 Web 和反向代理服務器,而且支持熱部署,幾乎可以做到 7 * 24 小時不間斷運行,即使運行幾個月也不需要重新啟動,還能在不間斷服務的情況下對軟件版本進行熱…

2月22日作業,按鍵中斷LED燈控制

1.使用GPIO子系統&#xff0c;編寫LED驅動&#xff0c;應用程序測試 mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/of.h> …

微軟Azure OpenAI的 GPT 接口使用小結

直接使用OpenAI的 GPT服務&#xff0c;在國內環境使用上會一些相關問題&#xff0c;微軟提供了OpenAI的服務&#xff0c;基本上可以滿足的相關的需要。下面提供一些簡單的使用操作&#xff0c;來讓你快速使用到 GPT 的服務。 前提&#xff1a;注冊Azure的賬戶&#xff0c;并綁…

OpenCV中的normalize函數以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具體應用介紹

在OpenCV中&#xff0c;normalize函數用于將圖像或矩陣的值規范化到一個特定的范圍內。這在圖像處理中非常有用&#xff0c;比如在調整圖像的對比度、準備數據進行機器學習處理時。規范化可以提高不同圖像之間的可比性&#xff0c;或是為了滿足特定算法對數據范圍的要求。 nor…

數的反碼和補碼表示

2.反碼 反碼的表示方法是: 正數的反碼是其本身負數的反碼是在其原碼的基礎上,符號位不變&#xff0c;其余各個位取反 [1][000000011原[000000011反[-1][10000001]原[11111110]反 3.補碼 補碼的表示方法是: 正數的補碼就是其本身 負數的補碼是在其原碼的基礎上,符號位不變,其余各…

36、IO進程線程/進程和線程之間的通信練習

一、使用有名管道完成兩個進程的相互通信(提示&#xff1a;可以使用多進程或多線程完成)。 代碼1&#xff1a;創建兩個有名管道文件 #include<myhead.h>int main(int argc, const char *argv[]) {if(mkfifo("./mingtohua",0664)-1)//創建小明向小華發信息的管…

Stable Diffusion 繪畫入門教程(webui)-ControlNet(深度Depth)

上篇文章介紹了線稿約束&#xff0c;這篇文章介紹下深度Depth 文章目錄 一、選大模型二、寫提示詞三、基礎參數設置四、啟用ControlNet 顧名思義&#xff0c;就是把原圖預處理為深度圖&#xff0c;而深度圖可以區分出圖像中各元素的遠近關系&#xff0c;那么啥事深度圖&#xf…

c/c++ | 字符串函數總結 | 為什么總喜歡糾結sizeof 和strlen 呢?

其實時間長了&#xff0c;稍微研究后&#xff0c;再來品味&#xff0c;別有一番滋味 總是看著混亂&#xff0c;但是靜下來看&#xff0c;還是能琢磨透的&#xff0c;只是看著復雜&#xff0c;本質是兩套風格&#xff0c;然后又要有交集&#xff0c;所以就看起來復雜 // 首先字符…