ruby-grafana-reporter 0.1.7 → 0.2.0
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 +166 -339
- data/bin/ruby-grafana-reporter +5 -4
- data/lib/VERSION.rb +5 -3
- data/lib/grafana/abstract_panel_query.rb +22 -20
- data/lib/grafana/abstract_query.rb +132 -127
- data/lib/grafana/abstract_sql_query.rb +51 -42
- data/lib/grafana/dashboard.rb +77 -66
- data/lib/grafana/errors.rb +66 -61
- data/lib/grafana/grafana.rb +130 -131
- data/lib/grafana/panel.rb +41 -39
- data/lib/grafana/panel_image_query.rb +52 -49
- data/lib/grafana/variable.rb +217 -259
- data/lib/grafana_reporter/abstract_report.rb +112 -109
- data/lib/grafana_reporter/application/application.rb +404 -229
- data/lib/grafana_reporter/application/errors.rb +33 -30
- data/lib/grafana_reporter/application/webservice.rb +231 -0
- data/lib/grafana_reporter/asciidoctor/alerts_table_query.rb +104 -99
- data/lib/grafana_reporter/asciidoctor/annotations_table_query.rb +99 -96
- data/lib/grafana_reporter/asciidoctor/errors.rb +40 -37
- data/lib/grafana_reporter/asciidoctor/extensions/alerts_table_include_processor.rb +92 -86
- data/lib/grafana_reporter/asciidoctor/extensions/annotations_table_include_processor.rb +91 -86
- data/lib/grafana_reporter/asciidoctor/extensions/panel_image_block_macro.rb +69 -67
- data/lib/grafana_reporter/asciidoctor/extensions/panel_image_inline_macro.rb +68 -65
- data/lib/grafana_reporter/asciidoctor/extensions/panel_property_inline_macro.rb +61 -58
- data/lib/grafana_reporter/asciidoctor/extensions/panel_query_table_include_processor.rb +78 -75
- data/lib/grafana_reporter/asciidoctor/extensions/panel_query_value_inline_macro.rb +73 -70
- data/lib/grafana_reporter/asciidoctor/extensions/processor_mixin.rb +20 -18
- data/lib/grafana_reporter/asciidoctor/extensions/show_environment_include_processor.rb +43 -41
- data/lib/grafana_reporter/asciidoctor/extensions/sql_table_include_processor.rb +70 -67
- data/lib/grafana_reporter/asciidoctor/extensions/sql_value_inline_macro.rb +66 -65
- data/lib/grafana_reporter/asciidoctor/extensions/value_as_variable_include_processor.rb +61 -57
- data/lib/grafana_reporter/asciidoctor/panel_first_value_query.rb +34 -32
- data/lib/grafana_reporter/asciidoctor/panel_image_query.rb +25 -23
- data/lib/grafana_reporter/asciidoctor/panel_property_query.rb +44 -43
- data/lib/grafana_reporter/asciidoctor/panel_table_query.rb +38 -36
- data/lib/grafana_reporter/asciidoctor/query_mixin.rb +310 -309
- data/lib/grafana_reporter/asciidoctor/report.rb +177 -159
- data/lib/grafana_reporter/asciidoctor/sql_first_value_query.rb +37 -34
- data/lib/grafana_reporter/asciidoctor/sql_table_query.rb +39 -32
- data/lib/grafana_reporter/configuration.rb +257 -326
- data/lib/grafana_reporter/errors.rb +48 -38
- data/lib/grafana_reporter/logger/two_way_logger.rb +58 -52
- data/lib/ruby-grafana-reporter.rb +29 -27
- metadata +10 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3ffea90aebd213a65781274b5825d3f47d2a68e804821dd4a887ebdaebd67ae
|
4
|
+
data.tar.gz: 931c47a54cebe300a6f0b3e3dffb470ac6ce6f4faddc8558e90bd18d4273b1d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0c187b97ec27c6ac374069d9253215d78c2b04d6e8ff10cc1bd660486d0f998c742cfd65a4d415cdb2b8045fed1c6800ccf2c64cbe21fc530b82527b4183f69
|
7
|
+
data.tar.gz: b7b22e087b05c9c1bb6c0c92526755c1883ac9a57ca53c64e809de18e213421a2c65329618a42a75aa80b2ebdc0a38f48b28ac15eb2b9dd02c7c2250c838953c
|
data/README.md
CHANGED
@@ -1,339 +1,166 @@
|
|
1
|
-
[](https://github.com/divinity666/ruby-grafana-reporter/blob/master/LICENSE)
|
2
|
-
[](https://travis-ci.org/github/divinity666/ruby-grafana-reporter?branch=master)
|
3
|
-
[](https://coveralls.io/github/divinity666/ruby-grafana-reporter?branch=master)
|
4
|
-
|
5
|
-
# Ruby Grafana Reporter
|
6
|
-
Reporting Service for Grafana
|
7
|
-
|
8
|
-
## Table of Contents
|
9
|
-
|
10
|
-
* [About the project](#about-the-project)
|
11
|
-
* [Getting started](#getting-started)
|
12
|
-
* [
|
13
|
-
* [
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
* [
|
18
|
-
* [
|
19
|
-
* [
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
http://<<your-server-url>>:8815/render?var-template=myfirsttemplate.adoc
|
168
|
-
|
169
|
-
If this now also serves you the PDF document after a few seconds (remember to
|
170
|
-
reload the page), you are done with the reporter service and might want to go
|
171
|
-
to step into the integration with grafana.
|
172
|
-
|
173
|
-
### Docker
|
174
|
-
|
175
|
-
One of the key features of the reporter is, that it can work seemlessly with
|
176
|
-
the official `asciidoctor` docker container without further dependencies.
|
177
|
-
|
178
|
-
Assuming you have a `docker-compose` setup running, you may want to add the
|
179
|
-
following to your services secion in your `docker-compose.yml`:
|
180
|
-
|
181
|
-
asciidoctor:
|
182
|
-
image: asciidoctor/docker-asciidoctor
|
183
|
-
container_name: asciidoctor
|
184
|
-
hostname: asciidoctor
|
185
|
-
volumes:
|
186
|
-
- /<<an-empty-local-path>>:/documents
|
187
|
-
restart: unless-stopped
|
188
|
-
|
189
|
-
After running this container, you have to copy the reporter files. Download the
|
190
|
-
ruby grafana reporter to the folder `<<an-empty-local-path>>`. I tend to use
|
191
|
-
the single file application there.
|
192
|
-
|
193
|
-
To test the setup, you'll have to first step inside the container, e.g. by
|
194
|
-
calling `docker exec` with the appropriate parameters. Then you can simply
|
195
|
-
run
|
196
|
-
|
197
|
-
ruby bin/ruby-grafana-reporter -h
|
198
|
-
|
199
|
-
Check that your configured grafana instance can be accessed properly:
|
200
|
-
|
201
|
-
ruby bin/ruby-grafana-reporter myconfig --test default
|
202
|
-
|
203
|
-
Now you may want to check the conversion of your Hello World example:
|
204
|
-
|
205
|
-
ruby bin/ruby-grafana-reporter myconfig --template myfirsttemplate.adoc --output myfirstrender.pdf
|
206
|
-
|
207
|
-
You should now find a PDF document named `myfirstrender.pdf` which includes a detailed
|
208
|
-
help page on how to use the ruby grafana reporter functions in asciidoctor, as well
|
209
|
-
as a list of all environment variables that can be accessed.
|
210
|
-
|
211
|
-
If this has been working properly as well, you might want to run the reporter
|
212
|
-
as a webservice always when starting the container. To do so, use the following
|
213
|
-
`docker-compose` configuration. Watch out for the added lines!
|
214
|
-
|
215
|
-
asciidoctor:
|
216
|
-
image: asciidoctor/docker-asciidoctor
|
217
|
-
container_name: asciidoctor
|
218
|
-
hostname: asciidoctor
|
219
|
-
volumes:
|
220
|
-
- /<<an-empty-local-path>>:/documents
|
221
|
-
command:
|
222
|
-
sh /documents/startup.sh
|
223
|
-
restart: unless-stopped
|
224
|
-
|
225
|
-
Additionally you need to create a `startup.sh` file in the folder
|
226
|
-
`<<an-empty-local-path>>` with the following content:
|
227
|
-
|
228
|
-
cd /documents
|
229
|
-
ruby bin/ruby-grafana-reporter myconfig
|
230
|
-
|
231
|
-
After restarting the container, the service should be running.
|
232
|
-
|
233
|
-
Test your configuration by requesting the following URL in a browser of your
|
234
|
-
choice:
|
235
|
-
|
236
|
-
http://<<your-server-url>>:8815/render?var-template=myfirsttemplate.adoc
|
237
|
-
|
238
|
-
If this now also serves you the PDF document after a few seconds (remember to
|
239
|
-
reload the page), you are done with the reporter service and might want to go
|
240
|
-
to step into the integration with grafana.
|
241
|
-
|
242
|
-
### Grafana integration
|
243
|
-
|
244
|
-
The key feature of the report is, that it can easily be integrated with grafana
|
245
|
-
(I've not even been talking about the features it is providing for that, but
|
246
|
-
you'll find them having a look in the example results above).
|
247
|
-
|
248
|
-
For accessing the reporter from grafana, you need to simply add a link to your
|
249
|
-
grafana dashboard:
|
250
|
-
|
251
|
-
* Open the dashboard configuration
|
252
|
-
* Select `Links`
|
253
|
-
* Select `Add`
|
254
|
-
* Fill out as following:
|
255
|
-
* Type: `link`
|
256
|
-
* Url: `http://<<your-server-url>>:8815/render?var-template=myfirsttemplate.adoc`
|
257
|
-
* Title: `MyFirstReport`
|
258
|
-
* Select `Time range`
|
259
|
-
* Select `Variable values`
|
260
|
-
* Select `Add`
|
261
|
-
|
262
|
-
Now go back to your dashboard and click the newly generated 'MyFirstReport'
|
263
|
-
link on it. Now the renderer should start it's task and show you the expected
|
264
|
-
results.
|
265
|
-
|
266
|
-
But now the fun just starts! Try out the functions stated in the
|
267
|
-
'MyFirstReport' PDF file, to include the dynamic content in your asciidoctor
|
268
|
-
template.
|
269
|
-
|
270
|
-
Additionally you might want to make the selection of the template variable.
|
271
|
-
Piece of cake: Just add a dashboard variable to your grafana dashboard named
|
272
|
-
`template` and let the user select or enter a template name. To make use of it,
|
273
|
-
you should change the link of the 'MyFirstReport' link to
|
274
|
-
`http://<<your-server-url>>:8815/render?`
|
275
|
-
|
276
|
-
That's it. Let me know your feedback!
|
277
|
-
|
278
|
-
## Webservice overview
|
279
|
-
|
280
|
-
Running the reporter as a webservice provides the following URLs
|
281
|
-
|
282
|
-
/overview - for all running or retained renderings
|
283
|
-
/render - for rendering a template, 'var-template' is the only mandatory GET parameter
|
284
|
-
/view_report - for viewing the status or receving the result of a specific rendering, is automatically called after a successfull /render call
|
285
|
-
/cancel_report - for cancelling the rendering of a specific report, normally not called manually, but on user interaction in the /view_report or /overview URL
|
286
|
-
|
287
|
-
## Features
|
288
|
-
|
289
|
-
* Build report template including all imaginable grafana content:
|
290
|
-
* panels as images
|
291
|
-
* panel table query or custom query results as real document tables (not images!)
|
292
|
-
* single panel value or custom query single value result integrated in texts
|
293
|
-
* Solid as a rock, also in case of template errors (at least it aims to be)
|
294
|
-
* Runs standalone or as a webservice
|
295
|
-
* Seamlessly integrates with asciidoctor docker container
|
296
|
-
* Developed for being able to support other tools than asciidoctor as well
|
297
|
-
|
298
|
-
## Roadmap
|
299
|
-
|
300
|
-
This is just a collection of things, I am heading for in future, without a schedule.
|
301
|
-
|
302
|
-
* Add documentation of possible asciidoctor calls to grafana
|
303
|
-
* Add documentation for configuration file
|
304
|
-
* Add a simple plugin system to support specific asciidoctor modifications
|
305
|
-
* Solve code TODOs
|
306
|
-
* Become [rubocop](https://rubocop.org/) ready
|
307
|
-
|
308
|
-
## Contributing
|
309
|
-
|
310
|
-
If you'd like to contribute, please fork the repository and use a feature
|
311
|
-
branch. Pull requests are warmly welcome.
|
312
|
-
|
313
|
-
Though not yet valid for my code, I'd like to see the project become
|
314
|
-
[rubocop](https://rubocop.org/) ready :-)
|
315
|
-
|
316
|
-
Definitely open spots from my side are:
|
317
|
-
|
318
|
-
* This README
|
319
|
-
* Clean and properly setup test cases
|
320
|
-
* An own webpage for this project
|
321
|
-
|
322
|
-
## Licensing
|
323
|
-
|
324
|
-
The code in this project is licensed under MIT license.
|
325
|
-
|
326
|
-
## Acknowledgements
|
327
|
-
* [asciidoctor](https://github.com/asciidoctor/asciidoctor)
|
328
|
-
* [asciidoctor-pdf](https://github.com/asciidoctor/asciidoctor-pdf)
|
329
|
-
* [grafana](https://github.com/grafana/grafana)
|
330
|
-
|
331
|
-
Inspired by [Izak Marai's grafana reporter](https://github.com/IzakMarais/reporter)
|
332
|
-
|
333
|
-
## Donations
|
334
|
-
|
335
|
-
If this project saves you as much time as I hope it does, and if you'd like to
|
336
|
-
support my work, feel free donate, even a cup of coffee is appreciated :)
|
337
|
-
|
338
|
-
[](https://www.paypal.com/donate?hosted_button_id=35LH6JNLPHPHQ)
|
339
|
-
|
1
|
+
[](https://github.com/divinity666/ruby-grafana-reporter/blob/master/LICENSE)
|
2
|
+
[](https://travis-ci.org/github/divinity666/ruby-grafana-reporter?branch=master)
|
3
|
+
[](https://coveralls.io/github/divinity666/ruby-grafana-reporter?branch=master)
|
4
|
+
|
5
|
+
# Ruby Grafana Reporter
|
6
|
+
Reporting Service for Grafana
|
7
|
+
|
8
|
+
## Table of Contents
|
9
|
+
|
10
|
+
* [About the project](#about-the-project)
|
11
|
+
* [Getting started](#getting-started)
|
12
|
+
* [Grafana integration](#grafana-integration)
|
13
|
+
* [Webservice overview](#webservice-overview)
|
14
|
+
* [Features](#features)
|
15
|
+
* [Roadmap](#roadmap)
|
16
|
+
* [Contributing](#contributing)
|
17
|
+
* [Licensing](#licensing)
|
18
|
+
* [Acknowledgements](#acknowledgements)
|
19
|
+
* [Donations](#donations)
|
20
|
+
|
21
|
+
## About the project
|
22
|
+
|
23
|
+
Did you ever want to create (professional) reports based on Grafana dashboards?
|
24
|
+
I did so in order to being able to automatically get monthly reports of my
|
25
|
+
home's energy usage. That's how it started.
|
26
|
+
|
27
|
+
The reporter provides reporting capabilities for Grafana. It is based on
|
28
|
+
(but not limited to) [asciidoctor](https://github.com/asciidoctor/asciidoctor)
|
29
|
+
report templates, which can dynamically integrate Grafana panels, queries,
|
30
|
+
images etc. to create dynamic PDF reports on the fly.
|
31
|
+
|
32
|
+
The report may also be returned in any other format that asciidoctor supports.
|
33
|
+
|
34
|
+
The reporter can run standalone or as a webservice. It is built to
|
35
|
+
integrate without further dependencies with the asciidoctor docker image.
|
36
|
+
|
37
|
+
The complete
|
38
|
+
[API documentation](https://rubydoc.info/gems/ruby-grafana-reporter) can be
|
39
|
+
found here.
|
40
|
+
|
41
|
+
## Getting started
|
42
|
+
|
43
|
+
There exist several ways of installing the reporter. Here I cover the easiest
|
44
|
+
setup by using ruby gems. If you need further installation help, or want to use
|
45
|
+
a "baremetal" ruby setup or a docker integration, please have a look at the more
|
46
|
+
extended [installation documentation](INSTALL.md).
|
47
|
+
|
48
|
+
To install the reporter as a gem, simply run:
|
49
|
+
|
50
|
+
gem install ruby-grafana-reporter
|
51
|
+
|
52
|
+
If no configuration file is in place, you might want to use the configuration
|
53
|
+
wizard, which leads you through all necessary steps:
|
54
|
+
|
55
|
+
ruby-grafana-reporter -w
|
56
|
+
|
57
|
+
Now you're ready to go! Let's check it out!
|
58
|
+
|
59
|
+
ruby-grafana-reporter -t demo_report -o my_first_render.pdf
|
60
|
+
|
61
|
+
If everything works as expected, you should find a file named `my_first_render.pdf`
|
62
|
+
in the current folder, which contains a detailed explanation of all available
|
63
|
+
commands as well as your available configuration options.
|
64
|
+
|
65
|
+
To run the reporter as a service, you only need to call it like this:
|
66
|
+
|
67
|
+
ruby-grafana-reporter
|
68
|
+
|
69
|
+
Neat, isn't it?
|
70
|
+
|
71
|
+
### Grafana integration
|
72
|
+
|
73
|
+
The key feature of the report is, that it can easily be integrated with grafana
|
74
|
+
(I've not even been talking about the features it is providing for that, but
|
75
|
+
you'll find them having a look in the example results above).
|
76
|
+
|
77
|
+
For accessing the reporter from grafana, you need to simply add a link to your
|
78
|
+
grafana dashboard:
|
79
|
+
|
80
|
+
* Open the dashboard configuration
|
81
|
+
* Select `Links`
|
82
|
+
* Select `Add`
|
83
|
+
* Fill out as following:
|
84
|
+
* Type: `link`
|
85
|
+
* Url: `http://<<your-server-url>>:<<your-webservice-port>>/render?var-template=myfirsttemplate`
|
86
|
+
* Title: `MyFirstReport`
|
87
|
+
* Select `Time range`
|
88
|
+
* Select `Variable values`
|
89
|
+
* Select `Add`
|
90
|
+
|
91
|
+
Now go back to your dashboard and click the newly generated 'MyFirstReport'
|
92
|
+
link on it. Now the renderer should start it's task and show you the expected
|
93
|
+
results.
|
94
|
+
|
95
|
+
But now the fun just starts! Try out the functions stated in the
|
96
|
+
'MyFirstReport' PDF file, to include the dynamic content in your asciidoctor
|
97
|
+
template.
|
98
|
+
|
99
|
+
Additionally you might want to make the selection of the template variable.
|
100
|
+
Piece of cake: Just add a dashboard variable to your grafana dashboard named
|
101
|
+
`template` and let the user select or enter a template name. To make use of it,
|
102
|
+
you should change the link of the 'MyFirstReport' link to
|
103
|
+
`http://<<your-server-url>>:<<your-webservice-port>>/render?`
|
104
|
+
|
105
|
+
That's it. Let me know your feedback!
|
106
|
+
|
107
|
+
## Webservice overview
|
108
|
+
|
109
|
+
Running the reporter as a webservice provides the following URLs
|
110
|
+
|
111
|
+
/overview - for all running or retained renderings
|
112
|
+
/render - for rendering a template, 'var-template' is the only mandatory GET parameter
|
113
|
+
/view_report - for viewing the status or receving the result of a specific rendering, is automatically called after a successfull /render call
|
114
|
+
/cancel_report - for cancelling the rendering of a specific report, normally not called manually, but on user interaction in the /view_report or /overview URL
|
115
|
+
|
116
|
+
## Features
|
117
|
+
|
118
|
+
* Build report template including all imaginable grafana content:
|
119
|
+
* panels as images
|
120
|
+
* panel table query or custom query results as real document tables (not images!)
|
121
|
+
* single panel value or custom query single value result integrated in texts
|
122
|
+
* Solid as a rock, also in case of template errors (at least it aims to be)
|
123
|
+
* Runs standalone or as a webservice
|
124
|
+
* Seamlessly integrates with asciidoctor docker container
|
125
|
+
* Developed for being able to support other tools than asciidoctor as well
|
126
|
+
|
127
|
+
## Roadmap
|
128
|
+
|
129
|
+
This is just a collection of things, I am heading for in future, without a schedule.
|
130
|
+
|
131
|
+
* Add documentation of possible asciidoctor calls to grafana
|
132
|
+
* Add a simple plugin system to support specific asciidoctor modifications
|
133
|
+
* Solve code TODOs
|
134
|
+
* Become [rubocop](https://rubocop.org/) ready
|
135
|
+
|
136
|
+
## Contributing
|
137
|
+
|
138
|
+
If you'd like to contribute, please fork the repository and use a feature
|
139
|
+
branch. Pull requests are warmly welcome.
|
140
|
+
|
141
|
+
Though not yet valid for my code, I'd like to see the project become
|
142
|
+
[rubocop](https://rubocop.org/) ready :-)
|
143
|
+
|
144
|
+
Definitely open spots from my side are:
|
145
|
+
|
146
|
+
* This README
|
147
|
+
* Clean and properly setup test cases
|
148
|
+
|
149
|
+
## Licensing
|
150
|
+
|
151
|
+
The code in this project is licensed under MIT license.
|
152
|
+
|
153
|
+
## Acknowledgements
|
154
|
+
* [asciidoctor](https://github.com/asciidoctor/asciidoctor)
|
155
|
+
* [asciidoctor-pdf](https://github.com/asciidoctor/asciidoctor-pdf)
|
156
|
+
* [grafana](https://github.com/grafana/grafana)
|
157
|
+
|
158
|
+
Inspired by [Izak Marai's grafana reporter](https://github.com/IzakMarais/reporter)
|
159
|
+
|
160
|
+
## Donations
|
161
|
+
|
162
|
+
If this project saves you as much time as I hope it does, and if you'd like to
|
163
|
+
support my work, feel free donate, even a cup of coffee is appreciated :)
|
164
|
+
|
165
|
+
[](https://www.paypal.com/donate?hosted_button_id=35LH6JNLPHPHQ)
|
166
|
+
|