module SnowmanIO::Aggregate
Public Class Methods
metrics_aggregate_5min()
click to toggle source
Aggregate
5mins metrics
# File lib/snowman-io/aggregate.rb, line 4 def self.metrics_aggregate_5min Metric.all.each do |metric| aggr = {} # collect metric.data_points.each do |point| key = Utils.floor_5min(point.at) aggr[key] ||= [] aggr[key] << point.value end # aggregrate aggr.each do |at, values| metric.aggregations.where(precision: "5min", at: at).first_or_create!.update_attributes!( count: values.length, min: values.min, avg: Utils.avg(values), up: Utils.up(values), max: values.max, sum: values.inject(&:+) ) end end end
metrics_aggregate_daily()
click to toggle source
Aggregate
daily metrics
# File lib/snowman-io/aggregate.rb, line 58 def self.metrics_aggregate_daily Metric.all.each do |metric| out = {} metric.aggregations.where(precision: "hour").each do |aggr| key = aggr.at.beginning_of_day out[key] ||= {"count" => 0, "avg" => 0, "up" => 0, "sum" => 0} out[key]["count"] += aggr["count"] out[key]["min"] = aggr["min"] if !out[key]["min"] || out[key]["min"] > aggr["min"] out[key]["avg"] += aggr["avg"]*aggr["count"] out[key]["up"] += aggr["up"]*aggr["count"] out[key]["max"] = aggr["max"] if !out[key]["max"] || out[key]["max"] < aggr["max"] out[key]["sum"] += aggr["sum"] end # normalize out.each do |__, chunk| chunk["avg"] /= chunk["count"] chunk["up"] /= chunk["count"] end # store out.each do |at, chunk| metric.aggregations.where(precision: "daily", at: at).first_or_create!.update_attributes!(chunk) end end # for meteor App.all.each(&:touch) end
metrics_aggregate_hour()
click to toggle source
Aggregate
hour metrics
# File lib/snowman-io/aggregate.rb, line 30 def self.metrics_aggregate_hour Metric.all.each do |metric| out = {} metric.aggregations.where(precision: "5min").each do |aggr| key = aggr.at.beginning_of_hour out[key] ||= {"count" => 0, "avg" => 0, "up" => 0, "sum" => 0} out[key]["count"] += aggr["count"] out[key]["min"] = aggr["min"] if !out[key]["min"] || out[key]["min"] > aggr["min"] out[key]["avg"] += aggr["avg"]*aggr["count"] out[key]["up"] += aggr["up"]*aggr["count"] out[key]["max"] = aggr["max"] if !out[key]["max"] || out[key]["max"] < aggr["max"] out[key]["sum"] += aggr["sum"] end # normalize out.each do |__, chunk| chunk["avg"] /= chunk["count"] chunk["up"] /= chunk["count"] end # store out.each do |at, chunk| metric.aggregations.where(precision: "hour", at: at).first_or_create!.update_attributes!(chunk) end end end
metrics_clean_old()
click to toggle source
Clean old records
# File lib/snowman-io/aggregate.rb, line 89 def self.metrics_clean_old now = Time.now DataPoint.where(:at.lt => Utils.floor_5min(now - 6.minutes)).delete_all SnowmanIO::Aggregation.where(precision: "5min", :at.lt => (now - 2.hours).beginning_of_hour).delete_all SnowmanIO::Aggregation.where(precision: "hour", :at.lt => (now - 25.hours).beginning_of_day).delete_all SnowmanIO::Aggregation.where(precision: "daily", :at.lt => (now - 365.days).beginning_of_day).delete_all end