recolectar estadísticas una vez por hora
This commit is contained in:
parent
0342455955
commit
306d1ed983
1 changed files with 66 additions and 0 deletions
66
app/jobs/stat_collection_job.rb
Normal file
66
app/jobs/stat_collection_job.rb
Normal file
|
@ -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
|
Loading…
Reference in a new issue