菜单
开源

为 Tempo 设置监控

您可以使用现有或新的集群为 Tempo 设置监控。如果您没有可用的集群,可以使用链接的文档通过 Helm 设置 Tempo、Mimir 和 Grafana,或者您可以使用 Grafana Cloud。

要设置监控,您需要

  • 使用 Grafana Alloy 向 Tempo 远程写入,并按照设置测试应用配置 Grafana 以可视化追踪数据。
  • 更新您的 Alloy 配置,以抓取用于监控 Tempo 数据的指标。

本步骤假设您已经使用 Helm Chart 并结合 Grafana Alloy 设置了 Tempo。

下面概述的步骤使用了为 Tempo 集群设置测试应用中描述的 Alloy 配置。

注意

请根据您自己的部署更新本文档中的所有说明。

如果您使用Kubernetes 集成 Grafana Alloy Helm Chart,您可以使用 Kubernetes 的抓取注解来自动抓取 Tempo。您需要将标签添加到所有已部署的组件中。

开始之前

要使用本页上的示例配置监控,您需要在 Kubernetes 环境中运行以下组件

您可以使用 Grafana Alloy 或 OpenTelemetry Collector。本步骤仅提供 Grafana Alloy 的示例。

本文档的其余部分假设 Tempo、Grafana 和 Mimir 实例使用相同的 Kubernetes 集群。

如果您使用的是 Grafana Cloud,则可以跳过安装部分,并在 Grafana 实例中设置 Mimir (Prometheus)Tempo 数据源

使用 Tempo 的测试应用向 Grafana 发送数据

在监控 Tempo 数据之前,您需要配置 Grafana Alloy 以将追踪发送到 Tempo。

使用这些说明在您的 Tempo 集群中创建测试应用。这些步骤配置 Grafana Alloy 以向 Tempo 进行 remote-write。此外,测试应用的说明还解释了如何在 Grafana 中配置 Tempo 数据源并查看追踪数据。

注意

如果您已经有 Tempo 环境,则无需创建测试应用。本指南假设 Tempo 和 Grafana Alloy 配置与这些创建测试应用的说明相同或基于这些说明,因为您将增强这些配置以启用 Tempo 指标监控。

在这些示例中,Tempo 安装在一个名为 tempo 的命名空间中。请根据您自己的环境需要更改示例中的此命名空间名称。

配置 Grafana

在您的 Grafana 实例中,您需要

启用 Tempo 指标抓取

Tempo 从其所有组件中暴露 Prometheus 指标,以允许元监控。Alloy 既可以收集追踪,也可以作为 Prometheus 抓取器从 Tempo 中检索指标。要使用此功能,您需要配置 Alloy 以从所有组件中抓取。

Alloy 允许您通过多种方式发现集群中要抓取的目标。通常对于 Prometheus 指标抓取,您会注解 Pod、Service 等,以标记 Alloy 应该使用诸如 prometheus/scrape: true 之类的注解以及端口和路径从这些对象抓取指标。

但是,Tempo 对象已经包含了一些方便的注解,这些注解在 app.kubernetes.io 前缀下提供。Helm 部署包含了这些注解。例如,Tempo 的 distributor 组件的标签注解包含

yaml
app.kubernetes.io/component=distributor
app.kubernetes.io/instance=tempo
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=tempo
app.kubernetes.io/part-of=memberlist
app.kubernetes.io/version=2.6.0

正因如此,您可以在 Grafana Alloy 中使用这些注解进行 Kubernetes 服务发现,确保 Alloy 从每个 Tempo 组件抓取指标。使用 discovery.kubernetes Alloy 组件,您可以包含基于标签的抓取目标选择器。由于存在 Tempo 特定的组件标签,您可以指定一个规则来覆盖所有 Tempo 组件。

yaml
discovery.kubernetes "k8s_pods" {
  role = "pod"
  selectors {
    // Only scrape pods with a particular selector.
    role = "pod"
    // The selector is any component that belongs to Tempo.
    label = "app.kubernetes.io/name=tempo"
  }
}

此规则让 Alloy 知道只有包含 app.kubernetes.io/name=tempo 注解的 Pod 才应抓取其指标。

需要注意的是,Tempo 的仪表盘期望抓取的 Tempo 指标包含特定的命名空间、集群名称和作业名称标签,其中作业命名规范为 <命名空间>/<app.kubernetes.io/component>。后者会展开为 distributorcompactoringester 等。例如:tempo/compactor,其中 tempo 是命名空间,compactor 替换了 <app.kubernetes.io/component>

您可以从包含在每个组件抓取数据中的 Kubernetes 元数据注解中获取所有三个标签。由于此元数据是一个带有 __meta_kubernetes 前缀的字符串,必须配置 Alloy 在指标处理管道中不丢弃这些标签。为此,您可以使用 discover.relabel 组件添加规则来保留任何所需的元数据标签。

在以下示例中,特定的 Tempo 组件名称(例如 __meta_kubernetes_app_kubernetes_io_component)被替换为一个更有用的标签名称并保留以用于后续的处理管道操作。

yaml
rule {
  source_labels = ["__meta_kubernetes_pod_label_app_kubernetes_io_component"]
  action = "replace"
  regex = "(.*)"
  replacement = "$1"
  target_label = "k8s_component_name"
}

通过添加规则来保留用于命名空间的 __meta_kubernetes_namespace 标签和用于集群名称的 __meta_kubernetes_app_kubernetes_io_instance 标签,您还可以将这些标签附加到写入的指标上,以便稍后在仪表盘中使用。

最后,在 Alloy 配置中包含一个 Prometheus relabel 组件,可以使用保留的元数据标签来为作业创建正确的命名规范

alloy
rule {
  source_labels = ["namespace", "k8s_component_name"]
  action = "replace"
  regex = "(.*?);(.*?)"
  replacement = "$1/$2"
  target_label = "job"
}

这使得您可以创建一种配置,用于从 Tempo 组件抓取指标并将数据写入您选择的 Mimir 实例。

本示例提供了一个 Helm values.yaml 文件,可用于部署在 Kubernetes 上的 Alloy。该文件配置了 Alloy 用于抓取正在运行的 Tempo 实例的选项。详细信息请参阅示例中的注释。

yaml
alloy:
  configMap:
  create: true
  content: |-
    // Scrape Prometheus metrics for Tempo.
    prometheus.scrape "tempo" {
      // Use Kubernetes discovery to find the relevant pods to scrape.
      targets    = discovery.relabel.k8s_pods.output
      // Forward to the Prometheus relabeling component.
      forward_to = [prometheus.relabel.tempo.receiver]
    }

    // Determine how to select pods to scrape.
    discovery.kubernetes "k8s_pods" {
      // Only scrape pods.
      role = "pod"
      selectors {
        // Only scrape pods with a particular selector.
        role = "pod"
        // The selector is any component that belongs to Tempo.
        label = "app.kubernetes.io/name=tempo"
      }
    }

    // Relabel data from Kubernetes discovery.
    discovery.relabel "k8s_pods" {
      // Relabel from targets scraped by the discovery selection.
      targets = discovery.kubernetes.k8s_pods.targets

      // Create new namespace label based on the discovered kubernetes namespace.
      rule {
        source_labels = ["__meta_kubernetes_namespace"]
        action = "replace"
        regex = "(.*)"
        replacement = "$1"
        target_label = "namespace"
      }

      // Create new component label based on the discovered kubernetes component.
      rule {
        source_labels = ["__meta_kubernetes_pod_label_app_kubernetes_io_component"]
        action = "replace"
        regex = "(.*)"
        replacement = "$1"
        target_label = "k8s_component_name"
      }

      // Create new cluster label based on the discovered kubernetes instance.
      rule {
        source_labels = ["__meta_kubernetes_pod_label_app_kubernetes_io_instance"]
        action = "replace"
        regex = "(.*)"
        replacement = "$1"
        target_label = "cluster"
      }
    }

    // Relabel data from Prometheus scraping.
    prometheus.relabel "tempo" {
      // Replace the existing job label with one comprised of the namespace and component.
      rule {
        source_labels = ["namespace", "k8s_component_name"]
        action = "replace"
        regex = "(.*?);(.*?)"
        replacement = "$1/$2"
        target_label = "job"
      }


      // Send the metrics to the Prometheus remote write component.
      forward_to = [prometheus.remote_write.tempo.receiver]
    }

    // Remote write the metrics to a Prometheus compatible endpoint (in this case Mimir).
    prometheus.remote_write "tempo" {
      endpoint {
        url = "https://mimir-cluster.distributor.mimir.svc.cluster.local:9001/api/v1/push"
      }
    }

本示例不包含任何其他数据的摄取,例如发送到 Tempo 的追踪,但可以通过一些配置更新来包含。有关详细信息,请参阅配置 Alloy 向 Tempo 远程写入

在 Grafana 中安装 Tempo 仪表盘

Alloy 从 Tempo 中抓取指标并将其发送到 Mimir 或其他与 Prometheus 兼容的时序数据库。然后,您可以使用 mixin 来监控 Tempo。

Tempo 附带了一个 mixin,其中包括

  • 用于全面以及各组件健康状况监控的相关仪表盘
  • 简化仪表盘和自由格式查询的指标生成的记录规则
  • 当 Tempo 超出操作参数时触发的告警

要在 Grafana 中安装 mixins,您需要

  1. 从 Tempo 仓库下载 mixin 仪表盘。

  2. 在您的 Grafana 实例中导入仪表盘。

  3. 为 Mimir 或 Prometheus 上传 alerts.yamlrules.yaml 文件

下载 tempo-mixin 仪表盘

  1. 首先,从 Github 克隆 Tempo 仓库

    bash
    git clone git+ssh://github.com/grafana/tempo
  2. 获取仓库的本地副本后,导航到 operations/tempo-mixin-compiled 目录。

    bash
    cd operations/tempo-mixin-compiled

此目录包含告警和记录规则的编译版本,以及仪表盘。

注意

如果您想更改任何 mixin,请在 operations/tempo-mixin 目录中进行更新。使用该目录下的 README 中的说明重新生成文件。生成的 mixins 位于 operations/tempo-mixin-compiled 目录中。

将仪表盘导入 Grafana

dashboards 目录包含可以安装到您的 Grafana 实例中的六个监控仪表盘。请参阅 Grafana 文档中的导入仪表盘

提示

安装所有六个仪表盘。您一次只能导入一个仪表盘。在仪表盘区域创建一个新文件夹,例如“Tempo 监控”,作为一个方便的位置来保存导入的仪表盘。

创建文件夹

  1. 打开您的 Grafana 实例,选择仪表盘
  2. 在右上角选择新建
  3. 新建下拉菜单中选择新建文件夹
  4. 命名您的文件夹,例如“Tempo 监控”。
  5. 选择创建

导入仪表盘

  1. 打开您的 Grafana 实例,选择仪表盘
  2. 在右上角选择新建
  3. 选择导入
  4. 导入仪表盘屏幕上,选择上传
  5. 浏览到 operations/tempo-mixin-compiled/dashboards 并选择要导入的仪表盘。
  6. 将仪表盘文件(例如 tempo-operational.json)拖到导入仪表盘屏幕的上传区域。或者,您也可以浏览并选择文件。
  7. 文件夹下拉菜单中选择您要保存导入仪表盘的文件夹。例如,选择前面步骤中创建的 Tempo 监控文件夹。
  8. 选择导入

导入的文件将列在 Tempo 监控仪表盘文件夹中。

在 Grafana 中查看仪表盘

  1. 在您的 Grafana 实例中选择仪表盘。
  2. 选择 Tempo 监控,或您上传导入仪表盘的文件夹。
  3. 选择文件夹中的任意文件进行查看。

“Tempo Operational”仪表盘显示读取(查询)信息

Tempo Operational dashboard

将告警和规则添加到 Prometheus 或 Mimir

规则和告警需要安装到您的 Mimir 或 Prometheus 实例中。要在 Prometheus 中执行此操作,请参阅记录规则告警规则文档。

对于 Mimir,您可以使用 [mimirtool](https://grafana.org.cn/docs/mimir/latest/manage/tools/mimirtool/) 来上传规则告警配置。使用默认安装的 Mimir 作为 Alloy 配置的指标存储,您可能会运行以下命令

bash
mimirtool rules load operations/tempo-mixin-compiles/rules.yml --address=https://mimir-cluster.distributor.mimir.svc.cluster.local:9001

mimirtool alertmanager load operations/tempo-mixin-compiles/alerts.yml --address=https://mimir-cluster.distributor.mimir.svc.cluster.local:9001

对于 Grafana Cloud,您还需要添加用户名和 API 密钥。有关详细信息,请参阅 mimirtool 文档。