67 lines
1.9 KiB
Ruby
67 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Genera resúmenes de información para poder mostrar estadísticas y se
|
|
# corre regularmente a sí misma.
|
|
class StatCollectionJob < ApplicationJob
|
|
STAT_NAME = 'stat_collection_job'
|
|
|
|
def perform(site_id:, once: true)
|
|
@site = Site.find site_id
|
|
|
|
scope.rollup('builds', **options)
|
|
|
|
scope.rollup('space_used', **options) do |rollup|
|
|
rollup.average(:bytes)
|
|
end
|
|
|
|
scope.rollup('build_time', **options) do |rollup|
|
|
rollup.average(:seconds)
|
|
end
|
|
|
|
# XXX: Es correcto promediar promedios?
|
|
Stat::INTERVALS.reduce do |previous, current|
|
|
rollup(name: 'builds', interval_previous: previous, interval: current)
|
|
rollup(name: 'space_used', interval_previous: previous, interval: current, operation: :average)
|
|
rollup(name: 'build_time', interval_previous: previous, interval: current, operation: :average)
|
|
|
|
current
|
|
end
|
|
|
|
# Registrar que se hicieron todas las recolecciones
|
|
site.stats.create! name: STAT_NAME
|
|
|
|
run_again! unless once
|
|
end
|
|
|
|
private
|
|
|
|
# Genera un rollup recursivo en base al período anterior y aplica una
|
|
# operación.
|
|
#
|
|
# @return [NilClass]
|
|
def rollup(name:, interval_previous:, interval:, operation: :sum)
|
|
Rollup.where(name: name, interval: interval_previous)
|
|
.where_dimensions(site_id: site.id)
|
|
.group("dimensions->'site_id'")
|
|
.rollup(name, interval: interval, update: true) do |rollup|
|
|
rollup.try(:operation, :value)
|
|
end
|
|
end
|
|
|
|
# Los registros a procesar
|
|
#
|
|
# @return [ActiveRecord::Relation]
|
|
def scope
|
|
@scope ||= site.build_stats
|
|
.jekyll
|
|
.where('created_at => ?', beginning_of_interval)
|
|
.group(:site_id)
|
|
end
|
|
|
|
# Las opciones por defecto
|
|
#
|
|
# @return [Hash]
|
|
def options
|
|
@options ||= { interval: starting_interval, update: true }
|
|
end
|
|
end
|