Grafana Tempo 入门

已发表: 2021-04-19

让我们学习 Grafana Tempo(分布式跟踪后端)的基础知识。

分布式跟踪是获取有关系统性能的细粒度信息的方法。 它是一种可视化通过应用程序的请求的生命周期的方法。 应用程序可以由单个节点上或分布在多个节点上的多个服务组成。

因此,通过使用分布式跟踪,您可以获得所有服务的统一视图。 Grafana Tempo 就是这样。

什么是 Grafana 节奏?

今年的 ObservabilityCon 大会上,Grafana Labs 有一些重大更新,Grafana Tempo 就是其中之一。 Grafana Labs 在他们的开源产品组合中又增加了一个项目“Grafana Tempo”。

Grafana Tempo 是一个开源的分布式跟踪后端,具有高度的可扩展性和易用性。 Tempo 与其他跟踪协议完全兼容,例如 Zipkin、Jaeger、OpenTelemetry 和 OpenCensus。 目前支持Loki中的Tempo数据发现引擎,Prometheus、Grafana等监控平台。 Grafana 7.3+ 提供了 Grafana 和 Tempo 之间的无缝体验。

为什么要使用节奏?

Tempo 用于关联指标、跟踪和日志。 在某些情况下,用户会多次收到相同类型的错误。 如果我想了解发生了什么,我需要查看确切的痕迹。 但是由于下采样,我可能正在寻找的一些有价值的信息会丢失。 使用 Tempo,现在我们不需要对分布式跟踪数据进行下采样。 我们可以将完整的跟踪存储在 S3 或 GCS 等对象存储中,从而使 Tempo 非常经济高效。

此外,Tempo 允许您快速从指标移动到记录了一些问题的特定日志的相关跟踪,从而使您能够更快地进行调试/故障排除。

以下是 Tempo 中使用的配置选项。

  • Distributor :这些用于配置接收选项以接收跨度,然后将它们发送到摄取器。
  • Ingester :这些用于创建一批跟踪并将它们发送到 TempoDB 进行存储。
  • 压缩器:它从 S3 或 GCS 等存储中流式传输块,将它们组合起来,然后将它们写回到存储中。
  • 存储:这用于配置 TempoDB。 您需要在此配置中使用其他参数提及存储后端名称(S3 或 GCS)。
  • Memberlist : 用于Tempo 组件之间的协调。
  • 身份验证/服务器:Tempo 使用 Wea​​veworks/Common 服务器。 它用于设置服务器配置。

节奏架构

节奏建筑

上图展示了 Grafana Tempo 的工作架构。

首先,分发者从 Zipkin、Jaeger、OpenTelemetry、OpenCensus 接收不同格式的跨度,并通过散列跟踪 ID 将这些跨度发送给摄取器。 Ingester 然后创建一批被称为块的跟踪。

然后它将这些块发送到后端存储 (S3/GCS)。 当您有要排除故障的跟踪 ID 时,您将使用 Grafana UI 并将跟踪 ID 放在搜索栏中。 现在,查询器负责从输入器或对象存储中获取有关您输入的跟踪 ID 的详细信息。

首先,它检查该跟踪 ID 是否存在于接收器中; 如果没有找到,它会检查存储后端。 它使用一个简单的 HTTP 端点来公开跟踪。 同时,压缩器从存储中取出块,将它们组合起来,然后将它们发送回存储以减少存储中的块数量。

使用 Docker 设置 Tempo

在本节中,我将使用 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
积家 – 节俭契约6831
Jaeger – 节俭二进制6832
Jaeger – Thrift HTTP 14268
Jaeger – GRPC 14250
齐普金9411

使用 tempo 配置文件,运行 docker 容器。 在这里,我选择 Jaeger – 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

使用 tempo 查询配置文件,运行 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,如下所示。

jaeger ui - geekflare

在搜索栏中,您可以从要排除故障的日志中添加跟踪 ID,它会为您生成跟踪。

跟踪 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 搜索栏中。

跟踪号

可以看到它已经成功生成了与我提供的trace id相关的trace。

结论

这就是 Grafana Tempo 的全部内容。 继续并开始使用 Tempo 生成跟踪,以详细了解日志中的指标和问题。

一切都在 Tempo 中被捕获,您不会因为下采样而错过任何细节,这曾经发生过。 Tempo 很容易让开发人员或生产团队了解日志中可能出现的错误或警告的根本原因。