Grafana & You
Bringing it all together
A few points to explore in Grafana
Time range
Variables
Explore
Time Range
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9448028/pasted-from-clipboard.png)
Grafana has a global (dashboard specific) time range that allows you to specify what range of data you want to observe at that time.
These parameters can be accessed both from SQL (in filtering by time) and Javascript in Plotly.
Variables
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9448043/pasted-from-clipboard.png)
Variables are dashboard specific parameters that can exist in a few different forms (text, array, key/value) and provide dynamic values for SQL/Javascript to interpret.
They can also be the result of SQL queries as well!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9448062/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9448063/pasted-from-clipboard.png)
Explore
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9448091/pasted-from-clipboard.png)
A really nice way to check our TImescale/Postgres DB queries.
Systems involved
We pull our cached data from our db (Postgres) with queries in SQL
1
SQL
Formatting the data so to be parsed by Plotly is done in Javascript
2
Javascript
Plotly.js consumes the objects that we generate (data, layout, config) to update the Plotly graph
3
Plotly
SQL is a tricky language, but essentially follows an order of execution.
Here's a nice resource for some of the more common operations in SQL and examples.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445103/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445114/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445238/pasted-from-clipboard.png)
In initially editing SQL, you may see this version of the query builder.
To switch to the text editor of the query, click "Edit SQL". This allows us to modify the query directly.
There are a few unique elements to SQl queries in Grafana
-
Variable names can be referenced with ${var} where var is the variable name
- This way you can add them as tables and columns, like saidi_${space_grouping}_${time_grouping}
-
Due to the way Plotly interprets variables from Grafana, we aren't able to use the "Time series formatting option in the "Format as" option
-
We can still get the same effect by filtering it ourselves with the "Table" option. This looks like ... WHERE $__timeFilter(time) ...
- "time" being the time column
-
We can still get the same effect by filtering it ourselves with the "Table" option. This looks like ... WHERE $__timeFilter(time) ...
SQL in Grafana
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445267/pasted-from-clipboard.png)
Example of filtering by time
In the time series plot for SAIDI, we can filter using Grafana's special `$__timeFilter()` function that gives us the window of time we have selected in Grafana's time range control
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445283/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445303/pasted-from-clipboard.png)
Formatting variables
Grafana also has it's own variable converters for various use cases. See here for Grafana's docs.
Within our SQL queries it is sometimes needed to cast a variable as a type like date. This is apart of Postgres, not Grafana. See here for more info.
The notation is `column::type`
Javascript in the Plotly panel
Three major sections:
-
Plotly
- Data
- Layout
- Configuration
- Script
- Click script
The Plotly sections are actually just JSON objects and need to be formatted as such while the Script and Click script. However, all of the dict objects can be passed in through the Script. Let's see how!
Lots of tiny editors...
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445456/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1461358/images/9445459/pasted-from-clipboard.png)
My suggestion: We only use the Script panel and move content from Data, Layout and Config to Script (instead of partitioning)
Variables from SQL are accessed via
`let z = data.series[0].fields[0].values.buffer;`
Where series 0 is the first SQL query and fields 0 is the first column returned in the SQL Select.
A single return must come at the end of the script like `return { data: [trace1, trace2], layout: layout, config: config};` The Data object can contain multiple plots, called traces, and they are packed within a single array while returned.
Miscellaneous Plotly
Thank You!
Questions?
Grafana & You
By jacksongoode
Grafana & You
- 41