From c9455bcc02007f82d52ccb561918bab08fb17995 Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Fri, 27 Feb 2026 13:47:11 +0800 Subject: [PATCH 1/4] Update package --- src/Directory.Packages.props | 2 +- .../ThroughputCollector.cs | 28 ++----------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index cda0df6473..f1b89a64a9 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -60,7 +60,7 @@ - + diff --git a/src/Particular.LicensingComponent/ThroughputCollector.cs b/src/Particular.LicensingComponent/ThroughputCollector.cs index 958de9a6c1..eca18b5e17 100644 --- a/src/Particular.LicensingComponent/ThroughputCollector.cs +++ b/src/Particular.LicensingComponent/ThroughputCollector.cs @@ -6,6 +6,7 @@ using AuditThroughput; using Contracts; using MonitoringThroughput; +using Particular.LicensingComponent.Report.Utility; using Persistence; using Report; using ServiceControl.Transports.BrokerThroughput; @@ -112,9 +113,8 @@ async Task GetReportGenerationStateForNonBroker(Cancellat public async Task GenerateThroughputReport(string spVersion, DateTime? reportEndDate, CancellationToken cancellationToken) { - (string Mask, string Replacement)[] masks = []; var reportMasks = await dataStore.GetReportMasks(cancellationToken); - CreateMasks(reportMasks.ToArray()); + var masker = new Masker([.. reportMasks]); var queueThroughputs = new List(); List ignoredQueueNames = []; @@ -126,7 +126,7 @@ public async Task GenerateThroughputReport(string spVersion, DateT //get all data that we have, including daily values var queueThroughput = new QueueThroughput { - QueueName = Mask(endpointData.Name), + QueueName = masker.Mask(endpointData.Name), UserIndicator = endpointData.UserIndicator, EndpointIndicators = endpointData.EndpointIndicators ?? [], NoDataOrSendOnly = endpointData.ThroughputData.Sum() == 0, @@ -189,28 +189,6 @@ public async Task GenerateThroughputReport(string spVersion, DateT var throughputReport = new SignedReport { ReportData = report, Signature = Signature.SignReport(report) }; return throughputReport; - - void CreateMasks(string[] wordsToMask) - { - var number = 0; - masks = wordsToMask - .Select(mask => - { - number++; - return (mask, $"REDACTED{number}"); - }) - .ToArray(); - } - - string Mask(string stringToMask) - { - foreach (var (mask, replacement) in masks) - { - stringToMask = stringToMask.Replace(mask, replacement, StringComparison.OrdinalIgnoreCase); - } - - return stringToMask; - } } async IAsyncEnumerable GetDistinctEndpointData([EnumeratorCancellation] CancellationToken cancellationToken) From 72ff6504899289de974e7b45c21ca1f5f107804f Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Fri, 27 Feb 2026 13:49:28 +0800 Subject: [PATCH 2/4] Calculate name hash for queues --- src/Particular.LicensingComponent/ThroughputCollector.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Particular.LicensingComponent/ThroughputCollector.cs b/src/Particular.LicensingComponent/ThroughputCollector.cs index eca18b5e17..4e18741612 100644 --- a/src/Particular.LicensingComponent/ThroughputCollector.cs +++ b/src/Particular.LicensingComponent/ThroughputCollector.cs @@ -126,6 +126,7 @@ public async Task GenerateThroughputReport(string spVersion, DateT //get all data that we have, including daily values var queueThroughput = new QueueThroughput { + NameHash = OneWayHasher.CalculateOneWayHash(endpointData.Name), QueueName = masker.Mask(endpointData.Name), UserIndicator = endpointData.UserIndicator, EndpointIndicators = endpointData.EndpointIndicators ?? [], From 15d17a9c0f39e9a8a03b03326085cfa93e606624 Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Fri, 27 Feb 2026 14:45:01 +0800 Subject: [PATCH 3/4] Approve new usage report property --- ...oughput_Tests.Should_generate_correct_report.approved.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt b/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt index 4357071e8e..4393c717b2 100644 --- a/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt +++ b/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt @@ -12,6 +12,7 @@ "Queues": [ { "QueueName": "REDACTED1", + "NameHash": "FAD4132E2E84D00CFDCF59DEE29B4353D5AFD88C2268113B63E10F8562F0415D", "Throughput": 65, "EndpointIndicators": [ "KnownEndpoint" @@ -41,6 +42,7 @@ }, { "QueueName": "Endpoint2", + "NameHash": "CC025A7DAEDE6B7354219CD6CBE69F6CC20D9A4E50AE4697D0339D83F1916B0B", "Throughput": 65, "EndpointIndicators": [ "KnownEndpoint" @@ -70,6 +72,7 @@ }, { "QueueName": "Endpoint3", + "NameHash": "41F376A830F79D28A6C4AB64BFBAB49E3460266F2EF832D5D323A3D15D332935", "Throughput": 57, "EndpointIndicators": [ "KnownEndpoint" @@ -108,6 +111,7 @@ }, { "QueueName": "Endpoint4", + "NameHash": "F3B76C9479C36F3759A00E4A6C899A60B310349888FC36D84C07D9EC14BC3F2A", "Throughput": 47, "EndpointIndicators": [], "UserIndicator": "PlannedToDecommission", @@ -127,6 +131,7 @@ }, { "QueueName": "Endpoint5", + "NameHash": "4843958694AE6C4DE89E992E0C3381120824212D35506B021F062F9D263FFB9B", "Throughput": 15, "EndpointIndicators": [], "UserIndicator": "NotNServiceBusEndpoint", From 24166fe3224128898ac29758dd69c41b4aba5daf Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Tue, 3 Mar 2026 13:22:35 +0800 Subject: [PATCH 4/4] Use SHA256 --- src/Directory.Packages.props | 2 +- ...t_Tests.Should_generate_correct_report.approved.txt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index f1b89a64a9..b06e799467 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -60,7 +60,7 @@ - + diff --git a/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt b/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt index 4393c717b2..df4c5ac553 100644 --- a/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt +++ b/src/Particular.LicensingComponent.UnitTests/ApprovalFiles/ThroughputCollector_Report_Throughput_Tests.Should_generate_correct_report.approved.txt @@ -12,7 +12,7 @@ "Queues": [ { "QueueName": "REDACTED1", - "NameHash": "FAD4132E2E84D00CFDCF59DEE29B4353D5AFD88C2268113B63E10F8562F0415D", + "NameHash": "66DB6BA4857B08195A497D6FA4BFAAC140B35A0B5925C0845E37AA39DB1A0050", "Throughput": 65, "EndpointIndicators": [ "KnownEndpoint" @@ -42,7 +42,7 @@ }, { "QueueName": "Endpoint2", - "NameHash": "CC025A7DAEDE6B7354219CD6CBE69F6CC20D9A4E50AE4697D0339D83F1916B0B", + "NameHash": "936C4C33C71B498D9C60C90F78138AF1ECF3C9F72089F054563E125C94B0A224", "Throughput": 65, "EndpointIndicators": [ "KnownEndpoint" @@ -72,7 +72,7 @@ }, { "QueueName": "Endpoint3", - "NameHash": "41F376A830F79D28A6C4AB64BFBAB49E3460266F2EF832D5D323A3D15D332935", + "NameHash": "8035D54FFAF0523F509245E1556BB1BD18C37B76A2D7DB4C928024B348A13132", "Throughput": 57, "EndpointIndicators": [ "KnownEndpoint" @@ -111,7 +111,7 @@ }, { "QueueName": "Endpoint4", - "NameHash": "F3B76C9479C36F3759A00E4A6C899A60B310349888FC36D84C07D9EC14BC3F2A", + "NameHash": "BBF022C092922A8B3A63455FC7583EAF35840E66F01B73AF997EACDCA8ABCEA4", "Throughput": 47, "EndpointIndicators": [], "UserIndicator": "PlannedToDecommission", @@ -131,7 +131,7 @@ }, { "QueueName": "Endpoint5", - "NameHash": "4843958694AE6C4DE89E992E0C3381120824212D35506B021F062F9D263FFB9B", + "NameHash": "435D99844B95C6079607233709D2B6FA8F2EE5E67C187946F4BC476EBB8C9E42", "Throughput": 15, "EndpointIndicators": [], "UserIndicator": "NotNServiceBusEndpoint",