Byndyusoft.Execution.Metrics 1.0.0

dotnet add package Byndyusoft.Execution.Metrics --version 1.0.0                
NuGet\Install-Package Byndyusoft.Execution.Metrics -Version 1.0.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Byndyusoft.Execution.Metrics" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Byndyusoft.Execution.Metrics --version 1.0.0                
#r "nuget: Byndyusoft.Execution.Metrics, 1.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Byndyusoft.Execution.Metrics as a Cake Addin
#addin nuget:?package=Byndyusoft.Execution.Metrics&version=1.0.0

// Install Byndyusoft.Execution.Metrics as a Cake Tool
#tool nuget:?package=Byndyusoft.Execution.Metrics&version=1.0.0                

Byndyusoft.Execution.Metrics

Набор инструментов для Open Telemetry, который позволяет получать согласованные метрики и трассы для основных операций сервиса.

Под основной операцией понимается обработка http-запроса, выполнение периодического задания (hangfire), обработка сообщений очереди (rabbit-mq, kafka) и т.п. Т.е. то, что обычно является первым спаном в сервисе.

Почему бы не взять стандартные библиотеки?

В соответствии с семантическими соглашениями у разных основных операций метрики имеют разные названия, а трассы содержат разный набор тегов.

Из-за этого есть ряд проблем:

  • Для каждой основной операции нужно своё правило алертинга, т.к. разные названия метрик и тегов.
  • Для каждой основной операции нужно знать её теги, чтобы по ним искать трассы.
  • Не для каждой операции есть готовое соглашение.

Если использовать одинаковый набор мертик и тегов для каждой операции, то эти проблемы уходят.

Появляется возможность построить универсальный дашборд для всех операций. Настроить единые правила алертинга (хотя бы на старте проекта). Искать по тегам связанные с метриками трассы.

Для этого нужно разработать свои собственные соглашения.

Соглашения

Требования к набору тегов

Для согласования метрик и трасс (и логов) в них должен быть один и тот же набор тегов:

  • тип операции
  • название операции
  • код статуса
  • результат.

Это минимальный необходимый набор, чтобы работали дашборды и алертинг. В метриках могут быть дополнительные теги, если этого требует проект. Например, тип документа.

Тег Название метриках Название в трассах Примечание
Тип операции type type hangfire, rabbit-mq, kafka и т.п.
Название операции operation Название спана
Код статуса status_code otel.status_code "ERROR" или "OK", если результат не установлен, то тег не выводится
Результат result result По умолчанию пусто. Заполняется, если нужно различать овтеты. Например: Retry, 200 и т.п.

Требования к метрикам

Метрика должна называться execution_duration и должна быть гистограммой.

Т.е. должны быть execution_duration_milliseconds_bucket с тегом le, execution_duration_milliseconds_sum и execution_duration_milliseconds_count.

Пример:

execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="0"} 0 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="5"} 0 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="10"} 0 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="25"} 0 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="50"} 1 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="75"} 1 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="100"} 1 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="250"} 1 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="500"} 1 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="1000"} 1 1695888400559
execution_duration_milliseconds_bucket{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue",le="+Inf"} 1 1695888400559
execution_duration_milliseconds_sum{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue"} 48.0471 1695888400559
execution_duration_milliseconds_count{operation="SendNotification",status_code="ERROR",status_description="",type="memory_queue"} 1 1695888400559

Требования к именованию операций

Название операции формируется по разному в зависимости от её типа:

  • http - "{GET|POST|etc} {url_template|url}". Т.к. собираем в метрики, урл не должен зависеть от входящих параметров, иначе сборщику метрик будет плохо.
  • hangfire - "{Название операции из самого хенгфаера}"
  • rabbit_mq - "{Название очереди на которую подписаны}"

Использование

Основа библиотеки - ExecutionHandler, который используется для простого добавления метрик и трасс для любой основной опрерации. ExecutionHandler создаёт Activity, по которому вычисляются метрики и записываются трассы.

Чтобы заработала трассировка для операций, которые используют для метрик ExecutionHandler, нужно добавить соответствующую инструментацию в трассировку:

.WithTracing(builder =>
    builder.AddExecutionDurationInstrumentation()
    ...

Чтобы заработали метрики для операций, которые используют ExecutionHandler, нужно добавить соответствующую инструментацию в метрики:

.WithMetrics(builder =>
    builder.AddExecutionDurationInstrumentation()
    ...

Чтобы заработали метрики для http-запросов и не было дублирования со стандартными метриками, нужно заменить AddAspNetCoreInstrumentation на AddHttpRequestExecutionDurationInstrumentation

.WithMetrics(builder =>
    builder.AddHttpRequestExecutionDurationInstrumentation()
    ...

Чтобы писались метрики hangfire, нужно добавить соответствующий фильтр

services.AddHangfire((_, configuration) => 
    configuration.AddHangfireExecutionMetricDurationFilter()
    ...

Метрики для рэбита и прочих основных операций в разработке.

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Byndyusoft.Execution.Metrics:

Package Downloads
Byndyusoft.Execution.Metrics.AspNet

Package Description

Byndyusoft.Execution.Metrics.Hangfire

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.0 1,390 2/14/2024
0.0.1 1,462 10/5/2023
0.0.1-tags-prelease-4 798 10/5/2023