[toc]
一仅政、分布式鏈路追蹤
1.1 分布式鏈路追蹤系統(tǒng)起源
在比較大型的web集群和微服務環(huán)境中,客戶端的一次請求可能需要經過多個不通的模塊,多個中間件,多臺主機一起相互協(xié)作才能處理完成客戶端的騎牛哩罪,而在這一系列的請求過程之中,處理流程可能是串行也可能是并行巡验,要清晰的了解客戶端的一次請求到結束的背后調用了哪些應用以及哪些模塊并經過了哪些節(jié)點,且么個模塊的調用先后順序是怎么的碘耳,每個模塊的處理相應性能如何显设,就需要一套鏈路追蹤(Trace)來分析各個環(huán)節(jié)的業(yè)務處理狀況,從而讓運維人員對整個業(yè)務系統(tǒng)一目了然
分布式服務跟蹤系統(tǒng)是整個分布式系統(tǒng)中跟蹤一個用戶請求的完整過程辛辨,包括數(shù)據(jù)采集捕捂、數(shù)據(jù)傳輸瑟枫、數(shù)據(jù)存儲、數(shù)據(jù)分析和數(shù)據(jù)可視化指攒,獲取并存儲和分享此類跟蹤可以讓運維清晰了解用戶請求也業(yè)務系統(tǒng)交互背后的這個調用鏈的調用關系慷妙,鏈路追蹤系統(tǒng)是針對調試和監(jiān)控微服務不可或缺的好幫手
- 業(yè)務環(huán)境
業(yè)務系統(tǒng)是使用復雜的、大規(guī)模的分布式集群實現(xiàn)允悦,并且由很多服務組成,每個服務可能是使用不通的軟件模塊或開發(fā)框架,也可能是使用不同的編程語言開發(fā)拂募,服務可能運行在數(shù)千臺服務器喧伞,并且分步在不同的數(shù)據(jù)中心運行,對管理和監(jiān)控產生挑戰(zhàn)全闷;因此需要鏈路追蹤跟蹤請求叉寂,查看整體系統(tǒng)的瓶頸和實時的狀況,分析出響應慢或存在問題的環(huán)節(jié)
一個前端服務作為訪問入口总珠,用戶的請求可能會被轉發(fā)至多個后端服務處理屏鳍,當出現(xiàn)系統(tǒng)響應慢的時候,運維工程師很難對各個請求鏈路了如指掌局服,因為服務開發(fā)和維護可能是由不同的團隊維護的孕蝉,而且不通的后端服務還可能被不同的前端進行調用,因此人工疏理和排錯會變得耗時且艱難
- Dapper
Dapper是google公司在2008年就開始內部使用經過生產環(huán)境驗證的鏈路追蹤系統(tǒng)腌逢。2010年google發(fā)布的Dapper論文降淮,《Dapper,a Large-Sacle Distributed Systems Tracing Infrastructure(2010)》
- 針對Dapper設計要求
無處不在的部署:任何服務都應該被監(jiān)控到搏讶,出問題都要做到有據(jù)可查
持續(xù)的監(jiān)控:做到7*24小時監(jiān)控佳鳖,任何時候出問題都要基于監(jiān)控數(shù)據(jù)追蹤問題根源
- 針對Dapper設計目標
低消耗:dapper跟蹤系統(tǒng)對服務的影響應該做到最小,在一些高并發(fā)的場合媒惕,即使很小的影響也可能會導致服務出現(xiàn)延遲系吩、負載變高或不可用,從而導致業(yè)務團隊可能會停掉dapper系統(tǒng)
對應用透明:應用程序對dapper系統(tǒng)無感知深知不知道dapper系統(tǒng)的存在妒蔚,假如一個跟蹤系統(tǒng)必須依賴于應用的開發(fā)者配合才能實現(xiàn)跟蹤穿挨,需要在應用中植入跟蹤代碼,那么可能會因為植入代碼而產生bug或導致應用出問題
可伸縮性:針對未來眾多的服務和大規(guī)模業(yè)務集群肴盏,dapper系統(tǒng)應該滿足未來在性能的壓力和功能上的需求
- Dapper請求鏈路
如下圖是一個有五臺服務器相關的服務科盛,包括前端(A),兩個中間層(B和C)菜皂,以及兩個后端(D和E)贞绵,當一個用戶(User)發(fā)起一個請求時,首先到達前端(A)恍飘,然后發(fā)送兩個RPC到服務器B和C榨崩,B收到請求后馬上做出響應谴垫,但是C需要和后盾的D和E交互之后再返回給A,由A來響應最初的客戶請求母蛛,對于這樣一個請求翩剪,簡單實用的分布式跟蹤的實現(xiàn),就是為服務器上每一次發(fā)送和接收動作來收集跟蹤標識符(message identifiers)和時間戳(timestamp events)
- Dapper數(shù)據(jù)采集
分布式追蹤的設計方案主要可以分為兩類:黑盒(black-box)和標記(annotation-based)
黑盒法:無需任何侵入性代碼彩郊,它的優(yōu)勢在于無需修改代碼前弯,缺點在于記錄不是很準確,且需要大量數(shù)據(jù)才能夠推導出服務間的關系
標記法:需要為每個請求打標記焦辅,并通過一個全局標識符將請求途徑的所有服務信息串聯(lián)博杖,復盤整個鏈路,標記法記錄準確筷登,缺點是需要將標記代碼注入到每個服務中
在google內部剃根,幾乎所有應用都使用相同的threading model、control flow和RPC systems前方,因此可以將打標記的工作集中在少量的公共庫中狈醉,同樣能夠達到對應用透明的效果
- Dapper跟蹤樹和span
span代表系統(tǒng)中具有開始時間和執(zhí)行時長的請求跨度,span之間通過嵌套或者順序排列建立邏輯因果關系惠险,在dapper跟蹤樹結構中苗傅,樹節(jié)點是整個框架的基本單元,是請求從前端到后端不同應用之間層級機構班巩,而每一個節(jié)點又是對span的引用渣慕,節(jié)點之間的連線表示span和它的父span直接的關系;下圖說明了span在一個跟蹤過程中的示例抱慌,dapper記錄了span名稱逊桦,以及每個span的ID和父ID,以重建在一次追蹤過程中不同span之間的關系抑进,如果一個span沒有父ID强经,則稱之為root span,所有span都掛載一個特定的跟蹤上寺渗,也共用一個跟蹤id匿情,所有這些ID用全局唯一的64位整數(shù)表示,在一個典型的dapper跟蹤中信殊,每一個RPC對應到一個span上炬称,而且每一個額外的組件層都對應一個跟蹤樹型結構的層級
任何一個span可以包含來自不同的主機信息,這些也要記錄下來鸡号,事實上每一個RPC span可以包含客戶端和服務器兩個過程的注釋转砖,使得連接兩個主機的span會成為圖中的span,由于客戶端和服務器上的時間戳來自不同的主機鲸伴,還必須考慮到時間偏差府蔗,在分析工具中,就利用了時間偏差汞窗,即RPC客戶端發(fā)送一個請求后姓赤,服務器端才能接收到,對于響應也是一樣的(服務器先響應仲吏,然后客戶端才能接收到這個響應)不铆,這樣一來,服務器端的RPC就有一個時間戳的一個開始和結束裹唆,然后就可以計算出時間損耗誓斥。
對于traceid,在一個請求中许帐,traceid從始至終都是一樣的
- Dapper植入點
dapper可以實現(xiàn)對應用開發(fā)者近乎零侵入的成本對分布式請求鏈路進行跟蹤劳坑,主要通過通用組件庫實現(xiàn);當一個線程在處理跟蹤請求鏈路的過程中成畦,dapper把這次跟蹤的上下文的信息在ThreadLocal中進行存儲距芬,追蹤上下文是一個小而且容易復制的空間,其中記錄了Scan的屬性信息循帐,比如跟蹤ID和Span ID框仔;當用戶的請求處理過程是延遲調用的或是異步的。大多數(shù)google開發(fā)者通過線程池或其他執(zhí)行器拄养,使用一個通用的控制流庫來回調离斩,dapper確保所有這樣的回調可以存儲這次跟蹤的上下文,而當回調函數(shù)被觸發(fā)時瘪匿,這次跟蹤的上下文會與適當?shù)木€程關聯(lián)上跛梗,在這種方式下,dapper可以使用trace ID和span ID來輔助構建異步調用的路徑柿顶;幾乎所有的google進程間通信都是建立在一個C++和Java開發(fā)的RPC框架上茄袖,我們把跟蹤植入該框架來定義RPC中所有的span,span ID和跟蹤ID會從客戶端發(fā)送到服務端嘁锯,像那樣基于RPC的系統(tǒng)被廣泛使用在google中宪祥,這是一個重要的植入點,當那些非rpc通信框架發(fā)展成熟并找到了自己的用戶群之后家乘,會計劃對RPC通信框架進行植入蝗羊。
- Dapper添加Annotation
dapper還允許應用程序開發(fā)人員在Dapper跟蹤的過程中添加額外的信息,以監(jiān)控更高級別的系統(tǒng)行為仁锯,或幫助調試問題耀找,dapper允許用戶通過一個簡單的API定義時間戳的Annotation,這些Annotation可以添加任意內容,為了保護dapper的用戶過分熱衷于日志的記錄野芒,每一個跟蹤span有一個可配置的總Annotation量的上線蓄愁,但是,應用程序級別的Annotation是不能替代用于表示span結構的信息和記錄著RPC相關的信息狞悲;除了簡單的文本Annotation撮抓,dapper也支持key-value映射的Annotation,提供給開發(fā)人員更強的跟蹤能力摇锋,如持續(xù)的計數(shù)器丹拯,二進制消息記錄和在一個進程上跑著的任意的用戶數(shù)據(jù),鍵值對的Annotation方式用來在分布式追蹤的上下文中定義某個特定應用程序的相關類型
- Dapper采樣率
低損耗是dapper的一個關鍵設計目標荸恕,因為如果這個工具價值未被證實并對性能有影響乖酬,那么服務運營人員就不愿意部署,并且融求,我們像讓開發(fā)人員使用Annotation的API咬像,而不用擔心額外的開銷,另外某些類型的web服務對植入帶來的性能損耗確實非常敏感双肤,因此施掏,除了把dapper的收集工作對基本組件的性能損耗限制盡可能小之外,還有進一步控制損耗的辦法茅糜,那就是遇到大量請求時只記錄其中的一小部分
- Dapper跟蹤收集實現(xiàn)步驟
dapper的跟蹤記錄和收集管道的過程分為三個階段
- span數(shù)據(jù)寫入本地日志文件中
- 守護進程和收集組件從主機中讀取數(shù)據(jù)
- 寫到dapper的數(shù)據(jù)倉庫中
一次跟蹤被設計成Bigtable中的一行七芭,每一列相當于一個span,Bigtable支持稀疏表格布局正適合這種情況蔑赘,因為每一個跟蹤可以有任意多個span
- Dapper跟蹤的代價
在生產環(huán)境的跟蹤數(shù)據(jù)處理中狸驳,dapper的守護進程從來沒有超過0.3%的單核cpu使用率,而且只有很少量的內存使用缩赛,另外還限制了dapper守護進程為內核scheduler最低的優(yōu)先級耙箍,以防止在一臺高負載的服務器上發(fā)生cpu競爭,dapper也是一個寬帶資源的輕量級的消費者酥馍,每一個span在我們的倉庫中傳輸只占用了平均426字節(jié)(byte)辩昆,作為網絡行為中的極小部分,dapper的數(shù)據(jù)收集在google的生產環(huán)境中只占用了0.01%的網絡資源
創(chuàng)建root span:204納秒旨袒,創(chuàng)建一般的span:176納秒
建立一個annotation:40納秒
寫到本地磁盤
dapper本地進程:<0.3% CPU汁针,< 0.01% 網絡
- Dapper應用場景
性能分析:開發(fā)人員針對請求延遲的目標進行跟蹤,并對容易優(yōu)化的地方進行定位
正確性分析:發(fā)現(xiàn)一些只讀請求應該是訪問從庫但是卻訪問了主庫類似的業(yè)務場景
理解系統(tǒng):全局優(yōu)化系統(tǒng)砚尽,理解每個查詢的整體代價
測試新版本:發(fā)現(xiàn)新版本的bug和性能問題
解決依賴關系:找到服務之間的依賴關系
1.2 分布式鏈路追蹤系統(tǒng)簡介
- APM概述
APM(Application Performance Management施无,應用性能管理)
早期APM工具功能比較單一,主要以監(jiān)控CPU使用率必孤、I/O猾骡、內存資源、網速等網絡基礎設施為主(cacti、nagios)兴想,隨著中間件技術的不斷發(fā)展幢哨,APM也開始監(jiān)控緩存、數(shù)據(jù)庫襟企、MQ等各種基礎組件的性能(zabbix嘱么、prometheus)狮含;微服務興起之后顽悼,系統(tǒng)功能被模塊化,再加上k8s與容器化的興起及應用數(shù)量的爆炸式增長几迄,各模塊和服務之間的鏈路調用蔚龙、響應時間、負載等越來越不好通過傳統(tǒng)的工具進行監(jiān)控和統(tǒng)計木羹,此時APM系統(tǒng)應運而生
- APM項目
- CAT:由國內美團點評開源的,基于Java語言開發(fā)解孙,目前提供Java坑填、C/C++、Nodejs弛姜、Python脐瑰、Go等語言的客戶端,監(jiān)控數(shù)據(jù)會全量統(tǒng)計廷臼,國內公司在用的有美團點評苍在、攜程、拼多多等荠商,CAT需要開發(fā)人員手動在應用程序總埋點寂恬,對代碼侵入性較強
- Zipkin:由Twitter公司開發(fā)并開源,基于Java語言實現(xiàn)莱没,侵入性相對于CAT低一些初肉,需要對web.xml等相關配置文件進行修改,但依然對系統(tǒng)有一定的侵入性饰躲,Zipkin可以輕松與Spring Cloud進行集成牙咏,也是Spring Cloud推薦的APM系統(tǒng)
- Jaeger:是Uber推出的一款開源分布式鏈路追蹤系統(tǒng),主要使用go語言開發(fā)属铁,對業(yè)務代碼侵入性較少
- Pinpoint:韓國團隊開源的APM產品眠寿,運用了字節(jié)碼增強技術,只需要在啟動時添加啟動參數(shù)即可實現(xiàn)APM功能焦蘑,對代碼無侵入盯拱,目前支持Java和PHP語言,底層采用HBase來存儲數(shù)據(jù),探針收集的數(shù)據(jù)粒度非常細狡逢,但性能損耗較大宁舰,因其出現(xiàn)的時間較長,完成度也很高奢浑,文檔較為豐富蛮艰,應用的公司較多
- SkyWalking:SkyWalking是有國內開源愛好者吳晟開源并提交到Apache孵化器的開源項目,2017年12月SkyWalking成為Apache國內首個個人孵化項目雀彼,2019年4月17日SkyWalking從Apache基金會的孵化器畢業(yè)成為頂級項目壤蚜,目前SkyWalking支持Java、.Net徊哑、Nodejs袜刷、Go、Python等探針莺丑,數(shù)據(jù)存儲支持MySQL著蟹、Elasticsearch等,SkyWalking與Pinpoint相同梢莽,對業(yè)務代碼無侵入萧豆,不過探針采集數(shù)據(jù)粒度相較于Pinpoint來說略粗,但性能表現(xiàn)優(yōu)秀昏名,目前SkyWalking增長勢頭強勁涮雷,社區(qū)活躍,中文文檔齊全葡粒,沒有語言障礙份殿,支持多語言探針,這些都是SkyWalking的優(yōu)勢所在嗽交,還有就是SkyWalking支持很多框架卿嘲,包括國產框架,例如夫壁,Dubbo拾枣、gRPC、SOFARPC等盒让,同時也有很多開發(fā)者正在不斷向社區(qū)提供更多插件以支持更多組件無縫接入SkyWalking
- 開源的:piwik等
- 商業(yè)的:百度統(tǒng)計梅肤、growingio等
- OpenTracing規(guī)范
由于以上APM系統(tǒng)較多,各個分布式鏈路追蹤產品的API并不兼容邑茄,如果用戶在各個產品之間進行切換姨蝴,成本非常高,因此社區(qū)成立了OpenTracing組織肺缕,通過指定統(tǒng)一個API標準和數(shù)據(jù)結構模型左医,從而幫助開發(fā)人員和用戶能夠方便地使用或更換追蹤系統(tǒng)
- OpenTracing數(shù)據(jù)模型trace
一個Trace代表一個事物授帕、請求或是流程在分布式系統(tǒng)中的執(zhí)行過程,OpenTracing中的一個Trace被認為是一個由多個Span組成的有向無環(huán)圖( Directed Acyclic Graph浮梢,DAG圖)跛十,一個Span代表系統(tǒng)中具有開始時間和執(zhí)行時長的邏輯單元,一條Trace中Span是首尾連接的(從請求開始到響應結束)
- OpenTracing數(shù)據(jù)模型span
span代表系統(tǒng)中具有開始時間和執(zhí)行長度的請求跨度秕硝,span之間通過嵌套或者順序排列建立邏輯因果關系芥映,每個span中可以包含以下的信息:
操作名稱:例如訪問的具體RPC服務,訪問的URL地址等远豺;起始時間奈偏;結束時間;span tag:一組鍵值對構成的span標簽集合憋飞,其中鍵必須為字符串類型霎苗,值可以是字符串、bool類型或者數(shù)據(jù)榛做;span log:一組span的日志集合;spanContext:trace的全局上下文信息内狸;references:span之間的引用關系检眯,下圖詳細說明span之間的引用關系,span的請求會產生logs昆淡,logs會攜帶一個時間戳以及一個可選的附加信息
- OpenTracing數(shù)據(jù)模型tags
每個span可以有多個鍵值對形式的tags锰瘸,tags是沒有時間戳的,只是為span添加一些簡單解釋和補充信息
- APM對比
Pinpoint | Zipkin | Jaeger | SkyWalking | |
---|---|---|---|---|
OpenTracing兼容 | 否 | 是 | 是 | 是 |
客戶端支持語言 | java,php | java,c#,go,php等 | java,c#,go,php等 | java, .net core,nodejs,php |
存儲 | hbase | es,mysql,Cassandra,內存 | es,mysql,Cassandra,內存 | es,h2,msyql,tidb,sharding sphere |
傳輸協(xié)議支持 | thrift | http,MQ | udp,http | gRPC,http |
UI豐富程度 | 高 | 低 | 中 | 中 |
實現(xiàn)方式 | 字節(jié)碼注入昂灵,無侵入 | 攔截請求避凝,侵入 | 攔截請求,侵入 | 字節(jié)碼注入眨补,無侵入 |
擴展性 | 低 | 高 | 高 | 中 |
Trace查詢 | 不支持 | 支持 | 支持 | 支持 |
告警支持 | 支持 | 不支持 | 不支持 | 支持 |
JVM監(jiān)控 | 支持 | 不支持 | 不支持 | 支持 |
性能損失 | 高 | 中 | 中 | 低 |
二管削、SkyWalking
2.1 SkyWalking簡介
官方網址:https://skywalking.apache.org/
實現(xiàn)從請求跟蹤,指標收集和日志記錄的完整信息記錄撑螺,多語言自動探針含思,支持Java、Go甘晤、Python含潘、PHP、NodeJS线婚、Lua遏弱、Rust等客戶端;內置服務網格可觀察性塞弊,支持從Istio+Envoy Service Mesh收集和分析數(shù)據(jù)漱逸,模塊化架構缀踪,存儲,集群管理虹脯,使用插件集合都可以進行自由選擇驴娃;支持告警,優(yōu)秀的可視化效果
- OAP
OAP(Observability Analysis Platform循集,可觀測性分析平臺)或OAP Server唇敞,是一個高度組件化的輕量級分析程序,由兼容各種探針Receiver咒彤、流式分析內核和查詢內核三部分構成
探針:基于無侵入式的收集疆柔,并通過http或者gRPC方式發(fā)送數(shù)據(jù)到OAP Server
存儲實現(xiàn)(Storage Implementors):SkyWalking OAP Server支持多種存儲實現(xiàn)并且提供了標準接口,可支持不通的后端存儲
UI模塊(SkyWalking):通過標準的GraphQL(Facebook在2012年開源)協(xié)議進行統(tǒng)計數(shù)據(jù)查詢和展示
GraphQL官方網址:https://graphql.cn/
- 設計模式
面向協(xié)議設計:是SkyWalking從5.x開始嚴格遵守的首要設計原則镶柱,組件之間使用標準的協(xié)議進行數(shù)據(jù)交互旷档,協(xié)議分為探針協(xié)議和查詢協(xié)議
- 探針協(xié)議
探針上報協(xié)議:協(xié)議包括語言探針的注冊、Metrics數(shù)據(jù)上報歇拆、Tracing數(shù)據(jù)上報等標準鞋屈,Java、Go等探針都需要嚴格遵守此協(xié)議的標準
探針交互協(xié)議:因為分布式追蹤環(huán)境故觅,探針間需要借助http header厂庇、MQ header在應用之間進行通信和交互,探針交互協(xié)議就定義了交互的數(shù)據(jù)格式
Service Mesh協(xié)議:是SkyWalking對Service Mesh抽象的專有協(xié)議输吏,任何Mesh類的服務都可以通過此協(xié)議直接上傳指標數(shù)據(jù)权旷,用于計算服務的指標數(shù)據(jù)和繪制拓撲圖
第三方協(xié)議:對大型的第三方開源項目,尤其是Service Mesh核心平臺Istio和Envoy贯溅,提供核心協(xié)議適配拄氯,支持針對Istion+Envoy Service Mesh進行無縫對接
- 數(shù)據(jù)查詢協(xié)議
元數(shù)據(jù)查詢:查詢在SkyWalking注冊的服務、服務實例它浅、Endpoint等元數(shù)據(jù)信息
拓撲關系查詢:查詢全局译柏、單個服務、Endpoint的拓撲圖及依賴關系
Metrics指標查詢:查詢指標數(shù)據(jù)
聚合指標查詢:區(qū)間范圍均值查詢及Top N排名數(shù)據(jù)查詢等
Trace查詢:追蹤數(shù)據(jù)的明細查詢
告警查詢:基于表達式罚缕,判斷指標數(shù)據(jù)是否超出閾值
- skywalking設計
模塊化設計:負責收集數(shù)據(jù)艇纺,前端負責展示數(shù)據(jù),OAP Server負責從后端存儲讀寫數(shù)據(jù)邮弹,后端存儲負責持久化數(shù)據(jù)
輕量化設計:skywalking在設計之初就提出了輕量化的設計理念黔衡,使用最輕量級的jar包模式,實現(xiàn)強大的數(shù)據(jù)處理和分析能力腌乡、可擴展能力和模塊化能力
- skywalking優(yōu)勢
兼容性好:支持傳統(tǒng)的部署架構dubbo和spring cloud盟劫,也支持云原生中的Istio和Envoy
易于部署和后期維護:組件化,可以自動以部署与纽,后期橫向擴容簡單
高性能:每天數(shù)T的數(shù)據(jù)無壓力
易于二次開發(fā):標準的http和grpc協(xié)議侣签,開源的項目塘装,企業(yè)可以自主二次開發(fā)
2.2 部署SkyWalking
2.2.1 二進制部署
skywalking-ui:前端服務,端口號8080
skywalking-oap(Observability Analysis Platform):可觀測性分析平臺影所,11800作為數(shù)據(jù)寫入端口蹦肴,12800作為查詢端口
es7:9200為elasticsearch的數(shù)據(jù)讀寫端口,skywalking支持的存儲有elasticsearch猴娩、h2阴幌、mysql、tidb卷中、influxdb矛双、postgresql等
agent:app服務器部署skywalking agent,用于收集app中的訪問請求
- 部署elasticsearch
# 下載
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-amd64.deb
# 安裝
dpkg -i elasticsearch-7.10.1-amd64.deb
# 修改配置文件 ...
# 重啟并設計為開機啟動
systemctl restart elasticsearch.service
systemctl enable elasticsearch.service
- 部署skywalking server
# 安裝openjdk-11-java
apt install -y openjdk-11-java
# 下載
wget https://archive.apache.org/dist/skywalking/8.6.0/apache-skywalking-apm-es7-8.6.0.tar.gz
# 解壓
tar xvf apache-skywalking-apm-es7-8.6.0.tar.gz
# 修改配置文件
vim config/application.yml
storage:
selector: ${SW_STORAGE:elasticsearch7} # 112行指定存儲為es7
elasticsearch7:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:ES_IP:9200} # 141行指定es7地址
# 啟動
./bin/startup.sh
# 查看日志是否啟動成功
tail -f logs/skywalking-oap-server.log
- 驗證
注意右下角服務器時區(qū)蟆豫,一定要跟主機時區(qū)對應上议忽,不然展示不出來數(shù)據(jù)
2.2.2 docker-compose部署
version: '3.3'
services:
es7:
image: elasticsearch:7.16.1
container_name: elasticsearch7
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
skywalking-oap:
image: apache/skywalking-oap-server:8.6.0-es7
container_name: skywalking-oap
restart: always
depends_on:
- elasticsearch7
links:
- elasticsearch7
ports:
- 11800:11800
- 12800:12800
environment:
TZ: Asia/Shanghai
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch7:9200
skywalking-ui:
image: apache/skywalking-ui:8.6.0
container_name: skywalking-ui
restart: always
depends_on:
- skywalking-oap
links:
- skywalking-oap
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
SW_OAP_ADDRESS: skywalking-oap:12800
主機需要先安裝docker和docker-compose
- 啟動
docker-compose up -d
虛擬機的內存需要多分配一些,如果在啟動的時候指定分配內容十减,虛擬機內存又不夠栈幸,es就會耗時好幾分鐘才能啟動起來,然后再過幾分鐘嫉称,skywalking-ui才能啟動
2.3 追蹤實例
2.3.1 halo博客
官方網址:https://halo.run/
- 下載skywalking的java agent
# 下載
wget https://archive.apache.org/dist/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz
# 解壓
tar xvf apache-skywalking-java-agent-8.8.0.tgz
# 配置
cd skywalking-agent
vim config/agent.config
agent.namespace=${SW_AGENT_NAMESPACE:myapp}
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:IP:11800} # skywalking server地址
- 下載halo
wget https://dl.halo.run/release/halo-1.4.17.jar -O halo.jar
- 啟動halo并配置鏈路跟蹤
apt install -y openjdk-11-jdk
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -jar /apps/halo/halo.jar
默認監(jiān)聽端口8090
halo 目前運行 Halo 的最低依賴要求為 JRE 11侦镇,請務必確保在進行下面操作之前已經正確安裝了 JRE
官方網址安裝指導:https://docs.halo.run/getting-started/install/linux
- halo頁面驗證
- skywalking頁面驗證
注意時間選擇最近15分鐘,注意時區(qū)织阅,需要跟服務器時區(qū)保持一致
- skywalking儀表盤
Apdex全稱是(Application Performance Index,應用性能指數(shù))震捣,是由Apdex聯(lián)盟開放的用于評估應用性能的標準荔棉,Apdex聯(lián)盟起源于2004年,Apdex標準是從用戶的角度觸發(fā)蒿赢,提供一個統(tǒng)一的測量和報告用戶體驗的方法润樱,將其量化為范圍是0~1的滿意度評價,把最終用戶的體驗和應用性能作為一個完整的指標進行統(tǒng)一度量羡棵;在網絡中運行的任何一個應用(web服務)壹若,它的響應時間決定了用戶的滿意程度,用戶等待所有交互完成時間的長短直接影響了用戶對應用的滿意程度皂冰,這才是對用戶有真正意義的“響應時間”店展,Apdex把完成這樣一個任務所用的時長稱為應用的“響應性“
Apdex定義了應用響應時間的最優(yōu)門檻為T,另外根據(jù)應用響應時間結合T定義了三種不通的性能表現(xiàn):
Satisfied(滿意):應用響應時間小于或等于Apdex閾值秃流,比如Apdex閾值為1s瓢喉,則一個耗時小于1s的響應結果則認為是滿意的
Tolerating(可容忍):應用響應時間大于Apdex閾值胖翰,但同時小于或等于4倍的Apdex閾值,若閾值為1s婚脱,則4*1=4s為響應時間的容忍上限
Frustrated(煩躁期):應用響應時間大于4倍的Apdex閾值
服務(Service):表示對請求提供相同行為的一系列或一組工作負載(服務名稱),在使用Agent或SDK的時候世囊,可以自定義服務的名字,如果不定義,SkyWalking將會使用在平臺(例如Istio)上定義的名字
服務實例(Instance):一組工作負載中的每一個工作稱為一個實例(一個服務運行的節(jié)點)萍丐,一個服務實例可以是一個kubernetes中的pod或者是一個虛擬機或是物理機
端點(Endpoint):對于特定服務所接收的請求路徑,如HTTP的URI路徑和gRPC服務的類+方法簽名放典,如/api/v1
- skywalking拓撲圖
- skywalking追蹤圖
2.3.2 tomcat運行jenkins
- 啟動jenkins
# 下載
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.37/bin/apache-tomcat-8.5.37.tar.gz
# 解壓
tar xvf apache-tomcat-8.5.37.tar.gz
# 配置tomcat加載war包路徑
vim apache-tomcat-8.5.37/conf/server.xml
<Host name="localhost" appBase="/apps/jenkins/webapps"
unpackWARs="true" autoDeploy="true">
# 配置tomcat啟動腳本 添加如下參數(shù)
vim apache-tomcat-8.5.37/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/skywalking-agent/skywalking-agent.jar";export CATALINA_OPTS
# 啟動tomcat
./apache-tomcat-8.5.37/bin/startup.sh
- jenkins頁面
- skywalking頁面
2.3.3 微服務追蹤
- zookeeper安裝
# 下載
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
# 解壓
tar xvf apache-zookeeper-3.6.3-bin.tar.gz
# 配置
cp conf/zoo_sample.cfg conf/zoo.cfg
# 啟動zookeeper
./bin/zkServer.sh start
- 生產者
# 配置
vim dubbo-demo-provider-2.1.5/conf/dubbo.properties
dubbo.registry.address=zookeeper://IP:2181
# 啟動生產者
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC -classpath /apps/dubbo/dubbo-demo-provider-2.1.5/conf:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/dubbo-demo-provider-2.1.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main
- 消費者
# 配置
vim dubbo-demo-consumer-2.1.5/conf/dubbo.properties
dubbo.registry.address=zookeeper://192.168.204.96:2181
# 啟動
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC -classpath /apps/dubbo/dubbo-demo-consumer-2.1.5/conf:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-consumer-2.1.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main
- skywalking驗證
2.3.4 python服務追蹤
python agent官方網址:https://pypi.org/project/apache-skywalking/0.7.0/
- 安裝pip
apt install -y python3-pip
- 安裝skywalking
pip3 install "apache-skywalking"
python3
>>> from skywalking import agent, config
>>> config.init(collector_address='IP:11800', service_name='python-app-test')
>>> agent.start()
- Django驗證
- skywalking驗證
2.4 告警
告警規(guī)則github地址:https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-alarm.md
- 告警指標
service_resp_time:服務響應時間
service_sla:服務的http請求成功率SLA逝变,比如99%等
service_cpm:每分鐘的吞吐量
service_apdex:應用性能指數(shù)(0.8或0.x)
service_percentile:指定最近多少數(shù)據(jù)范圍內的響應時間百分比,即p99刻撒,p95在內的數(shù)據(jù)統(tǒng)計結果
skywalking-oap的/skywalking/config/oal/core.oal配置文件字段
- 配置alert-setting.yml文件
rules: # 定義rule規(guī)則
service_cpm_rule: # 唯一的規(guī)則名稱骨田,必須以_rule結尾
# Metrics value need tom long, double or int
metrics-name: service_cpm # 指標名稱
op: ">" # 操作符,>=,==,<,<=
threshold: 1 # 指標閾值
# The length of time to evaluate the metrics
period: 2 # 評估指標的間隔周期
# How many times after the metrics match the condition, will trigger alarm.
count: 1 # 匹配成功多少次會觸發(fā)告警
# How many times of checks, the alarm keeps silence after alarm triggered, default as same sa period.
silence-period: 2 # 觸發(fā)告警后的靜默時間
message: dubbo-provider service_cpm 大于1 # 告警信息
dingtalkHooks:
textTemplate: |-
{
"msgtype": "text",
"text": {
"content": "Apache SkyWalking Alarm sen: \n %s."
}
}
webhooks:
- url: https://oapi.dingtalk.com/robot/send?access_token=TOKEN
dingtalk告警在github網址上有
- skywalking驗證
- 釘釘截圖驗證
以生產者消費者示例