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