Jaeger

一、简介

Jaeger是一个基于opentracing规范的链路追踪工具平台

1、架构及组件

带有Kafka缓存同时可以进行ETL的架构

  • jaeger-client

    Jaeger 的客户端,实现了 OpenTracing 的 API,支持主流编程语言。客户端直接集成在目标 Application 中,其作用是记录和发送 Span 到 Jaeger Agent。在 Application 中调用 Jaeger Client Library 记录 Span 的过程通常被称为埋点。

  • jaeger-agent

    暂存 Jaeger Client 发来的 Span,并批量向 Jaeger Collector 发送 Span,一般每台机器上都会部署一个 Jaeger Agent。官方的介绍中还强调了 Jaeger Agent 可以将服务发现的功能从 Client 中抽离出来,不过从架构角度讲,如果是部署在 Kubernetes 或者是 Nomad 中,Jaeger Agent 存在的意义并不大。

  • jaeger-collector

    接受 Jaeger Agent 发来的数据,并将其写入存储后端,目前支持采用 Cassandra 和 Elasticsearch 作为存储后端。个人还是比较推荐用 Elasticsearch,既可以和日志服务共用同一个 ES,又可以使用 Kibana 对 Trace 数据进行额外的分析。架构图中的存储后端是 Cassandra,旁边还有一个 Spark,讲的就是可以用 Spark 等其他工具对存储后端中的 Span 进行直接分析。

  • jaeger-query & jaeger-ui

    读取存储后端中的数据,以直观的形式呈现

  • jaeger-ingester

    ingester从名字就可以看出是从kafka里面取数据然后做持久化的,关于这个持久化的对象,jaeger原生是选择了elasticsearch(简称es),之索引选择es是因为查询非常方便(反向索引),性能也不错。

2、概念

  • Trace:一条调用链。

  • Span:可以理解成一条调用链的一个环节。一条 Trace可以被认为是一个由多个 Span 组成的DAG图。

  • Tag:标签集

  • Log:日志集

  • References:Span与Span之间的关系。OpenTracing目前定义了两种关系:ChildOf(父子) 和 FollowsFrom(跟随)

  • SpanContext:Span上下文对象,主要保存了traceId spanId等,用来跨进程边界传输。不同进程间可以利用SpanContext建立References关系。 (下个服务拿到traceId就可以知道自己改归属于哪个调用链, 拿到spanId就知道自己的父span是谁 )

3、采样速率

支持设置采样率是 Jaeger 的一个亮点,生产环境系统性能很重要,所以对于所有的请求都开启 Trace 显然会带来比较大的压力,另外,大量的数据也会带来很大存储压力。为了尽量消除分布式追踪采样对系统带来的影响,设置采样率是一个很好的办法。Jaeger官方 支持四种采样类别,分别是

  • Constant:全量采集,采样率设置0,1 分别对应打开和关闭
  • Probabilistic:概率采集,默认万份之一,取值可在 0至1之间,单位为百分比。0.5代表50%
  • Rate Limiting:限速采集,每秒只能采集一定量的数据,如设置2的话,就是每秒采集2个链路数据
  • Remote :**是遵循远程设置,取值的含义和 probabilistic 相同,都意为采样的概率,只不过设置为 remote 后,Client 会从 Jaeger Agent 中动态获取采样率设置。
  • guaranteedThroughput: 复合采样,至少每秒采样lowerBound次(rateLimiting),超过lowerBound次的话,按照samplingRate概率来采样

4、组件端口作用

组件 端口 协议 描述
Agent 6831 UDP 应用程序向代理发送跟踪的端口,接受 Jaeger.thrift而不是 Compact thrift协议
通过兼容性Thrift协议,接收Jaeger thrift类型数据
Agent 6832 UDP 通过二进制Thrift协议,接收Jaeger thrift类型数据 ,需要某些不支持压缩的客户端库
Agent 5775 UDP 通过兼容性Thrift协议,接收Zipkin thrift类型数据
Agent 5778 HTTP 配置控制服务接口
Agent 14271 HTTP 监控信息端口
Collector 14250 TCP Agent 发送 Proto 格式数据
Collector 14267 TCP 接收客户端Jaeger thrift类型的数据
Collector 14268 HTTP 接收客户端Zipkin thrift类型的数据
Collector 14269 HTTP 监控信息端口
Query 16686 HTTP Jaeger UI页面端口
Query 16687 HTTP 监控信息端口
ingester 14270 HTTP 监控信息端口

二、安装

docker镜像 描述
all-in-one 专为快速本地测试而设计。它使用内存存储组件启动 Jaeger UI、收集器、查询和代理。
$ docker pull jaegertracing/all-in-one:1.34
example-hotrod 演示分布式跟踪功能的示例应用程序“HotROD”.
$ docker pull jaegertracing/example-hotrod:1.34
jaeger-agent 从 Jaeger 客户端接收 span 并转发给收集器。设计为作为 sidecar 或主机agents运行
$ docker pull jaegertracing/jaeger-agent:1.34
jaeger-collector 从agents或直接从客户端接收 spans并将它们保存在持久存储中
$ docker pull jaegertracing/jaeger-collector:1.34
jaeger-query 提供 Jaeger UI 和从存储中检索跟踪的 API.
$ docker pull jaegertracing/jaeger-query:1.34
jaeger-ingester 收集器的替代品;从 Kafka topic读取spans并将它们保存到存储中
$ docker pull jaegertracing/jaeger-ingester:1.34
spark-dependencies 一个 Apache Spark 作业,它从存储中收集 Jaeger spans ,分析服务之间的关联,并将它们存储起来以供以后在 Jaeger UI 中展示
$ docker pull jaegertracing/spark-dependencies:latest
jaeger-operator 用于打包、部署和管理 Jaeger 的 Kubernetes Operator.
$ docker pull jaegertracing/jaeger-operator:1.34
jaeger-cassandra-schema 用于初始化 Cassandra 键空间和模式的实用程序脚本。
$ docker pull jaegertracing/jaeger-cassandra-schema:1.34
jaeger-es-index-cleaner 用于从 Elasticsearch 中清除旧索引的实用程序脚本,因为 ES 不支持数据 TTL。.
$ docker pull jaegertracing/jaeger-es-index-cleaner:1.34

1. Docker

1.1 Allinone

docker run -d --name jaeger \
    -p 16686:16686 \
    jaegertracing/all-in-one:1.34

或者在Windows或MacOS或Linux中使用二进制文件进行部署

https://github.com/jaegertracing/jaeger/releases/

2. Kubernetes

2.1 helm

helm repo ad jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update
helm install --namespace jaeger jaeger jaegertracing/jaeger \
  --set tag="1.34" \
  --set provisionDataStore.cassandra=false \
  --set storage.type=elasticsearch \
  --set storage.elasticsearch.host=elasticsearch的IP地址(不用带协议,直接IP地址即可) \
  --set storage.elasticsearch.user=elasticsearch用户名(如果使用自定义创建的es用户,权限要求:
集群权限:monitor、manage_index_templates;运行身份权限:apm_system;索引权限:对索引模式jaeger*拥有all权限) \
  --set storage.elasticsearch.password=elasticsearch用户密码 \
  --set agent.serviceMonitor.enabled=true \
  --set collector.serviceMonitor.enabled=true \
  --set collector.service.zipkin.port=9411
  --set query.ingress.enabled=true \
  --set "query.ingress.hosts={jaeger的ingress域名1(例如:jaeger1.curiouser.com),域名2(例如:jaeger2.curiouser.com)}" \
  --set query.serviceMonitor.enabled=true


# 如果要部署HotROD容器,需要添加设置以下参数
  --set hotrod.enabled=true \
  --set hotrod.ingress.enabled=true \
  --set hotrod.ingress.hosts={HotROD的ingress域名1(例如:jaeger-hotrod1.curiouser.com)}

2.2 k8s operator

暂无

三、HotROD演示数据

HotROD(Rides on Demand)是一个演示应用程序,由几个微服务组成,说明了OpenTracing API的使用。

相关文档:

docker run -d --name jaeger-hotrod \
  --link jaeger \
  -p 8080-8083:8080-8083 \
  -e JAEGER_AGENT_HOST="jaeger" \
  jaegertracing/example-hotrod:1.34 all

访问:http://127.0.0.1:8080 点击进行导入数据,之后相关的请求HotROD容器日志中

四、tracegen压力测试

jaeger-tracegen可用于生成简单跨度的连续流。主要用于压力测试。可以控制worker的数量和在每个worker中生成的span。同时,它还可以在 firehose 模式下生成 span(在 span 上设置一个标志以跳过索引)

docker run --rm --link jaeger \
  -e JAEGER_AGENT_HOST=jaeger \
  -e JAEGER_AGENT_PORT=6831 \
  jaegertracing/jaeger-tracegen:1.34 --workers=10 --traces=10

jaeger-tracegen参数

-debug
      Whether to set DEBUG flag on the spans to force sampling
-duration duration
      For how long to run the test
-firehose
      Whether to set FIREHOSE flag on the spans to skip indexing
-marshal
      Whether to marshal trace context via HTTP headers
-pause duration
      How long to pause before finishing trace (default 1µs)
-service string
      Service name to use (default "tracegen")
-traces int
      Number of traces to generate in each worker (ignored if duration is provided (default 1)
-workers int
      Number of workers (goroutines) to run (default 1)

参考:https://www.jaegertracing.io/docs/1.34/tools/

五、应用接入

1、Golang应用

2、Java应用

3、Python应用

4、PHP应用

参考

Copyright Curiouser all right reserved,powered by Gitbook该文件最后修改时间: 2022-06-02 13:43:04

results matching ""

    No results matching ""