grafanalib icon indicating copy to clipboard operation
grafanalib copied to clipboard

Publish to Grafana instance using REST API

Open peay opened this issue 4 years ago • 5 comments

Really great library. I would like to get some thoughts on a potential feature. For development, it would be useful to be able to directly publish to a Grafana instance to preview/test using the REST API. This is especially useful if you don't have access to the data sources locally.

API could take the form of a method

class Dashboard:
    ...
    def preview(self, grafana_url: str, grafana_auth: str, folder: Optional[str] = None) -> str:
       ....

preview would create (or update, if it exists based on title) a dashboard named {self.title} (Preview), and would return the URL to the preview dashboard. This could also return a context manager that would delete the preview dashboard on __exit__, so that you could do:

with dashboard.preview(...) as preview:
   webbrowser.open(preview.url)
   _ = input() # Wait for a keystroke, then cleanup

peay avatar Jan 21 '21 11:01 peay

Interesting idea.

Where would this code run? Would there be a daemon beside the Grafana instance running Python code?

bboreham avatar Jan 22 '21 16:01 bboreham

I have in mind to run this from Jupyter notebooks, to achieve a kind of 'REPL' workflow: edit the dashboard definition in a notebook, periodically preview the result in a remote Grafana.

Alternatively, you could edit a Python file with a dashboard locally, with a

dashboard = ...

if __name__ == "__main__":
    with dashboard.preview(...) as preview:
        webbrowser.open(preview.url)
        _ = input() # Wait for a keystroke, then cleanup

Then, you can periodically run the script to preview.

peay avatar Jan 22 '21 19:01 peay

Yeah, I like the idea.

For me the the ability to preview a dashboard from the a Python file would be more useful than from a Jupyter notebook.

If we go to the effort of adding support for grafanalib to preview a grafana dashboard we might as well add support for it to publish/provision dashboards as the process will be almost the same.

https://grafana.com/docs/grafana/latest/http_api/dashboard/

Here is some Python code from Ansible for creating/updating dashboards: https://github.com/ansible-collections/community.grafana/blob/770421f3f227f19c0cb227fdbf681be80d69225a/plugins/modules/grafana_dashboard.py#L295-L315

JamesGibo avatar Jan 25 '21 09:01 JamesGibo

There is also this project that pushes grafanalib dashboards to grafana https://github.com/uritau/grafana_as_code

JamesGibo avatar Mar 23 '21 08:03 JamesGibo

#370 example code to publish a dashboard in python

JamesGibo avatar May 20 '21 14:05 JamesGibo