一、jaeger 架构图:
部署节点
agent :
程序目录:jaeger/cmd/agent
功能:接收udp数据,然后通过tcp协议将数据发送给collector。
运行命令:./agnet -collector.host-port 127.0.0.1:5044
其他配置参数可通过./agnet -h 命令查看
collecort
程序目录:jaeger/cmd/collector
功能:接收agent通过TCP协议发送的数据,然后写入存储,存储类型目前支持两种:memory和Cassandra
运行命令:-dependency-storage.type cassandra -cassandra.keyspace jaeger_v1_test -cassandra.servers 10.103.17.184 -cassandra.port 9042 -collector.port 5044
其他配置参数可同./collector -h 命令查看
query
程序目录:jaeger/cmd/query
功能:接收ui的请求,然后查询Cassandra或者memory存储,然后返回给ui
运行命令:-cassandra.servers 10.103.17.184 -cassandra.port 9042 -cassandra.keyspace jaeger_v1_test -span-storage.type cassandra -query.port 3001
其他配置参数可同./query -h 命令查看
jaeger-ui
程序目录:jaeger/jaeger-ui
功能:ui界面,接收用户的请求,然后转向query请求数据,然后可视化的方式展示
运行命令: npm start (监听的端口是:3000,转向请求的query端口是3001)
二、query接口整理
获取service
请求接口:http://localhost:3001/api/services
查询cassandra的cql语句:SELECT service_name FROM service_names
返回的数据结构(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 对应的operation (该接口将来会移除,使用通过第3个接口获取service对应的operation)
请求接口地址:http://localhost:3001/api/services/frontend/operations (注意:标红的是service name)
查询的cql语句:SELECT operation_name FROM operation_names WHERE service_name = ?
返回的数据结构与获取service 返回的接口一样
获取某个service的operation
接口地址:http://localhost:3001/api/operations?service=frontend
处理流程以及返回值与接口2一样。
获取某个service 和 operation 对应的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进行过滤时的cql:SELECT trace_idFROM duration_indexWHERE bucket = ? AND service_name = ? AND operation_name = ? AND duration > ? AND duration < ?LIMIT ?
通过service和operation进行过滤时的cql:SELECT trace_idFROM service_operation_indexWHERE service_name = ? AND operation_name = ? AND start_time > ? AND start_time < ?ORDER BY start_time DESCLIMIT ?
通过tag进行过滤时的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进行过滤时的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对应的所有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进制转成uint64数,如果0~16是low,16~32为high
还有一个重要步骤是将:存储的trace转成ui的trace:dbtrace->uitrace
获取服务之间的依赖关系:
请求接口地址: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 存储结构
service_names
operation_names
service_name_index
bucket 的计算代码:bucketNo := atomic.AddUint32(&s.bucketCounter, 1) % defaultNumBuckets
service_operation_index
duration_index
通一个记录在这个表中存在两份,唯一的区别是一个有operation_name ,另外一个记录没有operation_name,记录如下:
tag_index
traces
注意:存在spanID相同的情况(不确定是某些情况下是需要产生相同的spanID,跟RPC相关,tag中含有:span.kind=server)
dependencies