Description
Is your feature request related to a problem? Please describe.
As platform engineers me and my collegues want to provide our customers with some standardized dashboards where our customers can only access their target cluster and namespace. For that we created a template dashboard which we store in git. Now we would like to create a kubernetes manifest GrafanaDashboard
which takes in a url to the template dashboard json and substitutes some values on the go in the kubernetes manifest. Currently we have to create a seperate json file for each request where we need to change the query by hand. This is error prone and tidiouse if we want to update the "standardized" dashbaord
(If applicable)If your feature request solves a bug please provide a link to the community issue
Describe the solution you'd like
When I create a GrafanaDashboard
I would like to be able to substitute some variables in the dashbaord.json. Example
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
name: customer-dashboard.team-xyz
namespace: monitoring
spec:
folder: Team-xyz
instanceSelector:
matchLabels:
app.kubernetes.io/name: grafana-operator
resyncPeriod: 10s
url: https://raw.githubusercontent.com/blabla/dashbaord-template.json
urlAuthorization:
basicAuth:
password:
name: secret
key: password
username:
name: secret
key: username
substituteVars:
- varName1: "value1"
- varName2: "value2"
Describe alternatives you've considered
Alternatives are to create a seperate dashboard.json and then a kubernetes manifest of GrafanaDashboard
. With the approache described above we could have one central template and multiple GrafanaDashbaord
's which synch with that one url and substitute variables on the go.
Additional context
n/a
Existing solutions
n/a
Would be a really nice feature to the operator. Please let me know what you think of this. BR.
Activity
KaiseerKenopsia commentedon Nov 19, 2024
Wouldn't a helm template be enough to solve your problem?
Put your vars into Values and then you can iterate over them with a 'range' loop, golang can iterate well over dicts and lists, so the differing-imported vars can have any yaml structure you want.
Go docs can be hard to understand sometimes so here is a 'range' example:
https://stackoverflow.com/questions/54156119/range-over-string-slice-in-golang-template
If you dig around the templates folder in helm chart, you'll be probably able to reverse engineer the rest
theSuess commentedon Nov 25, 2024
I've investigated this a bit and found a way to do this which is officially supported by Grafana (albeit, not very well documented).
By using the
__inputs
field in the Dashboard specification and the/api/dashboards/import
endpoint, arbitrary variables can be replaced in a dashboard specification.I'm open to adding this as a feature to the operator but would like to hear other opinions on this
Hipska commentedon Apr 3, 2025
@theSuess I'm trying to create a dashboard from exported JSON which has
constant
type template vars, so the__inputs
field looks like this:But the resulting dashboard in Grafana shows this:
Instead of the expected
I'm not sure if this is a problem on Operator or Grafana side..
Hipska commentedon Apr 9, 2025
So having a way to easily replace these vars based on the json
__inputs
or a new option in the spec (higher precedence) as suggested, would be very welcome!jmendiara commentedon May 15, 2025
👍 +1 on supporting the
constant
type in theGrafanaDashboard
spec — it's already a native Grafana feature.Use case and example:
We can define a "constant" variable in a Dashboard.
This allows
$namespace
to be used in queries without exposing the variable to users via the dashboard variable selector — a clear UX improvement.When exporting the dashboard externally, that constant variable (sic) is available in
_inputs
asVAR_**************
When importing this dashboard manually through the UI, we can define both the Prometheus data source and the Namespace constant.
Suggested implementation:
Support a
constants:
field in theGrafanaDashboard
spec, for example (Helm-style):This would provide parity between dashboards imported via the UI and those deployed through the Operator.
Hipska commentedon Jun 4, 2025
IMHO, if you name it
inputs
, it could even replace the currentdatasources
setting.If the
value
for a constant is not set in the spec, the default value as defined in the JSON could be used.