菜单
文档breadcrumb arrow Grafana Mimirbreadcrumb arrow 发送数据breadcrumb arrow OpenTelemetry 指数直方图
开源 RSS

将 OpenTelemetry 指数直方图发送到 Mimir

注意

发送 OpenTelemetry 指数直方图是 Grafana Mimir 的一项实验性功能。

您可以使用 OpenTelemetry Collector 收集指数直方图并将其发送到 Mimir。OpenTelemetry 指数直方图 与 Prometheus Native Histogram 兼容。关键区别在于,指数直方图明确存储了 `min` 和 `max` 观察值,而 Native Histogram 则不存储。这意味着对于指数直方图,您无需使用 0.0 和 1.0 分位数来估计这些值。

OpenTelemetry Collector 通过其接收器支持收集指数直方图和其他兼容数据格式(包括 Native Histogram 和 Datadog sketches),并通过其 exporter 发送这些数据。

注意

不同接收器和 exporter 的可用性取决于您的 OpenTelemetry Collector 分发版

您可以使用基于 HTTP 的 OpenTelemetry 协议 (OTLP) 将指数直方图以其现有格式发送到 Grafana Mimir,也可以使用 Prometheus 远程写入协议将其作为 Prometheus Native Histogram 发送。

OpenTelemetry SDK 支持多种语言的应用程序插桩。有关完整列表,请参阅 Language APIs & SDKs

使用 Go 通过 OpenTelemetry SDK 插桩应用程序

请使用 OpenTelemetry SDK 1.17.0 或更高版本。

  1. 设置 OpenTelemetry Collector 来处理您的指标数据。这包括设置您的资源、meter provider、meter、instrument 和 view。有关 Go 中 OpenTelemetry SDK 的更多信息,请参阅 Metrics

  2. 要将 Histogram instrument 聚合为指数直方图,请包含以下 view

    Aggregation: metric.AggregationBase2ExponentialHistogram{
    		MaxSize:  160,
    		MaxScale: 20,
    	}

    有关 view 的更多信息,请参阅 Go 中 OpenTelemetry SDK 文档中的 Registering Views。有关 view 配置参数的信息,请参阅 GitHub 上 OpenTelemetry Metrics SDK 中的 Base2 Exponential Bucket Histogram Aggregation

从 Explicit Bucket Histogram 迁移

为了简化迁移过程,您可以保留 Explicit Bucket Histogram 的自定义 bucket 定义,并为指数直方图添加一个 view。

  1. 从使用显式 bucket 的现有直方图开始。

  2. 为指数直方图创建一个 view。为该 view 分配一个唯一的名称,并包含指数聚合。这将创建一个具有指定名称和指数 bucket 的指标。

    以下示例演示如何创建一个名为 `request_latency_exp` 并使用指数 bucket 的指标。

    v := sdkmetric.NewView(sdkmetric.Instrument{
       	Name: "request_latency",
       	Kind: sdkmetric.InstrumentKindHistogram,
       }, sdkmetric.Stream{
    	   Name: "request_latency_exp",
    	   Aggregation: sdkmetric.AggregationBase2ExponentialHistogram{MaxSize: 160, NoMinMax: true, MaxScale: 20},
       })

    有关创建 view 的更多信息,请参阅 OpenTelemetry Metrics SDK 中的 View

  3. 修改仪表盘以使用指数直方图指标。有关更多信息,请参阅 可视化 Native Histogram

    使用以下策略之一更新仪表盘。

    • (推荐)使用指数直方图查询创建仪表盘。此解决方案需要查看不同仪表盘中的数据(迁移前和迁移后),直到迁移前的数据因超出保留时间而被移除。您可以在经过足够的时间后发布仪表盘,以便为用户提供新数据。

    • 在仪表盘中添加一个仪表盘变量,以实现 Explicit Bucket Histogram 和指数直方图之间的切换。Grafana 不支持选择性地启用和禁用查询(issue 79848)。作为替代方案,添加仪表盘变量 `latency_metrics`,例如,并为其分配值 `-1` 或 `1`。然后,向面板添加以下两个查询

      <explicit_bucket_query> < ($latency_metrics * +Inf)
      <exponential_query> < ($latency_metrics * -Inf)

      其中 `explicit_bucket_query` 是原始查询,`exponential_query` 是使用指数直方图查询语法的相同查询。Mimir 的仪表盘中采用了此技术。例如,请参阅 Mimir 仓库中的 Overview 仪表盘

      此解决方案允许用户在 Explicit Bucket Histogram 和指数直方图之间切换,而无需转到其他仪表盘。

    • 将 Explicit Bucket Query 替换为修改后的查询。例如,替换

      <explicit_bucket_query>

      <exponential_query> or <explicit_bucket_query>

      其中 `explicit_bucket_query` 是原始查询,`exponential_query` 是使用指数直方图查询语法的相同查询。

      警告

      使用 PromQL 运算符 `or` 可能会导致意外结果。例如,如果查询使用七天的范围,例如 `sum(rate(http_request_duration_seconds[7d]))`,则只要在查询中指定的结束时间之前存在两个指数直方图样本,此查询就会返回一个值。在这种情况下,七天的速率是从几分钟而不是七天的数据计算得出的。这会导致您开始 scraping 指数直方图的时间附近的图表出现不准确。

  4. 开始添加 Recording Rule 和警报以使用指数直方图。此时不要删除任何现有的 Recording Rule 和警报。

  5. 重要的是,至少在 Recording Rule 和警报中最长范围的时间段加上一天的时间内,继续 scraping Explicit Bucket 和指数直方图。这是最短时间,但建议继续 scraping 这两种数据类型,直到您可以验证新的规则和警报。

    例如,如果您有一个警报计算请求速率,例如 `sum(rate(http_request_duration_seconds[7d]))`,此查询会查看过去七天的数据以及 Prometheus 的 lookback period。当您开始发送指数直方图时,数据尚未满七天,因此,结果可能对警报不可靠。

  6. 配置完指数直方图收集后,删除 Explicit Bucket Histogram 定义以及任何暴露显式 bucket 的 view。

  7. 通过删除 Explicit Bucket Histogram 版本的规则或警报来清理 Recording Rule 和警报。

Bucket 边界计算

指数直方图的 bucket 边界计算方式与 Native Histogram 类似。唯一的区别在于,对于指数直方图,bucket 偏移量会移动一位,如以下等式所示。

Positive bucket definition

有关更多信息,请参阅 Native Histogram 文档中的 bucket 边界计算