Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Инфраструктура измерений .NET предназначена для обеспечения удобного в использовании и высокопроизводительного решения для современных приложений .NET.
Чтобы использовать метрики, созданные источником, создайте класс, определяющий имена и измерения метрик, которые может создавать код. Затем создайте класс с partial сигнатурами метода.
Генератор источника автоматически создает код, который предоставляет строго типизированные типы и методы измерения, которые можно вызвать для записи значений метрик. Созданные методы реализуются в высоко эффективной форме, что снижает затраты на вычисления по сравнению с традиционными решениями измерения.
Начало работы
Чтобы приступить к работе, установите 📦 пакет NuGet Microsoft.Extensions.Telemetry.Abstractions :
dotnet add package Microsoft.Extensions.Telemetry.Abstractions
Дополнительные сведения см. в разделе dotnet add package или Управление зависимостями пакетов в приложениях .NET.
Универсальные атрибуты
Универсальные атрибуты требуют C# 11 или более поздней версии. Для C# 10 или более ранних версий используйте вместо этого негенерические атрибуты.
В следующем примере показан класс, объявляющий три метрики. Методы помечены атрибутом и объявляются как static и partial.
Генератор кода выполняется во время сборки и предоставляет реализацию этих методов вместе с сопутствующими типами.
internal class MetricConstants
{
public const string EnvironmentName = "env";
public const string Region = "region";
public const string RequestName = "requestName";
public const string RequestStatus = "requestStatus";
}
В следующем коде показано, как использовать генератор с примитивными типами:
using System.Diagnostics.Metrics;
using Microsoft.Extensions.Diagnostics.Metrics;
namespace MetricsGen;
internal static partial class Metric
{
// an explicit metric name is given
[Histogram<long>("requestName", "duration", Name = "MyCustomMetricName")]
public static partial Latency CreateLatency(Meter meter);
// no explicit metric name given, it is auto-generated from the method name
[Counter<int>(
MetricConstants.EnvironmentName,
MetricConstants.Region,
MetricConstants.RequestName,
MetricConstants.RequestStatus)]
public static partial TotalCount CreateTotalCount(Meter meter);
[Counter<int>]
public static partial TotalFailures CreateTotalFailures(this Meter meter);
}
Указание единиц
Начиная с .NET 10.2, можно также указать единицу измерения для метрик с помощью Unit параметра. Это помогает предоставить контекст о том, что измеряет метрика (например, "секунды", "байты" и "запросы"). Единица передается базовому Meter элементу при создании инструмента.
В следующем коде показано, как использовать генератор с примитивными типами с указанными единицами:
internal static partial class Metric
{
[Histogram<long>("requestName", "duration", Name = "MyCustomMetricName", Unit = "ms")]
public static partial Latency CreateLatency(Meter meter);
[Counter<int>(
MetricConstants.EnvironmentName,
MetricConstants.Region,
MetricConstants.RequestName,
MetricConstants.RequestStatus,
Unit = "requests")]
public static partial TotalCount CreateTotalCount(Meter meter);
[Counter<int>(Unit = "failures")]
public static partial TotalFailures CreateTotalFailures(this Meter meter);
}
Предыдущее объявление автоматически возвращает следующую информацию:
-
Latencyкласс с методомRecord -
TotalCountкласс с методомAdd -
TotalFailuresкласс с методомAdd.
Атрибуты указывают набор измерений, которые используются каждой метрикой. Сигнатура для созданных типов выглядит следующим образом:
internal class TotalCount
{
public void Add(int value, object? env, object? region, object? requestName, object? requestStatus)
}
internal class TotalFailures
{
public void Add(int value)
}
internal class Latency
{
public void Record(long value, object? requestName, object? duration);
}
Измерения, указанные в атрибутах, были превращены в аргументы методов Add и Record. Затем вы используете созданные методы для создания экземпляров этих типов. С помощью созданных экземпляров можно вызывать Add и Record регистрировать значения метрик, как показано в следующем примере:
internal class MyClass
{
// these variable are for example purposes, the dimensions values should depend on your business logic.
private string envName = "envValue";
private string regionName = "regionValue";
private string requestName = "requestNameValue";
private string status = "requestStatusValue";
private string duration = "1:00:00";
private readonly Latency _latencyMetric;
private readonly TotalCount _totalCountMetric;
private readonly TotalFailures _totalFailuresMetric;
public MyClass(Meter meter)
{
// Create metric instances using the source-generated factory methods
_latencyMetric = Metric.CreateLatency(meter);
_totalCountMetric = Metric.CreateTotalCount(meter);
// This syntax is available since `CreateTotalFailures` is defined as an extension method
_totalFailuresMetric = meter.CreateTotalFailures();
}
public void ReportSampleRequestCount()
{
// method logic ...
// Invoke Add on the counter and pass the dimension values you need.
_totalCountMetric.Add(1, envName, regionName, requestName, status);
}
public void ReportSampleLatency()
{
// method logic ...
// Invoke Record on the histogram and pass the dimension values you need.
_latencyMetric.Record(1, requestName, duration);
}
public void ReportSampleFailuresCount()
{
// method logic ...
// Invoke Add on the counter and pass the dimension values you need.
_totalFailuresMetric.Add(1);
}
}
Требования к методам метрик
Метрические методы ограничены следующим:
- Они должны быть
public static partial. - Возвращаемый тип должен быть уникальным.
- Их имена не должны начинаться с подчеркивания.
- Имена параметров не должны начинаться с символа подчеркивания.
- Их первый параметр должен быть Meter типом.
См. также
Дополнительные сведения о поддерживаемых метриках см. в разделе "Типы инструментов ", чтобы узнать, как выбрать инструмент для использования в разных ситуациях.