ruby-grafana-reporter 0.6.6 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -4
- data/lib/VERSION.rb +2 -2
- data/lib/grafana/grafana.rb +19 -0
- data/lib/grafana_reporter/abstract_query.rb +1 -1
- data/lib/grafana_reporter/asciidoctor/help.rb +8 -0
- data/lib/grafana_reporter/asciidoctor/panel_query_table_include_processor.rb +0 -1
- data/lib/grafana_reporter/asciidoctor/panel_query_value_inline_macro.rb +0 -1
- data/lib/grafana_reporter/asciidoctor/processor_mixin.rb +1 -1
- data/lib/grafana_reporter/asciidoctor/sql_table_include_processor.rb +2 -3
- data/lib/grafana_reporter/asciidoctor/sql_value_inline_macro.rb +2 -3
- data/lib/grafana_reporter/errors.rb +9 -0
- data/lib/grafana_reporter/query_value_query.rb +24 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49639b5da410d46b0ad6cf16a187a3f30389fac610497de09d1e1466a66f22f5
|
4
|
+
data.tar.gz: 673791b6d38cd46e54292903f07e0fdd16070f5e0abf999565fecf04b930efbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4bb03253d7681c580c96f11e5e86112e036087b927ff01e0e490bebeb4aeadd5f213f9de7202007523b8bf384ed36f6fcc040d5b81aa5aceef88c7cb191ab50
|
7
|
+
data.tar.gz: d3695d4d6ce451c01e7ad33a28a942f697d019215cca603827bda44af488e292c4befaf658d266e19b5ca3e84ab1a06cbc5f4f5e189d262b5c8bb415c4ae1013
|
data/README.md
CHANGED
@@ -26,12 +26,10 @@ Reporting Service for Grafana
|
|
26
26
|
|
27
27
|
## Your support is appreciated!
|
28
28
|
|
29
|
-
Hey there!
|
30
|
-
|
31
|
-
I provide you this software free of charge - and I'm happy, that I can do so. I have already
|
29
|
+
Hey there! I provide you this software free of charge. I have already
|
32
30
|
spend a lot of my private time in developing, maintaining and supporting it.
|
33
31
|
|
34
|
-
If you enjoy my work,
|
32
|
+
If you enjoy my work, feel free to
|
35
33
|
|
36
34
|
[![buymeacoffee](https://az743702.vo.msecnd.net/cdn/kofi3.png?v=0)](https://ko-fi.com/divinity666)
|
37
35
|
|
@@ -50,6 +48,10 @@ dashboards and to use it in your custom templates to finally create reports in P
|
|
50
48
|
|
51
49
|
By default (an extended version of) Asciidoctor is enabled as template language.
|
52
50
|
|
51
|
+
## Getting started
|
52
|
+
|
53
|
+
![GettingStarted](./assets/GettingStartedAnimation.gif)
|
54
|
+
|
53
55
|
## Features
|
54
56
|
|
55
57
|
* Supports creation of reports for multiple [grafana](https://github.com/grafana/grafana)
|
data/lib/VERSION.rb
CHANGED
data/lib/grafana/grafana.rb
CHANGED
@@ -68,6 +68,23 @@ module Grafana
|
|
68
68
|
'NON-Admin'
|
69
69
|
end
|
70
70
|
|
71
|
+
# Returns the datasource, which has been queried by model entry in the panel model.
|
72
|
+
#
|
73
|
+
# @param model_entry [Object] model entry of the searched datasource (e.g. String or Hash)
|
74
|
+
# @return [Datasource] Datasource for the specified datasource model entry
|
75
|
+
def datasource_by_model_entry(model_entry)
|
76
|
+
datasource = nil
|
77
|
+
if model_entry.is_a?(String)
|
78
|
+
datasource = datasource_by_name(model_entry)
|
79
|
+
elsif model_entry.is_a?(Hash)
|
80
|
+
datasource = datasource_by_uid(model_entry['uid'])
|
81
|
+
end
|
82
|
+
|
83
|
+
raise DatasourceDoesNotExistError.new('model entry', model_entry) unless datasource
|
84
|
+
|
85
|
+
datasource
|
86
|
+
end
|
87
|
+
|
71
88
|
# Returns the datasource, which has been queried by the datasource name.
|
72
89
|
#
|
73
90
|
# @param datasource_name [String] name of the searched datasource
|
@@ -86,6 +103,8 @@ module Grafana
|
|
86
103
|
# @param datasource_uid [String] unique id of the searched datasource
|
87
104
|
# @return [Datasource] Datasource for the specified datasource unique id
|
88
105
|
def datasource_by_uid(datasource_uid)
|
106
|
+
raise DatasourceDoesNotExistError.new('uid', datasource_uid) unless datasource_uid
|
107
|
+
|
89
108
|
clean_nil_datasources
|
90
109
|
datasource = @datasources.select { |ds_name, ds| ds.uid == datasource_uid }.values.first
|
91
110
|
raise DatasourceDoesNotExistError.new('uid', datasource_uid) unless datasource
|
@@ -383,7 +383,7 @@ module GrafanaReporter
|
|
383
383
|
delta_match = date_spec.match(/^(?<op>(?:-|\+))(?<count>\d+)?(?<unit>[smhdwMy])/)
|
384
384
|
if delta_match
|
385
385
|
date = delta_date(date, "#{delta_match[:op]}#{delta_match[:count] || 1}".to_i, delta_match[:unit])
|
386
|
-
date_spec = date_spec.gsub(/^#{delta_match[:op]}#{delta_match[:count]}#{delta_match[:unit]}/, '')
|
386
|
+
date_spec = date_spec.gsub(/^#{delta_match[:op] == '+' ? '\+' : '-'}#{delta_match[:count]}#{delta_match[:unit]}/, '')
|
387
387
|
end
|
388
388
|
|
389
389
|
raise TimeRangeUnknownError, orig_date unless fit_match || delta_match
|
@@ -229,6 +229,12 @@ end}
|
|
229
229
|
escaped by using `_,`. Execution of related functions is applied in the following order
|
230
230
|
`format`, `replace_values`, `filter_columns`, `transpose`.
|
231
231
|
|
232
|
+
select_value:
|
233
|
+
call: select_value="<select_value>"
|
234
|
+
description: >-
|
235
|
+
Allows the selection of a specific value from the result set. Supported options are `min`, `max`, `avg`,
|
236
|
+
`sum`, `first`, `last`.
|
237
|
+
|
232
238
|
transpose:
|
233
239
|
call: transpose="true"
|
234
240
|
description: >-
|
@@ -456,6 +462,7 @@ end}
|
|
456
462
|
from:
|
457
463
|
instance:
|
458
464
|
replace_values:
|
465
|
+
select_value:
|
459
466
|
timeout:
|
460
467
|
to:
|
461
468
|
from_timezone:
|
@@ -505,6 +512,7 @@ end}
|
|
505
512
|
from:
|
506
513
|
instance:
|
507
514
|
replace_values:
|
515
|
+
select_value:
|
508
516
|
timeout:
|
509
517
|
to:
|
510
518
|
from_timezone:
|
@@ -40,7 +40,7 @@ module GrafanaReporter
|
|
40
40
|
k =~ /^(?:timeout|from|to)$/ ||
|
41
41
|
k =~ /filter_columns|format|replace_values_.*|transpose|from_timezone|
|
42
42
|
to_timezone|result_type|query|table_formatter|include_headline|
|
43
|
-
column_divider|row_divider|instant|interval|verbose_log/x
|
43
|
+
column_divider|row_divider|instant|interval|verbose_log|select_value/x
|
44
44
|
end)
|
45
45
|
|
46
46
|
result
|
@@ -74,7 +74,6 @@ module GrafanaReporter
|
|
74
74
|
# @see ProcessorMixin#build_demo_entry
|
75
75
|
def build_demo_entry(panel)
|
76
76
|
return nil unless panel
|
77
|
-
return nil unless panel.model['type'].include?('table')
|
78
77
|
|
79
78
|
ref_id = nil
|
80
79
|
panel.model['targets'].each do |item|
|
@@ -85,8 +84,8 @@ module GrafanaReporter
|
|
85
84
|
end
|
86
85
|
return nil unless ref_id
|
87
86
|
|
88
|
-
"|===\ninclude::grafana_sql_table:#{panel.dashboard.grafana.
|
89
|
-
"[sql=\"#{panel.query(ref_id).gsub(/"/, '\"').gsub("\n", ' ').gsub(/\\/, '\\\\')}\",filter_columns=\"time\","\
|
87
|
+
"|===\ninclude::grafana_sql_table:#{panel.dashboard.grafana.datasource_by_model_entry(panel.model['datasource']).id}"\
|
88
|
+
"[sql=\"#{panel.query(ref_id).gsub(/"/, '\"').gsub("\r\n", ' ').gsub("\n", ' ').gsub(/\\/, '\\\\')}\",filter_columns=\"time\","\
|
90
89
|
"dashboard=\"#{panel.dashboard.id}\",from=\"now-1h\",to=\"now\"]\n|==="
|
91
90
|
end
|
92
91
|
end
|
@@ -79,7 +79,6 @@ module GrafanaReporter
|
|
79
79
|
# @see ProcessorMixin#build_demo_entry
|
80
80
|
def build_demo_entry(panel)
|
81
81
|
return nil unless panel
|
82
|
-
return nil unless panel.model['type'] == 'singlestat'
|
83
82
|
|
84
83
|
ref_id = nil
|
85
84
|
panel.model['targets'].each do |item|
|
@@ -90,8 +89,8 @@ module GrafanaReporter
|
|
90
89
|
end
|
91
90
|
return nil unless ref_id
|
92
91
|
|
93
|
-
"grafana_sql_value:#{panel.dashboard.grafana.
|
94
|
-
"[sql=\"#{panel.query(ref_id).gsub(/"/, '\"').gsub("\n", ' ').gsub(/\\/, '\\\\')}\",from=\"now-1h\","\
|
92
|
+
"grafana_sql_value:#{panel.dashboard.grafana.datasource_by_model_entry(panel.model['datasource']).id}"\
|
93
|
+
"[sql=\"#{panel.query(ref_id).gsub(/"/, '\"').gsub("\r\n", ' ').gsub("\n", ' ').gsub(/\\/, '\\\\')}\",from=\"now-1h\","\
|
95
94
|
'to="now"]'
|
96
95
|
end
|
97
96
|
end
|
@@ -79,6 +79,15 @@ module GrafanaReporter
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
+
# Thrown, if the value configuration in {QueryValueQuery#select_value} is
|
83
|
+
# invalid.
|
84
|
+
class UnsupportedSelectValueStatementError < GrafanaReporterError
|
85
|
+
def initialize(statement)
|
86
|
+
super("Unsupported 'select_value' specified in template file: '#{statement}'. Supported values are 'min', 'max', "\
|
87
|
+
"'avg', 'sum', 'first', 'last'.")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
82
91
|
# Thrown, if a configured parameter is malformed.
|
83
92
|
class MalformedAttributeContentError < GrafanaReporterError
|
84
93
|
def initialize(message, attribute, content)
|
@@ -33,7 +33,30 @@ module GrafanaReporter
|
|
33
33
|
|
34
34
|
when /(?:panel_value|sql_value)/
|
35
35
|
tmp = @result[:content] || []
|
36
|
-
|
36
|
+
# use only first column of return values and replace null values with zero
|
37
|
+
tmp = tmp.map{ |item| item[0] || 0 }
|
38
|
+
|
39
|
+
# as default behaviour we fallback to the first_value, as this was the default in older releases
|
40
|
+
select_value = 'first'
|
41
|
+
select_value = @variables['select_value'].raw_value if @variables['select_value']
|
42
|
+
case select_value
|
43
|
+
when 'min'
|
44
|
+
result = tmp.min
|
45
|
+
when 'max'
|
46
|
+
result = tmp.max
|
47
|
+
when 'avg'
|
48
|
+
result = tmp.size > 0 ? tmp.sum / tmp.size : 0
|
49
|
+
when 'sum'
|
50
|
+
result = tmp.sum
|
51
|
+
when 'last'
|
52
|
+
result = tmp.last
|
53
|
+
when 'first'
|
54
|
+
result = tmp.first
|
55
|
+
else
|
56
|
+
raise UnsupportedSelectValueStatementError, @variables['select_value'].raw_value
|
57
|
+
end
|
58
|
+
|
59
|
+
@result = result
|
37
60
|
|
38
61
|
else
|
39
62
|
raise StandardError, "Unsupported 'result_type' received: '#{@variables['result_type'].raw_value}'"
|
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.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Kohlmeyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -206,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
206
|
- !ruby/object:Gem::Version
|
207
207
|
version: '0'
|
208
208
|
requirements: []
|
209
|
-
rubygems_version: 3.1.
|
209
|
+
rubygems_version: 3.1.6
|
210
210
|
signing_key:
|
211
211
|
specification_version: 4
|
212
212
|
summary: Reporter Service for Grafana
|