入门指标 - 控制台

了解如何在 .NET 控制台应用程序中使用 OpenTelemetry 指标

本指南将在几分钟内向您展示如何在控制台应用程序中开始使用 OpenTelemetry .NET 指标。

先决条件

创建控制台应用程序

创建新的控制台应用程序并运行它

dotnet new console --output getting-started
cd getting-started
dotnet run

您应该会看到以下输出

Hello World!

添加 OpenTelemetry 指标

安装 OpenTelemetry Console Exporter 包

dotnet add package OpenTelemetry.Exporter.Console

使用以下代码更新 Program.cs 文件

using System;
using System.Diagnostics.Metrics;
using OpenTelemetry;
using OpenTelemetry.Metrics;

// Define a meter
private static readonly Meter MyMeter = new("MyCompany.MyProduct.MyLibrary", "1.0");

// Create a counter instrument
private static readonly Counter<long> MyFruitCounter = MyMeter.CreateCounter<long>("MyFruitCounter", "fruit", "Counts fruit by name and color");

// Configure the OpenTelemetry MeterProvider
using var meterProvider = Sdk.CreateMeterProviderBuilder()
    .AddMeter("MyCompany.MyProduct.MyLibrary")
    .AddConsoleExporter()
    .Build();

// Record some measurements
MyFruitCounter.Add(1, new("name", "apple"), new("color", "red"));
MyFruitCounter.Add(2, new("name", "lemon"), new("color", "yellow"));
MyFruitCounter.Add(1, new("name", "lemon"), new("color", "yellow"));
MyFruitCounter.Add(2, new("name", "apple"), new("color", "green"));
MyFruitCounter.Add(5, new("name", "apple"), new("color", "red"));
MyFruitCounter.Add(4, new("name", "lemon"), new("color", "yellow"));

Console.WriteLine("Press any key to exit");
Console.ReadKey();

再次运行应用程序(使用 dotnet run),您应该会看到来自控制台的指标输出(程序结束时会看到指标),类似于下图所示

Export MyFruitCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0
(2021-09-23T22:00:08.4399776Z, 2021-09-23T22:00:08.4510115Z) color:red name:apple LongSum
Value: 6
(2021-09-23T22:00:08.4399776Z, 2021-09-23T22:00:08.4510115Z) color:yellow name:lemon LongSum
Value: 7
(2021-09-23T22:00:08.4399776Z, 2021-09-23T22:00:08.4510115Z) color:green name:apple LongSum
Value: 2

恭喜!您现在正在使用 OpenTelemetry 收集指标。

工作原理

Meter

该程序创建一个名为“MyCompany.MyProduct.MyLibrary”的 Meter 实例。Meter 是创建指标仪表的入口点。

private static readonly Meter MyMeter = new("MyCompany.MyProduct.MyLibrary", "1.0");

计数器仪表

然后,它从 Meter 创建一个 Counter 仪表。Counter 用于测量非递减的值。

private static readonly Counter<long> MyFruitCounter = MyMeter.CreateCounter<long>("MyFruitCounter");

记录测量

Counter 用于报告具有不同属性组合的多个指标测量

MyFruitCounter.Add(1, new("name", "apple"), new("color", "red"));

MeterProvider 配置

OpenTelemetry MeterProvider 配置为

  1. 订阅指定 Meter 的仪表
  2. 将指标导出到控制台
var meterProvider = Sdk.CreateMeterProviderBuilder()
    .AddMeter("MyCompany.MyProduct.MyLibrary")
    .AddConsoleExporter()
    .Build();

MeterProvider 在内存中聚合测量,默认基数限制为 2000 种属性组合。

处理高基数指标

如果您需要收集基数超过默认限制 2000 的指标,可以自定义基数限制

var meterProvider = Sdk.CreateMeterProviderBuilder()
    .AddMeter("MyCompany.MyProduct.MyLibrary")
    .AddView(instrumentName: "MyFruitCounter", new MetricStreamConfiguration { CardinalityLimit = 10 })
    .AddConsoleExporter()
    .Build();

指标管道

OpenTelemetry .NET 中的指标管道遵循此流程

  1. 仪表记录测量
  2. MeterProvider 接收并聚合测量
  3. MetricReader 读取聚合的指标
  4. Exporter 将指标导出到后端

关于 OpenTelemetry .NET 的特别说明

OpenTelemetry .NET 中的指标实现方式有些独特,因为大多数 Metrics API 由 .NET 运行时本身实现。从高层次来看,这意味着您只需依赖 System.Diagnostics.DiagnosticSource 包即可为应用程序添加仪表。

了解更多