From 957c810aea703d7c877ca5521fca8a9c8f9f306f Mon Sep 17 00:00:00 2001 From: f Date: Fri, 29 Apr 2022 15:04:42 -0300 Subject: [PATCH] =?UTF-8?q?recolectar=20informaci=C3=B3n=20acumul=C3=A1ndo?= =?UTF-8?q?la?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/uri_collection_job.rb | 48 +++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/app/jobs/uri_collection_job.rb b/app/jobs/uri_collection_job.rb index 12f25eb6..2939b9f9 100644 --- a/app/jobs/uri_collection_job.rb +++ b/app/jobs/uri_collection_job.rb @@ -26,23 +26,43 @@ class UriCollectionJob < PeriodicJob stat = site.stats.create! name: STAT_NAME beginning = beginning_of_interval + # Recorremos todos los hostnames y uris posibles y luego agrupamos + # recursivamente para no tener que recalcular, asumiendo que es más + # rápido buscar en los rollups indexados que en la tabla en bruto. + # + # Los referers solo se agrupan por host. site.hostnames.each do |host| break if stop? + dimensions = { host: host } + uris.each do |uri| break if stop? - rollup('host|uri', beginning, host: host, uri: uri) + dimensions[:uri] = uri - AccessLog.where(host: host, uri: uri).distinct(:http_referer).pluck(:http_referer).each do |http_referer| - rollup('host|uri|referer', beginning, host: host, uri: uri, http_referer: http_referer) - end + rollup('host|uri', beginning, **dimensions) + reduce_rollup('host|uri', beginning, **dimensions) end - rollup('host', beginning, host: host) + dimensions.delete(:uri) + # Reducir todas las visitas a cantidad de visitas por host + recursive_rollup(name: 'host|uri', + new_name: 'host', + interval_previous: starting_interval, + interval: starting_interval, + dimensions: dimensions) + + # Acumular por mes y año + reduce_rollup('host', beginning, **dimensions) + + # Obtener orígenes de visitas por host AccessLog.where(host: host).distinct(:http_referer).pluck(:http_referer).each do |http_referer| - rollup('host|referer', beginning, host: host, http_referer: http_referer) + dimensions[:http_referer] = http_referer + + rollup('host|referer', beginning, **dimensions) + reduce_rollup('host|referer', beginning, **dimensions) end end @@ -53,8 +73,7 @@ class UriCollectionJob < PeriodicJob private - # Generar un rollup a partir de unas dimensiones que también sirven de - # filtro. + # Generar un rollup de access logs # # @param :name [String] # @param :beginning [Time] @@ -67,9 +86,16 @@ class UriCollectionJob < PeriodicJob .non_robots .group(*dimensions.keys) .rollup(name, interval: starting_interval, update: true) + end - # Reducir las estadísticas calculadas aplicando un rollup sobre el - # intervalo más amplio. + # Reducir las estadísticas calculadas aplicando un rollup sobre el + # intervalo más amplio. + # + # @param :name [String] + # @param :beginning [Time] + # @param :dimensions [Hash] + # @return [nil] + def reduce_rollup(name, beginning, **dimensions) Stat::INTERVALS.reduce do |previous, current| recursive_rollup(name: name, interval_previous: previous, @@ -80,6 +106,8 @@ class UriCollectionJob < PeriodicJob # Devolver el intervalo actual current end + + nil end def stat_name