Service Dependecy Graph Building
开始之前
正式开始之前我问自己这样几个问题
- kiali是trace的一个可视化工具,那么我怎么才能拿到trace的原始数据呢?
- istio的数据也都是prom给的,prom的metric之前已经看过了。怎么从prom的metric构造一个trace处理呢?
终于在今天得到了想要的答案:
首先,Prometheus和tracing没有关系。其次,trace的原始数据是jaeger提供的,具体是opentracing标准的链路追踪手段。
OK,继续深入吧。
Jaeger数据存储
关于agent怎么上报span,collector如何管理span我先不关心。我现在立刻马上想要拿到trace的原始数据,最起码是能让我能二次开发的那种数据。
数据一般呢,是存在数据库里的,而我的pod里并没有数据库相关的,那数据存在哪里呢?然后我就搜到了这样一个信息:
Istio中Jaeger的数据临时存在内存中
既然这样,Jaeger UI又是怎么抽取数据并graph展示的?会不会有Prometheus类似的api接口暴露出来?果然功夫不负有心人,让我找到了Jaeger的API:
Jaeger trace info
Trace API
先提下Jaeger提供的接口,因为这个东西我曾经上Jaeger官网,告诉我/traces
这个接口是获取trace信息的API。看看原文怎么说的哈:
Jaeger UI communicates with Jaeger Query Service via JSON API. For example, a trace can be retrieved via GET request to
https://jaeger-query:16686/api/traces/{trace-id-hex-string}
. This JSON API is intentionally undocumented and subject to change.
但是我只顾着一个劲撞南墙,基础概念都没有打好就老想着找捷径。恰好今天静下心来好好想了一下一个trace是什么,拿istio的productpage来说,一次访问网址http://istio-gateway:port/productpage
的过程,其实就是一个完整的trace。
回到官网提供的API,也就是说我知道了trace-id,那么trace的信息就能得到了呀。而trace-id在UI里已经提供了。
Trace meta data
回到Jaeger UI,点进一个trace,查看JSON格式的数据,其实就是我需要的数据。详细来看看这个json数据里的span都有哪些内容:
{
"data": [
{
"traceID": "aeb825de4ba82901d71fecb349727885",
"spans": [
{
"traceID": "aeb825de4ba82901d71fecb349727885",
"spanID": "22958c27bcc7f900",
"operationName": "details.default.svc.cluster.local:9080/*",
"references": [
{
"refType": "CHILD_OF",
"traceID": "aeb825de4ba82901d71fecb349727885",
"spanID": "3a4e71ebf338bd17"
}
],
"startTime": 1591240276462724,
"duration": 40881,
"tags": [],
"logs": [],
"processID": "p3",
"warnings": null
}
],
],
}
其中我最关系的是“references”里面的“refType”,CHILD_OF这种关系代表span和span之间的从属关系。举个例子:意味着我访问productpage,会连带访问detail和review两个微服务,也就是说后面两个是前者的child,那么微服务之间的调用关系图就可以构建出来了。
这篇文章对span讲得很好,给了我巨大的启发。特别是“特别说明,一条Trace(调用链)可以被认为是一个由多个Span组成的有向无环图(DAG图), Span与Span的关系被命名为References”这一句,联系到RCA论文中的DAG,我瞬间有种想落泪的感觉。
DAG构建
有了span和span之间的ref,对应起来画个图就OK了。
参考
https://blog.csdn.net/qq_42038407/article/details/103510066 (深入istio源码查看kiali的数据来源)
https://www.cnblogs.com/loveis715/p/5277051.html (neo4j介绍好文)
https://juejin.im/entry/5b0aa414f265da0ddf04a894 (nodeport可以用来画图)
https://pjw.io/articles/2018/05/18/jaeger-tutorial/ (Jaeger好文)
https://yq.aliyun.com/articles/514488?utm_content=m_43347 (理解jaeger极好的图)
https://packyzbq.gitee.io/jaeger-istio.html (Istio中Jaeger的数据存储)
https://github.com/IgaguriMK/envoy-dummy-stats/blob/master/sample/envoy-stats.txt (帮助理解envoy的奇怪PromQL)
https://www.jianshu.com/p/bd11294cf83e (让俺找到span之间的关系)