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