美文网首页
Jaeger依赖分析

Jaeger依赖分析

作者: huiwq1990 | 来源:发表于2019-11-22 20:04 被阅读0次

    一、依赖任务

    1.1 k8s运行任务

    # https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
    # https://github.com/jaegertracing/jaeger-kubernetes
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: jaeger-spark-dependencies
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
              - name: dependencies
                image: jaegertracing/spark-dependencies
                env:
                - name: STORAGE
                  value: "elasticsearch"
                - name: ES_NODES
                  value: "jaeger-elasticsearch:9200"
                - name: ES_USERNAME
                  value: "elastic"
                - name: ES_PASSWORD
                  value: "changeme"                           
              restartPolicy: OnFailure
    

    1.2 查看任务状态

    kubectl get cj
    kubectl describe cj jaeger-spark-dependencies 
    

    1.3 依赖关系结果

    [
      {
        "parent": "frontend",
        "callCount": 92,
        "source": "jaeger",
        "child": "frontend"
      },
      {
        "parent": "frontend",
        "callCount": 4,
        "source": "jaeger",
        "child": "driver"
      },
      {
        "parent": "frontend",
        "callCount": 40,
        "source": "jaeger",
        "child": "route"
      },
      {
        "parent": "frontend",
        "callCount": 4,
        "source": "jaeger",
        "child": "customer"
      },
      {
        "parent": "mysql",
        "callCount": 4,
        "source": "jaeger",
        "child": "mysql"
      },
      {
        "parent": "boot-service",
        "callCount": 1030,
        "source": "jaeger",
        "child": "boot-service"
      },
      {
        "parent": "customer",
        "callCount": 4,
        "source": "jaeger",
        "child": "mysql"
      },
      {
        "parent": "driver",
        "callCount": 54,
        "source": "jaeger",
        "child": "redis"
      }
    ]
    

    二、依赖任务实现

    io.jaegertracing.spark.dependencies.elastic.ElasticsearchDependenciesJob
    整体思路是:
    1)从ES集群查询数据,获取span列表
    2)根据traceId将Span进行分组
    3)计算每个分组中所有span的依赖关系


    image.png

    4)聚合依赖关系,并写入ES

    三、依赖Http接口实现

    cmd/query/app/http_handler.go:dependencies
    用户需要传入时间范围,然后获取数据。

    
    // 请求示例URL http://localhost:16686/api/dependencies?endTs=1574408925476&lookback=604800000
    func (aH *APIHandler) dependencies(w http.ResponseWriter, r *http.Request) {
        endTsMillis, err := strconv.ParseInt(r.FormValue(endTsParam), 10, 64)
        if aH.handleError(w, errors.Wrapf(err, "unable to parse %s", endTimeParam), http.StatusBadRequest) {
            return
        }
        var lookback time.Duration
        if formValue := r.FormValue(lookbackParam); len(formValue) > 0 {
            lookback, err = time.ParseDuration(formValue + "ms")
            if aH.handleError(w, errors.Wrapf(err, "unable to parse %s", lookbackParam), http.StatusBadRequest) {
                return
            }
        }
        service := r.FormValue(serviceParam)
    
        if lookback == 0 {
            lookback = defaultDependencyLookbackDuration
        }
        endTs := time.Unix(0, 0).Add(time.Duration(endTsMillis) * time.Millisecond)
        // 查询指定范围内的依赖关系
        dependencies, err := aH.queryService.GetDependencies(endTs, lookback)
        if aH.handleError(w, err, http.StatusInternalServerError) {
            return
        }
        // 如果用户传入服务名,根据服务名过滤依赖
        filteredDependencies := aH.filterDependenciesByService(dependencies, service)
        // 以parent和child为key,聚合数据
        structuredRes := structuredResponse{
            Data: aH.deduplicateDependencies(filteredDependencies),
        }
        aH.writeJSON(w, r, &structuredRes)
    }
    

    四、参考文档

    https://github.com/openzipkin/zipkin-dependencies
    https://github.com/jaegertracing/spark-dependencies

    https://segmentfault.com/a/1190000021063578
    https://www.jianshu.com/p/e26c5a9b5261

    相关文章

      网友评论

          本文标题:Jaeger依赖分析

          本文链接:https://www.haomeiwen.com/subject/oqkqwctx.html