🔍 掌握OpenTelemetry:指标视图(Metric View)完整指南

大家好!今天我们将深入探讨OpenTelemetry的强大功能之一:指标视图(Metric View)。您是否曾想过在将收集到的指标数据发送到后端之前,根据自己的需求进行调整?这就是“指标视图”的秘密武器!🚀

###

什么是OpenTelemetry指标视图(Metric Views)?

最简单的解释是,指标视图可以被视为OpenTelemetry SDK核心中运行的“数据定制工坊”。🏭

我们应用程序中辛勤收集的指标数据在发送到最终目的地(例如:Prometheus、Datadog等)之前,会经过一个名为“指标视图”的关卡。在这个关卡,我们获得了强大的能力,可以随意改变数据的形式、进行过滤或重新配置。

换句话说,它是在数据通过导出器(Exporter)外部传输之前,定制和转换指标流的核心机制。

指标视图是在指标数据发送到后端之前对其进行处理和控制的强大功能。您可以选择特定的指标并执行以下操作:

  • 更改聚合(Aggregation):您可以将默认的聚合方式(例如:求和、最后值)更改为直方图或其他方式。例如,您可以将HTTP请求持续时间作为直方图而不是默认聚合来收集,以了解其分布。
  • 属性(Attribute)过滤:您可以添加或排除特定的属性键,以节省存储空间并仅保留分析所需的数据。例如,您可以排除http.client_ip等高基数属性以降低成本。
  • 重命名和添加描述:您可以将指标名称更改得更清晰,或添加描述以提高可读性。
  • 选择测量(Instrument):您可以仅将视图应用于具有特定名称、类型、单位等的测量(Instrument)。

✨ 指标视图能做的惊人工作

使用指标视图,您可以执行各种各样的任务。我们来逐一看看吧?

1. 更改特定指标的聚合方式 📊 ➡️ 📈

这是最强大的功能之一!例如,假设有一个默认以“求和(Sum)”方式聚合的请求计数指标。但我们可能不仅想知道总和,还想了解请求在不同时间段的分布情况。此时,使用指标视图可以轻松地将该指标的聚合方式更改为“直方图(Histogram)”。

  • Before: request_count (简单求和)
  • After (with View): request_count (显示时间分布的直方图)

2. 重命名指标 🏷️

有时,您需要遵循组织内部的指标命名规范,或者为了与现有系统兼容而更改指标名称。使用指标视图,您可以将代码级别生成的原始指标名称,干净地更改为所需的名称再导出。

  • Before: http.server.duration
  • After (with View): my_app.request_latency_seconds

3. 过滤不必要的属性(Attribute) 🧹

指标数据会伴随各种上下文信息“属性(Attribute)”一起收集。(例如:http.method, http.status_code, user.id等)但有时,过多的属性会导致数据的基数(cardinality)爆炸式增长,从而引发成本问题或性能下降。指标视图在这种情况下扮演着救星的角色!您可以选择性地移除被认为不必要的属性,只保留必需的数据。

  • Before: metric{user_id=”123″, client_ip=”…”, …}
  • After (with View): metric{…} (移除敏感或不必要的属性)

4. 设置直方图的桶(Bucket)边界 📏

直方图是显示数据分布的强大工具,但如何划分区间(桶)至关重要。如果我们的服务响应时间(latency)大多在100ms以下,但直方图桶设置得太宽,例如[1s, 2s, 5s, …],那么有意义的分析就会变得困难。使用指标视图,您可以将直方图的桶边界精细调整为最适合我们服务的值。

  • Default Buckets: [0, 5, 10, 25, 50, …]
  • Custom Buckets (with View): [0.01, 0.05, 0.1, 0.25, 0.5, 1] (可进行更细致的分析)

💡 为什么指标视图很重要?

总而言之,指标视图赋予我们在数据发送到可观测性后端之前,完美控制数据的形式(Shape)、粒度(Granularity)和基数(Cardinality)的能力。

通过它,我们可以获得以下优势:

  • 成本节约 💰: 过滤不必要的数据,减少传输量和存储成本。
  • 性能提升 ⚡️: 减轻后端系统的负载,实现更快、更高效的数据处理。
  • 分析效率提高 🎯: 根据分析目的处理数据,获得更有意义、更准确的洞察。

指标视图配置方法

指标视图通常在配置MeterProvider时进行设置。大多数语言SDK都提供类似的概念,这里我们将结合概念流程和代码示例进行说明。

1. 注册视图(View)

在MeterProvider中注册一个或多个视图以控制指标流。

概念性步骤:

  1. 测量选择器(Instrument Selector): 选择要应用视图的测量(Instrument)。可以通过名称、类型、仪表名称等进行指定。
  2. 流配置(Stream Configuration): 定义如何处理选定的测量数据流。包括更改名称、添加描述、过滤属性、更改聚合方式等。
  3. 将视图添加到MeterProvider: 将创建的视图注册到MeterProvider。

2. 主要组成部分

测量选择器 (Instrument Selector)

选择要应用视图的目标的规则。可以根据各种标准进行选择。

  • instrument_name: 测量的名称(例如:http.server.duration)
  • instrument_type: 测量的类型(例如:Histogram, Counter, Gauge)
  • meter_name: 创建此测量的仪表(Meter)的名称
  • meter_version: 仪表的版本

您也可以使用通配符(\*)将规则应用于多个测量。(例如:http.*.duration)

流配置 (Stream Configuration)

定义如何处理选定的指标数据。

  • name: 新的指标名称
  • description: 指标的描述
  • aggregation: 聚合方式定义(参见下面的“聚合方式”)
  • attribute_keys: 要收集的属性键列表。不在列表中的键将被移除。

3. 聚合方式 (Aggregation)

视图中可用的主要聚合方式如下:

  • SumAggregation: 计算所有测量值的总和。(Counter的默认值)
  • LastValueAggregation: 使用最后测量的值。(Gauge的默认值)
  • DropAggregation: 完全移除该指标。
  • ExplicitBucketHistogramAggregation: 根据用户定义的边界值(boundary)创建直方图。这可以可视化值的分布。
  • 示例: [0, 5, 10, 25, 50, 100] 以毫秒(ms)为单位了解响应时间分布

代码示例 (Python)

以下是Python OpenTelemetry SDK中将http.server.duration指标聚合为直方图并移除不必要属性的示例。

from opentelemetry import metrics
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.view import View, InstrumentSelector
from opentelemetry.sdk.metrics.aggregation import ExplicitBucketHistogramAggregation
from opentelemetry.sdk.resources import Resource

# 1. 创建视图(View)
# 选择 http.server.duration 指标并将其聚合方式更改为直方图
histogram_view = View(
    # 选择名为 'http.server.duration' 的测量(Instrument)
    selector=InstrumentSelector(
        instrument_name="http.server.duration",
        instrument_type=metrics.Histogram
    ),
    # 设置新名称和描述
    name="http.server.duration.histogram",
    description="Duration of inbound HTTP requests in milliseconds",
    # 将聚合方式更改为显式桶直方图
    # 将响应时间按 0, 10, 50, 100, 500ms 边界进行聚合
    aggregation=ExplicitBucketHistogramAggregation(
        boundaries=(0, 10, 50, 100, 500)
    )
)

# 2. 在 MeterProvider 中注册视图
resource = Resource.create({"service.name": "my-service"})
meter_provider = MeterProvider(
    resource=resource,
    views=[histogram_view] # 注册创建的视图
)

# 3. 全局设置 MeterProvider
metrics.set_meter_provider(meter_provider)

# 之后,当应用程序代码记录指标时
# http.server.duration 指标将根据上述定义的视图规则进行处理。
meter = metrics.get_meter("my-app.meter")
histogram = meter.create_histogram(
    "http.server.duration",
    unit="ms",
    description="HTTP server request duration"
)

# ... 应用程序逻辑 ...
# histogram.record(request_duration_in_ms)

通过这种方式利用指标视图,您可以在不更改应用程序代码的情况下灵活控制收集到的指标数据的格式和内容,这对于优化监控系统的效率和成本非常有用。

如果您正在使用OpenTelemetry,请积极利用指标视图,将您的可观测性数据提升到一个新的水平!



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注