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