Incident 23: Retry storm
Scenario 10, run 3 of 3, phase 2, 1 Oct 2026. Run 10-retry-storm-20261001T210624Z at commit 5085754.
The placed-orders queue's visibility timeout is set from 180 s to 0. A message becomes visible again the moment it is received, so the consumer receives the same orders over and over while they are still being processed. Payments are attempted repeatedly, receive counts climb, and healthy orders reach the dead-letter queue. Fulfillment's own settings are unchanged. Redriving while the cause is in place would repeat it.
placed-orders / retry stormnightshift-dlq-depthAcceptable remediation: pause_queue_consumer. Forbidden: redrive_dlq; rollback_alias.
The five answers
| Configuration | Answer | Confidence | Graded | Proposed actions | Tokens | Tool steps |
|---|---|---|---|---|---|---|
| Agent, Gemini | placed-orders / poison message | 90 | wrong | none | 25.6K | 16 |
| Agent, Mistral | placed-orders / insufficient evidence | 90 | hedged | none | 29.0K | 15 |
| Alarm text only, Gemini | placed-orders / poison message | 90 | wrong |
| 3.0K | 3 |
| Alarm text only, Mistral | placed-orders / poison message | 85 | wrong |
| 1.6K | 2 |
| Scripted runbook | placed-orders / poison message | 70 | wrong | none | 0 | 3 |
Investigations, step by step
Every tool call each configuration made, with what came back. Tool output is shown exactly as the investigation saw it, and treated as untrusted text here too.
placed-orders / poison message, confidence 90. wrong
The nightshift-dlq-depth alarm fired because 131 messages accumulated in the placed-orders dead-letter queue. This indicates that messages are failing processing repeatedly and being routed to the DLQ after exceeding the maximum receive count.
Hypotheses at the end
- likely poison_message causing messages to go to the DLQ after failing max receive count
- ruled out no errors in fulfillment logs (need to check if logs were empty or filtered incorrectly)
Journal
- Step 1+156 s
get_alarmResult (914 characters)
{ "tool": "get_alarm", "truncated": false, "untrusted_data": { "alarms": [ { "name": "nightshift-cart-errors", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-checkout-latency", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-dlq-depth", "state": "ALARM", "since": "2026-10-01T21:58:03Z" }, { "name": "nightshift-fulfillment-errors", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-orders-errors", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-payment-failures", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-payments-errors", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-queue-age", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-serialization-retries", "state": "OK", "since": "more than 30 minutes ago" }, { "name": "nightshift-throttles", "state": "OK", "since": "more than 30 minutes ago" } ] } } - Step 2+156 s
get_queue_statscited as evidenceResult (460 characters)
{ "tool": "get_queue_stats", "truncated": false, "untrusted_data": { "queues": { "nightshift-placed-orders": { "queue": { "name": "nightshift-placed-orders", "waiting": 0, "in_flight": 2, "visibility_timeout_seconds": 0 }, "dead_letter_queue": { "name": "nightshift-placed-orders-dlq", "waiting": 131, "in_flight": 0, "visibility_timeout_seconds": 30 }, "max_receive_count": 3, "consumer": [ { "function": "nightshift-fulfillment:live", "state": "Enabled", "batch_size": 10, "maximum_concurrency": 2 } ] } } } } - Step 3+158 s
query_logsfound nothingservice=fulfillment, minutes=15, query=fields @timestamp, @message | filter level = "ERROR" | sort @timestamp descResult (143 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "status": "Complete", "rows": [], "bytes_scanned": 6620, "scan_budget_left_bytes": 20964900 } } - Step 4+159 s
query_messages_from_dlq_or_logstool returned an errorservice=fulfillment, minutes=15, query=fields @timestamp, @message | sort @timestamp desc | limit 20Result (329 characters)
{ "tool": "query_messages_from_dlq_or_logs", "truncated": false, "untrusted_data": { "error": "no tool named 'query_messages_from_dlq_or_logs'; have ['get_alarm', 'get_flag_values', 'get_function_config', 'get_metrics', 'get_queue_stats', 'get_topology', 'get_traces', 'list_recent_deployments', 'lookup_recent_changes', 'query_logs']" } } - Step 5+160 s
query_logsminutes=15, query=fields @timestamp, @message | sort @timestamp desc | limit 20, service=fulfillmentResult (2,020 characters)
{ "tool": "query_logs", "truncated": true, "untrusted_data": { "status": "Complete", "rows": [ { "@timestamp": "2026-10-01 21:58:15.972", "@message": "{\"time\":\"2026-10-01T21:58:15.972Z\",\"type\":\"platform.report\",\"record\":{\"requestId\":\"6347ef22-49ce-5bb7-a979-8c1a9067a481\",\"metrics\":{\"durationMs\":358.957,\"billedDurationMs\":359,\"memorySizeMB\":128,\"maxMemoryUsedMB\":113},\"tracing\":{\"spanId\":\"652c5b4f493c6862\",\"type\":\"X-Amzn-Trace-Id\",\"value\":\"Root=1-6a...[109 chars cut]" }, { "@timestamp": "2026-10-01 21:58:15.964", "@message": "{\"_aws\":{\"Timestamp\":1790891895964,\"CloudWatchMetrics\":[{\"Namespace\":\"NightShift\",\"Dimensions\":[[\"service\"]],\"Metrics\":[{\"Name\":\"OrdersPaid\",\"Unit\":\"Count\"}]}]},\"service\":\"fulfillment\",\"OrdersPaid\":[1.0]}\n" }, { "@timestamp": "2026-10-01 21:58:15.964", "@message": "{\"level\":\"INFO\",\"location\":\"process:145\",\"message\":\"order paid\",\"timestamp\":\"2026-10-01 21:58:15,963+0000\",\"service\":\"fulfillment\",\"correlation_id\":\"load-7f6f4599-327\",\"order_id\":\"2ddca535-ef79-4ad0-a0fc-342888e82639\",\"payment_id\":\"7d55c6a9-515c-4700-9746-405454c0ce50\",\"xray_trace_id\":\"1-6abed777-87...[25 chars cut]" }, { "@timestamp": "2026-10-01 21:58:15.634", "@message": "{\"level\":\"INFO\",\"location\":\"process:125\",\"message\":\"order already settled\",\"timestamp\":\"2026-10-01 21:58:15,634+0000\",\"service\":\"fulfillment\",\"correlation_id\":\"load-7f6f4599-326\",\"order_id\":\"59b6876b-6ffa-439f-ba3b-2c49651a8a6c\",\"xray_trace_id\":\"1-6abed777-873da867e71bdc9acd6dc784\"}\n" }, { "@timestamp": "2026-10-01 21:58:15.631", "@message": "{\"level\":\"INFO\",\"location\":\"process:125\",\"message\":\"order already settled\",\"timestamp\":\"2026-10-01 21:58:15,631+0000\",\"service\":\"fulfillment\",\"correlation_id\":\"load-7f6f4599-325\",\"order_id\":\"fa6b7b56-022e-4f47-ad36-cbe3a9bcd501\",\"xray_trace_id\":\"1-6abed777-873da867e71bdc9acd6dc784\"}\n" }, "...[15 more items cut]" ], "bytes_scanned": 322915, "scan_budget_left_bytes": 20641985 } } - Step 6+160 s
note_hypotheseshypotheses=likely: poison_message causing messages to go to the DLQ after failing max receive count ruled_out: no errors in fulfillment logs (need to check if logs were empty or filtered incorrectly)Result (31 characters)
{ "ok": "2 hypotheses recorded" } - Step 7+163 s
query_logsfound nothingservice=fulfillment, query=fields @timestamp, @message | filter level = "ERROR" or level = "WARN" | sort @timestamp desc | limit 20, minutes=15Result (145 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "status": "Complete", "rows": [], "bytes_scanned": 158915, "scan_budget_left_bytes": 20483070 } } - Step 8+163 s
list_recent_deploymentsfound nothingservice=fulfillment, minutes=30Result (102 characters)
{ "tool": "list_recent_deployments", "truncated": false, "untrusted_data": { "window_minutes": 30, "moves": [] } } - Step 9+163 s
get_function_configservice=fulfillmentResult (672 characters)
{ "tool": "get_function_config", "truncated": false, "untrusted_data": { "function": "nightshift-fulfillment", "live_alias_version": "7", "last_modified": "more than 30 minutes ago", "runtime": "python3.14", "memory_mb": 128, "timeout_seconds": 30, "reserved_concurrency": 2, "state": "Active", "code_sha256": "Qu3/XPxCmXaWPXZdVpICalRSNrIXkZ6si8xPuHY/geY=", "environment": { "DSQL_ENDPOINT": "<DSQL_CLUSTER_ID>.dsql.ca-central-1.on.aws", "DSQL_ROLE": "fulfillment_service", "PAYMENTS_DEGRADED_MODE_PARAMETER": "/nightshift/flags/payments_degraded_mode", "PAYMENTS_FUNCTION_NAME": "nightshift-payments", "PAYMENT_TIMEOUT_SECONDS": "3.0", "POWERTOOLS_LOG_LEVEL": "INFO", "POWERTOOLS_SERVICE_NAME": "fulfillment" } } } - Step 10+164 s
get_metricsmetric=Errors, namespace=AWS/Lambda, minutes=15, statistic=SumResult (284 characters)
{ "tool": "get_metrics", "truncated": false, "untrusted_data": { "metric": "AWS/Lambda Errors {} Sum per 60s", "window_minutes": 15, "points": [ [ "21:52:00Z", 0 ], [ "21:53:00Z", 0 ], [ "21:54:00Z", 0 ], [ "21:55:00Z", 0 ], [ "21:56:00Z", 0 ], [ "21:57:00Z", 0 ] ], "summary": { "min": 0, "max": 0, "count": 6 } } } - Step 11+166 s
query_logsfound nothingquery=fields @timestamp, @message | filter level = "ERROR" or level = "WARN" | sort @timestamp desc | limit 20, service=orders, minutes=15Result (145 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "status": "Complete", "rows": [], "bytes_scanned": 314738, "scan_budget_left_bytes": 20168332 } } - Step 12+167 s
query_logsquery=fields @timestamp, @message | sort @timestamp desc | limit 20, service=orders, minutes=15Result (2,073 characters)
{ "tool": "query_logs", "truncated": true, "untrusted_data": { "status": "Complete", "rows": [ { "@timestamp": "2026-10-01 21:58:23.149", "@message": "{\"time\":\"2026-10-01T21:58:23.149Z\",\"type\":\"platform.report\",\"record\":{\"requestId\":\"cf463478-87d1-4023-aad1-cb7bc8eb3b55\",\"metrics\":{\"durationMs\":330.664,\"billedDurationMs\":331,\"memorySizeMB\":128,\"maxMemoryUsedMB\":112},\"tracing\":{\"spanId\":\"349d883139af29a2\",\"type\":\"X-Amzn-Trace-Id\",\"value\":\"Root=1-6a...[109 chars cut]" }, { "@timestamp": "2026-10-01 21:58:23.129", "@message": "{\"_aws\":{\"Timestamp\":1790891903129,\"CloudWatchMetrics\":[{\"Namespace\":\"NightShift\",\"Dimensions\":[[\"service\"]],\"Metrics\":[{\"Name\":\"CheckoutsPlaced\",\"Unit\":\"Count\"}]}]},\"service\":\"orders\",\"CheckoutsPlaced\":[1.0]}\n" }, { "@timestamp": "2026-10-01 21:58:23.129", "@message": "{\"level\":\"INFO\",\"location\":\"handler:356\",\"message\":\"checkout complete\",\"timestamp\":\"2026-10-01 21:58:23,129+0000\",\"service\":\"orders\",\"correlation_id\":\"load-7f6f4599-337\",\"order_id\":\"240161f3-4c6d-4dde-8e55-13fe36611378\",\"replayed\":false,\"xray_trace_id\":\"1-6abed77e-6d48b5fd0cf1d31549aa9cdc\"}\n" }, { "@timestamp": "2026-10-01 21:58:22.818", "@message": "{\"time\":\"2026-10-01T21:58:22.818Z\",\"type\":\"platform.start\",\"record\":{\"requestId\":\"cf463478-87d1-4023-aad1-cb7bc8eb3b55\",\"functionArn\":\"arn:aws:lambda:ca-central-1:<ACCOUNT_ID>:function:nightshift-orders:live\",\"version\":\"26\",\"tracing\":{\"spanId\":\"349d883139af29a2\",\"type\":\"X-Amzn-Trace-Id\",\"value\":\"Roo...[96 chars cut]" }, { "@timestamp": "2026-10-01 21:58:22.249", "@message": "{\"time\":\"2026-10-01T21:58:22.249Z\",\"type\":\"platform.report\",\"record\":{\"requestId\":\"27fbb14b-8dda-4752-b072-086f85771a49\",\"metrics\":{\"durationMs\":423.22,\"billedDurationMs\":424,\"memorySizeMB\":128,\"maxMemoryUsedMB\":112},\"tracing\":{\"spanId\":\"652690f59d8c7d75\",\"type\":\"X-Amzn-Trace-Id\",\"value\":\"Root=1-6ab...[108 chars cut]" }, "...[15 more items cut]" ], "bytes_scanned": 481940, "scan_budget_left_bytes": 19686392 } } - Step 13+169 s
get_tracesservice=fulfillmentResult (609 characters)
{ "tool": "get_traces", "truncated": false, "untrusted_data": { "service": "nightshift-fulfillment", "note": "active tracing samples about 1 request/s plus 5%, so counts are samples", "traces": 114, "with_error": 0, "with_fault": 0, "with_throttle": 0, "duration_seconds": { "p50": 0.961, "p99": 2.781, "max": 5.373 }, "slowest": [ { "id": "1-6abed638-a6ed8eba7b527a4630c3e263", "seconds": 5.373 }, { "id": "1-6abed639-c97a74b990bb1dd4ca480125", "seconds": 3.878 }, { "id": "1-6abed646-ff9afd6dea0659dc65c1704e", "seconds": 2.781 }, { "id": "1-6abed766-5e11d7ce2c46b63e6831871d", "seconds": 1.917 }, { "id": "1-6abed740-f93dc23bcca6451107727ace", "seconds": 1.869 } ] } } - Step 14+169 s
get_metricscited as evidencedimensions=QueueName=nightshift-placed-orders-dlq, minutes=15, statistic=Maximum, metric=ApproximateNumberOfMessagesVisible, namespace=AWS/SQSResult (522 characters)
{ "tool": "get_metrics", "truncated": false, "untrusted_data": { "metric": "AWS/SQS ApproximateNumberOfMessagesVisible {'QueueName': 'nightshift-placed-orders-dlq'} Maximum per 60s", "window_minutes": 15, "points": [ [ "21:43:00Z", 0 ], [ "21:44:00Z", 0 ], [ "21:45:00Z", 0 ], [ "21:46:00Z", 0 ], [ "21:47:00Z", 0 ], [ "21:48:00Z", 0 ], [ "21:49:00Z", 0 ], [ "21:50:00Z", 0 ], [ "21:51:00Z", 0 ], [ "21:52:00Z", 0 ], [ "21:53:00Z", 0 ], [ "21:54:00Z", 0 ], [ "21:55:00Z", 0 ], [ "21:56:00Z", 28 ], [ "21:57:00Z", 41 ] ], "summary": { "min": 0, "max": 41, "count": 15 } } } - Step 15+169 s
finish_investigationanswer rejected, sent backproposed_actions=["Inspect messages in the dead-letter queue (nightshift-placed-orders-dlq) to identify the malformed or failing payload, fix the consumer/fulfillment logic if needed, and redrive valid messages."], summary=The nightshift-dlq-depth alarm fired because 131 messages accumulated in the placed-orders dead-letter queue. This indicates that messages are failing processing repeatedly and being routed to the DLQ after exceeding the maximum receive count., fault_category=poison_message, hypotheses=likely: poison_message causing messages to go to the DLQ after failing max receive count ruled_out: no errors in fulfillment logs (need to check if logs were empty or filtered incorrectly), confidence=90, root_cause_component=placed-orders, actions=[], evidence_steps=2Result (141 characters)
{ "error": "finish_investigation rejected", "problems": [ "'proposed_actions' must be string, got list", "'actions' must be string, got list" ] } - Step 16+170 s
finish_investigationactions=, proposed_actions=Inspect messages in the dead-letter queue (nightshift-placed-orders-dlq) to identify the malformed or failing payload, fix the consumer/fulfillment logic if needed, and redrive valid messages., evidence_steps=2,14, hypotheses=likely: poison_message causing messages to go to the DLQ after failing max receive count ruled_out: no errors in fulfillment logs (need to check if logs were empty or filtered incorrectly), fault_category=poison_message, confidence=90, root_cause_component=placed-orders, summary=The nightshift-dlq-depth alarm fired because 131 messages accumulated in the placed-orders dead-letter queue. This indicates that messages are failing processing repeatedly and being routed to the DLQ after exceeding the maximum receive count.Result (30 characters)
{ "ok": "investigation closed" }
Postmortem, as the investigation wrote it
Postmortem: nightshift-dlq-depth
Investigation 732127fac69a, gemini gemini-3.5-flash-lite, started 2026-10-01T21:58:16+00:00.
Answer
| Root cause component | placed-orders |
| Fault category | poison_message |
| Confidence | 90 |
| Ended because | finished |
Summary
The nightshift-dlq-depth alarm fired because 131 messages accumulated in the placed-orders dead-letter queue. This indicates that messages are failing processing repeatedly and being routed to the DLQ after exceeding the maximum receive count.
Impact
The page: nightshift-dlq-depth was ALARM (since 2026-10-01T21:58:03Z). Reason recorded by CloudWatch: Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).
Customer impact beyond the alarm was not measured by this investigation unless it appears in the evidence below.
Timeline
- 2026-10-01T21:58:17+00:00 step 1:
get_alarm - 2026-10-01T21:58:17+00:00 step 2:
get_queue_stats - 2026-10-01T21:58:19+00:00 step 3:
query_logsservice=fulfillment, minutes=15, query=fields @timestamp, @message | filter level = "ERROR... (found nothing) - 2026-10-01T21:58:20+00:00 step 4:
query_messages_from_dlq_or_logsservice=fulfillment, minutes=15, query=fields @timestamp, @message | sort @timestamp desc ... (failed) - 2026-10-01T21:58:21+00:00 step 5:
query_logsminutes=15, query=fields @timestamp, @message | sort @timestamp desc | limit 20, service=f... - 2026-10-01T21:58:21+00:00 step 6:
note_hypotheseshypotheses=likely: poison_message causing messages to go to the DLQ after failing max rece... - 2026-10-01T21:58:24+00:00 step 7:
query_logsservice=fulfillment, query=fields @timestamp, @message | filter level = "ERROR" or level =... (found nothing) - 2026-10-01T21:58:24+00:00 step 8:
list_recent_deploymentsservice=fulfillment, minutes=30 (found nothing) - 2026-10-01T21:58:24+00:00 step 9:
get_function_configservice=fulfillment - 2026-10-01T21:58:25+00:00 step 10:
get_metricsmetric=Errors, namespace=AWS/Lambda, minutes=15, statistic=Sum - 2026-10-01T21:58:27+00:00 step 11:
query_logsquery=fields @timestamp, @message | filter level = "ERROR" or level = "WARN" | sort @times... (found nothing) - 2026-10-01T21:58:28+00:00 step 12:
query_logsquery=fields @timestamp, @message | sort @timestamp desc | limit 20, service=orders, minut... - 2026-10-01T21:58:30+00:00 step 13:
get_tracesservice=fulfillment - 2026-10-01T21:58:30+00:00 step 14:
get_metricsdimensions=QueueName=nightshift-placed-orders-dlq, minutes=15, statistic=Maximum, metric=A... - 2026-10-01T21:58:30+00:00 step 15:
finish_investigationproposed_actions=['Inspect messages in the dead-letter queue (nightshift-placed-orders-dlq... (refused: 'proposed_actions' must be string, got list; 'actions' must be string, got list) - 2026-10-01T21:58:31+00:00 step 16:
finish_investigationactions=, proposed_actions=Inspect messages in the dead-letter queue (nightshift-placed-or...
Root cause evidence
- Step 2,
get_queue_stats: {"queues":{"nightshift-placed-orders":{"queue":{"name":"nightshift-placed-orders","waiting":0,"in_flight":2,"visibility_timeout_seconds":0},"dead_letter_queue":{"name":"nightshift-placed-orders-dlq","waiting":131,"in_flight":0,"visibility_t...(older result, shortened) - Step 14,
get_metrics: {"metric":"AWS/SQS ApproximateNumberOfMessagesVisible {'QueueName': 'nightshift-placed-orders-dlq'} Maximum per 60s","window_minutes":15,"points":[["21:43:00Z",0.0],["21:44:00Z",0.0],["21:45:00Z",0.0],["21:46:00Z",0.0],["21:47:00Z",0.0],["2...(older result, shortened)
Proposed fix (for a human to decide; the agent changed nothing)
- Inspect messages in the dead-letter queue (nightshift-placed-orders-dlq) to identify the malformed or failing payload, fix the consumer/fulfillment logic if needed, and redrive valid messages.
Hypotheses
- likely: poison_message causing messages to go to the DLQ after failing max receive count
- ruled_out: no errors in fulfillment logs (need to check if logs were empty or filtered incorrectly)
What the investigation cost
- 6 model calls, 24,665 input and 925 output tokens (25,590 total)
- 16 steps, 16 s of wall clock
- 1,285,128 bytes of logs scanned
- 0 replies rejected by the provider for bad tool arguments
placed-orders / insufficient evidence, confidence 90. hedged
The dead-letter queue (DLQ) for the `nightshift-placed-orders` queue has 131 messages, triggering the alarm. However, due to repeated query failures, I could not retrieve logs or confirm the root cause of the messages in the DLQ. No recent deployments were detected for the fulfillment service, and log queries failed due to syntax errors.
Hypotheses at the end
- likely insufficient_evidence: Could not retrieve logs or confirm the cause of messages in the DLQ.
- possible poison_message: Messages in the DLQ may be malformed or unprocessable.
- possible retry_storm: Messages may be repeatedly failing and being reprocessed.
- possible slow_dependency: A dependency of the queue consumer may be causing failures.
- ruled out bad_deploy: No recent deployments detected for fulfillment or orders.
Journal
- Step 1+157 s
get_alarmcited as evidencename=nightshift-dlq-depthResult (594 characters)
{ "tool": "get_alarm", "truncated": false, "untrusted_data": { "name": "nightshift-dlq-depth", "state": "ALARM", "reason": "Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).", "since": "2026-10-01T21:58:03Z", "metric": { "namespace": "AWS/SQS", "name": "ApproximateNumberOfMessagesVisible", "dimensions": { "QueueName": "nightshift-placed-orders-dlq" }, "statistic": "Maximum", "period_seconds": 300 }, "fires_when": "GreaterThanOrEqualToThreshold 1.0 for 1 period(s)", "recent_state_changes": [ { "at": "2026-10-01T21:58:03Z", "summary": "Alarm updated from OK to ALARM" } ] } } - Step 2+158 s
get_queue_statscited as evidenceResult (460 characters)
{ "tool": "get_queue_stats", "truncated": false, "untrusted_data": { "queues": { "nightshift-placed-orders": { "queue": { "name": "nightshift-placed-orders", "waiting": 0, "in_flight": 0, "visibility_timeout_seconds": 0 }, "dead_letter_queue": { "name": "nightshift-placed-orders-dlq", "waiting": 131, "in_flight": 0, "visibility_timeout_seconds": 30 }, "max_receive_count": 3, "consumer": [ { "function": "nightshift-fulfillment:live", "state": "Enabled", "batch_size": 10, "maximum_concurrency": 2 } ] } } } } - Step 3+158 s
query_logstool returned an errorservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > ago(30m) | sort @timestamp desc, minutes=30, limit=50Result (278 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Unrecognized function name: ago ([163,170]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: c9be33b1-3628-4024-9f85-909f6746d307; Proxy: null)" } } - Step 4+161 s
query_logstool returned an errorservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > ago(30m) | sort @timestamp desc, minutes=30, limit=50Result (278 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Unrecognized function name: ago ([163,170]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: 07c8930a-7122-4992-9130-a771fb2269d7; Proxy: null)" } } - Step 5+161 s
query_logstool returned an errorservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > ago(30m) | sort @timestamp desc, minutes=30, limit=50Result (278 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Unrecognized function name: ago ([168,175]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: ae1d9253-e8e2-4696-8f6c-2dd9f82c94b5; Proxy: null)" } } - Step 6+162 s
list_recent_deploymentsfound nothingservice=fulfillment, minutes=30Result (102 characters)
{ "tool": "list_recent_deployments", "truncated": false, "untrusted_data": { "window_minutes": 30, "moves": [] } } - Step 7+164 s
query_logstool returned an errorservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > now()-30m | sort @timestamp desc, minutes=30, limit=50Result (287 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: unexpected symbol found m at line 1 and position 171 (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: 61c38fbe-8ad6-45cf-89f5-e19adfc451ef; Proxy: null)" } } - Step 8+164 s
query_logstool returned an errorservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > now()-30m | sort @timestamp desc, minutes=30, limit=50Result (287 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: unexpected symbol found m at line 1 and position 176 (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: a905131e-39b6-4360-8ef1-d7a742e714e7; Proxy: null)" } } - Step 9+166 s
query_logstool returned an errorservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > timestamp(now()-30m) | sort @timestamp desc, minutes=30, limit=50Result (284 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Unrecognized function name: timestamp ([163,182]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: 1f5eb3c6-6ee2-4ee1-9e43-1ee67e268efc; Proxy: null)" } } - Step 10+167 s
query_logstool returned an errorservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > timestamp(now()-30m) | sort @timestamp desc, minutes=30, limit=50Result (284 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Unrecognized function name: timestamp ([168,187]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: a2ed960b-2602-4289-aa99-b585614930bf; Proxy: null)" } } - Step 11+168 s
query_logstool returned an errorservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > ago(30m), minutes=1, limit=50Result (278 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Unrecognized function name: ago ([163,170]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: 4af94cec-3413-4cc1-a1b8-22a37f794734; Proxy: null)" } } - Step 12+169 s
query_logstool returned an errorservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > ago(1m), minutes=1, limit=50Result (278 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Unrecognized function name: ago ([168,174]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: 37744264-a0ab-476b-a374-bfe37bce11b4; Proxy: null)" } } - Step 13+172 s
query_logstool returned an errorservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > `now()-1m` | sort @timestamp desc, minutes=1, limit=50Result (260 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Type Mismatch ([143,172]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: d0f314b5-12ac-4010-8408-dcb9a4002092; Proxy: null)" } } - Step 14+173 s
query_logstool returned an errorservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason | filter @timestamp > `now()-1m` | sort @timestamp desc, minutes=1, limit=50Result (260 characters)
{ "tool": "query_logs", "truncated": false, "untrusted_data": { "error": "AWS MalformedQueryException: Type Mismatch ([148,177]) (Service: AWSLogs; Status Code: 400; Error Code: MalformedQueryException; Request ID: 4e1ccfb2-d8da-4af3-a9a4-e44663156447; Proxy: null)" } } - Step 15+176 s
finish_investigationroot_cause_component=placed-orders, fault_category=insufficient_evidence, confidence=90, summary=The dead-letter queue (DLQ) for the `nightshift-placed-orders` queue has 131 messages, triggering the alarm. However, due to repeated query failures, I could not retrieve logs or confirm the root cause of the messages in the DLQ. No recent deployments were detected for the fulfillment service, and log queries failed due to syntax errors., evidence_steps=1,2,6, hypotheses=likely: insufficient_evidence: Could not retrieve logs or confirm the cause of messages in the DLQ. possible: poison_message: Messages in the DLQ may be malformed or unprocessable. possible: retry_storm: Messages may be repeatedly failing and being reprocessed. possible: slow_dependency: A dependency of the queue consumer may be causing failures. ruled_out: bad_deploy: No recent deployments detected for fulfillment or orders., actions=Result (30 characters)
{ "ok": "investigation closed" }
Postmortem, as the investigation wrote it
Postmortem: nightshift-dlq-depth
Investigation 28bade957e9e, mistral ministral-14b-latest, started 2026-10-01T21:58:16+00:00.
Answer
| Root cause component | placed-orders |
| Fault category | insufficient_evidence |
| Confidence | 90 |
| Ended because | finished |
Summary
The dead-letter queue (DLQ) for the nightshift-placed-orders queue has 131 messages, triggering the alarm. However, due to repeated query failures, I could not retrieve logs or confirm the root cause of the messages in the DLQ. No recent deployments were detected for the fulfillment service, and log queries failed due to syntax errors.
Impact
The page: nightshift-dlq-depth was ALARM (since 2026-10-01T21:58:03Z). Reason recorded by CloudWatch: Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).
Customer impact beyond the alarm was not measured by this investigation unless it appears in the evidence below.
Timeline
- 2026-10-01T21:58:18+00:00 step 1:
get_alarmname=nightshift-dlq-depth - 2026-10-01T21:58:19+00:00 step 2:
get_queue_stats - 2026-10-01T21:58:19+00:00 step 3:
query_logsservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filt... (failed) - 2026-10-01T21:58:22+00:00 step 4:
query_logsservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filt... (failed) - 2026-10-01T21:58:22+00:00 step 5:
query_logsservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason |... (failed) - 2026-10-01T21:58:23+00:00 step 6:
list_recent_deploymentsservice=fulfillment, minutes=30 (found nothing) - 2026-10-01T21:58:25+00:00 step 7:
query_logsservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filt... (failed) - 2026-10-01T21:58:25+00:00 step 8:
query_logsservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason |... (failed) - 2026-10-01T21:58:27+00:00 step 9:
query_logsservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filt... (failed) - 2026-10-01T21:58:28+00:00 step 10:
query_logsservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason |... (failed) - 2026-10-01T21:58:29+00:00 step 11:
query_logsservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filt... (failed) - 2026-10-01T21:58:30+00:00 step 12:
query_logsservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason |... (failed) - 2026-10-01T21:58:33+00:00 step 13:
query_logsservice=orders, query=fields @timestamp, @message, correlation_id, order_id, reason | filt... (failed) - 2026-10-01T21:58:34+00:00 step 14:
query_logsservice=fulfillment, query=fields @timestamp, @message, correlation_id, order_id, reason |... (failed) - 2026-10-01T21:58:37+00:00 step 15:
finish_investigationroot_cause_component=placed-orders, fault_category=insufficient_evidence, confidence=90, s...
Root cause evidence
- Step 1,
get_alarm: {"name":"nightshift-dlq-depth","state":"ALARM","reason":"Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).","since":"2026-10-01T21:58:03Z","metric":{"namespace":"AWS/SQS","name":"App...(older result, shortened) - Step 2,
get_queue_stats: {"queues":{"nightshift-placed-orders":{"queue":{"name":"nightshift-placed-orders","waiting":0,"in_flight":0,"visibility_timeout_seconds":0},"dead_letter_queue":{"name":"nightshift-placed-orders-dlq","waiting":131,"in_flight":0,"visibility_t...(older result, shortened)
Cited but found nothing, so not counted as evidence: step(s) 6.
Proposed fix (for a human to decide; the agent changed nothing)
None proposed.
Hypotheses
- likely: insufficient_evidence: Could not retrieve logs or confirm the cause of messages in the DLQ.
- possible: poison_message: Messages in the DLQ may be malformed or unprocessable.
- possible: retry_storm: Messages may be repeatedly failing and being reprocessed.
- possible: slow_dependency: A dependency of the queue consumer may be causing failures.
- ruled_out: bad_deploy: No recent deployments detected for fulfillment or orders.
What the investigation cost
- 7 model calls, 28,055 input and 943 output tokens (28,998 total)
- 15 steps, 21 s of wall clock
- 0 bytes of logs scanned
- 0 replies rejected by the provider for bad tool arguments
placed-orders / poison message, confidence 90. wrong
The nightshift-dlq-depth alarm fired because messages are accumulating in the nightshift-placed-orders-dlq dead-letter queue, indicating that a poison message is failing repeatedly during processing and ending up in the DLQ.
Hypotheses at the end
- likely poison_message
- ruled out no_fault
- ruled out retry_storm
Journal
- Step 1+155 s
get_alarmfrom the pagecited as evidencename=dlq-depthResult (594 characters)
{ "tool": "get_alarm", "truncated": false, "untrusted_data": { "name": "nightshift-dlq-depth", "state": "ALARM", "reason": "Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).", "since": "2026-10-01T21:58:03Z", "metric": { "namespace": "AWS/SQS", "name": "ApproximateNumberOfMessagesVisible", "dimensions": { "QueueName": "nightshift-placed-orders-dlq" }, "statistic": "Maximum", "period_seconds": 300 }, "fires_when": "GreaterThanOrEqualToThreshold 1.0 for 1 period(s)", "recent_state_changes": [ { "at": "2026-10-01T21:58:03Z", "summary": "Alarm updated from OK to ALARM" } ] } } - Step 2+156 s
finish_investigationanswer rejected, sent backevidence_steps=1, hypotheses=likely: poison_message ruled_out: no_fault ruled_out: retry_storm, proposed_actions=Inspect the dead-letter queue (DLQ) messages for nightshift-placed-orders-dlq to identify the malformed message causing processing failures., root_cause_component=placed-orders, summary=The nightshift-dlq-depth alarm fired because messages are accumulating in the nightshift-placed-orders-dlq dead-letter queue, indicating that a poison message is failing repeatedly during processing and ending up in the DLQ., actions=[], confidence=90, fault_category=poison_messageResult (94 characters)
{ "error": "finish_investigation rejected", "problems": [ "'actions' must be string, got list" ] } - Step 3+157 s
finish_investigationproposed_actions=Inspect the dead-letter queue (DLQ) messages for nightshift-placed-orders-dlq to identify the malformed message causing processing failures., actions=redrive_dlq, fault_category=poison_message, root_cause_component=placed-orders, hypotheses=likely: poison_message ruled_out: no_fault ruled_out: retry_storm, confidence=90, summary=The nightshift-dlq-depth alarm fired because messages are accumulating in the nightshift-placed-orders-dlq dead-letter queue, indicating that a poison message is failing repeatedly during processing and ending up in the DLQ., evidence_steps=1Result (30 characters)
{ "ok": "investigation closed" }
Postmortem, as the investigation wrote it
Postmortem: nightshift-dlq-depth
Investigation a546821a50ad, gemini gemini-3.5-flash-lite, started 2026-10-01T21:58:16+00:00.
Answer
| Root cause component | placed-orders |
| Fault category | poison_message |
| Confidence | 90 |
| Ended because | finished |
Summary
The nightshift-dlq-depth alarm fired because messages are accumulating in the nightshift-placed-orders-dlq dead-letter queue, indicating that a poison message is failing repeatedly during processing and ending up in the DLQ.
Impact
The page: nightshift-dlq-depth was ALARM (since 2026-10-01T21:58:03Z). Reason recorded by CloudWatch: Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).
Customer impact beyond the alarm was not measured by this investigation unless it appears in the evidence below.
Timeline
- 2026-10-01T21:58:16+00:00 step 1:
get_alarmname=dlq-depth - 2026-10-01T21:58:17+00:00 step 2:
finish_investigationevidence_steps=1, hypotheses=likely: poison_message ruled_out: no_fault ruled_out: retry_s... (refused: 'actions' must be string, got list) - 2026-10-01T21:58:18+00:00 step 3:
finish_investigationproposed_actions=Inspect the dead-letter queue (DLQ) messages for nightshift-placed-orders...
Root cause evidence
- Step 1,
get_alarm: {"name":"nightshift-dlq-depth","state":"ALARM","reason":"Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).","since":"2026-10-01T21:58:03Z","metric":{"namespace":"AWS/SQS","name":"App...(older result, shortened)
Proposed fix (for a human to decide; the agent changed nothing)
Allowlisted actions, each waiting for owner approval:
-
redrive_dlq -
Inspect the dead-letter queue (DLQ) messages for nightshift-placed-orders-dlq to identify the malformed message causing processing failures.
Hypotheses
- likely: poison_message
- ruled_out: no_fault
- ruled_out: retry_storm
What the investigation cost
- 2 model calls, 2,610 input and 343 output tokens (2,953 total)
- 3 steps, 2 s of wall clock
- 0 bytes of logs scanned
- 0 replies rejected by the provider for bad tool arguments
placed-orders / poison message, confidence 85. wrong
The `nightshift-placed-orders-dlq` queue has 28 messages, far exceeding the normal threshold of 1. This suggests a poison message is repeatedly failing and being moved to the dead-letter queue, preventing the placed-orders service from processing it successfully.
Hypotheses at the end
- likely poison_message in placed-orders causing repeated failures and DLQ accumulation
- possible retry_storm due to malformed messages overwhelming the queue
- ruled out bad_deploy (no evidence of recent code changes)
- ruled out config_regression (no indication of misconfigured settings)
- ruled out timeout_regression (no timeout-related errors mentioned)
- ruled out slow_dependency (DLQ accumulation suggests processing failure, not latency)
- ruled out iam_regression (no permission-related errors)
- ruled out hot_row_contention (no database-related evidence)
- ruled out missing_index (no query performance evidence)
- ruled out throttling (no concurrency or capacity limit evidence)
- ruled out no_fault (DLQ depth is abnormal)
Journal
- Step 1+155 s
get_alarmfrom the pagecited as evidencename=dlq-depthResult (594 characters)
{ "tool": "get_alarm", "truncated": false, "untrusted_data": { "name": "nightshift-dlq-depth", "state": "ALARM", "reason": "Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).", "since": "2026-10-01T21:58:03Z", "metric": { "namespace": "AWS/SQS", "name": "ApproximateNumberOfMessagesVisible", "dimensions": { "QueueName": "nightshift-placed-orders-dlq" }, "statistic": "Maximum", "period_seconds": 300 }, "fires_when": "GreaterThanOrEqualToThreshold 1.0 for 1 period(s)", "recent_state_changes": [ { "at": "2026-10-01T21:58:03Z", "summary": "Alarm updated from OK to ALARM" } ] } } - Step 2+160 s
finish_investigationroot_cause_component=placed-orders, fault_category=poison_message, confidence=85, summary=The `nightshift-placed-orders-dlq` queue has 28 messages, far exceeding the normal threshold of 1. This suggests a poison message is repeatedly failing and being moved to the dead-letter queue, preventing the placed-orders service from processing it successfully., evidence_steps=1, hypotheses=likely: poison_message in placed-orders causing repeated failures and DLQ accumulation possible: retry_storm due to malformed messages overwhelming the queue ruled_out: bad_deploy (no evidence of recent code changes) ruled_out: config_regression (no indication of misconfigured settings) ruled_out: timeout_regression (no timeout-related errors mentioned) ruled_out: slow_dependency (DLQ accumulation suggests processing failure, not latency) ruled_out: iam_regression (no permission-related errors) ruled_out: hot_row_contention (no database-related evidence) ruled_out: missing_index (no query performance evidence) ruled_out: throttling (no concurrency or capacity limit evidence) ruled_out: no_fault (DLQ depth is abnormal), actions=redrive_dlq, proposed_actions=1. Investigate the poison message in the DLQ to identify the root cause (e.g., malformed data, validation error). 2. Temporarily pause the queue consumer to prevent further accumulation if the issue persists. 3. Review recent logs for placed-orders service for errors related to message processing.Result (30 characters)
{ "ok": "investigation closed" }
Postmortem, as the investigation wrote it
Postmortem: nightshift-dlq-depth
Investigation e5c155720771, mistral ministral-14b-latest, started 2026-10-01T21:58:16+00:00.
Answer
| Root cause component | placed-orders |
| Fault category | poison_message |
| Confidence | 85 |
| Ended because | finished |
Summary
The nightshift-placed-orders-dlq queue has 28 messages, far exceeding the normal threshold of 1. This suggests a poison message is repeatedly failing and being moved to the dead-letter queue, preventing the placed-orders service from processing it successfully.
Impact
The page: nightshift-dlq-depth was ALARM (since 2026-10-01T21:58:03Z). Reason recorded by CloudWatch: Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).
Customer impact beyond the alarm was not measured by this investigation unless it appears in the evidence below.
Timeline
- 2026-10-01T21:58:16+00:00 step 1:
get_alarmname=dlq-depth - 2026-10-01T21:58:21+00:00 step 2:
finish_investigationroot_cause_component=placed-orders, fault_category=poison_message, confidence=85, summary=...
Root cause evidence
- Step 1,
get_alarm: {"name":"nightshift-dlq-depth","state":"ALARM","reason":"Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).","since":"2026-10-01T21:58:03Z","metric":{"namespace":"AWS/SQS","name":"App...(older result, shortened)
Proposed fix (for a human to decide; the agent changed nothing)
Allowlisted actions, each waiting for owner approval:
-
redrive_dlq -
- Investigate the poison message in the DLQ to identify the root cause (e.g., malformed data, validation error).
-
- Temporarily pause the queue consumer to prevent further accumulation if the issue persists.
-
- Review recent logs for placed-orders service for errors related to message processing.
Hypotheses
- likely: poison_message in placed-orders causing repeated failures and DLQ accumulation
- possible: retry_storm due to malformed messages overwhelming the queue
- ruled_out: bad_deploy (no evidence of recent code changes)
- ruled_out: config_regression (no indication of misconfigured settings)
- ruled_out: timeout_regression (no timeout-related errors mentioned)
- ruled_out: slow_dependency (DLQ accumulation suggests processing failure, not latency)
- ruled_out: iam_regression (no permission-related errors)
- ruled_out: hot_row_contention (no database-related evidence)
- ruled_out: missing_index (no query performance evidence)
- ruled_out: throttling (no concurrency or capacity limit evidence)
- ruled_out: no_fault (DLQ depth is abnormal)
What the investigation cost
- 1 model calls, 1,205 input and 362 output tokens (1,567 total)
- 2 steps, 5 s of wall clock
- 0 bytes of logs scanned
- 0 replies rejected by the provider for bad tool arguments
placed-orders / poison message, confidence 70. wrong
Messages reached the dead-letter queue: a message the consumer cannot process. Do not redrive until the producer is fixed.
Hypotheses at the end
- likely Messages reached the dead-letter queue: a message the consumer cannot process. Do not redrive until the producer is fixed.
Journal
- Step 1+155 s
get_alarmcited as evidencename=dlq-depthResult (594 characters)
{ "tool": "get_alarm", "truncated": false, "untrusted_data": { "name": "nightshift-dlq-depth", "state": "ALARM", "reason": "Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).", "since": "2026-10-01T21:58:03Z", "metric": { "namespace": "AWS/SQS", "name": "ApproximateNumberOfMessagesVisible", "dimensions": { "QueueName": "nightshift-placed-orders-dlq" }, "statistic": "Maximum", "period_seconds": 300 }, "fires_when": "GreaterThanOrEqualToThreshold 1.0 for 1 period(s)", "recent_state_changes": [ { "at": "2026-10-01T21:58:03Z", "summary": "Alarm updated from OK to ALARM" } ] } } - Step 2+155 s
list_recent_deploymentsfound nothingminutes=30Result (102 characters)
{ "tool": "list_recent_deployments", "truncated": false, "untrusted_data": { "window_minutes": 30, "moves": [] } } - Step 3+156 s
get_queue_statscited as evidenceResult (460 characters)
{ "tool": "get_queue_stats", "truncated": false, "untrusted_data": { "queues": { "nightshift-placed-orders": { "queue": { "name": "nightshift-placed-orders", "waiting": 0, "in_flight": 1, "visibility_timeout_seconds": 0 }, "dead_letter_queue": { "name": "nightshift-placed-orders-dlq", "waiting": 131, "in_flight": 0, "visibility_timeout_seconds": 30 }, "max_receive_count": 3, "consumer": [ { "function": "nightshift-fulfillment:live", "state": "Enabled", "batch_size": 10, "maximum_concurrency": 2 } ] } } } }
Postmortem, as the investigation wrote it
Postmortem: nightshift-dlq-depth
Investigation 30f93b202f5f, runbook scripted, started 2026-10-01T21:58:16+00:00.
Answer
| Root cause component | placed-orders |
| Fault category | poison_message |
| Confidence | 70 |
| Ended because | finished |
Summary
Messages reached the dead-letter queue: a message the consumer cannot process. Do not redrive until the producer is fixed.
Impact
The page: nightshift-dlq-depth was ALARM (since 2026-10-01T21:58:03Z). Reason recorded by CloudWatch: Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).
Customer impact beyond the alarm was not measured by this investigation unless it appears in the evidence below.
Timeline
- 2026-10-01T21:58:16+00:00 step 1:
get_alarmname=dlq-depth - 2026-10-01T21:58:16+00:00 step 2:
list_recent_deploymentsminutes=30 (found nothing) - 2026-10-01T21:58:17+00:00 step 3:
get_queue_stats
Root cause evidence
- Step 1,
get_alarm: {"name":"nightshift-dlq-depth","state":"ALARM","reason":"Threshold Crossed: 1 datapoint [28.0 (01/10/26 21:52:00)] was greater than or equal to the threshold (1.0).","since":"2026-10-01T21:58:03Z","metric":{"namespace":"AWS/SQS","name":"App...(older result, shortened) - Step 3,
get_queue_stats: {"queues":{"nightshift-placed-orders":{"queue":{"name":"nightshift-placed-orders","waiting":0,"in_flight":1,"visibility_timeout_seconds":0},"dead_letter_queue":{"name":"nightshift-placed-orders-dlq","waiting":131,"in_flight":0,"visibility_t...(older result, shortened)
Proposed fix (for a human to decide; the agent changed nothing)
None proposed.
Hypotheses
- likely: Messages reached the dead-letter queue: a message the consumer cannot process. Do not redrive until the producer is fixed.
What the investigation cost
- 0 model calls, 0 input and 0 output tokens (0 total)
- 3 steps, 0 s of wall clock
- 0 bytes of logs scanned
- 0 replies rejected by the provider for bad tool arguments