Skip to content
Draft
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
8 changes: 4 additions & 4 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
<PackageVersion Include="Mindscape.Raygun4Net.NetCore" Version="11.2.5" />
<PackageVersion Include="NLog.Extensions.Logging" Version="6.1.2" />
<PackageVersion Include="NServiceBus" Version="10.1.2" />
<PackageVersion Include="NServiceBus" Version="10.1.3" />
<PackageVersion Include="NServiceBus.AcceptanceTesting" Version="10.1.2" />
<PackageVersion Include="NServiceBus.AmazonSQS" Version="9.0.0" />
<PackageVersion Include="NServiceBus.CustomChecks" Version="6.0.0" />
Expand All @@ -47,12 +47,12 @@
<PackageVersion Include="NServiceBus.RabbitMQ" Version="11.2.0" />
<PackageVersion Include="NServiceBus.SagaAudit" Version="6.0.0" />
<PackageVersion Include="NServiceBus.Testing" Version="10.0.1" />
<PackageVersion Include="NServiceBus.Transport.AzureServiceBus" Version="6.2.1" />
<PackageVersion Include="NServiceBus.Transport.AzureServiceBus" Version="6.3.0-alpha.1" />
<PackageVersion Include="NServiceBus.Transport.AzureStorageQueues" Version="14.0.0" />
<PackageVersion Include="NServiceBus.Transport.Msmq.Sources" Version="4.0.0" />
<PackageVersion Include="NServiceBus.Transport.PostgreSql" Version="9.0.0" />
<PackageVersion Include="NServiceBus.Transport.SqlServer" Version="9.0.0" />
<PackageVersion Include="NServiceBus.Transport.IBMMQ" Version="1.0.0"/>
<PackageVersion Include="NServiceBus.Transport.IBMMQ" Version="1.0.0" />
<PackageVersion Include="NuGet.Versioning" Version="7.3.0" />
<PackageVersion Include="NUnit" Version="4.5.1" />
<PackageVersion Include="NUnit.Analyzers" Version="4.12.0" />
Expand Down Expand Up @@ -94,4 +94,4 @@
<GlobalPackageReference Include="Microsoft.Build.CopyOnWrite" Version="1.0.334" />
<GlobalPackageReference Include="Particular.Packaging" Version="4.5.0" />
</ItemGroup>
</Project>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
namespace ServiceControl.UnitTests.Operations;

using System.Collections.Generic;
using NServiceBus.Faults;
using NUnit.Framework;
using ServiceControl.Contracts.Operations;
using ServiceControl.Infrastructure;

[TestFixture]
public class EndpointDetailsParserTests
{
[Test]
public void Receiving_endpoint_should_use_failed_queue_machine_when_host_is_missing()
{
var headers = new Dictionary<string, string>
{
{ FaultsHeaderKeys.FailedQ, "Sales@backend-01" }
};

var endpoint = EndpointDetailsParser.ReceivingEndpoint(headers);

Assert.Multiple(() =>
{
Assert.That(endpoint, Is.Not.Null);
Assert.That(endpoint.Name, Is.EqualTo("Sales"));
Assert.That(endpoint.Host, Is.EqualTo("backend-01"));
Assert.That(endpoint.HostId, Is.EqualTo(DeterministicGuid.MakeId("Sales", "backend-01")));
});
}

[Test]
public void Receiving_endpoint_should_use_unknown_host_when_failed_queue_is_used_to_infer_endpoint_name()
{
var headers = new Dictionary<string, string>
{
{ FaultsHeaderKeys.FailedQ, "Billing" }
};

var endpoint = EndpointDetailsParser.ReceivingEndpoint(headers);

Assert.Multiple(() =>
{
Assert.That(endpoint, Is.Not.Null);
Assert.That(endpoint.Name, Is.EqualTo("Billing"));
Assert.That(endpoint.Host, Is.EqualTo("unknown"));
Assert.That(endpoint.HostId, Is.EqualTo(DeterministicGuid.MakeId("Billing", "unknown")));
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
[TestFixture]
public class ExceptionTypeAndStackTraceFailureClassifierTest
{
const string noStackTraceClassification = "exceptionType: No stacktrace available";

[Test]
public void Failure_Without_ExceptionDetails_should_not_group()
{
Expand All @@ -23,7 +25,7 @@ public void Empty_stack_trace_should_group_by_exception_type()
var failureWithEmptyStackTrace = CreateFailureDetailsWithStackTrace(string.Empty);
var classification = classifier.ClassifyFailure(failureWithEmptyStackTrace);

Assert.That(classification, Is.EqualTo("exceptionType: 0"));
Assert.That(classification, Is.EqualTo(noStackTraceClassification));
}

[Test]
Expand All @@ -33,7 +35,7 @@ public void Null_stack_trace_should_group_by_exception_type()
var failureWithNullStackTrace = CreateFailureDetailsWithStackTrace(null);
var classification = classifier.ClassifyFailure(failureWithNullStackTrace);

Assert.That(classification, Is.EqualTo("exceptionType: 0"));
Assert.That(classification, Is.EqualTo(noStackTraceClassification));
}

[Test]
Expand All @@ -43,7 +45,7 @@ public void Non_standard_stack_trace_format_should_group_by_exception_type()
var failureWithNonStandardStackTrace = CreateFailureDetailsWithStackTrace("something other than a normal stack trace");
var classification = classifier.ClassifyFailure(failureWithNonStandardStackTrace);

Assert.That(classification, Is.EqualTo("exceptionType: 0"));
Assert.That(classification, Is.EqualTo(noStackTraceClassification));
}

[Test]
Expand All @@ -53,7 +55,7 @@ public void Null_message_should_group_by_exception_type()
var failureWithNullMessage = CreateFailureDetailsWithMessage(null);
var classification = classifier.ClassifyFailure(failureWithNullMessage);

Assert.That(classification, Is.EqualTo("exceptionType: 0"));
Assert.That(classification, Is.EqualTo(noStackTraceClassification));
}

[Test]
Expand All @@ -63,7 +65,7 @@ public void Empty_message_should_group_by_exception_type()
var failureWithEmptyMessage = CreateFailureDetailsWithMessage(string.Empty);
var classification = classifier.ClassifyFailure(failureWithEmptyMessage);

Assert.That(classification, Is.EqualTo("exceptionType: 0"));
Assert.That(classification, Is.EqualTo(noStackTraceClassification));
}

[Test]
Expand All @@ -73,7 +75,7 @@ public void Whitespace_message_should_group_by_exception_type()
var failureWithWhitespaceMessage = CreateFailureDetailsWithMessage(" ");
var classification = classifier.ClassifyFailure(failureWithWhitespaceMessage);

Assert.That(classification, Is.EqualTo("exceptionType: 0"));
Assert.That(classification, Is.EqualTo(noStackTraceClassification));
}

[Test]
Expand Down Expand Up @@ -154,4 +156,4 @@ static ClassifiableMessageDetails CreateFailureDetailsWithMessage(string message
return new ClassifiableMessageDetails(null, failure, null);
}
}
}
}
9 changes: 7 additions & 2 deletions src/ServiceControl/Operations/EndpointDetailsParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,17 @@ public static EndpointDetails ReceivingEndpoint(IReadOnlyDictionary<string, stri

if (string.IsNullOrEmpty(endpoint.Host))
{
endpoint.Host = queueAndMachinename.Machine;
endpoint.Host = queueAndMachinename.Machine ?? "unknown";
}

// If we've been now able to get the endpoint details, return the new info.
if (!string.IsNullOrEmpty(endpoint.Name) && !string.IsNullOrEmpty(endpoint.Host))
if (!string.IsNullOrEmpty(endpoint.Name))
{
if (endpoint.HostId == Guid.Empty)
{
endpoint.HostId = DeterministicGuid.MakeId(endpoint.Name, endpoint.Host);
}

return endpoint;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public string ClassifyFailure(ClassifiableMessageDetails failure)
// We need to remove the message in order to make sure the stack trace parser does not get into catastrophic backtracking mode.
exceptionStackTrace = exceptionStackTrace.Replace(exception.Message, string.Empty);
}

try
{
var firstStackTraceFrame = StackTraceParser.Parse(exceptionStackTrace, (frame, type, method, parameterList, parameters, file, line) => new StackFrame
Expand All @@ -54,10 +55,7 @@ public string ClassifyFailure(ClassifiableMessageDetails failure)
return GetNonStandardClassification(exception.ExceptionType);
}

static string GetNonStandardClassification(string exceptionType)
{
return exceptionType + ": 0";
}
static string GetNonStandardClassification(string exceptionType) => exceptionType + ": No stacktrace available";

public const string Id = "Exception Type and Stack Trace";

Expand Down
Loading