skywalking golang客戶端源碼解析

源碼地址

go sdk的基本特性

  • 客戶端和服務(wù)端使用grpc雙向stream通信行施。
  • 可以設(shè)置采樣率更鲁。默認(rèn)都會(huì)上報(bào)茫多。
  • 可以自定義logger绷耍。
  • 可以自定義上報(bào)的緩沖通道長(zhǎng)度莽龟,默認(rèn)30000
  • 可以自定義服務(wù)實(shí)例上報(bào)的屬性字段。
  • 可以自定義服務(wù)實(shí)例標(biāo)識(shí)锨天,默認(rèn)uuid@ipv4。進(jìn)程重啟會(huì)發(fā)生變化剃毒,不建議使用uuid病袄,需要自定義覆蓋。
  • 可以自定義trace上報(bào)的reporter赘阀,除grpcReporter以外都是mock益缠、debug、logger等reporter基公,不能用于生產(chǎn)環(huán)境幅慌。如果grpcReporter無(wú)法滿足需要,可以基于接口重寫(xiě)轰豆。
  • 提供gin胰伍、go-restful齿诞、go http server的trace插件和go http client的trace功能。
  • 一個(gè)進(jìn)程內(nèi)的同一個(gè)trace鏈路上的多個(gè)span(父子span)構(gòu)成一個(gè)segment上報(bào)的骂租。不是單個(gè)span挨個(gè)上報(bào)祷杈。邏輯上看,一個(gè)邏輯segment包含多個(gè)父子span渗饮,構(gòu)成一個(gè)SegmentObject上報(bào)到服務(wù)端但汞。

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

spanContext是span的上下文』フ荆跨進(jìn)程通信需要將此對(duì)象序列化到協(xié)議中私蕾,然后從協(xié)議中反序列化出此對(duì)象。

type SpanContext struct {
    TraceID               string `json:"trace_id"`                //traceId
    ParentSegmentID       string `json:"parent_segment_id"`       //父segmentId
    ParentService         string `json:"parent_service"`          //父service
    ParentServiceInstance string `json:"parent_service_instance"` //父實(shí)例
    ParentEndpoint        string `json:"parent_endpoint"`         //父endpoint
    AddressUsedAtClient   string `json:"address_used_at_client"`
    ParentSpanID          int32  `json:"parent_span_id"`          //父spanId
    Sample                int8   `json:"sample"`                  
}

defaultSpan記錄span基本信息胡桃。持有tracer踩叭、時(shí)間和spanContext等信息。實(shí)現(xiàn)span接口标捺。

type defaultSpan struct {
    Refs          []*propagation.SpanContext    //跨進(jìn)程通信用的span上下文懊纳。
    tracer        *Tracer                       //上報(bào)trace用的client封裝對(duì)象。
    StartTime     time.Time    //span起始時(shí)間
    EndTime       time.Time    //span結(jié)束時(shí)間
    OperationName string       //span操作名稱(chēng)亡容。http是/method/uri
    Peer          string       //span對(duì)端地址
    Layer         v3.SpanLayer //span的用途嗤疯。有數(shù)據(jù)庫(kù)、rpc闺兢、http茂缚、mq、緩存屋谭。
    ComponentID   int32        //創(chuàng)建span的組件ID脚囊。比如5005是http client;5004是http server桐磁。
    Tags          []*common.KeyStringValuePair //span鍵值對(duì)
    Logs          []*v3.Log    //span核心日志
    IsError       bool         //span是否有錯(cuò)誤悔耘,一般http code不等于200,rpc超時(shí)都需要標(biāo)記error我擂。
    SpanType      SpanType    //span類(lèi)型衬以。入口端用entry、調(diào)用端用exit校摩。 
}

segmentContext是segment上下文看峻,主要用于生成spanId,記錄同一個(gè)鏈路父子span的個(gè)數(shù)等衙吩。

  • 每個(gè)span都有一個(gè)自己的segmentContext對(duì)象互妓。記錄當(dāng)前spanId、父spanId。
  • 同一個(gè)進(jìn)程的同一個(gè)鏈路的不同span(即父子span)的segmentContext對(duì)象不同冯勉,但共用一個(gè)spanId生成器澈蚌、共用同一個(gè)segmentId、共用一個(gè)collect收集器珠闰、共用一個(gè)refNum字段惜浅。可以說(shuō)伏嗜,同一個(gè)進(jìn)程的同一個(gè)鏈路的父子span共用同一個(gè)邏輯segmentContext坛悉。
type SegmentContext struct {
    TraceID         string //鏈路唯一Id。如果從協(xié)議中解析出SpanContext承绸,則延續(xù)使用裸影。沒(méi)有則隨機(jī)生成UUID。
    SegmentID       string //段Id军熏。隨機(jī)生成轩猩。父子span共用一個(gè)segmentId
    SpanID          int32  //關(guān)聯(lián)的spanId
    ParentSpanID    int32  //關(guān)聯(lián)的span的父spanId
    ParentSegmentID string //父段id,就是自身ID荡澎。
    collect         chan<- ReportedSpan //上報(bào)span的channel通道均践。父子span共用一個(gè)channel通道。
    refNum          *int32 //當(dāng)前segment包含多少個(gè)span摩幔。
    spanIDGenerator *int32 //同一個(gè)segment下spanId的生成器彤委,atomic自增。
    FirstSpan       Span `json:"-"`
}

segmentSpanImpl組合defaultSpan和SegmentContext或衡,該對(duì)象是真正意義的span焦影。

type segmentSpanImpl struct {
    defaultSpan
    SegmentContext
}

rootSegmentSpan是根span,組合segmentSpanImpl封断,也就實(shí)現(xiàn)span接口斯辰。進(jìn)程內(nèi)每個(gè)trace鏈路上都有一個(gè)起始的根span,用于進(jìn)程內(nèi)當(dāng)前鏈路上所有span的收尾上報(bào)坡疼。每個(gè)根span創(chuàng)建時(shí)會(huì)啟動(dòng)單獨(dú)的協(xié)程彬呻,循環(huán)接收子span或監(jiān)聽(tīng)trace鏈路結(jié)束信號(hào)。根span重新實(shí)現(xiàn)了span的End接口柄瑰,當(dāng)根span操作end闸氮,不僅結(jié)束當(dāng)前根span(設(shè)置結(jié)束時(shí)間),還會(huì)往done channel發(fā)送信號(hào)狱意,通知接收方開(kāi)始上報(bào)當(dāng)前鏈路的所有span對(duì)象。

type rootSegmentSpan struct {
    *segmentSpanImpl
    notify  <-chan ReportedSpan //接收segmentSpanImpl拯欧,和segmentSpanImpl中的collect是同一個(gè)數(shù)據(jù)通道详囤,for循環(huán)不斷讀取。
    segment []ReportedSpan //同一個(gè)進(jìn)程同一個(gè)鏈路的所有segmentSpan的聚合。
    doneCh  chan int32
}

源碼解析

暫略

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藏姐,一起剝皮案震驚了整個(gè)濱河市隆箩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羔杨,老刑警劉巖捌臊,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兜材,居然都是意外死亡理澎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)曙寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糠爬,“玉大人,你說(shuō)我怎么就攤上這事举庶≈此恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵户侥,是天一觀的道長(zhǎng)镀琉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蕊唐,這世上最難降的妖魔是什么屋摔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮刃泌,結(jié)果婚禮上凡壤,老公的妹妹穿的比我還像新娘。我一直安慰自己耙替,他們只是感情好亚侠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著俗扇,像睡著了一般硝烂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铜幽,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天滞谢,我揣著相機(jī)與錄音,去河邊找鬼除抛。 笑死狮杨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的到忽。 我是一名探鬼主播橄教,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼清寇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了护蝶?” 一聲冷哼從身側(cè)響起华烟,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎持灰,沒(méi)想到半個(gè)月后盔夜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堤魁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年喂链,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姨涡。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衩藤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涛漂,到底是詐尸還是另有隱情赏表,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布匈仗,位于F島的核電站瓢剿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悠轩。R本人自食惡果不足惜间狂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望火架。 院中可真熱鬧鉴象,春花似錦、人聲如沸何鸡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)骡男。三九已至淆游,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隔盛,已是汗流浹背犹菱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吮炕,地道東北人腊脱。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像龙亲,于是被迫代替她去往敵國(guó)和親陕凹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子震鹉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容