Module: Pigeon::HealthCheck::Queue

Defined in:
lib/pigeon/health_check/queue.rb

Overview

Queue health check functionality

Class Method Summary collapse

Class Method Details

.healthHash

Check the health of the queue

Returns:

  • (Hash)

    Health check result



9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/pigeon/health_check/queue.rb', line 9

def self.health
  # Get queue statistics
  stats = statistics

  # Determine overall status based on queue depth and age
  status, message = status(stats)

  {
    component: "queue",
    status: status,
    message: message,
    details: stats
  }
end

.queue_status_message(pending_count, age_seconds) ⇒ String

Generate queue status message

Parameters:

  • pending_count (Integer)

    Number of pending messages

  • age_seconds (Integer)

    Age of oldest message in seconds

Returns:

  • (String)

    Status message



64
65
66
# File 'lib/pigeon/health_check/queue.rb', line 64

def self.queue_status_message(pending_count, age_seconds)
  "Queue has #{pending_count} pending messages, oldest is #{age_seconds} seconds old"
end

.statisticsHash

Get queue statistics

Returns:

  • (Hash)

    Queue statistics



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/pigeon/health_check/queue.rb', line 26

def self.statistics
  pending_count = Pigeon.count_outbox_messages_by_status("pending")
  failed_count = Pigeon.count_outbox_messages_by_status("failed")

  # Get the oldest pending message
  oldest_pending = Pigeon.find_oldest_outbox_message_by_status("pending")
  oldest_pending_age = oldest_pending ? (Time.now - oldest_pending.created_at).to_i : 0

  {
    pending_count: pending_count,
    failed_count: failed_count,
    oldest_pending_age_seconds: oldest_pending_age,
    oldest_pending_id: oldest_pending&.id
  }
end

.status(stats) ⇒ Array<String, String>

Determine queue status

Parameters:

  • stats (Hash)

    Queue statistics

Returns:

  • (Array<String, String>)

    Status and message



45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/pigeon/health_check/queue.rb', line 45

def self.status(stats)
  pending_count = stats[:pending_count]
  age_seconds = stats[:oldest_pending_age_seconds]

  message = queue_status_message(pending_count, age_seconds)

  if pending_count > 1000 || age_seconds > 3600 # 1 hour
    ["critical", message]
  elsif pending_count > 100 || age_seconds > 300 # 5 minutes
    ["warning", message]
  else
    ["healthy", "Queue is processing normally"]
  end
end