天天看點

APM之jaeger php源碼了解

flags:是否進行采樣,根據采樣政策來定,True代表采樣

Reference對象包含 Span之間的關系及SpanContext

SpanContext對象包含 Span資訊及baggage

inject是将SpanContext中的Span及baggage資訊寫入carrier中,carrier是數組

extract是将carrier中的Span資訊寫入SpanContext中(traceId、spanId、parentId、flags,Baggage)

Span對象包括SpanContext對象、Reference對象、operationName、startTime、logs、tags

Tracer對象包括reporter、sampler、gen128bit、scopeManager、spans、tags、process、serverName、propagator、processThrift

traceIdLow、traceIdHigh生成方式:microtime(true) * 10000 . rand(10000, 99999); rootSpanID等于traceIdLow。如果設定gen128bit,則設定traceIdHigh;子Span的traceIdLow、traceIdHigh都繼承父Span的,子SpanID建立時生成。

TraceId:如果設定gen128bit。%x%016x "16進制$traceIdHigh" + "16進制$traceIdLow(不足16位前面補0)";否則TraceId等于$traceIdLow,也等于rootSpanId

python jaeger中TEXT_MAP和HTTP_HEADERS使用同一套編碼方式, inject時carrier必須為字典, requests.get傳的header參數就是dict。 extract時判斷carrier必須有items方法,雖然request.headers為EnvironHeaders對象,但是有item方法,和dict操作類似。三種編碼方式BINARY = 'binary';TEXT_MAP = 'text_map';HTTP_HEADERS = 'http_headers'

某網友對Java中ScopeManager和Scope的了解:在多線程環境下ScopeManager管理着各個線程的Scope,而每個線程中的Scope管理着該線程中的Span。這樣當某個線程需要擷取其線程中目前 活動的 span時,可以通過ScopeManager找到對應該線程的Scope,并從Scope中取出該線程 活動的 span

startSpan或者startActiveSpan需指定操作名及option。option是數組,key可以為child_of,指定父span;也可以為references,值為array,可為多個,child_of和references隻允許有一個存在,option中也可指定tags,start_time,finish_span_on_close,傳進去的tags會設定為Span的tags。StartSpanOptions

tracer和Span都存在tags屬性,其中tracer的tags屬性會将資訊記錄在ES的Process中

RateLimitingSampler類,控制每秒流量的一個采樣類。php目前未實作,python已實作,每次都會根據上次調用與這次調用的時間差乘以我們設定的maxTracesPerSecond參數并累加後與1比較,超過1就傳回true,并且讓其減去1,否則傳回false,繼續累加

Span的finish方法标志着span的結束,finish方法還隻是校驗和記錄的作用,真正發送span的是tracer對象的flush方法

在部署jaeger系統測試時發現當jaeger-service索引手動删除後,然後再進行追蹤時發現jaeger-service索引不能被自動建立,通過ES檢視發現隻有 jaeger-span*索引被建立。通過github詢問作者,作者回複如下

意思是Jaeger-Collector中設計的jaeger-service索引的緩存時間是48小時。但是經過測試,删除jaeger-service索引後再被自動建立是随機的,可能幾分鐘内就會被自動建立

Agent的服務隊列是有長度限制(default 1000),如果堆積超過1000個,Agent就會毫不憐憫的把資料丢掉。當然在這裡并沒有不妥,Jaeger的定位就是一套日志系統,不太看重資料的可靠性。如果要想減少資料丢失的問題,可通過配置或增加Agent節點。因為Jaeger和NSQ對于資料的定位不一樣,是以就不對比這部分功能。NSQ比較注重資料的可靠性。

tracer設定的tag将被記錄在process中,span設定的tag将被記錄在Tags中

繼續閱讀