Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 15 additions & 12 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
<AWSSDKExtensionsNETCoreSetup>4.0.3.20</AWSSDKExtensionsNETCoreSetup>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="AWSSDK.DynamoDBv2" Version="[3.7.500.5, 4)" />
<PackageVersion Include="AWSSDK.IdentityManagement" Version="[3.7.500.5, 4)" />
<PackageVersion Include="AWSSDK.Extensions.NETCore.Setup" Version="[3.7.400, 4)" />
<PackageVersion Include="AWSSDK.S3" Version="[3.7.500.5, 4)" />
<PackageVersion Include="AWSSDK.SecurityToken" Version="[3.7.500.5, 4)" />
<PackageVersion Include="AWSSDK.Scheduler" Version="[3.7.500.5, 4)" />
<PackageVersion Include="AWSSDK.SimpleNotificationService" Version="[3.7.500.5, 4)" />
<PackageVersion Include="AWSSDK.SQS" Version="[3.7.500.5, 4)" />
<PackageVersion Include="AWSSDK.DynamoDBv2" Version="3.7.509.19" />
<PackageVersion Include="AWSSDK.IdentityManagement" Version="3.7.507.15" />
<PackageVersion Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.400" />
<PackageVersion Include="AWSSDK.S3" Version="3.7.509.6" />
<PackageVersion Include="AWSSDK.SecurityToken" Version="3.7.504.19" />
<PackageVersion Include="AWSSDK.Scheduler" Version="3.7.502.27" />
<PackageVersion Include="AWSSDK.SimpleNotificationService" Version="3.7.502.30" />
<PackageVersion Include="AWSSDK.SQS" Version="3.7.502.26" />
<PackageVersion Include="Azure.Identity" Version="1.17.1" />
<PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.20.1" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.27.0" />
Expand All @@ -34,7 +34,7 @@
<PackageVersion Include="Dapper.Contrib" Version="2.0.78" />
<PackageVersion Include="DapperExtensions" Version="1.7.0" />
<PackageVersion Include="EventStore.ClientAPI.NetCore" Version="4.1.0.23" />
<PackageVersion Include="FluentMigrator" Version="8.0.0" />
<PackageVersion Include="FakeItEasy" Version="9.0.0" /> <PackageVersion Include="FluentMigrator" Version="8.0.0" />
<PackageVersion Include="FluentMigrator.Runner" Version="8.0.0" />
<PackageVersion Include="FluentMigrator.Runner.Core" Version="8.0.0" />
<PackageVersion Include="FluentMigrator.Runner.MySql" Version="8.0.0" />
Expand All @@ -54,6 +54,7 @@
<PackageVersion Include="Hangfire.InMemory" Version="1.0.0" />
<PackageVersion Include="JustSaying" Version="8.0.0" />
<PackageVersion Include="JustSaying.Extensions.DependencyInjection.Microsoft" Version="8.0.0" />
<PackageVersion Include="JetBrains.dotMemoryUnit" Version="3.2.20220510" />
<PackageVersion Include="MassTransit" Version="9.0.0" />
<PackageVersion Include="MassTransit.AmazonSQS" Version="9.0.0" />
<PackageVersion Include="MassTransit.Extensions.DependencyInjection" Version="7.3.1" />
Expand All @@ -78,6 +79,7 @@
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="10.2.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="Microsoft.Testing.Platform" Version="2.0.2" />
<PackageVersion Include="MongoDB.Driver" Version="3.6.0" />
<PackageVersion Include="MQTTnet" Version="4.3.7.1207" />
<PackageVersion Include="MySqlConnector" Version="2.5.0" />
Expand Down Expand Up @@ -133,16 +135,15 @@
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
<PackageVersion Include="System.Threading.Channels" Version="10.0.2" />
<PackageVersion Include="TUnit" Version="0.67.10" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.v3.mtp-v2" Version="3.2.1" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageVersion>
<PackageVersion Include="FakeItEasy" Version="9.0.0" />
<PackageVersion Include="xunit.v3" Version="3.1.0" />
<PackageVersion Include="xunit.v3.runner.msbuild" Version="3.1.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.22" />
Expand All @@ -155,6 +156,7 @@
<PackageVersion Include="TickerQ" Version="8.0.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' ">
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.11" />
Expand All @@ -167,6 +169,7 @@
<PackageVersion Include="TickerQ" Version="9.0.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net10.0' ">
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.1" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS\Paramore.Brighter.MessagingGateway.AWSSQS.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS.V4\Paramore.Brighter.MessagingGateway.AWSSQS.V4.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter\Paramore.Brighter.csproj" />
</ItemGroup>
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using Paramore.Brighter.Extensions.DependencyInjection;
using Paramore.Brighter.MessageScheduler.Quartz;
using Paramore.Brighter.MessagingGateway.AWSSQS;
using Paramore.Brighter.MessagingGateway.AWSSQS.V4;
using Quartz;
using Serilog;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ THE SOFTWARE. */
using Microsoft.Extensions.Hosting;
using Paramore.Brighter;
using Paramore.Brighter.MessagingGateway.AWSSQS;
using Paramore.Brighter.MessagingGateway.AWSSQS.V4;
using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection;
using Paramore.Brighter.ServiceActivator.Extensions.Hosting;
using Serilog;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS\Paramore.Brighter.MessagingGateway.AWSSQS.csproj" />
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS.V4\Paramore.Brighter.MessagingGateway.AWSSQS.V4.csproj" />
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter\Paramore.Brighter.csproj" />
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter.Transformers.AWS\Paramore.Brighter.Transformers.AWS.csproj" />
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter.Transformers.AWS.V4\Paramore.Brighter.Transformers.AWS.V4.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ THE SOFTWARE. */
using Paramore.Brighter;
using Paramore.Brighter.Extensions.DependencyInjection;
using Paramore.Brighter.MessagingGateway.AWSSQS;
using Paramore.Brighter.MessagingGateway.AWSSQS.V4;
using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection;
using Paramore.Brighter.ServiceActivator.Extensions.Hosting;
using Paramore.Brighter.Transformers.AWS.V4;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter.Extensions.DependencyInjection\Paramore.Brighter.Extensions.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter.Transformers.AWS\Paramore.Brighter.Transformers.AWS.csproj" />
<ProjectReference Include="..\..\..\..\..\src\Paramore.Brighter.Transformers.AWS.V4\Paramore.Brighter.Transformers.AWS.V4.csproj" />
<ProjectReference Include="..\Greetings\Greetings.csproj" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ THE SOFTWARE. */
using Paramore.Brighter;
using Paramore.Brighter.Extensions.DependencyInjection;
using Paramore.Brighter.MessagingGateway.AWSSQS;
using Paramore.Brighter.MessagingGateway.AWSSQS.V4;
using Paramore.Brighter.Transformers.AWS;
using Paramore.Brighter.Transformers.AWS.V4;
using Paramore.Brighter.Transforms.Storage;
using Serilog;
using Serilog.Extensions.Logging;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS\Paramore.Brighter.MessagingGateway.AWSSQS.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS.V4\Paramore.Brighter.MessagingGateway.AWSSQS.V4.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.ServiceActivator.Extensions.Hosting\Paramore.Brighter.ServiceActivator.Extensions.Hosting.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection\Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.Transformers.JustSaying\Paramore.Brighter.Transformers.JustSaying.csproj" />
Expand Down
1 change: 1 addition & 0 deletions samples/Transforms/JustSaying/BrighterSide/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Paramore.Brighter.Extensions.DependencyInjection;
using Paramore.Brighter.JsonConverters;
using Paramore.Brighter.MessagingGateway.AWSSQS;
using Paramore.Brighter.MessagingGateway.AWSSQS.V4;
using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection;
using Paramore.Brighter.ServiceActivator.Extensions.Hosting;
using Paramore.Brighter.Transformers.JustSaying;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS\Paramore.Brighter.MessagingGateway.AWSSQS.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.MessagingGateway.AWSSQS.V4\Paramore.Brighter.MessagingGateway.AWSSQS.V4.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.ServiceActivator.Extensions.Hosting\Paramore.Brighter.ServiceActivator.Extensions.Hosting.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection\Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\..\src\Paramore.Brighter.Transformers.MassTransit\Paramore.Brighter.Transformers.MassTransit.csproj" />
Expand Down
1 change: 1 addition & 0 deletions samples/Transforms/MassTransit/MBrigtherSide/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Paramore.Brighter.Extensions.DependencyInjection;
using Paramore.Brighter.JsonConverters;
using Paramore.Brighter.MessagingGateway.AWSSQS;
using Paramore.Brighter.MessagingGateway.AWSSQS.V4;
using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection;
using Paramore.Brighter.ServiceActivator.Extensions.Hosting;
using Paramore.Brighter.Transformers.MassTransit;
Expand Down
6 changes: 6 additions & 0 deletions specs/002-performance-testing/.currenttask
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Phase: 1 - Foundation
Task: 1.10 - Phase 1 Verification
Status: Ready to Verify
Previous Tasks: 1.1-1.9 All Implementation and Documentation (COMPLETED)
Next Action: docker compose -f docker-compose-rmq.yaml up -d && dotnet test tests/Paramore.Brighter.MemoryLeak.Tests/ --filter "Speed=Quick"
Docker Files Created: README.md and docker-compose.yml in test directory
75 changes: 75 additions & 0 deletions specs/002-performance-testing/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Performance Testing - Memory Leak Detection

This specification implements comprehensive memory leak testing infrastructure for Brighter as documented in [ADR-0036: Memory Leak Testing Infrastructure](../../docs/adr/0036-memory-leak-tests.md).

## Overview

We're building a two-tier memory leak testing strategy:
- **Quick Tests** (5-10 min): Run on every PR to catch obvious leaks early
- **Soak Tests** (30-60 min): Run nightly to detect gradual memory accumulation

## Goals

1. **Early Detection**: Catch memory leaks during PR review, not in production
2. **Systematic Verification**: Ensure handlers, DbContexts, and connections are properly disposed
3. **Confidence in Releases**: Prove memory stability under sustained load
4. **Diagnostic Capabilities**: Provide actionable insights when leaks occur

## Architecture

- **Tooling**: JetBrains dotMemory Unit for memory assertions
- **Test Infrastructure**: WebApplicationFactory for in-process API testing
- **Target Samples**: WebAPI_EFCore (GreetingsWeb API + SalutationAnalytics consumer)
- **CI Integration**: New jobs in GitHub Actions workflows

## Test Coverage

### Quick Tests (PR runs)
- Handler lifecycle verification
- DbContext disposal checks
- CommandProcessor memory behavior
- Message producer connection management
- Consumer handler disposal

### Soak Tests (Nightly runs)
- API under sustained load (30 min, 10k+ requests)
- Continuous message consumption (30 min, 10k+ messages)
- Outbox sweeper stability over time

## Memory Thresholds

**Quick Tests:**
- Handler instances: 0 after GC (strict)
- DbContext instances: 0 after GC (strict)
- Memory growth per 1000 commands: < 5MB
- Memory growth per 500 requests: < 10MB
- Connection objects: < 50

**Soak Tests:**
- Total growth over 30 minutes: < 50MB
- Growth per request: < 1KB average
- Consumer growth after 10k messages: < 100MB
- No unbounded linear growth

## Implementation Status

Current phase: **Phase 1 - Foundation**

See [plan.md](./plan.md) for detailed task breakdown and progress tracking.

## Related Documents

- [ADR-0036: Memory Leak Testing Infrastructure](../../docs/adr/0036-memory-leak-tests.md)
- [Implementation Plan](./plan.md)
- [Current Task](./.currenttask)

## Quick Start

```bash
# Run quick tests locally (requires RabbitMQ)
docker run -d -p 5672:5672 brightercommand/rabbitmq:3.13-management-delay
dotnet test --filter "Category=MemoryLeak&Speed=Quick"

# Run soak tests (long-running)
dotnet test --filter "Category=MemoryLeak&Speed=Soak"
```
Loading
Loading