Class: GoodJob::PerformanceIndexChart
- Defined in:
- app/charts/good_job/performance_index_chart.rb
Instance Method Summary collapse
Methods inherited from BaseChart
#start_end_binds, #string_to_hsl
Instance Method Details
#data ⇒ Object
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'app/charts/good_job/performance_index_chart.rb', line 5 def data table_name = GoodJob::Execution.table_name sum_query = Arel.sql(GoodJob::Job.pg_or_jdbc_query(<<~SQL.squish)) SELECT * FROM generate_series( date_trunc('hour', $1::timestamp), date_trunc('hour', $2::timestamp), '1 hour' ) timestamp LEFT JOIN ( SELECT date_trunc('hour', scheduled_at) AS scheduled_at, job_class, SUM(duration) AS sum FROM #{table_name} sources GROUP BY date_trunc('hour', scheduled_at), job_class ) sources ON sources.scheduled_at = timestamp ORDER BY timestamp ASC SQL executions_data = GoodJob::Job.connection.exec_query(GoodJob::Job.pg_or_jdbc_query(sum_query), "GoodJob Performance Chart", start_end_binds) job_names = executions_data.reject { |d| d['sum'].nil? }.map { |d| d['job_class'] || BaseFilter::EMPTY }.uniq labels = [] jobs_data = executions_data.to_a.group_by { |d| d['timestamp'] }.each_with_object({}) do |(, values), hash| labels << .in_time_zone.strftime('%H:%M') job_names.each do |job_class| sum = values.find { |d| d['job_class'] == job_class }&.[]('sum') duration = sum ? ActiveSupport::Duration.parse(sum).to_f : 0 (hash[job_class] ||= []) << duration end end { type: "line", data: { labels: labels, datasets: jobs_data.map do |job_class, data| label = job_class || '(none)' { label: label, data: data, backgroundColor: string_to_hsl(label), borderColor: string_to_hsl(label), } end, }, options: { plugins: { title: { display: true, text: I18n.t("good_job.performance.index.chart_title"), }, legend: { vertical: true, }, }, scales: { y: { beginAtZero: true, }, }, }, } end |