fix(host): rate-limit dead-letter warnings (10/min + suppression summary); metric counting unchanged
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
using System.Linq;
|
||||
using Akka.Actor;
|
||||
using Akka.Event;
|
||||
using Akka.TestKit.Xunit2;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using NSubstitute;
|
||||
using ZB.MOM.WW.ScadaBridge.Host.Actors;
|
||||
|
||||
namespace ZB.MOM.WW.ScadaBridge.Host.Tests;
|
||||
@@ -48,6 +50,33 @@ public class DeadLetterMonitorTests : TestKit
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task DeadLetterStorm_LogsAtMostWindowLimit_ButCountsAll()
|
||||
{
|
||||
// Review 01 [Low]: a failover/undeploy storm produced one Warning per
|
||||
// dead letter — unbounded log flood. Health metric counting is untouched.
|
||||
var logger = Substitute.For<ILogger<DeadLetterMonitorActor>>();
|
||||
var monitor = Sys.ActorOf(Props.Create(() => new DeadLetterMonitorActor(logger, null)));
|
||||
|
||||
// Ensure the actor has started before the storm.
|
||||
monitor.Tell(GetDeadLetterCount.Instance);
|
||||
ExpectMsg<DeadLetterCountResponse>();
|
||||
|
||||
for (var i = 0; i < 50; i++)
|
||||
monitor.Tell(new DeadLetter($"m{i}", TestActor, TestActor));
|
||||
|
||||
var count = await monitor.Ask<DeadLetterCountResponse>(GetDeadLetterCount.Instance);
|
||||
Assert.Equal(50, count.Count); // every dead letter still counted
|
||||
|
||||
var warnings = logger.ReceivedCalls().Count(c =>
|
||||
c.GetMethodInfo().Name == "Log"
|
||||
&& (Microsoft.Extensions.Logging.LogLevel)c.GetArguments()[0]!
|
||||
== Microsoft.Extensions.Logging.LogLevel.Warning);
|
||||
// The per-letter cap plus the one "limit reached" notice.
|
||||
Assert.True(warnings <= DeadLetterMonitorActor.MaxWarningsPerWindow + 1,
|
||||
$"expected <= {DeadLetterMonitorActor.MaxWarningsPerWindow + 1} warnings, got {warnings}");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DeadLetterMonitor_CountAccumulates()
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" />
|
||||
<PackageReference Include="NSubstitute" />
|
||||
<PackageReference Include="Serilog" />
|
||||
<PackageReference Include="xunit" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" />
|
||||
|
||||
Reference in New Issue
Block a user