From 0e09073ee02a146c9af4dfbd1725d55c4f1bd70c Mon Sep 17 00:00:00 2001 From: Moritz <101179677+mxritzdev@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:50:34 +0200 Subject: [PATCH 1/2] Add .DotSettings.user to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5cdc66f..6da3193 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ obj/ riderModule.iml /_ReSharper.Caches/ /LinkRouter/data +*.DotSettings.user From 8c9453676bd06459b22022c58a41c18cefed176c Mon Sep 17 00:00:00 2001 From: Moritz <101179677+mxritzdev@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:50:49 +0200 Subject: [PATCH 2/2] Add Prometheus metrics for route and 404 requests --- .../Http/Controllers/RedirectController.cs | 34 +++++++++++++++++++ LinkRouter/LinkRouter.csproj | 1 + LinkRouter/Program.cs | 7 ++++ 3 files changed, 42 insertions(+) diff --git a/LinkRouter/App/Http/Controllers/RedirectController.cs b/LinkRouter/App/Http/Controllers/RedirectController.cs index 1a36a96..7ba7fcb 100644 --- a/LinkRouter/App/Http/Controllers/RedirectController.cs +++ b/LinkRouter/App/Http/Controllers/RedirectController.cs @@ -3,6 +3,7 @@ using LinkRouter.App.Configuration; using Microsoft.AspNetCore.Mvc; using MoonCore.Services; +using Prometheus; namespace LinkRouter.App.Http.Controllers; @@ -11,6 +12,26 @@ public class RedirectController : Controller { private readonly Config Config; + + + private readonly Counter RouteCounter = Metrics.CreateCounter( + "linkrouter_requests", + "Counts the number of requests to the link router", + new CounterConfiguration + { + LabelNames = new[] { "route" } + } + ); + + + private readonly Counter NotFoundCounter = Metrics.CreateCounter( + "linkrouter_404_requests", + "Counts the number of not found requests to the link router", + new CounterConfiguration + { + LabelNames = new[] { "route" } + } + ); public RedirectController(Config config) { @@ -23,8 +44,17 @@ public IActionResult RedirectToExternalUrl(string path) var redirectRoute = Config.Routes.FirstOrDefault(x => x.Route == path || x.Route == path + "/" || x.Route == "/" + path); if (redirectRoute != null) + { + RouteCounter + .WithLabels(redirectRoute.Route) + .Inc(); + return Redirect(redirectRoute.RedirectUrl); + } + NotFoundCounter + .WithLabels(path) + .Inc(); if (Config.NotFoundBehavior.RedirectOn404) return Redirect(Config.NotFoundBehavior.RedirectUrl); @@ -35,6 +65,10 @@ public IActionResult RedirectToExternalUrl(string path) [HttpGet("/")] public IActionResult GetRootRoute() { + RouteCounter + .WithLabels("/") + .Inc(); + string url = Config.RootRoute; return Redirect(url); diff --git a/LinkRouter/LinkRouter.csproj b/LinkRouter/LinkRouter.csproj index 13c742b..2eb2d1b 100644 --- a/LinkRouter/LinkRouter.csproj +++ b/LinkRouter/LinkRouter.csproj @@ -12,6 +12,7 @@ + diff --git a/LinkRouter/Program.cs b/LinkRouter/Program.cs index b4b1cfe..0842b5e 100644 --- a/LinkRouter/Program.cs +++ b/LinkRouter/Program.cs @@ -6,6 +6,7 @@ using MoonCore.Extensions; using MoonCore.Helpers; using MoonCore.Services; +using Prometheus; namespace LinkRouter; @@ -46,8 +47,14 @@ public static void Main(string[] args) builder.Services.AddSingleton(config); + builder.Services.AddMetricServer(options => + { + options.Port = 5000; + }); + var app = builder.Build(); + app.UseMetricServer(); app.MapControllers(); app.Run();