From 306d1ed983f69456a219a6c5fae47ea5e98ff8b1 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 9 Oct 2021 14:45:34 -0300 Subject: [PATCH] =?UTF-8?q?recolectar=20estad=C3=ADsticas=20una=20vez=20po?= =?UTF-8?q?r=20hora?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/stat_collection_job.rb | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 app/jobs/stat_collection_job.rb diff --git a/app/jobs/stat_collection_job.rb b/app/jobs/stat_collection_job.rb new file mode 100644 index 00000000..c36d036c --- /dev/null +++ b/app/jobs/stat_collection_job.rb @@ -0,0 +1,66 @@ +# 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 + class CrontabException < StandardError; end + + # Descartar y notificar si pasó algo más. + # + # XXX: En realidad deberíamos seguir reintentando? + discard_on(Exception) do |_, error| + ExceptionNotifier.notify_exception error + end + + # Correr indefinidamente una vez por hora. + # + # XXX: El orden importa, si el descarte viene después, nunca se va a + # reintentar. + retry_on(StatCollectionJob::CrontabException, wait: 1.hour, attempts: Float::INFINITY) + + COLUMNS = %i[uri].freeze + + def perform(once: false) + Stat::INTERVALS.each do |interval| + options = { interval: interval } + + # Visitas por hostname + AccessLog.completed_requests.group(:host).rollup('host', **options) + + combined_columns **options + stats_by_site **options + end + + # Registrar que se hicieron todas las recolecciones + Stat.create! + + raise CrontabException unless once + end + + private + + # Combinación de columnas + def combined_columns(**options) + COLUMNS.each do |column| + AccessLog.completed_requests.group(:host, column).rollup("hostname|#{column}", **options) + end + end + + # Uso de recursos por cada sitio. + # + # XXX: En realidad se agrupan por el deploy_id, que siempre será el + # del DeployLocal. + def stats_by_site(**options) + Site.find_each do |site| + site.build_stats.jekyll.group(:deploy_id).rollup('builds', **options) + + site.build_stats.jekyll.group(:deploy_id).rollup('space_used', **options) do |rollup| + rollup.average(:bytes) + end + + site.build_stats.jekyll.group(:deploy_id).rollup('build_time', **options) do |rollup| + rollup.average(:seconds) + end + end + end +end