grafana / grafana-operator

An operator for Grafana that installs and manages Grafana instances, Dashboards and Datasources through Kubernetes/OpenShift CRs
https://grafana.github.io/grafana-operator/
Apache License 2.0
922 stars 397 forks source link

GrafanaDashboard syncing from url and replacing variables on the go #1760

Open toporek3112 opened 1 week ago

toporek3112 commented 1 week ago

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.

KaiseerKenopsia commented 6 days ago

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 commented 20 hours ago

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