Skip to content

Commit 0e633a6

Browse files
authored
Merge pull request #813 from NHSDigital/re-implement-retry-queue
Add retry queue metrics collection to collect_metrics
2 parents 959cf53 + 85ef7aa commit 0e633a6

File tree

6 files changed

+60
-9
lines changed

6 files changed

+60
-9
lines changed

infrastructure/modules/container-apps/alerts.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ resource "azurerm_monitor_scheduled_query_rules_alert_v2" "queue_length_high" {
6262
criteria {
6363
query = <<-KQL
6464
customMetrics
65-
| where name == "${each.key}"
65+
| where name == "queue_size_${each.key}"
6666
| extend environment = tostring(customDimensions.environment)
6767
| where environment == "${var.environment}"
6868
| extend value = toreal(value)

infrastructure/modules/container-apps/jobs.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ locals {
4646
collect_metrics = {
4747
cron_expression = "*/5 * * * *"
4848
environment_variables = {
49+
RETRY_QUEUE_NAME = "notifications-message-batch-retries"
4950
STATUS_UPDATES_QUEUE_NAME = "notifications-message-status-updates"
5051
ENVIRONMENT = var.environment
5152
}

manage_breast_screening/notifications/management/commands/collect_metrics.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@
1111
class Command(BaseCommand):
1212
def handle(self, *args, **options):
1313
try:
14-
queue = Queue.MessageStatusUpdates()
15-
Metrics().set_gauge_value(
16-
f"queue_size_{queue.queue_name}",
17-
"messages",
18-
"Queue length",
19-
queue.get_message_count(),
20-
)
14+
queues = [
15+
Queue.MessageStatusUpdates(),
16+
Queue.RetryMessageBatches(),
17+
]
18+
19+
for queue in queues:
20+
Metrics().set_gauge_value(
21+
f"queue_size_{queue.queue_name}",
22+
"messages",
23+
"Queue length",
24+
queue.get_message_count(),
25+
)
2126

2227
except Exception as e:
2328
logger.error(e, exc_info=True)

manage_breast_screening/notifications/services/queue.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,7 @@ def MessageStatusUpdates(cls):
6969
"STATUS_UPDATES_QUEUE_NAME", "notifications-message-status-updates"
7070
)
7171
)
72+
73+
@classmethod
74+
def RetryMessageBatches(cls):
75+
return cls(os.getenv("RETRY_QUEUE_NAME", "notifications-message-batch-retries"))

manage_breast_screening/notifications/tests/management/commands/test_collect_metrics.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,27 @@ def test_handle_sends_queue_lengths(self, mock_metrics_class, mock_queue):
1919
mock_status.queue_name = "status_queue"
2020
mock_status.get_message_count.return_value = 2
2121

22+
mock_retry = MagicMock()
23+
mock_retry.queue_name = "retry_queue"
24+
mock_retry.get_message_count.return_value = 5
25+
2226
mock_queue.MessageStatusUpdates.return_value = mock_status
27+
mock_queue.RetryMessageBatches.return_value = mock_retry
2328

2429
Command().handle()
2530

2631
metrics_instance = mock_metrics_class.return_value
2732

28-
metrics_instance.set_gauge_value.assert_called_once_with(
33+
assert metrics_instance.set_gauge_value.call_count == 2
34+
metrics_instance.set_gauge_value.assert_any_call(
2935
"queue_size_status_queue",
3036
"messages",
3137
"Queue length",
3238
2,
3339
)
40+
metrics_instance.set_gauge_value.assert_any_call(
41+
"queue_size_retry_queue",
42+
"messages",
43+
"Queue length",
44+
5,
45+
)

manage_breast_screening/notifications/tests/services/test_queue.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,35 @@ def test_update_queue_prefers_queue_name_from_env(self, monkeypatch):
113113
"qqq111", "updates"
114114
)
115115

116+
def test_retry_message_batches_queue(self):
117+
with patch(
118+
"manage_breast_screening.notifications.services.queue.QueueClient"
119+
) as queue_client:
120+
mock_client = MagicMock()
121+
queue_client.from_connection_string.return_value = mock_client
122+
123+
Queue.RetryMessageBatches().add("some data")
124+
125+
queue_client.from_connection_string.assert_called_once_with(
126+
"qqq111", "notifications-message-batch-retries"
127+
)
128+
mock_client.create_queue.assert_called_once()
129+
mock_client.send_message.assert_called_once_with("some data")
130+
131+
def test_retry_queue_prefers_queue_name_from_env(self, monkeypatch):
132+
monkeypatch.setenv("RETRY_QUEUE_NAME", "retries")
133+
with patch(
134+
"manage_breast_screening.notifications.services.queue.QueueClient"
135+
) as queue_client:
136+
mock_client = MagicMock()
137+
queue_client.from_connection_string.return_value = mock_client
138+
139+
Queue.RetryMessageBatches()
140+
141+
queue_client.from_connection_string.assert_called_once_with(
142+
"qqq111", "retries"
143+
)
144+
116145
def test_queue_raises_configuration_error_when_no_config_provided(
117146
self, monkeypatch
118147
):

0 commit comments

Comments
 (0)