一务冕、jaeger 架構(gòu)圖:
部署節(jié)點(diǎn)
agent :
程序目錄:jaeger/cmd/agent
功能:接收udp數(shù)據(jù)书释,然后通過tcp協(xié)議將數(shù)據(jù)發(fā)送給collector翘贮。
運(yùn)行命令:./agnet -collector.host-port 127.0.0.1:5044
其他配置參數(shù)可通過./agnet -h 命令查看
collecort
程序目錄:jaeger/cmd/collector
功能:接收agent通過TCP協(xié)議發(fā)送的數(shù)據(jù),然后寫入存儲爆惧,存儲類型目前支持兩種:memory和Cassandra
運(yùn)行命令:-dependency-storage.type cassandra -cassandra.keyspace jaeger_v1_test -cassandra.servers 10.103.17.184 -cassandra.port 9042 -collector.port 5044
其他配置參數(shù)可同./collector -h 命令查看
query
程序目錄:jaeger/cmd/query
功能:接收ui的請求狸页,然后查詢Cassandra或者memory存儲,然后返回給ui
運(yùn)行命令:-cassandra.servers 10.103.17.184 -cassandra.port 9042 -cassandra.keyspace jaeger_v1_test -span-storage.type cassandra -query.port 3001
其他配置參數(shù)可同./query -h 命令查看
jaeger-ui
程序目錄:jaeger/jaeger-ui
功能:ui界面扯再,接收用戶的請求芍耘,然后轉(zhuǎn)向query請求數(shù)據(jù),然后可視化的方式展示
運(yùn)行命令: npm start ?(監(jiān)聽的端口是:3000熄阻,轉(zhuǎn)向請求的query端口是3001)
二斋竞、query接口整理
獲取service
請求接口:http://localhost:3001/api/services
查詢cassandra的cql語句:SELECT service_name FROM service_names
返回的數(shù)據(jù)結(jié)構(gòu)(Limit、Offset秃殉、Errors窃页,沒用到)
type structuredResponse struct {
Data???interface{}???????`json:"data"`
Total??int???????????????`json:"total"`
Limit??int???????????????`json:"limit"`
Offset int???????????????`json:"offset"`
Errors []structuredError `json:"errors"`
}
獲取某個service 對應(yīng)的operation ?(該接口將來會移除,使用通過第3個接口獲取service對應(yīng)的operation)
請求接口地址:http://localhost:3001/api/services/frontend/operations? (注意:標(biāo)紅的是service name)
查詢的cql語句:SELECT operation_name FROM operation_names WHERE service_name = ?
返回的數(shù)據(jù)結(jié)構(gòu)與獲取service 返回的接口一樣
獲取某個service的operation
接口地址:http://localhost:3001/api/operations?service=frontend
處理流程以及返回值與接口2一樣复濒。
獲取某個service 和 operation 對應(yīng)的trace (注意:tag 和duration 不能同時作為過濾條件,tag條件多個條件之間只能為或)
請求接口地址:http://localhost:3001/api/traces?end=1495013235806000&limit=20&lookback=1h&maxDuration&minDuration&service=frontend&start=1495009635806000&tag=http.status_code%3A200
查詢的cql:
通過duration進(jìn)行過濾時的cql:SELECT trace_idFROM duration_indexWHERE bucket = ? AND service_name = ? AND operation_name = ? AND duration > ? AND duration < ?LIMIT ?
通過service和operation進(jìn)行過濾時的cql:SELECT trace_idFROM service_operation_indexWHERE service_name = ? AND operation_name = ? AND start_time > ? AND start_time < ?ORDER BY start_time DESCLIMIT ?
通過tag進(jìn)行過濾時的cql:SELECT trace_idFROM tag_indexWHERE service_name = ? AND tag_key = ? AND tag_value = ? and start_time > ? and start_time < ?ORDER BY start_time DESCLIMIT ?
通過service進(jìn)行過濾時的cql:SELECT trace_idFROM service_name_indexWHERE bucket IN `+bucketRange+` AND service_name = ? AND start_time > ? AND start_time < ?ORDER BY start_time DESCLIMIT ?
查詢邏輯如圖:
查看某一個traceId對應(yīng)的所有span
請求接口日志:http://localhost:3001/api/traces/233be37760fcb397
查詢的cql語句:SELECT trace_id, span_id, parent_id, operation_name, flags, start_time, duration, tags, logs, refs, process FROM traces WHERE trace_id = ?`
流程:traceID會從一個string類型的16進(jìn)制轉(zhuǎn)成uint64數(shù)脖卖,如果0~16是low,16~32為high
還有一個重要步驟是將:存儲的trace轉(zhuǎn)成ui的trace:dbtrace->uitrace
獲取服務(wù)之間的依賴關(guān)系:
請求接口地址:http://localhost:3001/api/dependencies?endTs=1495012727164&lookback=604800000
查詢cql:SELECT ts, dependencies FROM dependencies WHERE ts_index >= ? AND ts_index < ?
有個post的不知道干什么的接口(目前代碼中沒使用):
接口日志(post方式):http://localhost:3001/api/archive/233be37760fcb397
三、jaeger Cassandra 存儲結(jié)構(gòu)
service_names
operation_names
service_name_index
bucket 的計(jì)算代碼:bucketNo := atomic.AddUint32(&s.bucketCounter, 1) % defaultNumBuckets
service_operation_index
duration_index
通一個記錄在這個表中存在兩份巧颈,唯一的區(qū)別是一個有operation_name ,另外一個記錄沒有operation_name,記錄如下:
tag_index
traces
注意:存在spanID相同的情況(不確定是某些情況下是需要產(chǎn)生相同的spanID畦木,跟RPC相關(guān),tag中含有:span.kind=server)
dependencies