指标工具

了解OpenTelemetry .NET中可用的不同类型的指标工具。

本指南解释了OpenTelemetry .NET中可用的不同类型的指标工具以及如何有效地使用它们。

了解指标工具

OpenTelemetry提供几种类型的工具来测量不同类型的数据

Instrument Type行为典型用例
Counter单调递增值请求计数、错误计数
UpDownCounter可增可减的值队列大小、活动连接数
Histogram记录值的分布请求持续时间、响应大小
Gauge在特定时间点观测某个值CPU使用率、内存使用率

Counter

Counter记录一个随时间累加且永不减少的值。它非常适合仅增加的指标,例如请求计数、已完成操作或错误计数。

创建计数器

using System.Diagnostics.Metrics;

// Create a meter
var meter = new Meter("MyCompany.MyProduct", "1.0.0");

// Create a counter
var requestCounter = meter.CreateCounter<long>("request_counter", "requests", "Counts the number of requests");

记录测量值

// Increment by 1
requestCounter.Add(1);

// Increment with attributes
requestCounter.Add(1, new("endpoint", "/api/users"), new("method", "GET"));

UpDownCounter

UpDownCounter记录一个可以增加和减少的值,表示某个给定时间的当前值。它对于跟踪队列大小、活动连接数或资源池使用情况等值很有用。

创建UpDownCounter

// Create an up-down counter
var activeConnectionsCounter = meter.CreateUpDownCounter<int>("active_connections", "connections", "Number of active connections");

记录UpDownCounter测量值

// Increment by 1
activeConnectionsCounter.Add(1);

// Decrement by 1
activeConnectionsCounter.Add(-1);

// With attributes
activeConnectionsCounter.Add(1, new("pool", "worker"), new("region", "west"));

Histogram

Histogram记录值的分布,捕获计数、总和、最小值、最大值和百分位数等统计信息。它非常适合测量持续时间、大小和其他分布值。

创建直方图

// Create a histogram
var requestDurationHistogram = meter.CreateHistogram<double>("request_duration", "ms", "Request duration in milliseconds");

记录直方图测量值

// Record a duration
requestDurationHistogram.Record(213.5);

// With attributes
requestDurationHistogram.Record(42.3, new("endpoint", "/api/users"), new("method", "GET"));

可观测工具

可观测工具允许您在收集指标时按需收集测量值,而不是直接在代码中记录它们。这对于最好定期采样的指标很有用。

可观测计数器

// Create an observable counter
meter.CreateObservableCounter("processed_items_total", () =>
{
    // Return the current count from some internal state
    return new Measurement<long>(GetCurrentProcessedCount(), new("queue", "default"));
}, "items", "Total number of processed items");

可观测UpDownCounter

// Create an observable up-down counter
meter.CreateObservableUpDownCounter("active_tasks", () =>
{
    // Return current values from internal state
    return new[]
    {
        new Measurement<int>(GetHighPriorityTaskCount(), new("priority", "high")),
        new Measurement<int>(GetLowPriorityTaskCount(), new("priority", "low"))
    };
}, "tasks", "Current number of active tasks");

可观测Gauge

// Create an observable gauge
meter.CreateObservableGauge("cpu_usage", () =>
{
    // Get current CPU usage percentage
    return new Measurement<double>(GetCurrentCpuUsage());
}, "%", "Current CPU usage percentage");

批量可观测测量值

您还可以注册一个返回多个工具的多个测量值的回调。

// Register a single callback for multiple observable instruments
var observableCounter = meter.CreateObservableCounter<long>("my_observable_counter", "items");
var observableGauge = meter.CreateObservableGauge<double>("my_observable_gauge", "%");

meter.RegisterObservableCallback(observableInstruments =>
{
    // Record a value for the counter
    observableInstruments.Observe(observableCounter, 42, new("type", "product_a"));

    // Record a value for the gauge
    observableInstruments.Observe(observableGauge, 12.3, new("resource", "cpu"));
}, observableCounter, observableGauge);

单位和描述

创建工具时,指定单位和描述是一个好习惯。

// Specify unit and description
var requestSizeHistogram = meter.CreateHistogram<long>(
    name: "http.request.size",
    unit: "By",  // bytes
    description: "Size of HTTP request in bytes"
);

常用单位包括

  • 时间:ms(毫秒)、s(秒)、min(分钟)
  • 字节:By(字节)、KiBy(千字节)、MiBy(兆字节)
  • 计数:通常是无单位的,或使用特定单位,如requests

最佳实践

  1. 选择正确的工具 - 选择最符合您要测量的指标行为的工具类型
  2. 使用有意义的名称 - 遵循指标名称的语义约定
  3. 添加描述性属性 - 使用属性来区分您正在测量的不同方面
  4. 注意基数 - 过多的唯一属性组合可能会导致性能问题
  5. 重用工具 - 一次创建工具并在整个应用程序中重用它们
  6. 提供单位和描述 - 始终指定单位和描述以获得更好的可观测性

了解更多