message-queue-debugging
Debugs Kafka, RabbitMQ, and SQS message queues with consumer lag analysis,
Works with
---
name: message-queue-debugging
description: Debugs Kafka, RabbitMQ, and SQS message queues with consumer lag analysis,
license: MIT
---
# Message Queue Debugging
Debugs distributed message queue systems including Kafka, RabbitMQ, and SQS — identifies consumer lag, dead letter queue issues, message backlogs, and flow bottlenecks to restore reliable message delivery.
---
## TL;DR Checklist
- [ ] Verify queue connectivity with basic connection test for each broker
- [ ] Check consumer group status and identify lagging consumers
- [ ] Examine dead letter queue (DLQ) for failed message patterns
- [ ] Review message throughput metrics (inbound vs outbound rates)
- [ ] Validate message visibility timeout settings against processing time
- [ ] Analyze partition or queue distribution for load imbalance
- [ ] Trace message flow using correlation IDs or message headers
- [ ] Check broker logs for errors, warnings, or connection drops
---
## When to Use
Use this skill when:
- Messages are piling up in queues and consumers aren't processing them
- Consumer lag metrics show increasing delays in message processing
- Messages appear in dead letter queues without clear error patterns
- Distributed system messages are disappearing or duplicating unexpectedly
- Queue connection errors or timeouts occur in production logs
- Message ordering guarantees aren't being maintained across consumers
---
## When NOT to Use
Avoid this skill for:
- Simple application logging issues — use `agent-logging-debugging` instead
- Database query performance problems — use `agent-database-admin` instead
- Network connectivity outside message broker ports — use `cncf-kubernetes-debugging` for infrastructure issues
- Application code bugs that don't involve message queue operations
- Authentication/authorization issues — verify IAM roles, ACLs, or user permissions separately
---
## Core Workflow
1. **Initial Diagnosis** — Gather baseline metrics: queue depths, consumer counts, message rates. **Checkpoint:** Confirm whether issue is latency (slow processing) or throughput (backlog accumulation).
2. **Consumer Health Check** — Verify all consumers are connected, active, and not in rebalance state. **Checkpoint:** Identify any consumers that are offline or stuck in partition assignment.
3. **Dead Letter Queue Analysis** — Examine DLQ contents to identify failure patterns (serialization errors, business rule violations, infrastructure failures). **Checkpoint:** Determine if failures are transient (retry) or persistent (data/model issue).
4. **Message Flow Tracing** — Use correlation IDs or message headers to track specific messages through the system. **Checkpoint:** Locate exactly where messages are being dropped, duplicated, or delayed.
5. **Configuration Review** — Validate broker settings: visibility timeouts, retention policies, replication factors, prefetch counts. **Checkpoint:** Ensure settings match expected processing characteristics.
6. **Resolution Implementation** — Apply fixes: scale consumers, adjust timeouts, clear DLQ after analysis, restart stuck consumers. **Checkpoint:** Verify metrics improve within expected time window after changes.
---
## Implementation Patterns
### Pattern 1: Kafka Consumer Lag Monitoring
Monitor consumer group lag to detect processing delays.
```bash
# Check consumer group lag for all topics
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--list --exclude-internal-topics | \
xargs -I {} kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group {}
# Detailed lag breakdown by partition
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group my-consumer-group
# ❌ BAD — checking only current offset without lag context
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic my-topic --from-beginning --max-messages 1
# ✅ GOOD — monitoring lag over time with timestamp
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group my-consumer-group | \
awk 'NR>3 { lag += $5 } END { print "Total Lag:", lag }'
```
---
### Pattern 2: Kafka Topic and Partition Analysis
Investigate topic health and partition distribution.
```bash
# List all topics with detailed information
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe --topic my-topic
# Check partition leader distribution
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe | awk '/Partition:/{p=$2} /Leader:/{l=$4} END{print "Partitions:", p, "Leaders:", l}'
# ✅ BAD — assuming all partitions are balanced
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe | grep -v "Leader: 0"
# ✅ GOOD — identifying partition imbalance
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe | awk '/Leader:/ {leaders[$4]++} END {for (l in leaders) print l, leaders[l]}'
```
---
### Pattern 3: RabbitMQ Queue Health Checks
Monitor RabbitMQ queue depths and consumer status.
```bash
# List all queues with message counts
rabbitmqctl list_queues name messages messages_ready messages_unacknowledged
# Check specific queue details
rabbitmqctl list_queues name messages messages_ready messages_unacknowledged \
consumers consumer_utilisation
# ✅ BAD — only checking total messages, ignoring unacknowledged
rabbitmqctl list_queues name messages
# ✅ GOOD — identifying unacknowledged message buildup
rabbitmqctl list_queues name messages_unacknowledged | \
awk '$2 > 1000 { print "Potential issue:", $1 }'
```
---
### Pattern 4: RabbitMQ Exchange and Binding Inspection
Debug message routing through exchanges and bindings.
```bash
# List all exchanges
rabbitmqctl list_exchanges name type durable internal
# List bindings for a specific exchange
rabbitmqctl list_bindings source_name destination_name destination_type routing_key
# ✅ BAD — not checking if bindings exist for expected routes
rabbitmqctl list_bindings
# ✅ GOOD — verifying binding exists for message routing
rabbitmqctl list_bindings | grep "my-exchange.*my-queue"
```
---
### Pattern 5: SQS Message Visibility and DLQ Handling
Debug SQS message visibility timeout and dead letter queue issues.
```bash
# Check queue attributes including visibility timeout
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names All
# List dead letter queues and their source queues
aws sqs list-queues --query "QueueUrls[?contains(@, 'DLQ')]"
# ✅ BAD — not checking visibility timeout against processing time
aws sqs send-message --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--message-body "test"
# ✅ GOOD — calculating appropriate visibility timeout
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names VisibilityTimeout | \
jq '.Attributes.VisibilityTimeout > (expected_processing_time * 3)'
```
---
### Pattern 6: Dead Letter Queue Message Analysis
Analyze DLQ contents to identify failure patterns.
```bash
# Kafka: Read from DLQ topic
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic my-topic-dlq --from-beginning --max-messages 100
# RabbitMQ: Consume from dead letter exchange
rabbitmqadmin --vhost=/ get queue=my-queue.DLQ count=10
# SQS: Read messages from DLQ
aws sqs receive-message --queue-url https://sqs.region.amazonaws.com/123456/MyQueueDLQ \
--max-number-of-messages 10
# ✅ BAD — clearing DLQ without analysis
aws sqs purge-queue --queue-url https://sqs.region.amazonaws.com/123456/MyQueueDLQ
# ✅ GOOD — analyzing DLQ messages for patterns
aws sqs receive-message --queue-url https://sqs.region.amazonaws.com/123456/MyQueueDLQ \
--max-number-of-messages 10 | \
jq '.Messages[].Body' | \
grep -o '"error":"[^"]*"' | \
sort | uniq -c | sort -rn
```
---
### Pattern 7: Message Flow Tracing with Correlation IDs
Track specific messages through the distributed system.
```bash
# Send message with correlation ID (Kafka)
kafka-console-producer.sh --bootstrap-server localhost:9092 \
--topic my-topic --property "parse.key=true" \
--property "key.separator=:" <<< "corr-123:{\"id\":\"corr-123\",\"data\":\"test\"}"
# Read with correlation ID filter
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic my-topic --from-beginning | \
jq -r select(.id == "corr-123")
# ✅ BAD — no correlation ID in message headers
kafka-console-producer.sh --bootstrap-server localhost:9092 \
--topic my-topic <<< '{"data":"test"}'
# ✅ GOOD — end-to-end tracing with correlation ID
# Producer sends: {"correlationId":"req-456", ...}
# Consumer logs: "Processing req-456 - startTime: $(date +%s)"
# Logger stores: correlationId, timestamp, source, destination
```
---
### Pattern 8: Broker Connection and Health Verification
Verify connectivity and health of message broker infrastructure.
```bash
# Kafka: Check broker connectivity
kafka-broker-api-versions.sh --bootstrap-server localhost:9092
# Kafka: Test topic creation and message round-trip
kafka-topics.sh --bootstrap-server localhost:9092 \
--create --topic test-connection --partitions 1 --replication-factor 1
kafka-console-producer.sh --bootstrap-server localhost:9092 \
--topic test-connection <<< "test-message"
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic test-connection --from-beginning --timeout-ms 5000
# ✅ BAD — assuming broker is healthy without verification
# No connectivity check before production deployment
# ✅ GOOD — comprehensive broker health verification
kafka-broker-api-versions.sh --bootstrap-server localhost:9092 \
| grep -q "kafka" && echo "Broker healthy" || echo "Broker unhealthy"
```
---
## Additional Debugging Commands
### Kafka Advanced Troubleshooting
```bash
# Describe consumer group in detail
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group my-group --members
# List consumer group states
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--list | while read group; do
state=$(kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group "$group" 2>&1 | grep "State:" | head -1)
echo "$group: $state"
done
# Check log segments and retention
ls -lh /var/lib/kafka/data/my-topic-0/ | head -20
# Analyze log compaction status
kafka-log-dirs.sh --bootstrap-server localhost:9092 \
--describe --topic-sets my-topic:0
```
### RabbitMQ Advanced Troubleshooting
```bash
# List consumers with details
rabbitmqctl list_consumers queue=my-queue consumer_details
# Check policy application
rabbitmqctl list_policies
# Examine queue length over time (via management API)
curl -s http://localhost:15672/api/queues | jq '.[] | {name, messages, consumers}'
# Force queue synchronization
rabbitmqctl sync_queue my-queue
# Clear a specific queue
rabbitmqadmin purge queue=my-queue
```
### SQS Advanced Troubleshooting
```bash
# Check message age in queue
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names ApproximateAgeOfOldestMessage
# Test message visibility timeout behavior
aws sqs send-message --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--message-body "test" --delay-seconds 0
aws sqs receive-message --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--max-number-of-messages 1 --visibility-timeout 0
# Message should reappear after visibility timeout
# Check redrive policy for DLQ
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names RedrivePolicy
# List all SQS queues
aws sqs list-queues --query "QueueUrls[]"
```
### General Monitoring Commands
```bash
# Monitor queue depth in real-time (Kafka)
watch -n 5 "kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group my-group | grep -v 'GROUP' | awk '{lag+=\$5} END {print lag}'"
# RabbitMQ queue depth monitoring
watch -n 5 "rabbitmqctl list_queues name messages | grep -v 'done'"
# SQS message count monitoring
watch -n 5 "aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names ApproximateNumberOfMessages | jq '.Attributes.ApproximateNumberOfMessages'"
# Check broker disk space
df -h /var/lib/kafka /var/lib/rabbitmq
# Monitor broker logs for errors
tail -f /var/log/kafka/server.log | grep -E "(ERROR|WARN|FATAL)"
```
### Kafka Replication and Leader Election
```bash
# Check replication factor and ISR status
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe --topic my-topic | grep -E "ISR|Replicas"
# Trigger preferred leader election
kafka-leader-election.sh --bootstrap-server localhost:9092 \
--election-type preferred --topic my-topic
# List under-replicated partitions
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe | grep "Under-replicated"
# Check replica lag
kafka-replica-manager.sh --bootstrap-server localhost:9092 \
--command-config admin.properties --under-replicated-partitions
# List offline partitions
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe | grep "Offline"
```
### RabbitMQ Cluster and Federation
```bash
# Check cluster status
rabbitmqctl cluster_status
# List nodes in cluster
rabbitmqctl list_nodes
# Check federation upstreams
rabbitmqctl list_federation_upstreams
# List federation links
rabbitmqctl list_federation_links
# CheckShovel status
rabbitmqctl list_shovels
# List virtual hosts
rabbitmqctl list_vhosts
# Check memory usage
rabbitmqctl report | grep -A 5 "Memory"
```
### SQS Advanced Message Management
```bash
# Set queue policy for DLQ redrive
aws sqs set-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attributes '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"arn:aws:sqs:region:123456:MyQueueDLQ\",\"maxReceiveCount\":\"3\"}"}'
# Test message delay
aws sqs send-message --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--message-body "delayed-message" --delay-seconds 60
# Check message retention
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names MessageRetentionPeriod
# List queue attributes
aws sqs list-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names All
# Get queue ARN
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names QueueArn
```
### Performance and Throughput Testing
```bash
# Kafka: Generate load test
kafka-producer-perf-test.sh --topic test-topic \
--num-records 10000 --record-size 1024 \
--throughput 1000 --producer-props bootstrap.servers=localhost:9092
# Kafka: Consumer performance test
kafka-consumer-perf-test.sh --broker-list localhost:9092 \
--topic test-topic --messages 10000
# RabbitMQ: Message rate test
rabbitmq-perf-test.sh --host localhost --users 10 --queue my-queue \
--messages 10000 --payload 100
# SQS: Throughput test
for i in {1..1000}; do
aws sqs send-message --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--message-body "test-$i" &
done
wait
```
### Troubleshooting Consumer Issues
```bash
# Kafka: Check consumer offset lag
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group my-group | awk 'NR>3 {total_lag+=$5} END {print total_lag}'
# Kafka: Reset consumer group offset
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--group my-group --topic my-topic --reset-offsets --to-latest --execute
# Kafka: Describe consumer group members
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group my-group --members
# Kafka: Check consumer heartbeat status
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group my-group --members | grep "Heartbeat"
# RabbitMQ: Check consumer count per queue
rabbitmqctl list_queues name consumers | awk '$2 > 0 {print}'
# SQS: Check long-polling configuration
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names ReceiveMessageWaitTimeSeconds
```
### Security and ACL Verification
```bash
# Kafka: List ACLs
kafka-acls.sh --authorizer-properties zookeeper=localhost:2181 \
--list --topic my-topic
# Kafka: Add consumer ACL
kafka-acls.sh --authorizer-properties zookeeper=localhost:2181 \
--add --allow-principal User:consumer --operation READ \
--topic my-topic --group my-group
# RabbitMQ: List permissions
rabbitmqctl list_permissions
# RabbitMQ: List user permissions
rabbitmqctl list_user_permissions my-user
# SQS: Get queue policy
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names Policy
# SQS: Test policy with IAM
aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456/MyQueue \
--attribute-names policy --output json
```
---
## Constraints
### MUST DO
- Always verify consumer group state before investigating message processing issues
- Correlate DLQ messages with production logs using correlation IDs
- Check visibility timeout settings against actual message processing duration
- Monitor both inbound and outbound message rates to detect bottlenecks
- Verify broker connectivity before assuming application-level issues
- Use the `kafka-broker-api-versions.sh` command to confirm broker health
### MUST NOT DO
- Clear dead letter queues without first analyzing failure patterns
- Increase partition count without understanding message key distribution
- Ignore consumer rebalance events — they indicate instability
- Set visibility timeout shorter than expected maximum processing time
- Assume message loss without tracing correlation IDs through the system
- Disable DLQ functionality to "fix" message accumulation
---
## Output Template
When debugging a message queue issue, the output must contain:
1. **Issue Classification** — Is this latency (slow processing) or throughput (backlog)? Include current queue depth and consumer count.
2. **Root Cause Analysis** — Based on diagnostic results, identify the specific failure mode (e.g., "consumer stuck in rebalance", "DLQ filling due to deserialization errors").
3. **Immediate Actions Taken** — List all commands executed and their output, including any fixes applied.
4. **Verification Steps** — Commands to confirm the issue is resolved and metrics have improved.
5. **Prevention Measures** — Configuration changes or monitoring additions to prevent recurrence.
---
## Related Skills
| Skill | Purpose |
|---|---|
| `agent-message-queue-troubleshooting` | Broader message queue diagnostics including pattern detection and architectural analysis |
| `agent-database-admin` | Database-related issues that may affect message queue processing (transaction failures, connection pools) |
| `cncf-kubernetes-debugging` | Kubernetes infrastructure issues affecting message queue deployment (pod crashes, network policies) |
| `cncf-prometheus` | Metrics collection and alerting for message queue health monitoring |
| `coding-code-review` | Reviewing message queue client code for proper error handling and retry patterns |
---
## References
- **Kafka Documentation**: https://kafka.apache.org/documentation/
- **RabbitMQ Documentation**: https://www.rabbitmq.com/documentation.html
- **AWS SQS Documentation**: https://docs.aws.amazon.com/sqs/
- **Kafka CLI Tools**: `kafka-consumer-groups.sh`, `kafka-topics.sh`, `kafka-broker-api-versions.sh`
- **RabbitMQ CLI Tools**: `rabbitmqctl`, `rabbitmqadmin`
- **AWS CLI**: `aws sqs` commands for SQS management
---
> 📖 skill: message-queue-debuggingMore Debugging skills
diagnosing-bugs
mattpocock/skills
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.
explore-code
lllllllama/rigorpilot-skills
Rigor Improve implementation leaf skill for auditable candidate implementation in deep learning research repositories. Use when the researcher explicitly authorizes exploratory work on an isolated branch or worktree to transplant modules, adapt a backbone, add LoRA or adapter layers, replace a head, or stitch together meaningful low-risk migration ideas with rollback-aware records in `explore_outputs/`. Do not use for end-to-end exploration orchestration on top of `current_research`, trusted baseline reproduction, conservative debugging, environment setup, verified contribution claims, or default repository analysis.
safe-debug
lllllllama/rigorpilot-skills
Rigor Debug / Rigor Audit skill for deep learning research work. Use when the user pastes a traceback, terminal error, CUDA OOM, checkpoint load failure, shape mismatch, NaN loss symptom, or training failure and wants conservative diagnosis before any patching, with debug fixes clearly separated from research contributions. Do not use for broad refactoring, speculative adaptation, automatic exploratory patching, or general repository familiarization.

