# frozen_string_literal: true # Genera resúmenes de información para poder mostrar estadísticas y se # corre regularmente a sí misma. class StatCollectionJob < PeriodicJob include RecursiveRollup STAT_NAME = 'stat_collection_job' def perform(site_id:, once: true) @site = Site.find site_id # Registrar que se hicieron todas las recolecciones stat = site.stats.create! name: STAT_NAME beginning = beginning_of_interval 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| opts = { interval_previous: previous, interval: current, beginning: beginning, dimensions: { site_id: site.id } } recursive_rollup(name: 'builds', **opts) recursive_rollup(name: 'space_used', operation: :average, **opts) recursive_rollup(name: 'build_time', operation: :average, **opts) current end stat.touch run_again! unless once end private # 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 def stat_name STAT_NAME end end