Class: RequestResponseStats::ReqResStat

Inherits:
Object
  • Object
show all
Includes:
Mongoid::Document
Defined in:
lib/request_response_stats/req_res_stat.rb

Constant Summary collapse

DEFAULT_STATS_GRANULARITY =
1.hour
PERCISION =
2

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_avg(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY) ⇒ Object

wrapper around get_stat for :avg stat for more info, check documentation for get_stat



88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/request_response_stats/req_res_stat.rb', line 88

def get_avg(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY)
  data = get_stat("sum", key, start_time, end_time, granularity)
  data.each do |e|
    e[:stat_type] = "avg"
    if e[:count] != 0
      e[:data] = (e[:data] * 1.0 / e[:count]).try(:round, PERCISION)
    else
      e[:data] = 0
    end

  end
  data
end

.get_details(key, start_time, end_time, stat_type = nil, granularity = DEFAULT_STATS_GRANULARITY) ⇒ Object

instead of aggregated values (such as in get_stat), it returns grouped values for given key, given granularity level, and given start_time and end_time set stat_type as nil to return grouped but uncompacted data otherwise, you can set stat_type as :sum, :max, :min, :avg to get grouped data TODO: Ignore start_time and end_time if a time-based collection is passed TODO: Optimize get_time_ranges to not to calculate time_ranges again and again for same start_time and end_time (that is, for same time-based collection



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/request_response_stats/req_res_stat.rb', line 109

def get_details(key, start_time, end_time, stat_type = nil, granularity = DEFAULT_STATS_GRANULARITY)
  # get ungrouped data
  stat_type = stat_type.to_s.to_sym if stat_type
  key = key.to_s.to_sym
  relevant_records = get_within(start_time, end_time)
  time_ranges = get_time_ranges(start_time, end_time, granularity)
  stats = time_ranges.map do |time_range|
    data_for_time_range = relevant_records.get_within(*time_range.values).map{ |r|
      {server_plus_api: r.server_plus_api, data: r[key], key_name: r.key_name}
    }
    {data: data_for_time_range, **time_range}
  end

  # grouping data by :server_plus_api
  stats.each do |r|
    data = r[:data]
    data = data.map{ |e| {server_plus_api: e[:server_plus_api], data: e[:data]} }
    data = data.group_by { |e| e[:server_plus_api] }
    r[:data] = data
  end

  # calculating grouped value based on stat_type
  if stat_type
    if [:sum, :min, :max].include? stat_type

      # calculate grouped value
      stats.each do |r|
        data = r[:data]
        data = data.map do |k, v|
          # {server_plus_api: k, data: v.map{|e| e[:data]}}
          element_data = v.map{|e| e[:data]}
          {server_plus_api: k, count: element_data.size, data: element_data.compact.public_send(stat_type).try(:round, PERCISION)}
        end
        r[:data] = data
      end

      stats
    elsif stat_type == :avg
      data = get_details(key, start_time, end_time, stat_type = :sum, granularity)
      data.each do |r|
        r[:data].each do |e|
          e[:data] = (e[:data] * 1.0 / e[:count]).try(:round, PERCISION)
        end
      end

      data
    else
      "This :stat_type is not supported"
    end
  else
    stats
  end
end

.get_max(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY) ⇒ Object

wrapper around get_stat for :max stat for more info, check documentation for get_stat



82
83
84
# File 'lib/request_response_stats/req_res_stat.rb', line 82

def get_max(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY)
  get_stat("max", key, start_time, end_time, granularity)
end

.get_min(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY) ⇒ Object

wrapper around get_stat for :min stat for more info, check documentation for get_stat



76
77
78
# File 'lib/request_response_stats/req_res_stat.rb', line 76

def get_min(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY)
  get_stat("min", key, start_time, end_time, granularity)
end

.get_sum(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY) ⇒ Object

wrapper around get_stat for :sum stat for more info, check documentation for get_stat



70
71
72
# File 'lib/request_response_stats/req_res_stat.rb', line 70

def get_sum(key, start_time, end_time, granularity = DEFAULT_STATS_GRANULARITY)
  get_stat("sum", key, start_time, end_time, granularity)
end

.get_within(start_time, end_time) ⇒ Object

Note: start_time and end_time are Time objects start_time in inclusive but end_time is not Use get_within with nil values for start_time and end_time to minimize database hits for same kind of queries on same date-range of data



60
61
62
63
64
65
66
# File 'lib/request_response_stats/req_res_stat.rb', line 60

def get_within(start_time, end_time)
  if start_time || end_time
    where(:start_time.gte => start_time, :end_time.lt => end_time)
  else
    all
  end
end

Instance Method Details

#server_plus_apiObject

returns a string identifying server_name, api_name, and api_verb



50
51
52
# File 'lib/request_response_stats/req_res_stat.rb', line 50

def server_plus_api
  [server_name, api_name, api_verb].join("_")
end