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();