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之间的关系)