Skip to content

Commit 1494bf9

Browse files
Merge pull request #860 from Particular/use-existing-classifiers
Use existing classifiers
2 parents 4c6bb54 + 6361d20 commit 1494bf9

File tree

9 files changed

+59
-57
lines changed

9 files changed

+59
-57
lines changed

src/ServiceControl.UnitTests/Migrations/1.27/SplitFailedMessageDocumentsMigrationTests.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using ServiceControl.Contracts.Operations;
1313
using ServiceControl.Infrastructure;
1414
using ServiceControl.MessageFailures;
15+
using ServiceControl.Recoverability;
1516
using FailedMessage = ServiceControl.MessageFailures.FailedMessage;
1617

1718
[TestFixture]
@@ -287,8 +288,10 @@ public void Split_failuremessages_should_have_failure_groups()
287288

288289
session.SaveChanges();
289290
}
291+
AddClassifier(new ExceptionTypeAndStackTraceFailureClassifier());
292+
AddClassifier(new MessageTypeFailureClassifier());
290293

291-
var attempts = scenarios.SelectMany(s => s.ProcessingAttempts.Select(pa => new { s.OriginalFailedMessageStatus, pa.ExpectedUniqueMessageId })).ToList();
294+
var attempts = scenarios.SelectMany(s => s.ProcessingAttempts.Select(pa => new { s.OriginalFailedMessageStatus, pa.ExpectedUniqueMessageId, EndpointName = pa.Attempt.Headers.ProcessingEndpointName() })).ToList();
292295

293296
// Act
294297
var migration = CreateMigration();
@@ -311,11 +314,13 @@ public void Split_failuremessages_should_have_failure_groups()
311314

312315
Assert.IsNotNull(attempt, "Could not find attempt for a failed message");
313316

314-
var splitGroup = SplitFailedMessageDocumentsMigration.CreateSplitFailureGroup(failedMessage.ProcessingAttempts.Last(), ProcessingAttemptInfo.MessageType, attempt.OriginalFailedMessageStatus);
317+
Assert.AreEqual(2, failedMessage.FailureGroups.Count, "A FailedMessage does not have all expected Failure Groups");
315318

316-
Assert.AreEqual(1, failedMessage.FailureGroups.Count, "A FailedMessage does not have all expected Failure Groups");
317-
Assert.IsTrue(failedMessage.FailureGroups.Exists(g => g.Id == splitGroup.Id), "A FailedMessage does not have the expected Split Failure Group");
318-
Assert.IsFalse(failedMessage.FailureGroups.Exists(g => g.Id == "GroupId"), "A FailedMessage should not have the Fake Failure Group");
319+
var expectedPrefix = string.Format(SplitFailedMessageDocumentsMigration.GroupPrefixFormat, attempt.EndpointName);
320+
321+
var nonMatchingGroups = failedMessage.FailureGroups.Where(x => x.Title.StartsWith(expectedPrefix) == false).ToArray();
322+
323+
Assert.IsFalse(nonMatchingGroups.Any(), $"All groups should start with the prefix: {expectedPrefix}");
319324
}
320325
}
321326

@@ -403,7 +408,13 @@ public ProcessingAttemptInfo(PreSplitScenario scenario, string failedQ, bool isR
403408
ReplyToAddress = scenario.ReplyToAddress,
404409
FailureDetails = new FailureDetails
405410
{
406-
AddressOfFailingEndpoint = failedQ
411+
AddressOfFailingEndpoint = failedQ,
412+
Exception = new ExceptionDetails
413+
{
414+
ExceptionType = "SomeExceptionType",
415+
Message = "An Exception Message",
416+
Source = "TestScenario"
417+
}
407418
},
408419
Headers = new Dictionary<string, string>
409420
{
@@ -437,13 +448,20 @@ public ProcessingAttemptInfo(PreSplitScenario scenario, string failedQ, string e
437448
}
438449
}
439450

440-
private SplitFailedMessageDocumentsMigration CreateMigration() => new SplitFailedMessageDocumentsMigration();
451+
private SplitFailedMessageDocumentsMigration CreateMigration() => new SplitFailedMessageDocumentsMigration(failureClassifiers.ToArray());
441452

442453
private EmbeddableDocumentStore documentStore;
454+
private IList<IFailureClassifier> failureClassifiers;
455+
456+
void AddClassifier(IFailureClassifier classifier)
457+
{
458+
failureClassifiers.Add(classifier);
459+
}
443460

444461
[SetUp]
445462
public void Setup()
446463
{
464+
failureClassifiers = new List<IFailureClassifier>();
447465
documentStore = InMemoryStoreBuilder.GetInMemoryStore();
448466
}
449467

src/ServiceControl/DbMigrations/1.27/SplitFailedMessageDocumentsMigration.cs

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111

1212
public class SplitFailedMessageDocumentsMigration : IMigration
1313
{
14+
private readonly IFailureClassifier[] classifiers;
15+
16+
public SplitFailedMessageDocumentsMigration(IFailureClassifier[] classifiers)
17+
{
18+
this.classifiers = classifiers;
19+
}
20+
1421
public string Apply(IDocumentStore store)
1522
{
1623
store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite;
@@ -97,10 +104,7 @@ private MigrationStats MigrateFromTemporaryCollection(FailedMessage originalFail
97104

98105
var messageType = GetMessageType(lastAttempt) ?? "Unknown Message Type";
99106

100-
failedMessage.FailureGroups = new List<FailedMessage.FailureGroup>
101-
{
102-
CreateSplitFailureGroup(lastAttempt, messageType, originalStatus)
103-
};
107+
failedMessage.FailureGroups = CreateFailureGroups(messageType, lastAttempt).ToList();
104108

105109
if (failedMessage.UniqueMessageId == originalFailedMessage.UniqueMessageId) return;
106110

@@ -117,6 +121,30 @@ private MigrationStats MigrateFromTemporaryCollection(FailedMessage originalFail
117121
return stats;
118122
}
119123

124+
private IEnumerable<FailedMessage.FailureGroup> CreateFailureGroups(string messageType, FailedMessage.ProcessingAttempt attempt)
125+
{
126+
var failureDetails = new ClassifiableMessageDetails(messageType, attempt.FailureDetails);
127+
128+
foreach (var classifier in classifiers)
129+
{
130+
var failureGroupTitle = classifier.ClassifyFailure(failureDetails);
131+
if (failureGroupTitle == null)
132+
{
133+
continue;
134+
}
135+
136+
var prefix = string.Format(GroupPrefixFormat, attempt.Headers.ProcessingEndpointName());
137+
138+
var fullTitle = $"{prefix}{failureGroupTitle}";
139+
yield return new FailedMessage.FailureGroup
140+
{
141+
Id = DeterministicGuid.MakeId(classifier.Name, fullTitle).ToString(),
142+
Title = fullTitle,
143+
Type = classifier.Name
144+
};
145+
}
146+
}
147+
120148
private static string GetMessageType(FailedMessage.ProcessingAttempt processingAttempt)
121149
{
122150
object messageType;
@@ -127,19 +155,6 @@ private static string GetMessageType(FailedMessage.ProcessingAttempt processingA
127155
return null;
128156
}
129157

130-
public static FailedMessage.FailureGroup CreateSplitFailureGroup(FailedMessage.ProcessingAttempt attempt, string messageType, FailedMessageStatus orignalStatus)
131-
{
132-
var classifier = new SplitFailedMessageClassifer();
133-
var classification = classifier.ClassifyFailure(messageType, orignalStatus, attempt);
134-
135-
return new FailedMessage.FailureGroup
136-
{
137-
Id = DeterministicGuid.MakeId(classifier.Name, classification).ToString(),
138-
Title = classification,
139-
Type = classifier.Name
140-
};
141-
}
142-
143158
class ProcessingAttemptRecord
144159
{
145160
public ProcessingAttemptRecord(FailedMessage.ProcessingAttempt attempt, int index)
@@ -181,5 +196,6 @@ struct MigrationStats
181196
public const int PageSize = 1024;
182197
public const string SplitFromUniqueMessageIdHeader = "CollapsedSubscribers.SplitFromUniqueMessageId";
183198
public const string OriginalStatusHeader = "CollapsedSubscribers.OriginalStatus";
199+
public const string GroupPrefixFormat = "Issue 842 - {0} - ";
184200
}
185201
}

src/ServiceControl/Recoverability/Grouping/ClassifyFailedMessageEnricher.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class ClassifyFailedMessageEnricher : IFailedMessageEnricher
1212

1313
public ClassifyFailedMessageEnricher(IEnumerable<IFailureClassifier> classifiers)
1414
{
15-
this.classifiers = classifiers.Where(c => c.ApplyToNewFailures).ToArray();
15+
this.classifiers = classifiers.ToArray();
1616
}
1717

1818
public IEnumerable<FailedMessage.FailureGroup> Enrich(string messageType, FailureDetails failureDetails)

src/ServiceControl/Recoverability/Grouping/FailedMessageClassification.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ protected override void Setup(FeatureConfigurationContext context)
1717
context.Container.ConfigureComponent<ExceptionTypeAndStackTraceFailureClassifier>(DependencyLifecycle.SingleInstance);
1818
context.Container.ConfigureComponent<MessageTypeFailureClassifier>(DependencyLifecycle.SingleInstance);
1919
context.Container.ConfigureComponent<ClassifyFailedMessageEnricher>(DependencyLifecycle.SingleInstance);
20-
context.Container.ConfigureComponent<SplitFailedMessageClassifer>(DependencyLifecycle.SingleInstance);
2120
}
2221

2322
class ReclassifyErrorsAtStartup : FeatureStartupTask

src/ServiceControl/Recoverability/Grouping/Groupers/ExceptionTypeAndStackTraceFailureClassifier.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ public string ClassifyFailure(ClassifiableMessageDetails failure)
2525
return GetNonStandardClassification(exception.ExceptionType);
2626
}
2727

28-
public bool ApplyToNewFailures => true;
29-
3028
static string GetNonStandardClassification(string exceptionType)
3129
{
3230
return exceptionType + ": 0";

src/ServiceControl/Recoverability/Grouping/Groupers/IFailureClassifier.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,5 @@ public interface IFailureClassifier
44
{
55
string Name { get; }
66
string ClassifyFailure(ClassifiableMessageDetails failureDetails);
7-
bool ApplyToNewFailures { get; }
87
}
98
}

src/ServiceControl/Recoverability/Grouping/Groupers/MessageTypeFailureClassifier.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,5 @@ public string ClassifyFailure(ClassifiableMessageDetails failureDetails)
99
{
1010
return failureDetails.MessageType;
1111
}
12-
13-
public bool ApplyToNewFailures => true;
1412
}
1513
}

src/ServiceControl/Recoverability/Grouping/Groupers/SplitFailedMessageClassifer.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/ServiceControl/ServiceControl.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,6 @@
389389
<Compile Include="MessageFailures\FailedMessageViewIndexNotifications.cs" />
390390
<Compile Include="MessageFailures\FailedMessagesFeature.cs" />
391391
<Compile Include="MessageFailures\Handlers\UnArchiveMessagesHandler.cs" />
392-
<Compile Include="Recoverability\Grouping\Groupers\SplitFailedMessageClassifer.cs" />
393392
<Compile Include="Recoverability\Grouping\IFailedMessageEnricher.cs" />
394393
<Compile Include="MessageFailures\Handlers\UnArchiveMessagesByRangeHandler.cs" />
395394
<Compile Include="MessageFailures\IHaveStatus.cs" />

0 commit comments

Comments
 (0)