ruby-grafana-reporter 0.5.1 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +0 -0
- data/lib/VERSION.rb +2 -2
- data/lib/grafana/abstract_datasource.rb +35 -4
- data/lib/grafana/dashboard.rb +0 -0
- data/lib/grafana/errors.rb +7 -0
- data/lib/grafana/grafana.rb +11 -0
- data/lib/grafana/grafana_environment_datasource.rb +0 -0
- data/lib/grafana/grafana_property_datasource.rb +0 -0
- data/lib/grafana/graphite_datasource.rb +10 -3
- data/lib/grafana/image_rendering_datasource.rb +0 -0
- data/lib/grafana/influxdb_datasource.rb +12 -3
- data/lib/grafana/panel.rb +28 -1
- data/lib/grafana/prometheus_datasource.rb +12 -2
- data/lib/grafana/sql_datasource.rb +16 -6
- data/lib/grafana/variable.rb +0 -0
- data/lib/grafana/webrequest.rb +0 -0
- data/lib/grafana_reporter/abstract_query.rb +1 -1
- data/lib/grafana_reporter/abstract_report.rb +0 -0
- data/lib/grafana_reporter/abstract_table_format_strategy.rb +0 -0
- data/lib/grafana_reporter/alerts_table_query.rb +0 -0
- data/lib/grafana_reporter/annotations_table_query.rb +0 -0
- data/lib/grafana_reporter/application/webservice.rb +0 -0
- data/lib/grafana_reporter/asciidoctor/adoc_plain_table_format_strategy.rb +0 -0
- data/lib/grafana_reporter/asciidoctor/panel_image_block_macro.rb +0 -0
- data/lib/grafana_reporter/asciidoctor/panel_image_inline_macro.rb +0 -0
- data/lib/grafana_reporter/asciidoctor/processor_mixin.rb +0 -0
- data/lib/grafana_reporter/asciidoctor/show_environment_include_processor.rb +0 -0
- data/lib/grafana_reporter/asciidoctor/sql_value_inline_macro.rb +0 -0
- data/lib/grafana_reporter/asciidoctor/value_as_variable_include_processor.rb +0 -0
- data/lib/grafana_reporter/console_configuration_wizard.rb +0 -0
- data/lib/grafana_reporter/csv_table_format_strategy.rb +0 -0
- data/lib/grafana_reporter/demo_report_wizard.rb +0 -0
- data/lib/grafana_reporter/errors.rb +0 -0
- data/lib/grafana_reporter/panel_image_query.rb +0 -0
- data/lib/grafana_reporter/query_value_query.rb +4 -1
- data/lib/grafana_reporter/reporter_environment_datasource.rb +0 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f39ad036bedee33e59c42d02f3fcd755508b09c5fbb90d732681ddb35fefea11
|
4
|
+
data.tar.gz: 5a837b1a1e3a755d34cfc398eae35c58ae1d908476162d3f2e595afd6f26cf5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24148398cb3361619c0a1ae6464d7840fcecaa4812669757765bfe615de76cd65189ee44d4f4d18799f2e7792545e6dd4cefcec10e8d0836f3c45f5f318bbfb9
|
7
|
+
data.tar.gz: 0f66267327c1963ea5d18e3720f25ff41115a4a448d598cd313ab5130d1bc033a29905e96833da3401276176d1c7eebee1ae87ef91d670d052d5fcd683340838
|
data/README.md
CHANGED
File without changes
|
data/lib/VERSION.rb
CHANGED
@@ -57,6 +57,11 @@ module Grafana
|
|
57
57
|
@model['name']
|
58
58
|
end
|
59
59
|
|
60
|
+
# @return [String] unique ID of the datasource
|
61
|
+
def uid
|
62
|
+
@model['uid']
|
63
|
+
end
|
64
|
+
|
60
65
|
# @return [Integer] ID of the datasource
|
61
66
|
def id
|
62
67
|
@model['id'].to_i
|
@@ -108,15 +113,14 @@ module Grafana
|
|
108
113
|
raise NotImplementedError
|
109
114
|
end
|
110
115
|
|
111
|
-
private
|
112
|
-
|
113
116
|
# Replaces the grafana variables in the given string with their replacement value.
|
114
117
|
#
|
115
118
|
# @param string [String] string in which the variables shall be replaced
|
116
119
|
# @param variables [Hash<String,Variable>] Hash containing the variables, which shall be replaced in the
|
117
120
|
# given string
|
121
|
+
# @param overwrite_default_format [String] {Variable#value_formatted} value, if a custom default format should be used, otherwise {#default_variable_format} is used as default, which may be overwritten
|
118
122
|
# @return [String] string in which all variables are properly replaced
|
119
|
-
def replace_variables(string, variables =
|
123
|
+
def replace_variables(string, variables, overwrite_default_format = nil)
|
120
124
|
res = string
|
121
125
|
repeat = true
|
122
126
|
repeat_count = 0
|
@@ -136,7 +140,8 @@ module Grafana
|
|
136
140
|
next unless var_name =~ /^\w+$/
|
137
141
|
|
138
142
|
res = res.gsub(/(?:\$\{#{var_name}(?::(?<format>\w+))?\}|\$#{var_name}(?!\w))/) do
|
139
|
-
format =
|
143
|
+
format = overwrite_default_format
|
144
|
+
format = default_variable_format if overwrite_default_format.nil?
|
140
145
|
if $LAST_MATCH_INFO
|
141
146
|
format = $LAST_MATCH_INFO[:format] if $LAST_MATCH_INFO[:format]
|
142
147
|
end
|
@@ -148,5 +153,31 @@ module Grafana
|
|
148
153
|
|
149
154
|
res
|
150
155
|
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
# Provides a general method to handle the given query response as general Grafana Dataframe format.
|
160
|
+
#
|
161
|
+
# This method throws {UnsupportedQueryResponseReceivedError} if the given query response is not a
|
162
|
+
# properly formattes dataframe
|
163
|
+
#
|
164
|
+
# @param response_body [String] raw response body
|
165
|
+
def preformat_dataframe_response(response_body)
|
166
|
+
json = JSON.parse(response_body)
|
167
|
+
data = json['results'].values.first
|
168
|
+
|
169
|
+
# TODO: check how multiple frames have to be handled
|
170
|
+
data = data['frames']
|
171
|
+
headers = []
|
172
|
+
data.first['schema']['fields'].each do |headline|
|
173
|
+
header = headline['config']['displayNameFromDS'].nil? ? headline['name'] : headline['config']['displayNameFromDS']
|
174
|
+
headers << header
|
175
|
+
end
|
176
|
+
content = data.first['data']['values'][0].zip(data.first['data']['values'][1])
|
177
|
+
return { header: headers, content: content }
|
178
|
+
|
179
|
+
rescue
|
180
|
+
raise UnsupportedQueryResponseReceivedError, response_body
|
181
|
+
end
|
151
182
|
end
|
152
183
|
end
|
data/lib/grafana/dashboard.rb
CHANGED
File without changes
|
data/lib/grafana/errors.rb
CHANGED
@@ -71,4 +71,11 @@ module Grafana
|
|
71
71
|
super("The datasource query provided, does not look like a grafana datasource target (received: #{query}).")
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
# Raised if a datasource query returned with an unsupported result
|
76
|
+
class UnsupportedQueryResponseReceivedError < GrafanaError
|
77
|
+
def initialize(response)
|
78
|
+
super("The datasource request returned with an unsupported response format (received: #{response}).")
|
79
|
+
end
|
80
|
+
end
|
74
81
|
end
|
data/lib/grafana/grafana.rb
CHANGED
@@ -81,6 +81,17 @@ module Grafana
|
|
81
81
|
@datasources[datasource_name]
|
82
82
|
end
|
83
83
|
|
84
|
+
# Returns the datasource, which has been queried by the datasource uid.
|
85
|
+
#
|
86
|
+
# @param datasource_uid [String] unique id of the searched datasource
|
87
|
+
# @return [Datasource] Datasource for the specified datasource unique id
|
88
|
+
def datasource_by_uid(datasource_uid)
|
89
|
+
datasource = @datasources.select { |_name, ds| ds.uid == datasource_uid }.values.first
|
90
|
+
raise DatasourceDoesNotExistError.new('uid', datasource_uid) unless datasource
|
91
|
+
|
92
|
+
datasource
|
93
|
+
end
|
94
|
+
|
84
95
|
# Returns the datasource, which has been queried by the datasource id.
|
85
96
|
#
|
86
97
|
# @param datasource_id [Integer] id of the searched datasource
|
File without changes
|
File without changes
|
@@ -43,10 +43,14 @@ module Grafana
|
|
43
43
|
|
44
44
|
private
|
45
45
|
|
46
|
-
# @see AbstractDatasource#preformat_response
|
47
46
|
def preformat_response(response_body)
|
48
|
-
|
47
|
+
begin
|
48
|
+
return preformat_dataframe_response(response_body)
|
49
|
+
rescue
|
50
|
+
# TODO: show an info, that the response if not a dataframe
|
51
|
+
end
|
49
52
|
|
53
|
+
json = JSON.parse(response_body)
|
50
54
|
header = ['time']
|
51
55
|
content = {}
|
52
56
|
|
@@ -66,7 +70,10 @@ module Grafana
|
|
66
70
|
end
|
67
71
|
end
|
68
72
|
|
69
|
-
{ header: header, content: content.to_a.map(&:flatten).sort { |a, b| a[0] <=> b[0] } }
|
73
|
+
return { header: header, content: content.to_a.map(&:flatten).sort { |a, b| a[0] <=> b[0] } }
|
74
|
+
|
75
|
+
rescue
|
76
|
+
raise UnsupportedQueryResponseReceivedError, response_body
|
70
77
|
end
|
71
78
|
end
|
72
79
|
end
|
File without changes
|
@@ -127,10 +127,16 @@ module Grafana
|
|
127
127
|
"#{res} #{parts.join(', ')}"
|
128
128
|
end
|
129
129
|
|
130
|
-
# @see AbstractDatasource#preformat_response
|
131
130
|
def preformat_response(response_body)
|
131
|
+
begin
|
132
|
+
return preformat_dataframe_response(response_body)
|
133
|
+
rescue
|
134
|
+
# TODO: show an info, that the response if not a dataframe
|
135
|
+
end
|
136
|
+
|
132
137
|
# TODO: how to handle multiple query results?
|
133
|
-
json = JSON.parse(response_body)
|
138
|
+
json = JSON.parse(response_body)
|
139
|
+
json = json['results'].first['series']
|
134
140
|
return {} if json.nil?
|
135
141
|
|
136
142
|
header = ['time']
|
@@ -152,7 +158,10 @@ module Grafana
|
|
152
158
|
end
|
153
159
|
end
|
154
160
|
|
155
|
-
{ header: header, content: content.to_a.map(&:flatten).sort { |a, b| a[0] <=> b[0] } }
|
161
|
+
return { header: header, content: content.to_a.map(&:flatten).sort { |a, b| a[0] <=> b[0] } }
|
162
|
+
|
163
|
+
rescue
|
164
|
+
raise UnsupportedQueryResponseReceivedError, response_body
|
156
165
|
end
|
157
166
|
end
|
158
167
|
end
|
data/lib/grafana/panel.rb
CHANGED
@@ -12,6 +12,11 @@ module Grafana
|
|
12
12
|
def initialize(model, dashboard)
|
13
13
|
@model = model
|
14
14
|
@dashboard = dashboard
|
15
|
+
|
16
|
+
@datasource_uid_or_name = @model['datasource']
|
17
|
+
if @model['datasource'].is_a?(Hash)
|
18
|
+
@datasource_uid_or_name = @model['datasource']['uid']
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
22
|
# @return [String] content of the requested field or +''+ if not found
|
@@ -26,9 +31,22 @@ module Grafana
|
|
26
31
|
@model['id']
|
27
32
|
end
|
28
33
|
|
34
|
+
# This method should always be called before the +datasource+ method of a
|
35
|
+
# panel is invoked, to ensure that the variable names in the datasource
|
36
|
+
# field are resolved.
|
37
|
+
#
|
38
|
+
# @param variables [Hash] variables hash, which should be use to resolve variable datasource
|
39
|
+
def resolve_variable_datasource(variables)
|
40
|
+
@datasource_uid_or_name = AbstractDatasource.new(nil).replace_variables(@datasource_uid_or_name, variables, 'raw') if @datasource_uid_or_name.is_a?(String)
|
41
|
+
end
|
42
|
+
|
29
43
|
# @return [Datasource] datasource object specified for the current panel
|
30
44
|
def datasource
|
31
|
-
|
45
|
+
if datasource_kind_is_uid?
|
46
|
+
dashboard.grafana.datasource_by_uid(@datasource_uid_or_name)
|
47
|
+
else
|
48
|
+
dashboard.grafana.datasource_by_name(@datasource_uid_or_name)
|
49
|
+
end
|
32
50
|
end
|
33
51
|
|
34
52
|
# @return [String] query string for the requested query letter
|
@@ -43,5 +61,14 @@ module Grafana
|
|
43
61
|
def render_url
|
44
62
|
"/render/d-solo/#{@dashboard.id}?panelId=#{@model['id']}"
|
45
63
|
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def datasource_kind_is_uid?
|
68
|
+
if @model['datasource'].is_a?(Hash)
|
69
|
+
return true
|
70
|
+
end
|
71
|
+
false
|
72
|
+
end
|
46
73
|
end
|
47
74
|
end
|
@@ -55,8 +55,14 @@ module Grafana
|
|
55
55
|
|
56
56
|
private
|
57
57
|
|
58
|
-
# @see AbstractDatasource#preformat_response
|
59
58
|
def preformat_response(response_body)
|
59
|
+
# TODO: show raw response body to debug case https://github.com/divinity666/ruby-grafana-reporter/issues/24
|
60
|
+
begin
|
61
|
+
return preformat_dataframe_response(response_body)
|
62
|
+
rescue
|
63
|
+
# TODO: show an info, that the response if not a dataframe
|
64
|
+
end
|
65
|
+
|
60
66
|
json = JSON.parse(response_body)
|
61
67
|
|
62
68
|
# handle response with error result
|
@@ -64,6 +70,7 @@ module Grafana
|
|
64
70
|
return { header: ['error'], content: [[ json['error'] ]] }
|
65
71
|
end
|
66
72
|
|
73
|
+
# handle former result formats
|
67
74
|
result_type = json['data']['resultType']
|
68
75
|
json = json['data']['result']
|
69
76
|
|
@@ -101,7 +108,10 @@ module Grafana
|
|
101
108
|
end
|
102
109
|
end
|
103
110
|
|
104
|
-
{ header: headers, content: content.to_a.map(&:flatten).sort { |a, b| a[0] <=> b[0] } }
|
111
|
+
return { header: headers, content: content.to_a.map(&:flatten).sort { |a, b| a[0] <=> b[0] } }
|
112
|
+
|
113
|
+
rescue
|
114
|
+
raise UnsupportedQueryResponseReceivedError, response_body
|
105
115
|
end
|
106
116
|
end
|
107
117
|
end
|
@@ -47,6 +47,12 @@ module Grafana
|
|
47
47
|
private
|
48
48
|
|
49
49
|
def preformat_response(response_body)
|
50
|
+
begin
|
51
|
+
return preformat_dataframe_response(response_body)
|
52
|
+
rescue
|
53
|
+
# TODO: show an info, that the response if not a dataframe
|
54
|
+
end
|
55
|
+
|
50
56
|
results = {}
|
51
57
|
results.default = []
|
52
58
|
results[:header] = []
|
@@ -57,16 +63,20 @@ module Grafana
|
|
57
63
|
results[:header] = results[:header] + ['SQL Error']
|
58
64
|
results[:content] = [[query_result['error']]]
|
59
65
|
|
60
|
-
elsif query_result
|
61
|
-
query_result['tables']
|
62
|
-
|
63
|
-
|
66
|
+
elsif query_result.key?('tables')
|
67
|
+
if query_result['tables']
|
68
|
+
query_result['tables'].each do |table|
|
69
|
+
results[:header] = results[:header] + table['columns'].map { |header| header['text'] }
|
70
|
+
results[:content] = table['rows']
|
71
|
+
end
|
64
72
|
end
|
65
|
-
|
66
73
|
end
|
67
74
|
end
|
68
75
|
|
69
|
-
results
|
76
|
+
return results
|
77
|
+
|
78
|
+
rescue
|
79
|
+
raise UnsupportedQueryResponseReceivedError, response_body
|
70
80
|
end
|
71
81
|
end
|
72
82
|
end
|
data/lib/grafana/variable.rb
CHANGED
File without changes
|
data/lib/grafana/webrequest.rb
CHANGED
File without changes
|
@@ -89,7 +89,7 @@ module GrafanaReporter
|
|
89
89
|
# grafana errors will be directly passed through
|
90
90
|
raise
|
91
91
|
rescue StandardError => e
|
92
|
-
raise DatasourceRequestInternalError.new(@datasource, e.message)
|
92
|
+
raise DatasourceRequestInternalError.new(@datasource, "#{e.message}\n#{e.backtrace.join("\n")}")
|
93
93
|
end
|
94
94
|
|
95
95
|
raise DatasourceRequestInvalidReturnValueError.new(@datasource, @result) unless datasource_response_valid?
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -5,7 +5,10 @@ module GrafanaReporter
|
|
5
5
|
class QueryValueQuery < AbstractQuery
|
6
6
|
# @see Grafana::AbstractQuery#pre_process
|
7
7
|
def pre_process
|
8
|
-
|
8
|
+
if @panel
|
9
|
+
@panel.resolve_variable_datasource(@variables)
|
10
|
+
@datasource = @panel.datasource
|
11
|
+
end
|
9
12
|
|
10
13
|
@variables['result_type'] ||= Variable.new('')
|
11
14
|
end
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-grafana-reporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Kohlmeyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|