14207973
14207973

Reputation: 599

Get message counts across all Service Bus queues and topics

I have an Azure subscription with many Service Bus queues and topics. Is there an easy way of checking the active and deadletter message counts across all queues and topic subscriptions, without clicking through them one by one?

Upvotes: 1

Views: 503

Answers (1)

14207973
14207973

Reputation: 599

This can be achieved by running a PowerShell script in the Azure Cloud Shell.

If all the queues and topics you're interesting in belong to one Service Bus namespace, you can use:

$resourceGroupName = <enter your resource group name here>
$namespaceName = <enter your namespace name here>
$queueMessageCounts = @()
$topicMessageCounts = @()

$queues = Get-AzServiceBusQueue -ResourceGroup $resourceGroupName -NamespaceName $namespaceName
foreach ($queue in $queues) {
  $queueMessageCounts += [PSCustomObject]@{
    Queue = $queue.Name
    ActiveMessageCount = $queue.CountDetailActiveMessageCount             
    DeadLetterMessageCount = $queue.CountDetailDeadLetterMessageCount
  }
}

$queueMessageCounts | Format-Table

$topics = Get-AzServiceBusTopic -ResourceGroup $resourceGroupName -NamespaceName $namespaceName
foreach ($topic in $topics) {
  $subscriptions = Get-AzServiceBusSubscription -ResourceGroup $resourceGroupName -NamespaceName $namespaceName -TopicName $topic.Name
  foreach ($subscription in $subscriptions) {
    $topicMessageCounts += [PSCustomObject]@{
      Topic = $topic.Name
      Subscription = $subscription.Name
      ActiveMessageCount = $subscription.CountDetailActiveMessageCount             
      DeadLetterMessageCount = $subscription.CountDetailDeadLetterMessageCount
    }
  }
}

$topicMessageCounts | Format-Table

If you want to get everything in your subscription, use:

$queueMessageCounts = @()
$topicMessageCounts = @()

$namespaces = Get-AzServiceBusNamespace
foreach ($namespace in $namespaces) {
  
  $queues = Get-AzServiceBusQueue -ResourceGroup $namespace.ResourceGroupName -NamespaceName $namespace.Name
  foreach ($queue in $queues) {
    $queueMessageCounts += [PSCustomObject]@{
      Namespace = $namespace.Name
      Queue = $queue.Name
      ActiveMessageCount = $queue.CountDetailActiveMessageCount             
      DeadLetterMessageCount = $queue.CountDetailDeadLetterMessageCount
    }
  }
  
  $topics = Get-AzServiceBusTopic -ResourceGroup $namespace.ResourceGroupName -NamespaceName $namespace.Name
  foreach ($topic in $topics) {
    $subscriptions = Get-AzServiceBusSubscription -ResourceGroup $namespace.ResourceGroupName -NamespaceName $namespace.Name -TopicName $topic.Name
    foreach ($subscription in $subscriptions) {
      $topicMessageCounts += [PSCustomObject]@{
        Namespace = $namespace.Name
        Topic = $topic.Name
        Subscription = $subscription.Name
        ActiveMessageCount = $subscription.CountDetailActiveMessageCount             
        DeadLetterMessageCount = $subscription.CountDetailDeadLetterMessageCount
      }
    }
  }
}

$queueMessageCounts | Format-Table
$topicMessageCounts | Format-Table

You can apply PowerShell commands to sort or filter the results; for example:

$queueMessageCounts | Where-Object {$_.DeadLetterMessageCount -gt 0} | Sort-Object -Property DeadLetterMessageCount -Descending | Format-Table
$topicMessageCounts | Where-Object {$_.DeadLetterMessageCount -gt 0} | Sort-Object -Property DeadLetterMessageCount -Descending | Format-Table

Upvotes: 1

Related Questions