class GrafanaReporter::DemoReportWizard
This class is used to build a demo report based on a real grafana instance. Therefore it checks available grafana dashboards and panels and returns a final template file as string, which can then be used as a template.
Public Class Methods
new(query_classes)
click to toggle source
@param query_classes [Array] class objects, for which a demo report shall be created
# File lib/grafana_reporter/demo_report_wizard.rb, line 9 def initialize(query_classes) @query_classes = query_classes end
Public Instance Methods
build(grafana)
click to toggle source
Invokes the build process for the given grafana
object. Progress is printed to STDOUT. @param grafana [Grafana] grafana instance, for which the demo report shall be built @return [String] demo template as string
# File lib/grafana_reporter/demo_report_wizard.rb, line 17 def build(grafana) results = {} grafana.dashboard_ids.sample(15).each do |dashboard_id| print "Evaluating dashboard '#{dashboard_id}' for building a demo report..." dashboard = grafana.dashboard(dashboard_id) results = evaluate_dashboard(dashboard, @query_classes - results.keys).merge(results) puts "done - #{(@query_classes - results.keys).length} examples to go" break if (@query_classes - results.keys).empty? end if grafana.dashboard_ids.length > 15 && !(@query_classes - results.keys).empty? puts 'Aborting evaluating further dashboards after 15 samples.' end unless (@query_classes - results.keys).empty? puts "For #{(@query_classes - results.keys).length} reporter functionalities no appropriate "\ 'examples could be found in the configured grafana instance.' end format_results(default_result(@query_classes - results.keys).merge(results)) end
Private Instance Methods
default_result(query_classes)
click to toggle source
# File lib/grafana_reporter/demo_report_wizard.rb, line 44 def default_result(query_classes) results = {} query_classes.each do |query_class| results[query_class] = "No example found for #{query_class.name} in the dashboards." end results end
evaluate_dashboard(dashboard, query_classes)
click to toggle source
# File lib/grafana_reporter/demo_report_wizard.rb, line 54 def evaluate_dashboard(dashboard, query_classes) results = {} dashboard.panels.shuffle.each do |panel| begin next if panel.datasource.is_a?(Grafana::UnsupportedDatasource) rescue Grafana::DatasourceDoesNotExistError next end query_classes.each do |query_class| unless query_class.public_instance_methods.include?(:build_demo_entry) results[query_class] = "Method 'build_demo_entry' not implemented for #{query_class.name}" next end begin result = query_class.new.build_demo_entry(panel) results[query_class] = result if result rescue Grafana::DatasourceDoesNotExistError # properly catch DatasourceDoesNotExist errors here, as they don't lead to a real issue # during demo report creation # This may e.g. happen if a panel asks e.g. for datasource '-- Dashboard --' which is # currently not allowed rescue StandardError => e puts "#{e.message}\n#{e.backtrace.join("\n")}" end end end results end
format_results(raw_results)
click to toggle source
# File lib/grafana_reporter/demo_report_wizard.rb, line 87 def format_results(raw_results) results = ['= Demo report', "Created by `+ruby-grafana-reporter+` version #{GRAFANA_REPORTER_VERSION.join('.')}", '== Examples'] raw_results.each do |k, v| results += if v =~ /^[A-Z]/ ["=== #{k.to_s.gsub(/.*::/, '')}", v.to_s] else ["=== #{k.to_s.gsub(/.*::/, '')}", 'Sample call:', " #{v.gsub(/\n/, "\n ")}", 'Result:', v.to_s] end end results.join("\n\n") end