From d7340f0c09a62c99e9c7458ff4eee0ba61dbc7d9 Mon Sep 17 00:00:00 2001 From: Maksim Zaitsev Date: Tue, 28 Oct 2025 15:09:27 +0500 Subject: [PATCH 1/5] 1.1 --- Program.cs | 25 ++++++++++++++++++++++++- telemetry.csproj | 10 ++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Program.cs b/Program.cs index bc275e4..e883a2f 100644 --- a/Program.cs +++ b/Program.cs @@ -1,8 +1,30 @@ -var builder = WebApplication.CreateBuilder(args); +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; +var builder = WebApplication.CreateBuilder(args); +builder.Logging.AddOpenTelemetry(options => +{ + options + .SetResourceBuilder( + ResourceBuilder.CreateDefault() + .AddService("TelemetryExample")) + .AddConsoleExporter(); +}); +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => resource.AddService("TelemetryExample")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddConsoleExporter()) + .WithMetrics(metrics => metrics + .AddPrometheusExporter() + .AddAspNetCoreInstrumentation() + .AddConsoleExporter()); // Add services to the container. builder.Services.AddRazorPages(); + var app = builder.Build(); // Configure the HTTP request pipeline. @@ -13,6 +35,7 @@ app.UseHsts(); } +app.UseOpenTelemetryPrometheusScrapingEndpoint(); app.UseHttpsRedirection(); app.UseStaticFiles(); diff --git a/telemetry.csproj b/telemetry.csproj index 1b28a01..21d6853 100644 --- a/telemetry.csproj +++ b/telemetry.csproj @@ -6,4 +6,14 @@ enable + + + + + + + + + + From 5aa4ce70c2dce025ac3e8fc64c27f6bc2c0c420f Mon Sep 17 00:00:00 2001 From: Daewoow <147472046+Daewoow@users.noreply.github.com> Date: Tue, 28 Oct 2025 15:27:44 +0500 Subject: [PATCH 2/5] before 1.6 --- Program.cs | 25 +++++++++++++++++++++++++ compose.yaml | 12 ++++++++++++ prometheus.yml | 5 +++++ 3 files changed, 42 insertions(+) create mode 100644 compose.yaml create mode 100644 prometheus.yml diff --git a/Program.cs b/Program.cs index bc275e4..0c4d012 100644 --- a/Program.cs +++ b/Program.cs @@ -1,8 +1,31 @@ +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); +builder.Logging.AddOpenTelemetry(options => +{ + options + .SetResourceBuilder( + ResourceBuilder.CreateDefault() + .AddService("TelemetryExample")) + .AddConsoleExporter(); +}); +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => resource.AddService("TelemetryExample")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddConsoleExporter()) + .WithMetrics(metrics => metrics + .AddPrometheusExporter() + .AddAspNetCoreInstrumentation() + .AddConsoleExporter()); + var app = builder.Build(); // Configure the HTTP request pipeline. @@ -20,6 +43,8 @@ app.UseAuthorization(); +app.UseOpenTelemetryPrometheusScrapingEndpoint(); + app.MapRazorPages(); app.Run(); diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..34b44cc --- /dev/null +++ b/compose.yaml @@ -0,0 +1,12 @@ +services: + prometheus: + image: "prom/prometheus" + ports: + - "9090:9090" + volumes: + - "./prometheus.yml:/etc/prometheus/prometheus.yml" + + grafana: + image: "grafana/grafana-oss" + ports: + - "3000:3000" \ No newline at end of file diff --git a/prometheus.yml b/prometheus.yml new file mode 100644 index 0000000..9ad5785 --- /dev/null +++ b/prometheus.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: "prometheus" + scrape_interval: 5s + static_configs: + - targets: ["host.docker.internal:5149"] \ No newline at end of file From 7d92c1877c3372ed1d8ed82ceefd8577387001f9 Mon Sep 17 00:00:00 2001 From: Daewoow <147472046+Daewoow@users.noreply.github.com> Date: Tue, 28 Oct 2025 15:31:26 +0500 Subject: [PATCH 3/5] add 1.6 --- prometheus.yml | 3 ++- telemetry.csproj | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/prometheus.yml b/prometheus.yml index 9ad5785..c6b44a0 100644 --- a/prometheus.yml +++ b/prometheus.yml @@ -2,4 +2,5 @@ - job_name: "prometheus" scrape_interval: 5s static_configs: - - targets: ["host.docker.internal:5149"] \ No newline at end of file + - targets: ["host.docker.internal:5149"] + \ No newline at end of file diff --git a/telemetry.csproj b/telemetry.csproj index 21d6853..27e0ff0 100644 --- a/telemetry.csproj +++ b/telemetry.csproj @@ -4,6 +4,7 @@ net8.0 enable enable + Linux From 1eecfe47a47112d1aa5127b0eca5a4873e654c12 Mon Sep 17 00:00:00 2001 From: Daewoow <147472046+Daewoow@users.noreply.github.com> Date: Tue, 28 Oct 2025 15:31:58 +0500 Subject: [PATCH 4/5] 1.6 again --- Metrics.cs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Metrics.cs diff --git a/Metrics.cs b/Metrics.cs new file mode 100644 index 0000000..30e2524 --- /dev/null +++ b/Metrics.cs @@ -0,0 +1,22 @@ +using System.Diagnostics.Metrics; + +namespace telemetry; + +public class Metrics +{ + private readonly Counter indexRequestsCount; + private readonly Histogram indexRequestsTime; + + public Metrics(IMeterFactory meterFactory) + { + var meter = meterFactory.Create(nameof(Metrics)); + indexRequestsCount = meter.CreateCounter("requests.index.count", "pcs", "Количество запросов"); + indexRequestsTime = meter.CreateHistogram("requests.index.time", "ms", "Время запроса к index"); + } + + public void RequestToIndex(TimeSpan elapsed) + { + indexRequestsCount.Add(1); + indexRequestsTime.Record(elapsed.TotalMilliseconds); + } +} \ No newline at end of file From ccf8f3e468b67b679fc3b97dd3cb680a34db8682 Mon Sep 17 00:00:00 2001 From: Daewoow <147472046+Daewoow@users.noreply.github.com> Date: Tue, 28 Oct 2025 15:55:42 +0500 Subject: [PATCH 5/5] 1.7 --- Metrics.cs | 45 +++++++++++++++++++++++++++++++++++++++++++ Pages/Index.cshtml.cs | 39 ++++++++++++++++++++++++++++--------- Program.cs | 6 ++++-- 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/Metrics.cs b/Metrics.cs index 30e2524..e130c00 100644 --- a/Metrics.cs +++ b/Metrics.cs @@ -6,17 +6,62 @@ public class Metrics { private readonly Counter indexRequestsCount; private readonly Histogram indexRequestsTime; + private readonly Counter errorCount; + private readonly Counter slowRequestsCount; + + private int totalRequests; + private int errorRequests; public Metrics(IMeterFactory meterFactory) { var meter = meterFactory.Create(nameof(Metrics)); + indexRequestsCount = meter.CreateCounter("requests.index.count", "pcs", "Количество запросов"); indexRequestsTime = meter.CreateHistogram("requests.index.time", "ms", "Время запроса к index"); + + errorCount = meter.CreateCounter( + "requests.index.errors", + "errors", + "Количество ошибок при обработке запроса" + ); + + slowRequestsCount = meter.CreateCounter( + "requests.index.slow", + "requests", + "Количество медленных запросов (более 50ms)" + ); + + meter.CreateObservableGauge( + "requests.index.error_rate", + CalculateErrorRate, + "ratio", + "Доля ошибок среди всех запросов (0-1)" + ); } public void RequestToIndex(TimeSpan elapsed) { + totalRequests++; indexRequestsCount.Add(1); indexRequestsTime.Record(elapsed.TotalMilliseconds); + + if (elapsed.TotalMilliseconds > 50) + { + slowRequestsCount.Add(1); + } + } + + public void RecordError() + { + errorRequests++; + errorCount.Add(1); + } + + private double CalculateErrorRate() + { + if (totalRequests == 0) + return 0; + + return (double)errorRequests / totalRequests; } } \ No newline at end of file diff --git a/Pages/Index.cshtml.cs b/Pages/Index.cshtml.cs index 34a599f..5ba2b5f 100644 --- a/Pages/Index.cshtml.cs +++ b/Pages/Index.cshtml.cs @@ -1,19 +1,40 @@ +using System.Diagnostics; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace telemetry.Pages; -public class IndexModel : PageModel +public class IndexModel(ILogger logger, Metrics metrics) : PageModel { - private readonly ILogger _logger; - - public IndexModel(ILogger logger) - { - _logger = logger; - } + private readonly ILogger _logger = logger; public void OnGet() { - + var sw = Stopwatch.StartNew(); + var random = new Random(); + + try + { + for (var i = 0; i < random.Next(0, 100); i++) + { + if (random.Next(100) < 5) + { + throw new Exception("Simulated processing error"); + } + + Console.Write("1"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при обработке запроса"); + metrics.RecordError(); + } + finally + { + sw.Stop(); + + metrics.RequestToIndex(sw.Elapsed); + } } -} +} \ No newline at end of file diff --git a/Program.cs b/Program.cs index 0c4d012..a56ca19 100644 --- a/Program.cs +++ b/Program.cs @@ -2,12 +2,14 @@ using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; +using telemetry; + var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); - +builder.Services.AddSingleton(); builder.Logging.AddOpenTelemetry(options => { options @@ -24,7 +26,7 @@ .WithMetrics(metrics => metrics .AddPrometheusExporter() .AddAspNetCoreInstrumentation() - .AddConsoleExporter()); + .AddConsoleExporter().AddMeter(nameof(Metrics))); var app = builder.Build();