让我们学习分布式跟踪后端 Grafana Tempo 的基础知识。
分布式跟踪是获取有关系统性能的细粒度信息的方法。 它是一种可视化请求通过应用程序的生命周期的方法。 该应用程序可以包含存在于单个节点上或分布在多个节点上的多个服务。
因此,通过使用分布式跟踪,您可以获得所有服务的统一视图。 Grafana Tempo 就是这样。
目录
什么是 Grafana Tempo?
在今年的 ObservabilityCon 大会上,Grafana Labs 有一些重大更新,Grafana Tempo 就是其中之一。 Grafana Labs 在其开源产品组合中又增加了一个项目“Grafana Tempo”。
Grafana节奏 是一个开源分布式跟踪后端,具有高度可扩展性和易于使用。 Tempo 与其他跟踪协议完全兼容,例如 Zipkin、Jaeger、OpenTelemetry 和 OpenCensus。 目前支持Loki中的Tempo数据发现引擎,Prometheus、Grafana等监控平台。 Grafana 7.3+ 提供了 Grafana 和 Tempo 之间的无缝体验。
为什么要使用节奏?
Tempo 用于关联指标、跟踪和日志。 在某些情况下,用户会多次遇到相同类型的错误。 如果我想了解发生了什么,我需要查看确切的痕迹。 但是由于下采样,我可能正在寻找的一些有价值的信息会丢失。 使用 Tempo,现在我们不需要对分布式跟踪数据进行下采样。 我们可以将完整的跟踪存储在 S3 或 GCS 等对象存储中,从而使 Tempo 非常经济高效。
此外,Tempo 允许您快速从指标转移到记录了一些问题的特定日志的相关跟踪,从而使您能够更快地进行调试/故障排除。
以下是 Tempo 中使用的配置选项。
- Distributor:这些用于配置接收选项以接收跨度,然后将它们发送到摄取器。
- Ingester:这些用于创建批量跟踪并将它们发送到 TempoDB 进行存储。
- Compactor:它从 S3 或 GCS 等存储中流式传输块,将它们组合起来,然后将它们写回到存储中。
- 存储:这用于配置 TempoDB。 您需要在此配置中使用其他参数提及存储后端名称(S3 或 GCS)。
- Memberlist:用于Tempo组件之间的协调。
- 身份验证/服务器:Tempo 使用 Weaveworks/Common 服务器。 它用于设置服务器配置。
节奏建筑
上图展示了 Grafana Tempo 的工作架构。
首先,分发器从 Zipkin、Jaeger、OpenTelemetry、OpenCensus 接收不同格式的跨度,并通过散列跟踪 ID 将这些跨度发送到摄取器。 Ingester 然后创建称为块的批次跟踪。
然后它将这些块发送到后端存储 (S3/GCS)。 当您有要排除故障的跟踪 ID 时,您将使用 Grafana UI 并将跟踪 ID 放在搜索栏中。 现在查询器负责从摄取器或对象存储中获取有关您输入的跟踪 ID 的详细信息。
首先,它检查该跟踪 ID 是否存在于摄取器中; 如果找不到,它会检查存储后端。 它使用一个简单的 HTTP 端点来公开跟踪。 同时,压缩器从存储中取出块,将它们组合起来,然后将它们发送回存储,以减少存储中块的数量。
使用 Docker 设置节奏
在本节中,我将使用 Docker 逐步设置 Grafana Tempo。 首先,您需要一个 Tempo 后端,因此设置一个 docker 网络。
[[email protected] ~]$ docker network create docker-tempo
下载速度配置文件。
[[email protected] ~]$ curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml
以下是您获得的协议选项列表:
协议
港口
打开遥测
55680
Jaeger——节俭契约
6831
Jaeger – Thrift 二进制文件
6832
Jaeger——Thrift HTTP
14268
Jaeger——GRPC
14250
齐普金
9411
使用 tempo 配置文件,运行一个 docker 容器。 这里我选择 杰格 – Thrift Compact 格式(端口 6831)发送跟踪。
[[email protected] ~]$ docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo-local.yaml:/etc/tempo-local.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo-local.yaml
现在您需要运行一个 Tempo 查询容器。 所以首先,下载节奏查询配置文件。
[[email protected] ~]$ curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml
使用节奏查询配置文件,运行 docker 容器。
[[email protected] ~]$ docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml
现在可以通过 http://localhost:16686 访问 Jaeger UI,如下所示。
在搜索栏中,您可以添加要排除故障的日志中的跟踪 ID,它会为您生成跟踪。
在 Tempo 上运行演示应用程序
是时候运行 Grafana Tempo 给出的演示示例了。 我将运行一个 docker-compose 示例,因此如果您尝试相同,则必须在您的计算机上安装 docker-compose。
下载 Grafana Tempo zip 文件: https://github.com/grafana/tempo
将其解压缩到主文件夹中,然后转到 docker-compose 目录。 你会发现 docker-compose 的多个例子; 我正在使用应用程序数据存储在本地的示例。
[[email protected] ~]$ cd tempo-master/example/docker-compose/ [[email protected] docker-compose]$ ls docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc example-data readme.md tempo-link.png
运行以下命令以启动堆栈。
[[email protected] docker-compose]$ docker-compose up -d Starting docker-compose_prometheus_1 ... done Starting docker-compose_tempo_1 ... done Starting docker-compose_grafana_1 ... done Starting docker-compose_tempo-query_1 ... done Starting docker-compose_synthetic-load-generator_1 ... done
可以看到,它已经启动了Grafana、Loki、Tempo、Tempo-query和Prometheus的容器。
[[email protected] docker-compose]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 84cd557ce07b grafana/tempo-query:latest "/go/bin/query-linux…" 10 minutes ago Up 4 seconds 0.0.0.0:16686->16686/tcp docker-compose_tempo-query_1 f7cd9cf460d9 omnition/synthetic-load-generator:1.0.25 "./start.sh" 10 minutes ago Up 4 seconds docker-compose_synthetic-load-generator_1 6d9d9fbdb8f1 grafana/grafana:7.3.0-beta1 "/run.sh" 10 minutes ago Up 6 seconds 0.0.0.0:3000->3000/tcp docker-compose_grafana_1 d8574ea25028 grafana/tempo:latest "/tempo -config.file…" 10 minutes ago Up 6 seconds 0.0.0.0:49173->3100/tcp, 0.0.0.0:49172->14268/tcp docker-compose_tempo_1 5f9e53b5a09c prom/prometheus:latest "/bin/prometheus --c…" 10 minutes ago Up 6 seconds 0.0.0.0:9090->9090/tcp docker-compose_prometheus_1
您还可以转到浏览器并验证 Grafana、Jaeger UI、Prometheus 是否正在运行。
现在,在容器内运行的合成负载生成器正在生成放入节奏中的跟踪 ID。 运行以下命令,您可以查看日志。
[[email protected] docker-compose]$ docker-compose logs -f synthetic-load-generator Attaching to docker-compose_synthetic-load-generator_1 synthetic-load-generator_1 | using params: --jaegerCollectorUrl http://tempo:14268 synthetic-load-generator_1 | 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /product, 2880 traces/hr synthetic-load-generator_1 | 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /cart, 14400 traces/hr synthetic-load-generator_1 | 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /checkout, 480 traces/hr synthetic-load-generator_1 | 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 17867942c5e161f2 for service frontend route /currency synthetic-load-generator_1 | 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 3d9cc23c8129439f for service frontend route /shipping synthetic-load-generator_1
这些是您需要传递以生成跟踪的跟踪 ID。
我正在复制其中一个跟踪 ID 并将其放入 Jaeger UI 搜索栏中。
您可以看到它已成功生成与我提供的跟踪 ID 相关的跟踪。
结论
这就是关于 Grafana Tempo 的全部内容。 继续并开始使用 Tempo 生成跟踪以详细了解日志中的指标和问题。
一切都在 Tempo 中被捕获,你不会因为以前发生的下采样而错过任何细节。 Tempo 可以让开发人员或生产团队直接了解日志中可能出现的错误或警告的根本原因。