MyLab.HttpMetrics
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ: .NET Core 3.1+
ΠΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ Π² ΠΆΡΡΠ½Π°Π»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΠ±Π·ΠΎΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Prometheus Π΄Π»Ρ .NET Core Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΌΠ΅ΡΡΠΈΠΊ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ HTTP Π·Π°ΠΏΡΠΎΡΠΎΠ².
ΠΠ»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ:
-
AddUrlBasedHttpMetrics
- Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ -
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"