5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-16 19:36:22 +00:00

recolectar información acumulándola

This commit is contained in:
f 2022-04-29 15:04:42 -03:00
parent 752935afb4
commit 957c810aea

View file

@ -26,23 +26,43 @@ class UriCollectionJob < PeriodicJob
stat = site.stats.create! name: STAT_NAME stat = site.stats.create! name: STAT_NAME
beginning = beginning_of_interval 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| site.hostnames.each do |host|
break if stop? break if stop?
dimensions = { host: host }
uris.each do |uri| uris.each do |uri|
break if stop? 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', beginning, **dimensions)
rollup('host|uri|referer', beginning, host: host, uri: uri, http_referer: http_referer) reduce_rollup('host|uri', beginning, **dimensions)
end
end 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| 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
end end
@ -53,8 +73,7 @@ class UriCollectionJob < PeriodicJob
private private
# Generar un rollup a partir de unas dimensiones que también sirven de # Generar un rollup de access logs
# filtro.
# #
# @param :name [String] # @param :name [String]
# @param :beginning [Time] # @param :beginning [Time]
@ -67,9 +86,16 @@ class UriCollectionJob < PeriodicJob
.non_robots .non_robots
.group(*dimensions.keys) .group(*dimensions.keys)
.rollup(name, interval: starting_interval, update: true) .rollup(name, interval: starting_interval, update: true)
end
# Reducir las estadísticas calculadas aplicando un rollup sobre el # Reducir las estadísticas calculadas aplicando un rollup sobre el
# intervalo más amplio. # 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| Stat::INTERVALS.reduce do |previous, current|
recursive_rollup(name: name, recursive_rollup(name: name,
interval_previous: previous, interval_previous: previous,
@ -80,6 +106,8 @@ class UriCollectionJob < PeriodicJob
# Devolver el intervalo actual # Devolver el intervalo actual
current current
end end
nil
end end
def stat_name def stat_name