Improve statistic generation to avoid time calculation on request for statistic information

stats
Norore 1 year ago committed by aeris
parent 0a5589cfa5
commit 43a1097e45
  1. 27
      app/controllers/statistics_controller.rb
  2. 22
      app/javascript/js/stats/grades.js
  3. 34
      app/javascript/js/stats/index.js
  4. 1
      app/javascript/packs/application.js
  5. 18
      app/views/statistics/index.html.erb
  6. 21
      bin/stats
  7. 3
      config/routes.rb
  8. 1
      db/schema.rb

@ -1,30 +1,11 @@
class StatisticsController < ApplicationController
def index; end
def grade
@services = Analysis.where(service: params.fetch(:service))
TODAY = Date.today
def show
service = params.fetch :id
respond_to do |format|
format.html
format.json do
grades = Hash.new 0
@services.each do |service|
if (result = service.result)
result.each do |r|
next unless (grade = r['grade'])
grades[grade] += 1
end
end
end
json = {
grades: {
labels: grades.keys,
dataset: grades
}
}
json = Stat.find_by(name: "grades_for_#{service}", date: TODAY).dataset
render json: json, status: :ok
end
end

@ -2,13 +2,13 @@ document.addEventListener("DOMContentLoaded", () => {
let gradesChart = document.getElementById('gradesChart').getContext('2d')
let background = [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
]
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
]
let createGradesChart = new Chart(gradesChart, {
type: 'bar'
@ -24,12 +24,10 @@ document.addEventListener("DOMContentLoaded", () => {
}).then((response) => {
response.json().then((data) => {
if (response.status === 200) {
let grades = data["grades"]["dataset"]
createGradesChart.data.labels = data["grades"]["labels"]
createGradesChart.data.labels = data["labels"]
createGradesChart.data.datasets = [{
label: 'Count',
data: grades,
label: 'Number',
data: data["dataset"],
backgroundColor: background
}]
createGradesChart.update()

@ -0,0 +1,34 @@
document.addEventListener("DOMContentLoaded", () => {
let background = [
'#5cb85c',
'#8db457',
'#beb052',
'#f0ad4e',
'#e4804e',
'#d9534f',
'#bb3d39',
'#000'
]
for (const service of ["https", "smtp", "tls", "xmpp"]) {
const name = service.replace(/^\w/, c => c.toUpperCase())
console.info(`grades${name}Chart`)
const canvas = document.getElementById(`grades${name}Chart`).getContext('2d')
const chart = new Chart(canvas, {type: 'pie'})
fetch(`/statistics/${service}.json`).then((response) => {
if (response.status === 200) {
response.json().then((data) => {
chart.data.labels = Object.keys(data)
chart.data.datasets = [{
label: 'Number of request',
data: Object.values(data),
backgroundColor: background
}]
chart.update()
})
}
});
}
});

@ -3,4 +3,5 @@ import 'css/application'
import Chart from 'chart.js/auto'
global.Chart = Chart
import 'js/stats/index'
import 'js/stats/grades'

@ -1,7 +1,15 @@
<h2>Statistiques par service</h2>
<div class="row">
<div class="col-4">
<h2>Requests per service</h2>
<ul class="list-unstyled">
<% %i[https smtp xmpp tls ssh].each do |service| %>
<li><%= link_to service, stats_grade_path(service) %> (<%= Analysis.where(service: service).count %> recherches)</li>
<canvas id="servicesChart" aria-label="Pie chart for number of requests per service" role="img"></canvas>
</div>
<% %i[https smtp tls xmpp].each do |s| %>
<div class="col-4">
<h2>Grades for service <%= s.to_s.upcase %></h2>
<canvas id="<%= "grades" + s.to_s.upcase_first + "Chart" %>" aria-label="Bar chart for number of grades for service <%= s.to_s.upcase %>" role="img"></canvas>
</div>
<% end %>
</ul>
</div>

@ -75,3 +75,24 @@ sites.each do |type, domains|
Stat.create! :"sites_#{type}", domains
end
# general stat
services = Analysis.group(:service).order(service: :asc).count
Stat.create! :request_per_service, { labels: services.keys, dataset: services.values }
# grade per service for https, smtp, tls and xmpp
%i[https smtp tls xmpp].each do |service_name|
services = Analysis.where(service: service_name, pending: false)
grades = %w[A+ A B C D E F G].collect { |g| [g, 0] }.to_h
services.each do |service|
if (result = service.result)
result.each do |r|
next unless (grade = r['grade'])
grades[grade] += 1 if grades.has_key?(grade)
end
end
end
Stat.create! "grades_for_#{service_name.to_s}", grades
end

@ -16,8 +16,7 @@ Rails.application.routes.draw do
root 'site#index'
post '/' => 'site#check'
get 'statistics/', to: 'statistics#index', as: 'statisticts'
get 'statistics/grade/:service', to: 'statistics#grade', as: 'stats_grade'
resources :statistics, only: %i[index show]
get 'sites' => 'site#sites'

@ -33,5 +33,4 @@ ActiveRecord::Schema[7.0].define(version: 2022_06_26_133648) do
t.jsonb "data"
t.index ["name", "date"], name: "index_stats_on_name_and_date", unique: true
end
end

Loading…
Cancel
Save