MyLab.HttpMetrics

Package Description


Keywords
License
MIT
Install
Install-Package MyLab.HttpMetrics -Version 1.1.3

Documentation

MyLab.HttpMetrics

NuGet Version and Downloads count

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹: .NET Core 3.1+

ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с послСдними измСнСниями Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

ΠžΠ±Π·ΠΎΡ€

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Prometheus для .NET Core для прСдоставлСния основных ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ, связанных с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ HTTP запросов.

Для добавлСния ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ прилоТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ:

  1. AddUrlBasedHttpMetrics - Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ зависимости
  2. UseUrlBasedHttpMetrics - Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ middleware для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° запросов
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddUrlBasedHttpMetrics();		// <--- 1
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseUrlBasedHttpMetrics();			// <--- 2

        app.UseEndpoints(endpoints =>
		{
        	endpoints.MapControllers();
            endpoints.MapMetrics();
        });
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° собираСмых ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ (ΠΏΠΎΠ΄Ρ€Π΅Π·Π°Π½ΠΎ):

# HELP ml_http_request_count_total The total number of requests
# TYPE ml_http_request_count_total counter
ml_http_request_count_total{method="GET",path="/get/xxx",status_code="200"} 1
# HELP ml_http_request_content_size_bytes The request content size in bytes.
# TYPE ml_http_request_content_size_bytes histogram
ml_http_request_content_size_bytes_sum{method="GET",path="/get/xxx",status_code="200"} 0
ml_http_request_content_size_bytes_count{method="GET",path="/get/xxx",status_code="200"} 1
ml_http_request_content_size_bytes_bucket{method="GET",path="/get/xxx",status_code="200",le="1024"} 1
...
ml_http_request_content_size_bytes_bucket{method="GET",path="/get/xxx",status_code="200",le="+Inf"} 1
# HELP ml_http_request_size_bytes_total The total size of request content
# TYPE ml_http_request_size_bytes_total counter
# HELP ml_http_request_duration_seconds The duration in seconds between the response to a request.
# TYPE ml_http_request_duration_seconds histogram
ml_http_request_duration_seconds_sum{method="GET",path="/get/xxx",status_code="200"} 0.0303877
ml_http_request_duration_seconds_count{method="GET",path="/get/xxx",status_code="200"} 1
ml_http_request_duration_seconds_bucket{method="GET",path="/get/xxx",status_code="200",le="0.01"} 0
...
ml_http_request_duration_seconds_bucket{method="GET",path="/get/xxx",status_code="200",le="30"} 1
ml_http_request_duration_seconds_bucket{method="GET",path="/get/xxx",status_code="200",le="+Inf"} 1
# HELP process_working_set_bytes Process working set
# TYPE process_working_set_bytes gauge
process_working_set_bytes 111038464
# HELP ml_http_response_content_size_bytes The response content size in bytes.
# TYPE ml_http_response_content_size_bytes histogram
ml_http_response_content_size_bytes_sum{method="GET",path="/get/xxx",status_code="200"} 0
ml_http_response_content_size_bytes_count{method="GET",path="/get/xxx",status_code="200"} 1
ml_http_response_content_size_bytes_bucket{method="GET",path="/get/xxx",status_code="200",le="1024"} 1
...
ml_http_response_content_size_bytes_bucket{method="GET",path="/get/xxx",status_code="200",le="+Inf"} 1

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ

ml_http_request_count_total

Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊ. Π‘Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ количСство ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΡ… запросов.

ml_http_unhandled_exception_total

Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊ. Π‘Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ количСство Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

ml_http_request_content_size_bytes

Гистограмма. Π’Π΅Π΄Ρ‘Ρ‚ ΡƒΡ‡Ρ‘Ρ‚ ΠΎΠ±ΡŠΡ‘ΠΌΠ° запросов Π² Π±Π°ΠΉΡ‚Π°Ρ…. Π£Ρ‡Ρ‘Ρ‚ основан Π½Π° значСниях ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Content-Length.

Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊΠΈ гистограммы:

  • 1kb
  • 2kb
  • 5kb
  • 10kb
  • 20kb
  • 50kb
  • 1Mb

ml_http_response_content_size_bytes

Гистограмма. Π’Π΅Π΄Ρ‘Ρ‚ ΡƒΡ‡Ρ‘Ρ‚ ΠΎΠ±ΡŠΡ‘ΠΌΠ° ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π² Π±Π°ΠΉΡ‚Π°Ρ…. Π£Ρ‡Ρ‘Ρ‚ основан Π½Π° количСствС Π΄Π°Π½Π½Ρ‹Ρ…, записанных Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚Π΅Π»Π° сообщСния ΠΎΡ‚Π²Π΅Ρ‚Π°.

Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊΠΈ гистограммы:

  • 1kb
  • 2kb
  • 5kb
  • 10kb
  • 20kb
  • 50kb
  • 1Mb

ml_http_request_duration_seconds

Гистограмма. Π’Π΅Π΄Ρ‘Ρ‚ ΡƒΡ‡Ρ‘Ρ‚ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов Π² сСкундах.

Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊΠΈ гистограммы:

  • 10ms
  • 20ms
  • 50ms
  • 100ms
  • 200ms
  • 500ms
  • 1s
  • 2s
  • 3s
  • 10s
  • 20s
  • 30s

ΠœΠ΅Ρ‚ΠΊΠΈ

  • method - HTTP-ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС
  • path - Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈΠ· URL запроса
  • status_code - числовой статус-ΠΊΠΎΠ΄ ΠΎΡ‚Π²Π΅Ρ‚Π°

Нормализация ΠΏΡƒΡ‚ΠΈ URL

Основной Ρ†Π΅Π»ΡŒΡŽ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ являСтся ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ, содСрТащих ΠΏΡƒΡ‚ΠΈ URL запросов, содСрТащих ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ.

Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ манипуляции:

  • адрСс приводится ΠΊ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ рСгистру
  • провСряСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΏΡƒΡ‚ΠΈ ΠΈ замСняСтся Π½Π° xxx, Ссли:
    • Ρ†ΠΈΡ„Ρ€ большС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… символов
    • это GUID
    • содСрТит ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ†ΠΈΡ„Ρ€ Π΄Π»ΠΈΠ½ΠΎΠΉ 3 ΠΈ Π±ΠΎΠ»Π΅Π΅

Нормализация пСрСчислСний

Для Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ пСрСчислСний Π² качСствС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ EnumConverter.ToLabel.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ конвСртирования:

  • TestEnum.Foo => "foo"
  • TestEnum.Foo1 => "foo_1"
  • TestEnum.Foo2Bar => "foo_2_bar"
  • TestEnum.FooBar => "foo_bar"
  • TestEnum.Foo | TestEnum.FooBar => "foo_foo_bar"
  • (TestEnum)50 => "50"