From 36740dc0ffed4d0028c198fdc0c66bf4c6b21d9d Mon Sep 17 00:00:00 2001
From: OK <143250301+OK219@users.noreply.github.com>
Date: Tue, 28 Oct 2025 14:49:58 +0500
Subject: [PATCH 1/2] 1.1
---
Program.cs | 25 +++++++++++++++++++++++++
telemetry.csproj | 10 ++++++++++
2 files changed, 35 insertions(+)
diff --git a/Program.cs b/Program.cs
index bc275e4..2152694 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.
@@ -22,4 +45,6 @@
app.MapRazorPages();
+app.UseOpenTelemetryPrometheusScrapingEndpoint();
+
app.Run();
diff --git a/telemetry.csproj b/telemetry.csproj
index 1b28a01..21d6853 100644
--- a/telemetry.csproj
+++ b/telemetry.csproj
@@ -6,4 +6,14 @@
enable
+
+
+
+
+
+
+
+
+
+
From 5a9f95216a3a8b82b8b6af042713cf4c2a03dbbb Mon Sep 17 00:00:00 2001
From: OK <143250301+OK219@users.noreply.github.com>
Date: Tue, 28 Oct 2025 15:29:43 +0500
Subject: [PATCH 2/2] all
---
Metrics.cs | 22 ++++++++++++++++++++++
Pages/Index.cshtml | 1 +
Pages/Index.cshtml.cs | 14 ++++++++++++--
Program.cs | 7 +++++--
compose.yaml | 12 ++++++++++++
prometheus.yml | 6 ++++++
6 files changed, 58 insertions(+), 4 deletions(-)
create mode 100644 Metrics.cs
create mode 100644 compose.yaml
create mode 100644 prometheus.yml
diff --git a/Metrics.cs b/Metrics.cs
new file mode 100644
index 0000000..204d732
--- /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
diff --git a/Pages/Index.cshtml b/Pages/Index.cshtml
index f9ff8d4..082a6b2 100644
--- a/Pages/Index.cshtml
+++ b/Pages/Index.cshtml
@@ -1,4 +1,5 @@
@page
+@using System.Diagnostics
@model IndexModel
@{
ViewData["Title"] = "Home page";
diff --git a/Pages/Index.cshtml.cs b/Pages/Index.cshtml.cs
index 34a599f..da2eed8 100644
--- a/Pages/Index.cshtml.cs
+++ b/Pages/Index.cshtml.cs
@@ -1,3 +1,4 @@
+using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
@@ -6,14 +7,23 @@ namespace telemetry.Pages;
public class IndexModel : PageModel
{
private readonly ILogger _logger;
+ private readonly Metrics _metrics;
- public IndexModel(ILogger logger)
+ public IndexModel(ILogger logger, Metrics metrics)
{
_logger = logger;
+ _metrics = metrics;
}
public void OnGet()
{
+ var sw = Stopwatch.StartNew();
+ for (var i = 0; i < new Random().Next(0, 100); i++)
+ {
+ Console.Write("1");
+ }
+ sw.Stop();
+ _metrics.RequestToIndex(sw.Elapsed);
}
-}
+}
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
index 2152694..ece540c 100644
--- a/Program.cs
+++ b/Program.cs
@@ -2,11 +2,13 @@
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 =>
{
@@ -24,7 +26,8 @@
.WithMetrics(metrics => metrics
.AddPrometheusExporter()
.AddAspNetCoreInstrumentation()
- .AddConsoleExporter());
+ .AddConsoleExporter()
+ .AddMeter(nameof(Metrics)));
var app = builder.Build();
@@ -47,4 +50,4 @@
app.UseOpenTelemetryPrometheusScrapingEndpoint();
-app.Run();
+app.Run();
\ No newline at end of file
diff --git a/compose.yaml b/compose.yaml
new file mode 100644
index 0000000..b8a11cb
--- /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..53296a3
--- /dev/null
+++ b/prometheus.yml
@@ -0,0 +1,6 @@
+scrape_configs:
+ - job_name: "prometheus"
+ # Override the global default and scrape targets from this job every 5 seconds.
+ scrape_interval: 5s
+ static_configs:
+ - targets: ["host.docker.internal:5149"]
\ No newline at end of file