From 51f08206689ddd2d38f8ea7c9102469650701df8 Mon Sep 17 00:00:00 2001 From: Ricardo Carneiro Date: Mon, 25 Aug 2025 20:00:50 -0300 Subject: [PATCH] fix: ratelimit e erros de mongodb --- Program.cs | 26 ++++++++++++++++--- .../Monitoring/MongoDbMonitoringService.cs | 23 ++++++++++++---- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Program.cs b/Program.cs index 0a0cbfa..cd301c8 100644 --- a/Program.cs +++ b/Program.cs @@ -21,6 +21,8 @@ using Serilog.Sinks.SystemConsole.Themes; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.RateLimiting; +using System.Threading.RateLimiting; var builder = WebApplication.CreateBuilder(args); @@ -178,10 +180,10 @@ if (builder.Configuration.GetValue("ResourceMonitoring:Enabled", true)) builder.Services.AddHostedService(); } -if (builder.Configuration.GetValue("MongoDbMonitoring:Enabled", true)) -{ - builder.Services.AddHostedService(); -} +//if (builder.Configuration.GetValue("MongoDbMonitoring:Enabled", true)) +//{ +// builder.Services.AddHostedService(); +//} // CORS for API endpoints builder.Services.AddCors(options => @@ -212,8 +214,24 @@ builder.Services.Configure(options => options.KnownNetworks.Clear(); }); +builder.Services.AddRateLimiter(options => +{ + options.RejectionStatusCode = 429; + options.AddFixedWindowLimiter("api", options => + { + options.PermitLimit = 600; // 10 req/s = 600 req/min + options.Window = TimeSpan.FromMinutes(1); + //options.PermitLimit = 100; + //options.Window = TimeSpan.FromMinutes(1); + options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; + options.QueueLimit = 10; + }); +}); + var app = builder.Build(); +app.UseRateLimiter(); + app.UseForwardedHeaders(); // Configure the HTTP request pipeline diff --git a/Services/Monitoring/MongoDbMonitoringService.cs b/Services/Monitoring/MongoDbMonitoringService.cs index 1ca1a51..d5d215d 100644 --- a/Services/Monitoring/MongoDbMonitoringService.cs +++ b/Services/Monitoring/MongoDbMonitoringService.cs @@ -200,12 +200,12 @@ namespace QRRapidoApp.Services.Monitoring { var command = new BsonDocument("collStats", collectionName); var result = await context.Database!.RunCommandAsync(command); - - var size = result.GetValue("size", BsonValue.Create(0)).AsDouble; - var totalIndexSize = result.GetValue("totalIndexSize", BsonValue.Create(0)).AsDouble; + + var size = GetDoubleValue(result, "size"); + var totalIndexSize = GetDoubleValue(result, "totalIndexSize"); var count = result.GetValue("count", BsonValue.Create(0)).ToInt64(); - var avgObjSize = result.GetValue("avgObjSize", BsonValue.Create(0)).AsDouble; - + var avgObjSize = GetDoubleValue(result, "avgObjSize"); + collectionStats.Add(new CollectionStatistics { Name = collectionName, @@ -225,6 +225,19 @@ namespace QRRapidoApp.Services.Monitoring return collectionStats.OrderByDescending(c => c.SizeMB).ToList(); } + private static double GetDoubleValue(BsonDocument document, string fieldName) + { + var value = document.GetValue(fieldName, BsonValue.Create(0)); + return value.BsonType switch + { + BsonType.Double => value.AsDouble, + BsonType.Int32 => (double)value.AsInt32, + BsonType.Int64 => (double)value.AsInt64, + BsonType.Decimal128 => (double)value.AsDecimal128, + _ => 0.0 + }; + } + private bool ShouldMonitorCollection(string collectionName) { return _collectionsToMonitor.Any(monitored =>