# 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