zipkin跟踪原理解析
- 主要原理: 核心参数为 trace_id , id(当前的span的id) ,和 parent_id(前一个span的id组成)。
- trace_id : 整个请求链的唯一id,只要请求的trace_id 相同,不管相隔多长时间,zipkin都会归类到同一个链路中
- id(span_id): 在同一个请求链路下的单个请求(跟踪)的唯一id,span_id一般是不相同的
- parent_id(parent_span_id): 本次请求的上一个请求,这个是用于跟踪请求链中的每个请求之间的联系,zipkin可根据这个上下级的id关系生成服务依赖关系图
- 可以通过下面的结构查看到跟踪关系(测试数据的111 调用 222 ,222 调用 333,此段数据可以在下面的示例代码中生成)
zipkin中存储的数据结构示例
[
{
"traceId": "b7794163e2432bf0",
"id": "d4976a1d6eb10c24",
"name": "service_aaaa",
"timestamp": 1559123832737078,
"duration": 100,
"localEndpoint": {
"serviceName": "1111"
},
"remoteEndpoint": {
"serviceName": "2222"
},
"debug": true
},
{
"traceId": "b7794163e2432bf0",
"parentId": "d4976a1d6eb10c24",
"id": "ba7f99539c4e2b53",
"name": "service_aaaa",
"timestamp": 1559123832791081,
"duration": 100,
"localEndpoint": {
"serviceName": "2222"
},
"remoteEndpoint": {
"serviceName": "3333"
},
"debug": true
}
]
zipkin-api的使用
-
zipkin官方提供了好多sdk,有java,go,php等,里面涉及到很多header传播必要参数,可是,我一直没有接入成功过
-
既然sdk无法成功,我们可以采用最原始的方法,调用zipkin的sdk去进行跟踪,还好,官方项目提供了详细的api: api地址,全部复制后放入在线swagger编辑器即可查看,有了api,我们只要按照api的要求,把供zipkin跟踪的必要参数通过http的形式发送到zipkin,就算大功告成了。
-
sdk 帮我们处理了相关参数的传播,主要包括 trace_id ,parent_span_id 的传播和自动组装,遇到问题很难调试(本人愚钝,一直没接入成功过)。当然,在理解zipkin的数据结构和原理的时候,这些自己处理也不是很难的事情
-
下面的示例代码简单的模拟向zipkin发送跟踪点的数据,基于,可参考下,生产环境能不能用不知道
<?php
namespace http;
/**
* 文档 https://raw.githubusercontent.com/apache/incubator-zipkin-api/master/zipkin2-api.ya