Byndyusoft.Execution.Metrics.Hangfire 1.0.0

dotnet add package Byndyusoft.Execution.Metrics.Hangfire --version 1.0.0                
NuGet\Install-Package Byndyusoft.Execution.Metrics.Hangfire -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.Hangfire" 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.Hangfire --version 1.0.0                
#r "nuget: Byndyusoft.Execution.Metrics.Hangfire, 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.Hangfire as a Cake Addin
#addin nuget:?package=Byndyusoft.Execution.Metrics.Hangfire&version=1.0.0

// Install Byndyusoft.Execution.Metrics.Hangfire as a Cake Tool
#tool nuget:?package=Byndyusoft.Execution.Metrics.Hangfire&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

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.0 1,200 2/14/2024
0.0.1 965 10/5/2023
0.0.1-tags-prelease-4 485 10/5/2023