class Grafana::SqlDatasource

Implements the interface to all SQL based datasources (tested with PostgreSQL and MariaDB/MySQL).

Public Class Methods

handles?(model) click to toggle source

@see AbstractDatasource#handles?

# File lib/grafana/sql_datasource.rb, line 7
def self.handles?(model)
  tmp = new(model)
  tmp.category == 'sql'
end

Public Instance Methods

default_variable_format() click to toggle source

@see AbstractDatasource#default_variable_format

# File lib/grafana/sql_datasource.rb, line 43
def default_variable_format
    'glob'
end
raw_query_from_panel_model(panel_query_target) click to toggle source

Currently all composed SQL queries are saved in the dashboard as rawSql, so no conversion necessary here. @see AbstractDatasource#raw_query_from_panel_model

# File lib/grafana/sql_datasource.rb, line 38
def raw_query_from_panel_model(panel_query_target)
  panel_query_target['rawSql']
end
request(query_description) click to toggle source

:raw_query needs to contain a SQL query as String in the respective database dialect @see AbstractDatasource#request

# File lib/grafana/sql_datasource.rb, line 14
def request(query_description)
  raise MissingSqlQueryError if query_description[:raw_query].nil?

  sql = replace_variables(query_description[:raw_query], query_description[:variables])
  request = {
    body: {
      from: query_description[:from],
      to: query_description[:to],
      queries: [rawSql: sql, datasourceId: id, format: 'table']
    }.to_json,
    request: Net::HTTP::Post
  }

  webrequest = query_description[:prepared_request]
  webrequest.relative_url = '/api/tsdb/query'
  webrequest.options.merge!(request)

  result = webrequest.execute(query_description[:timeout])
  preformat_response(result.body)
end

Private Instance Methods

preformat_response(response_body) click to toggle source
# File lib/grafana/sql_datasource.rb, line 49
def preformat_response(response_body)
  results = {}
  results.default = []

  JSON.parse(response_body)['results'].each_value do |query_result|
    if query_result.key?('error')
      results[:header] = results[:header] + ['SQL Error']
      results[:content] = [[query_result['error']]]

    elsif query_result['tables']
      query_result['tables'].each do |table|
        results[:header] = results[:header] + table['columns'].map { |header| header['text'] }
        results[:content] = table['rows']
      end

    end
  end

  results
end