diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 9b32866275..93aff6f7d0 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -34,7 +34,7 @@
-
+
@@ -47,7 +47,7 @@
-
+
@@ -92,4 +92,4 @@
-
+
\ No newline at end of file
diff --git a/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs b/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs
index 90ba3b9f99..2b397516d9 100644
--- a/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs
+++ b/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs
@@ -37,6 +37,9 @@ public static IEnumerable SupportedConnectionStrings
//EnablePartitioning
yield return new TestCaseData("Endpoint=sb://some.endpoint.name/;EnablePartitioning=True",
new ConnectionSettings(new SharedAccessSignatureAuthentication("Endpoint=sb://some.endpoint.name/;EnablePartitioning=True"), enablePartitioning: true));
+ //HierarchyNamespace
+ yield return new TestCaseData("Endpoint=sb://some.endpoint.name/;HierarchyNamespace=my-hierarchy",
+ new ConnectionSettings(new SharedAccessSignatureAuthentication("Endpoint=sb://some.endpoint.name/;HierarchyNamespace=my-hierarchy"), hierarchyNamespace: "my-hierarchy"));
}
}
@@ -86,4 +89,4 @@ public void VerifyNotSupported(string connectionString)
Assert.Throws(() => ConnectionStringParser.Parse(connectionString));
}
}
-}
+}
\ No newline at end of file
diff --git a/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs b/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs
index 5a600a385f..4082fdcc0c 100644
--- a/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs
+++ b/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs
@@ -42,6 +42,10 @@ protected override AzureServiceBusTransport CreateTransport(TransportSettings tr
var transport = connectionSettings.AuthenticationMethod.CreateTransportDefinition(connectionSettings, selectedTopology);
transport.UseWebSockets = connectionSettings.UseWebSockets;
transport.EnablePartitioning = connectionSettings.EnablePartitioning;
+ if (!string.IsNullOrWhiteSpace(connectionSettings.HierarchyNamespace))
+ {
+ transport.HierarchyNamespaceOptions = new HierarchyNamespaceOptions { HierarchyNamespace = connectionSettings.HierarchyNamespace };
+ }
transport.TransportTransactionMode = transport.GetSupportedTransactionModes().Contains(preferredTransactionMode) ? preferredTransactionMode : TransportTransactionMode.ReceiveOnly;
@@ -67,7 +71,8 @@ protected override void AddTransportForPrimaryCore(IServiceCollection services,
{
TopicToPublishTo = connectionSettings.TopicName,
TopicToSubscribeOn = connectionSettings.TopicName,
- EventsToMigrateMap = [
+ EventsToMigrateMap =
+ [
"ServiceControl.Contracts.CustomCheckFailed",
"ServiceControl.Contracts.CustomCheckSucceeded",
"ServiceControl.Contracts.HeartbeatRestored",
diff --git a/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs b/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs
index 202d15b17b..47a36a4835 100644
--- a/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs
+++ b/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs
@@ -8,13 +8,15 @@ public ConnectionSettings(AuthenticationMethod authenticationSettings,
string topicName = default,
bool useWebSockets = default,
bool enablePartitioning = default,
- TimeSpan? queryDelayInterval = default)
+ TimeSpan? queryDelayInterval = default,
+ string hierarchyNamespace = default)
{
AuthenticationMethod = authenticationSettings;
TopicName = topicName;
UseWebSockets = useWebSockets;
EnablePartitioning = enablePartitioning;
QueryDelayInterval = queryDelayInterval;
+ HierarchyNamespace = hierarchyNamespace;
}
public AuthenticationMethod AuthenticationMethod { get; }
@@ -26,5 +28,7 @@ public ConnectionSettings(AuthenticationMethod authenticationSettings,
public bool UseWebSockets { get; }
public bool EnablePartitioning { get; }
+
+ public string HierarchyNamespace { get; }
}
}
\ No newline at end of file
diff --git a/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs b/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs
index 404a1da13b..b4f8386d99 100644
--- a/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs
+++ b/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs
@@ -35,6 +35,7 @@ public static ConnectionSettings Parse(string connectionString)
{
throw new Exception($"Can't parse {value} as a valid query delay interval.");
}
+
queryDelayInterval = TimeSpan.FromMilliseconds(delayInterval);
}
@@ -72,6 +73,12 @@ public static ConnectionSettings Parse(string connectionString)
}
}
+ string hierarchyNamespace = null;
+ if (builder.TryGetValue("HierarchyNamespace", out var hierarchyNamespaceString))
+ {
+ hierarchyNamespace = (string)hierarchyNamespaceString;
+ }
+
var shouldUseManagedIdentity = builder.TryGetValue("Authentication", out var authType) && (string)authType == "Managed Identity";
if (shouldUseManagedIdentity)
@@ -79,11 +86,12 @@ public static ConnectionSettings Parse(string connectionString)
var fullyQualifiedNamespace = endpoint.ToString().TrimEnd('/').Replace("sb://", "");
return new ConnectionSettings(
- new TokenCredentialAuthentication(fullyQualifiedNamespace, clientIdString),
- topicNameString,
- useWebSockets,
- enablePartitioning,
- queryDelayInterval);
+ new TokenCredentialAuthentication(fullyQualifiedNamespace, clientIdString),
+ topicNameString,
+ useWebSockets,
+ enablePartitioning,
+ queryDelayInterval,
+ hierarchyNamespace);
}
if (clientIdString != null)
@@ -96,7 +104,8 @@ public static ConnectionSettings Parse(string connectionString)
topicNameString,
useWebSockets,
enablePartitioning,
- queryDelayInterval);
+ queryDelayInterval,
+ hierarchyNamespace);
}
}
-}
+}
\ No newline at end of file
diff --git a/src/ServiceControl.Transports.ASBS/transport.manifest b/src/ServiceControl.Transports.ASBS/transport.manifest
index 34b78cd534..65d8e073fa 100644
--- a/src/ServiceControl.Transports.ASBS/transport.manifest
+++ b/src/ServiceControl.Transports.ASBS/transport.manifest
@@ -5,7 +5,7 @@
"DisplayName": "Azure Service Bus",
"AssemblyName": "ServiceControl.Transports.ASBS",
"TypeName": "ServiceControl.Transports.ASBS.ASBSTransportCustomization, ServiceControl.Transports.ASBS",
- "SampleConnectionString": "Endpoint=sb://[namespace].servicebus.windows.net; SharedSecretIssuer=;SharedSecretValue=;QueueLengthQueryDelayInterval=;TopicName=;EnablePartitioning=",
+ "SampleConnectionString": "Endpoint=sb://[namespace].servicebus.windows.net; SharedSecretIssuer=;SharedSecretValue=;QueueLengthQueryDelayInterval=;TopicName=;EnablePartitioning=;HierarchyNamespace=",
"AvailableInSCMU": true,
"Aliases": [
"ServiceControl.Transports.AzureServiceBus.AzureServiceBusTransport, ServiceControl.Transports.AzureServiceBus"