用SkyWalking做分布式追蹤和應(yīng)用性能監(jiān)控系統(tǒng)

【轉(zhuǎn)載請注明出處】:http://www.reibang.com/p/e1592d395891

SkyWalking 是觀察性分析平臺(tái)和應(yīng)用性能管理系統(tǒng)。提供分布式追蹤、服務(wù)網(wǎng)格遙測分析叉钥、度量聚合和可視化一體化解決方案。

特性:

  • 多種監(jiān)控手段变擒,語言探針和service mesh
  • 多語言自動(dòng)探針,Java寝志,.NET Core和Node.JS
  • 輕量高效娇斑,不需要大數(shù)據(jù)
  • 模塊化,UI材部、存儲(chǔ)悠菜、集群管理多種機(jī)制可選
  • 支持告警
  • 優(yōu)秀的可視化方案

Skywalking 技術(shù)架構(gòu)

image.png

整個(gè)系統(tǒng)分為三部分:

  • agent:采集tracing(調(diào)用鏈數(shù)據(jù))和metric(指標(biāo))信息并上報(bào)
  • OAP:收集tracing和metric信息通過analysis core模塊將數(shù)據(jù)放入持久化容器中(ES,H2(內(nèi)存數(shù)據(jù)庫)败富,mysql等等)悔醋,并進(jìn)行二次統(tǒng)計(jì)和監(jiān)控告警
  • webapp:前后端分離,前端負(fù)責(zé)呈現(xiàn)兽叮,并將查詢請求封裝為graphQL提交給后端芬骄,后端通過ribbon做負(fù)載均衡轉(zhuǎn)發(fā)給OAP集群猾愿,再將查詢結(jié)果渲染展示

Skywalking也提供了其他的一些特性:

  • 配置重載:支持通過jvm參數(shù)覆寫默認(rèn)配置,支持動(dòng)態(tài)配置管理
  • 集群管理:這個(gè)主要體現(xiàn)在OAP账阻,通過集群部署分擔(dān)數(shù)據(jù)上報(bào)的流量壓力和二次計(jì)算的計(jì)算壓力蒂秘,同時(shí)集群也可以通過配置切換角色,分別面向數(shù)據(jù)采集(collector)和計(jì)算(aggregator淘太,alarm)姻僧,需要注意的是agent目前不支持多collector負(fù)載均衡,而是隨機(jī)從集群中選擇一個(gè)實(shí)例進(jìn)行數(shù)據(jù)上報(bào)
  • 支持k8s和mesh
  • 支持?jǐn)?shù)據(jù)容器的擴(kuò)展蒲牧,例如官方主推是ES撇贺,通過擴(kuò)展接口,也可以實(shí)現(xiàn)插件去- - 支持其他的數(shù)據(jù)容器
  • 支持?jǐn)?shù)據(jù)上報(bào)receiver的擴(kuò)展冰抢,例如目前主要是支持gRPC接受agent的上報(bào)松嘶,但是也可以實(shí)現(xiàn)插件支持其他類型的數(shù)據(jù)上報(bào)(官方默認(rèn)實(shí)現(xiàn)了對Zipkin,telemetry和envoy的支持)
  • 支持客戶端采樣和服務(wù)端采樣挎扰,不過服務(wù)端采樣最有意義
  • 官方制定了一個(gè)數(shù)據(jù)查詢腳本規(guī)范:OAL(Observability Analysis Language)翠订,語法類似Linq,以簡化數(shù)據(jù)查詢擴(kuò)展的工作量
  • 支持監(jiān)控預(yù)警遵倦,通過OAL獲取數(shù)據(jù)指標(biāo)和閾值進(jìn)行對比來觸發(fā)告警尽超,支持webhook擴(kuò)展告警方式,支持統(tǒng)計(jì)周期的自定義梧躺,以及告警靜默防止重復(fù)告警
數(shù)據(jù)容器

由于Skywalking并沒有自己定制的數(shù)據(jù)容器或者使用多種數(shù)據(jù)容器增加復(fù)雜度似谁,而是主要使用ElasticSearch(當(dāng)然開源的基本上都是這樣來保持簡潔,例如Pinpoint也只使用了HBase)燥狰,所以數(shù)據(jù)容器的特性以及自己數(shù)據(jù)結(jié)構(gòu)基本上就限制了業(yè)務(wù)的上限,以ES為例:

  • ES查詢功能異常強(qiáng)大斜筐,在數(shù)據(jù)篩選方面碾壓其他所有容器龙致,在數(shù)據(jù)篩選潛力巨大(Skywalking默認(rèn)的查詢維度就比使用HBase的Pinpoint強(qiáng)很多)
  • 支持sharding分片和replicas數(shù)據(jù)備份,在高可用/高性能/大數(shù)據(jù)支持都非常好
  • 支持批量插入顷链,高并發(fā)下的插入性能大大增強(qiáng)
  • 數(shù)據(jù)密度低目代,源于ES會(huì)提前構(gòu)建大量的索引來優(yōu)化搜索查詢,這是查詢功能強(qiáng)大和性能好的代價(jià)嗤练,但是鏈路跟蹤往往有非常多的上下文需要記錄榛了,所以Skywalking把這些上下文二進(jìn)制化然后通過Base64編碼放入data_binary字段并且將字段標(biāo)記為not_analyzed來避免進(jìn)行預(yù)處理建立查詢索引

總體來說,Skywalking盡量使用ES在大數(shù)據(jù)和查詢方面的優(yōu)勢煞抬,同時(shí)盡量減少ES數(shù)據(jù)密度低的劣勢帶來的影響霜大,從目前來看,ES在調(diào)用鏈跟蹤方面是不二的數(shù)據(jù)容器革答,而在數(shù)據(jù)指標(biāo)方面战坤,ES也能中規(guī)中矩的完成業(yè)務(wù)曙强,雖然和時(shí)序數(shù)據(jù)庫相比要弱一些,但在PB級以下的數(shù)據(jù)支持也不會(huì)有太大問題途茫。

數(shù)據(jù)結(jié)構(gòu)

如果說數(shù)據(jù)容器決定了上限碟嘴,那么數(shù)據(jù)結(jié)構(gòu)則決定了實(shí)際到達(dá)的高度。Skywalking的數(shù)據(jù)結(jié)構(gòu)主要為:

  • 數(shù)據(jù)維度(ES索引為skywalking_*_inventory)
    1. service:服務(wù)
    2. instance:實(shí)例
    3. endpoint:接口
    4. network_adress:外部依賴
  • 數(shù)據(jù)內(nèi)容
    1. 原始數(shù)據(jù)
    • 調(diào)用鏈跟蹤數(shù)據(jù)(調(diào)用鏈的trace信息囊卜,ES索引為skywalking_segment娜扇,Skywalking主要的數(shù)據(jù)消耗都在這里)
    • 指標(biāo)(主要是jvm或者envoy的運(yùn)行時(shí)指標(biāo),例如ES索引skywalking_instance_jvm_cpu)
    1. 二次統(tǒng)計(jì)指標(biāo)
    • 指標(biāo)(按維度/時(shí)間二次統(tǒng)計(jì)出來的例如pxx栅组、sla等指標(biāo)雀瓢,例如ES索引skywalking_database_access_p75_month)
    • 數(shù)據(jù)庫慢查詢記錄(數(shù)據(jù)庫索引:skywalking_top_n_database_statement)
    1. 關(guān)聯(lián)關(guān)系(維度/指標(biāo)之間的關(guān)聯(lián)關(guān)系,ES索引為skywalking_relation)
    2. 特別記錄
      • 告警信息(ES索引為skywalking_alarm_record)
      • 并發(fā)控制(ES索引為skywalking_register_lock)

其中數(shù)量占比最大的就是調(diào)用鏈跟蹤數(shù)據(jù)和各種指標(biāo)笑窜,而這些數(shù)據(jù)均可以通過OAP設(shè)置過期時(shí)間致燥,以降低歷史數(shù)據(jù)的對磁盤占用和查詢效率的影響。

調(diào)用鏈跟蹤數(shù)據(jù)

作為Skywalking的核心數(shù)據(jù)排截,調(diào)用鏈跟蹤數(shù)據(jù)(skywalking_segment)基本上奠定了整個(gè)系統(tǒng)的基礎(chǔ)嫌蚤,而如果要詳細(xì)的了解調(diào)用鏈跟蹤的話,就不得不提到openTracing断傲。

openTracing基本上是目前開源調(diào)用鏈跟蹤系統(tǒng)的一個(gè)事實(shí)標(biāo)準(zhǔn)脱吱,它制定了調(diào)用鏈跟蹤的基本流程和基本的數(shù)據(jù)結(jié)構(gòu),同時(shí)也提供了各個(gè)語言的實(shí)現(xiàn)认罩。如果用一張圖來表現(xiàn)openTracing箱蝠,則是如下:

openTracing基本結(jié)構(gòu)

其中:

  • SpanContext:一個(gè)類似于MDC(Slfj)或者ThreadLocal的組件,負(fù)責(zé)整個(gè)調(diào)用鏈數(shù)據(jù)采集過程中的上下文保持和傳遞
  • Trace:一次調(diào)用的完整記錄
    • Span:一次調(diào)用中的某個(gè)節(jié)點(diǎn)/步驟垦垂,類似于一層堆棧信息宦搬,Trace是由多個(gè)Span組成,Span和Span之間也有父子或者并列的關(guān)系來標(biāo)志這個(gè)節(jié)點(diǎn)/步驟在整個(gè)調(diào)用中的位置
      • Tag:節(jié)點(diǎn)/步驟中的關(guān)鍵信息
      • Log:節(jié)點(diǎn)/步驟中的詳細(xì)記錄劫拗,例如異常時(shí)的異常堆棧
    • Baggage:和SpanContext一樣并不屬于數(shù)據(jù)結(jié)構(gòu)而是一種機(jī)制间校,主要用于跨Span或者跨實(shí)例的上下文傳遞,Baggage的數(shù)據(jù)更多是用于運(yùn)行時(shí)页慷,而不會(huì)進(jìn)行持久化

以一個(gè)Trace為例:

span間的關(guān)系

首先是外部請求調(diào)用A憔足,然后A依次同步調(diào)用了B和C,而B被調(diào)用時(shí)會(huì)去同步調(diào)用D酒繁,C被調(diào)用的時(shí)候會(huì)依次同步調(diào)用E和F滓彰,F(xiàn)被調(diào)用的時(shí)候會(huì)通過異步調(diào)用G,G則會(huì)異步調(diào)用H州袒,最終完成一次調(diào)用揭绑。

上圖是通過Span之間的依賴關(guān)系來表現(xiàn)一個(gè)Trace,而在時(shí)間線上郎哭,則可以有如下的表達(dá):

span的調(diào)用順序

當(dāng)然洗做,如果是同步調(diào)用的話弓叛,父Span的時(shí)間占用是包括子Span的時(shí)間消耗的。

而落地到Skywalking中诚纸,我們以一條skywalking_segment的記錄為例:

{
    "trace_id": "52.70.15530767312125341",
    "endpoint_name": "Mysql/JDBI/Connection/commit",
    "latency": 0,
    "end_time": 1553076731212,
    "endpoint_id": 96142,
    "service_instance_id": 52,
    "version": 2,
    "start_time": 1553076731212,
    "data_binary": "CgwKCjRGnPvp5eikyxsSXhD///////////8BGMz62NSZLSDM+tjUmS0wju8FQChQAVgBYCF6DgoHZGIudHlwZRIDc3FsehcKC2RiLmluc3RhbmNlEghyaXNrZGF0YXoOCgxkYi5zdGF0ZW1lbnQYAiA0",
    "service_id": 2,
    "time_bucket": 20190320181211,
    "is_error": 0,
    "segment_id": "52.70.15530767312125340"
}

其中:

  • trace_id:本次調(diào)用的唯一id撰筷,通過snowflake模式生成
  • endpoint_name:被調(diào)用的接口
  • latency:耗時(shí)
  • end_time:結(jié)束時(shí)間戳
  • endpoint_id:被調(diào)用的接口的唯一id
  • service_instance_id:被調(diào)用的實(shí)例的唯一id
  • version:本數(shù)據(jù)結(jié)構(gòu)的版本號
  • start_time:開始時(shí)間戳
  • data_binary:里面保存了本次調(diào)用的所有Span的數(shù)據(jù),序列化并用Base64編碼畦徘,不會(huì)進(jìn)行分析和用于查詢
  • service_id:服務(wù)的唯一id
  • time_bucket:調(diào)用所處的時(shí)段
  • is_error:是否失敗
  • segment_id:數(shù)據(jù)本身的唯一id毕籽,類似于主鍵,通過snowflake模式生成

這里可以看到井辆,目前Skywalking雖然相較于Pinpoint來說查詢的維度要多一些关筒,但是也很有限,而且除了endPoint杯缺,并沒有和業(yè)務(wù)有關(guān)聯(lián)的字段蒸播,只能通過時(shí)間/服務(wù)/實(shí)例/接口/成功標(biāo)志/耗時(shí)來進(jìn)行非業(yè)務(wù)相關(guān)的查詢,如果后續(xù)要增強(qiáng)業(yè)務(wù)相關(guān)的搜索查詢的話萍肆,應(yīng)該還需要增加一些用于保存動(dòng)態(tài)內(nèi)容(如messageId袍榆,orderId等業(yè)務(wù)關(guān)鍵字)的字段用于快速定位

指標(biāo)

指標(biāo)數(shù)據(jù)相對于Tracing則要簡單得多了,一般來說就是指標(biāo)標(biāo)志塘揣、時(shí)間戳包雀、指標(biāo)值,而Skywalking中的指標(biāo)有兩種:一種是采集的原始指標(biāo)值亲铡,例如jvm的各種運(yùn)行時(shí)指標(biāo)(例如cpu消耗才写、內(nèi)存結(jié)構(gòu)、GC信息等)奖蔓;一種是各種二次統(tǒng)計(jì)指標(biāo)(例如tp性能指標(biāo)赞草、SLA等,當(dāng)然也有為了便于查詢的更高時(shí)間維度的指標(biāo)吆鹤,例如基于分鐘厨疙、小時(shí)、天檀头、周轰异、月)

例如以下是索引skywalking_endpoint_cpm_hour中的一條記錄岖沛,用于標(biāo)志一個(gè)小時(shí)內(nèi)某個(gè)接口的cpm指標(biāo):

{
    "total": 8900,
    "service_id": 5,
    "time_bucket": 2019031816,
    "service_instance_id": 5,
    "entity_id": "7",
    "value": 148
}

各個(gè)字段的釋義如下:

  • total:一分鐘內(nèi)的調(diào)用總量
  • service_id:所屬服務(wù)的唯一id
  • time_bucket:統(tǒng)計(jì)的時(shí)段
  • service_instance_id:所屬實(shí)例的唯一id
  • entity_id:接口(endpoint)的唯一id
  • value:cpm的指標(biāo)值(cpm=call per minute暑始,即total/60)
agent

agent(apm-sniffer)是Skywalking的Java探針實(shí)現(xiàn),主要負(fù)責(zé):

  • 采集應(yīng)用實(shí)例的jvm指標(biāo)
  • 通過切向編程進(jìn)行數(shù)據(jù)埋點(diǎn)婴削,采集調(diào)用鏈數(shù)據(jù)
  • 通過RPC將采集的數(shù)據(jù)上報(bào)

當(dāng)然廊镜,agent還實(shí)現(xiàn)了客戶端采樣,不過在APM監(jiān)控系統(tǒng)里進(jìn)行客戶端數(shù)據(jù)采樣都是沒有靈魂的唉俗,所以這里就不再贅述了嗤朴。

首先配椭,agent通過 org.apache.skywalking.apm.agent.core.boot.BootService 實(shí)現(xiàn)了整體的插件化,agent啟動(dòng)會(huì)加載所有的BootService實(shí)現(xiàn)雹姊,并通過 ServiceManager 來管理這些插件的生命周期股缸,采集jvm指標(biāo)、gRPC連接管理吱雏、調(diào)用鏈數(shù)據(jù)維護(hù)敦姻、數(shù)據(jù)上報(bào)OAP這些服務(wù)均是通過這種方式擴(kuò)展。

然后歧杏,agent還通過bytebuddy以javaagent的模式镰惦,通過字節(jié)碼增強(qiáng)的機(jī)制來構(gòu)造AOP環(huán)境,再提供PluginDefine的規(guī)范方便探針的開發(fā)犬绒,最終實(shí)現(xiàn)非侵入性的數(shù)據(jù)埋點(diǎn)旺入,采集調(diào)用鏈數(shù)據(jù)。

OAP

同agent類似凯力,OAP作為Skywalking最核心的模塊茵瘾,也實(shí)現(xiàn)了自己的擴(kuò)展機(jī)制,不過在這里叫做Module沮协,具體可以參考library-module龄捡,在module的機(jī)制下,Skywalking實(shí)現(xiàn)了自己必須核心組件:

  • core:整個(gè)OAP核心業(yè)務(wù)(remoting慷暂、cluster聘殖、storage、analysis行瑞、query奸腺、alarm)的規(guī)范和接口
  • cluster:集群管理的具體實(shí)現(xiàn)
  • storage:數(shù)據(jù)容器的具體實(shí)現(xiàn)
  • query:為前端提供的查詢接口的具體實(shí)現(xiàn)
  • receiver:接收探針上報(bào)數(shù)據(jù)的接收器的具體實(shí)現(xiàn)
  • alarm:監(jiān)控告警的具體實(shí)現(xiàn)

以及一個(gè)可選組件:

  • telemetry:用于監(jiān)控OAP自身的健康狀況

而前面提到的OAP的高擴(kuò)展性則體現(xiàn)在核心業(yè)務(wù)的規(guī)范均定義在了core中,如果有需要自己擴(kuò)展的血久,只需要自己單獨(dú)做自己的實(shí)現(xiàn)突照,而不需要做侵入式的改動(dòng),最典型的示例則是官方支持的storage氧吐,不僅支持單機(jī)demo的內(nèi)存數(shù)據(jù)庫H2和經(jīng)典的ES讹蘑,連目前開源的Tidb都可以接入。

安裝
  1. 下載最新的安裝包
  2. 解壓筑舅,并進(jìn)入bin目錄執(zhí)行startup.sh啟動(dòng)
  3. 訪問http://localhost:8080/ 即可看到面板
  4. 啟動(dòng)服務(wù)
    添加如下VM 參數(shù):
-javaagent:${agent_home}/agent/skywalking-agent.jar -Dskywalking.agent.service_name=${service_name}
image.png

【轉(zhuǎn)載請注明出處】:http://www.reibang.com/p/e1592d395891

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末座慰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翠拣,更是在濱河造成了極大的恐慌版仔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛮粮,居然都是意外死亡益缎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門然想,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺奔,“玉大人,你說我怎么就攤上這事变泄”滓牵” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵杖刷,是天一觀的道長励饵。 經(jīng)常有香客問我,道長滑燃,這世上最難降的妖魔是什么役听? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮表窘,結(jié)果婚禮上典予,老公的妹妹穿的比我還像新娘。我一直安慰自己乐严,他們只是感情好瘤袖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昂验,像睡著了一般捂敌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上既琴,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天占婉,我揣著相機(jī)與錄音,去河邊找鬼甫恩。 笑死逆济,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磺箕。 我是一名探鬼主播奖慌,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼松靡!你這毒婦竟也來了简僧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤击困,失蹤者是張志新(化名)和其女友劉穎涎劈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阅茶,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛛枚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脸哀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹦浦。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撞蜂,靈堂內(nèi)的尸體忽然破棺而出盲镶,到底是詐尸還是另有隱情,我是刑警寧澤蝌诡,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布溉贿,位于F島的核電站,受9級特大地震影響浦旱,放射性物質(zhì)發(fā)生泄漏宇色。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一颁湖、第九天 我趴在偏房一處隱蔽的房頂上張望宣蠕。 院中可真熱鬧,春花似錦甥捺、人聲如沸抢蚀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粤铭,卻和暖如春吴侦,著一層夾襖步出監(jiān)牢的瞬間谷饿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工妈倔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留博投,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓盯蝴,卻偏偏與公主長得像毅哗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子捧挺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355