Module: SafeMemoize::PublicMetricsMethods

Included in:
InstanceMethods
Defined in:
lib/safe_memoize/public_metrics_methods.rb

Instance Method Summary collapse

Instance Method Details

#cache_hit_rateObject



115
116
117
118
# File 'lib/safe_memoize/public_metrics_methods.rb', line 115

def cache_hit_rate
  stats = cache_stats
  stats[:hit_rate]
end

#cache_metrics_resetObject



125
126
127
128
129
# File 'lib/safe_memoize/public_metrics_methods.rb', line 125

def cache_metrics_reset
  with_memo_lock do
    _reset_cache_metrics
  end
end

#cache_miss_rateObject



120
121
122
123
# File 'lib/safe_memoize/public_metrics_methods.rb', line 120

def cache_miss_rate
  stats = cache_stats
  stats[:miss_rate]
end

#cache_statsObject



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/safe_memoize/public_metrics_methods.rb', line 5

def cache_stats
  with_memo_lock do
    metrics = memo_metrics_store

    if metrics.empty?
      return {
        total_hits: 0,
        total_misses: 0,
        hit_rate: 0.0,
        miss_rate: 0.0,
        average_computation_time: 0.0,
        entries: []
      }
    end

    total_hits = metrics.values.sum { |m| m[:hits] }
    total_misses = metrics.values.sum { |m| m[:misses] }
    total_time = metrics.values.sum { |m| m[:total_time] }
    total_calls = total_hits + total_misses

    hit_rate = total_calls.zero? ? 0.0 : (total_hits.to_f / total_calls * 100).round(2)
    miss_rate = total_calls.zero? ? 0.0 : (total_misses.to_f / total_calls * 100).round(2)
    avg_time = total_misses.zero? ? 0.0 : (total_time / total_misses).round(6)

    entries = metrics.map do |cache_key, stats|
      method_name, args, _kwargs = cache_key
      entry_hit_rate = if (stats[:hits] + stats[:misses]).zero?
        0.0
      else
        (stats[:hits].to_f / (stats[:hits] + stats[:misses]) * 100).round(2)
      end

      {
        method: method_name,
        args: args,
        hits: stats[:hits],
        misses: stats[:misses],
        hit_rate: entry_hit_rate,
        computation_time: stats[:total_time].round(6)
      }
    end

    {
      total_hits: total_hits,
      total_misses: total_misses,
      hit_rate: hit_rate,
      miss_rate: miss_rate,
      average_computation_time: avg_time,
      entries: entries
    }
  end
end

#cache_stats_for(method_name) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/safe_memoize/public_metrics_methods.rb', line 58

def cache_stats_for(method_name)
  method_name = method_name.to_sym

  with_memo_lock do
    metrics = memo_metrics_store
    method_metrics = metrics.select { |key, _| key[0] == method_name }

    if method_metrics.empty?
      return {
        method: method_name,
        total_hits: 0,
        total_misses: 0,
        hit_rate: 0.0,
        miss_rate: 0.0,
        average_computation_time: 0.0,
        entries: []
      }
    end

    total_hits = method_metrics.values.sum { |m| m[:hits] }
    total_misses = method_metrics.values.sum { |m| m[:misses] }
    total_time = method_metrics.values.sum { |m| m[:total_time] }
    total_calls = total_hits + total_misses

    hit_rate = total_calls.zero? ? 0.0 : (total_hits.to_f / total_calls * 100).round(2)
    miss_rate = total_calls.zero? ? 0.0 : (total_misses.to_f / total_calls * 100).round(2)
    avg_time = total_misses.zero? ? 0.0 : (total_time / total_misses).round(6)

    entries = method_metrics.map do |cache_key, stats|
      _method, args, _kwargs = cache_key
      entry_hit_rate = if (stats[:hits] + stats[:misses]).zero?
        0.0
      else
        (stats[:hits].to_f / (stats[:hits] + stats[:misses]) * 100).round(2)
      end

      {
        args: args,
        hits: stats[:hits],
        misses: stats[:misses],
        hit_rate: entry_hit_rate,
        computation_time: stats[:total_time].round(6)
      }
    end

    {
      method: method_name,
      total_hits: total_hits,
      total_misses: total_misses,
      hit_rate: hit_rate,
      miss_rate: miss_rate,
      average_computation_time: avg_time,
      entries: entries
    }
  end
end