Class: BetterService::Subscribers::StatsSubscriber

Inherits:
Object
  • Object
show all
Defined in:
lib/better_service/subscribers/stats_subscriber.rb

Overview

StatsSubscriber - Built-in subscriber that collects service statistics

This subscriber tracks execution metrics for all services:

  • Total executions

  • Success/failure counts

  • Average duration

  • Cache hit rate

Examples:

Enable in initializer

BetterService.configure do |config|
  config.stats_subscriber_enabled = true
end

Access statistics

BetterService::Subscribers::StatsSubscriber.stats
# => {
#   "ProductsIndexService" => {
#     executions: 150,
#     successes: 148,
#     failures: 2,
#     total_duration: 4500.0,
#     avg_duration: 30.0,
#     cache_hits: 120,
#     cache_misses: 30
#   }
# }

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.statsHash (readonly)

Storage for service statistics

Returns:

  • (Hash)

    Statistics hash



36
37
38
# File 'lib/better_service/subscribers/stats_subscriber.rb', line 36

def stats
  @stats
end

.subscriptionsArray<ActiveSupport::Notifications::Fanout::Subscriber> (readonly)

Storage for ActiveSupport::Notifications subscriptions

Returns:

  • (Array<ActiveSupport::Notifications::Fanout::Subscriber>)


41
42
43
# File 'lib/better_service/subscribers/stats_subscriber.rb', line 41

def subscriptions
  @subscriptions
end

Class Method Details

.attachvoid

This method returns an undefined value.

Attach the subscriber to ActiveSupport::Notifications

This method is called automatically when subscriber is enabled.



48
49
50
51
52
53
# File 'lib/better_service/subscribers/stats_subscriber.rb', line 48

def attach
  reset!
  @subscriptions ||= []
  subscribe_to_service_events
  subscribe_to_cache_events
end

.reset!void

This method returns an undefined value.

Reset all statistics

Useful for testing or periodic reset in production.



60
61
62
63
64
65
66
67
68
69
# File 'lib/better_service/subscribers/stats_subscriber.rb', line 60

def reset!
  # Unsubscribe from all existing subscriptions
  if @subscriptions
    @subscriptions.each do |subscription|
      ActiveSupport::Notifications.unsubscribe(subscription)
    end
  end
  @subscriptions = []
  @stats = {}
end

.stats_for(service_name) ⇒ Hash?

Get statistics for a specific service

Parameters:

  • service_name (String)

    Name of service class

Returns:

  • (Hash, nil)

    Service statistics or nil if not found



75
76
77
# File 'lib/better_service/subscribers/stats_subscriber.rb', line 75

def stats_for(service_name)
  @stats[service_name]
end

.summaryHash

Get statistics summary across all services

Returns:

  • (Hash)

    Aggregated statistics



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/better_service/subscribers/stats_subscriber.rb', line 82

def summary
  total_executions = @stats.values.sum { |s| s[:executions] }
  total_successes = @stats.values.sum { |s| s[:successes] }
  total_failures = @stats.values.sum { |s| s[:failures] }
  total_duration = @stats.values.sum { |s| s[:total_duration] }
  total_cache_hits = @stats.values.sum { |s| s[:cache_hits] }
  total_cache_misses = @stats.values.sum { |s| s[:cache_misses] }

  {
    total_services: @stats.keys.size,
    total_executions: total_executions,
    total_successes: total_successes,
    total_failures: total_failures,
    success_rate: total_executions > 0 ? (total_successes.to_f / total_executions * 100).round(2) : 0,
    avg_duration: total_executions > 0 ? (total_duration / total_executions).round(2) : 0,
    cache_hit_rate: (total_cache_hits + total_cache_misses) > 0 ? (total_cache_hits.to_f / (total_cache_hits + total_cache_misses) * 100).round(2) : 0
  }
end