要解決的問題
對(duì)應(yīng)用進(jìn)行運(yùn)行時(shí)數(shù)據(jù)收集,提供追蹤和報(bào)告壮韭。
- 數(shù)據(jù)采集(埋點(diǎn)或者自動(dòng)獲缺狈ⅰ)纹因,存儲(chǔ)和分析
- 生成調(diào)用鏈 并能在UI展示
- 自動(dòng)分析并發(fā)現(xiàn)報(bào)告問題,例如:性能
- 和測(cè)試運(yùn)維工具集成(鲫竞?辐怕??)
相應(yīng)的組件有:
- model:采集模型
- agent/collector:agent提供埋點(diǎn)从绘,采集和發(fā)送
- aggregator/storage:聚合寄疏,加工和存儲(chǔ)數(shù)據(jù)
- analyzer:分析數(shù)據(jù)
- UI:展示調(diào)用鏈,dashboard和問題報(bào)告僵井,告警設(shè)置和觸發(fā)
考察如下的一些開源方案:
- Zipkin
- Pinpoint
- CAT
Zipkin
項(xiàng)目地址:https://github.com/openzipkin/zipkin
架構(gòu):http://zipkin.io/pages/architecture.html
以下是數(shù)據(jù)流圖
提供REST API支持陕截,可以查詢和推送數(shù)據(jù):http://zipkin.io/zipkin-api
快速開始:下載源碼后在根目錄運(yùn)行
./mvnw -DskipTests --also-make -pl zipkin-server clean install
編譯UI模塊可能遇到node-saas找不到的信息,解決辦法:
- 把node_modules目錄刪除重新運(yùn)行node install
- 運(yùn)行npm rebuild node-sass
- 升級(jí)node和npm批什,可能編譯好的node-sass和你本地的node版本不一致()农曲,會(huì)報(bào)錯(cuò):Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (51),建議用nvm管理node安裝版本驻债。
啟動(dòng)通過運(yùn)行: java -jar ./zipkin-server/target/zipkin-server-*-exec.jar乳规,然后訪問: http://localhost:9411 (REST API: http://localhost:9411/api/v1/spans ...)
數(shù)據(jù)格式:
- traceId
- name
- id
- parentId
- timestamp
- duration
- annotations: [
endpoint: {
...
}
]
- binaryAnnotations: [
{
- key
- value
- endpoint: {
...
}
}
]
數(shù)據(jù)樣例:
[
{
"traceId": "bd7a977555f6b982",
"name": "get",
"id": "bd7a977555f6b982",
"timestamp": 1458702548467000,
"duration": 386000,
"annotations": [
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548467000,
"value": "sr"
},
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548853000,
"value": "ss"
}
],
"binaryAnnotations": []
},
{
"traceId": "bd7a977555f6b982",
"name": "get-traces",
"id": "ebf33e1a81dc6f71",
"parentId": "bd7a977555f6b982",
"timestamp": 1458702548478000,
"duration": 354374,
"annotations": [],
"binaryAnnotations": [
{
"key": "lc",
"value": "JDBCSpanStore",
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
}
},
{
"key": "request",
"value": "QueryRequest{serviceName=zipkin-query, spanName=null, annotations=[], binaryAnnotations={}, minDuration=null, maxDuration=null, endTs=1458702548478, lookback=86400000, limit=1}",
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
}
}
]
},
{
"traceId": "bd7a977555f6b982",
"name": "query",
"id": "be2d01e33cc78d97",
"parentId": "ebf33e1a81dc6f71",
"timestamp": 1458702548786000,
"duration": 13000,
"annotations": [
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548786000,
"value": "cs"
},
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548799000,
"value": "cr"
}
],
"binaryAnnotations": [
{
"key": "jdbc.query",
"value": "select distinct `zipkin_spans`.`trace_id` from `zipkin_spans` join `zipkin_annotations` on (`zipkin_spans`.`trace_id` = `zipkin_annotations`.`trace_id` and `zipkin_spans`.`id` = `zipkin_annotations`.`span_id`) where (`zipkin_annotations`.`endpoint_service_name` = ? and `zipkin_spans`.`start_ts` between ? and ?) order by `zipkin_spans`.`start_ts` desc limit ?",
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
}
},
{
"key": "sa",
"value": true,
"endpoint": {
"serviceName": "spanstore-jdbc",
"ipv4": "127.0.0.1",
"port": 3306
}
}
]
},
{
"traceId": "bd7a977555f6b982",
"name": "query",
"id": "13038c5fee5a2f2e",
"parentId": "ebf33e1a81dc6f71",
"timestamp": 1458702548817000,
"duration": 1000,
"annotations": [
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548817000,
"value": "cs"
},
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548818000,
"value": "cr"
}
],
"binaryAnnotations": [
{
"key": "jdbc.query",
"value": "select `zipkin_spans`.`trace_id`, `zipkin_spans`.`id`, `zipkin_spans`.`name`, `zipkin_spans`.`parent_id`, `zipkin_spans`.`debug`, `zipkin_spans`.`start_ts`, `zipkin_spans`.`duration` from `zipkin_spans` where `zipkin_spans`.`trace_id` in (?)",
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
}
},
{
"key": "sa",
"value": true,
"endpoint": {
"serviceName": "spanstore-jdbc",
"ipv4": "127.0.0.1",
"port": 3306
}
}
]
},
{
"traceId": "bd7a977555f6b982",
"name": "query",
"id": "37ee55f3d3a94336",
"parentId": "ebf33e1a81dc6f71",
"timestamp": 1458702548827000,
"duration": 2000,
"annotations": [
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548827000,
"value": "cs"
},
{
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
},
"timestamp": 1458702548829000,
"value": "cr"
}
],
"binaryAnnotations": [
{
"key": "jdbc.query",
"value": "select `zipkin_annotations`.`trace_id`, `zipkin_annotations`.`span_id`, `zipkin_annotations`.`a_key`, `zipkin_annotations`.`a_value`, `zipkin_annotations`.`a_type`, `zipkin_annotations`.`a_timestamp`, `zipkin_annotations`.`endpoint_ipv4`, `zipkin_annotations`.`endpoint_port`, `zipkin_annotations`.`endpoint_service_name` from `zipkin_annotations` where `zipkin_annotations`.`trace_id` in (?) order by `zipkin_annotations`.`a_timestamp` asc, `zipkin_annotations`.`a_key` asc",
"endpoint": {
"serviceName": "zipkin-query",
"ipv4": "192.168.1.2",
"port": 9411
}
},
{
"key": "sa",
"value": true,
"endpoint": {
"serviceName": "spanstore-jdbc",
"ipv4": "127.0.0.1",
"port": 3306
}
}
]
}
]
在UI上的展示:
Pinpoint
https://github.com/naver/pinpoint
https://github.com/naver/pinpoint/wiki/Technical-Overview-Of-Pinpoint
https://sconts.com/11
- 對(duì)代碼無侵入,分析request/response
- 插件式
- 支持的代碼文件有限
美團(tuán)CAT
http://tech.meituan.com/CAT_in_Depth_Java_Application_Monitoring.html
http://unidal.org/cat/r/home?op=view&docName=develop
https://github.com/dianping/cat
- 埋點(diǎn)收集