grafana / helm-charts

Apache License 2.0
1.63k stars 2.26k forks source link

dashboards.<name>.file creates empty ConfigMap #27

Open mozai opened 4 years ago

mozai commented 4 years ago

In the documentation for Import dashboards it gives this example for importing a file from local filesystem (near the values.yaml file, I would assume).

dashboards:
  default:
    custom-dashboard:
      # This is a path to a file inside the dashboards directory inside the chart directory
      file: dashboards/custom-dashboard.json

When trying this myself with helm2 and helm3, it results in a ConfigMap with empty values.

Below are the steps I took when trying to use this feature of the helmchart.

dashboards:
  default:
    Prometheus:
      datasource: default
      gnetId: 2
      revision: 2
    empty-dashboard:
      file: dashboards/empty-dashboard.json
    prometheus-alerts-firing:
      file: dashboards/prometheus-alerts-firing.json

empty-dashboard.json is just {} which is a copy of the example "dashboards/custom-dashboard.json" already in this git repository.

$ wc -c values.yaml dashboards/empty-dashboard.json dashboards/prometheus-alerts-firing.json
 6852 values.yaml
    3 dashboards/empty-dashboard.json
24251 dashboards/prometheus-alerts-firing.json

Launching helm install --dry-run grafana grafana/grafana -f values.yaml --debug shows the ConfigMap that would be sent to the cluster would have empty values for the dashboards, instead of the file contents.

---
# Source: grafana/templates/dashboards-json-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-dashboards-default
  namespace: default
  labels:
    helm.sh/chart: grafana-5.6.7
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/version: "7.1.5"
    app.kubernetes.io/managed-by: Helm
    dashboard-provider: default
data:
  empty-dashboard.json:
    ""
  prometheus-alerts-firing.json:
    ""

If I install this without the --dry-run the ConfigMap I find is indeed empty, and grafana complains about being unable to load these dashboards.

Bizarrely, if I add custom-dashboard: {file: dashboards/custom-dashboard.json} exactly as it appears in the example documentation, this results in a non-empty ConfigMap, even though there is no such file "dashboards/custom-dashboard.json" on my local filesystem.

Maybe the {{.Files.Get "filename"}} in the template cannot access files outside of the helmchart package itself?

dry4ng commented 3 years ago

Same issue here.

tzouin commented 3 years ago

Even using a dashboard id i have an empty configmap

  dashboards:
    default:
      sample-dashboard:
        datasource: default
        gnetId: 11056
        revision: 1
#kubectl describe  cm/prometheus-stack-grafana-dashboards-default -n monitoring
Name:         prometheus-stack-grafana-dashboards-default
Namespace:    monitoring
Labels:       app.kubernetes.io/instance=prometheus-stack
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=grafana
              app.kubernetes.io/version=7.2.1
              dashboard-provider=default
              helm.sh/chart=grafana-5.8.16
Annotations:  meta.helm.sh/release-name: prometheus-stack
              meta.helm.sh/release-namespace: monitoring

Data
====
Events:  <none>
benc-uk commented 3 years ago

Same I can't see any way to import dashboards using the dashboards: value

And I'm really struggling to create a config map holding the dashboard defintion, as I'm using Helm and the {{ and }} sequences are causing a nightmare

uvw commented 3 years ago

I only used sidecar provisioning provided by this chart before. But today, I just wanted to install a minimal Grafana instance without sidecars and with a few file and imported dashboards. I spent like an hour figuring out what’s going on :unamused:

File-based dashboards:

@mozai, I believe you are right about the template not being able to access files outside of the chart package: there is an old open issue in the Helm repo. As for bizarre dashboards/custom-dashboard.json, I guess it works because this file is part of the chart itself. I am wondering if this feature ever worked as intended.

On the bright side, sidecar-injected dashboards and datasources seem to be working great.

Imported dashboards (gnetId):

@tzouin, I think your issue is different. There is another config map containing a generated script to download gnetId dashboards. The config map should be named after the helm release you installed (likely, configmaps/prometheus-stack-grafana).

The reason it did not work is that the chart does not define a default dashboard provider. I had to define a matching provider in values as well, e.g.:

dashboardProviders:
  dashboardproviders.yaml:
    apiVersion: 1
    providers:
    - name: istio
      orgId: 1
      folder: Istio
      type: file
      options:
        path: /var/lib/grafana/dashboards/istio
dashboards:
  istio: # this key should match the provider name above
    mesh:
      gnetId: 7639
      revision: 43
      datasource: default
    #...
tzouin commented 3 years ago

@uvw i missed your answer but that's it ! Thanks you

slavonicsniper commented 3 years ago

Same issue here.

g-linville commented 2 years ago

I see there have been no comments on here in a while, and I mentioned this over on #764, but one way you can work around this is using --set-file to basically just inject the JSON into the values without maintaining an enormous values file:

helm install releasename grafana/grafana -f my_values.yaml --set-file dashboards.default.dashboard-name.json=my-dashboard.json

muzammil360 commented 9 months ago

@uvw, thanks for the detailed comment above. It was really useful to me. As per your advice, I am trying to add a dashboard using sidecar approach. The dashboard is added to grafana but I am unable to over-ride the datasource.

Here is how i was able to over-ride the datasource for opensource dashboards. But when it comes to sidecar, It doesn't seem to be able to take in datasource. Any suggestions will be welcome!

    dashboards:
      default:
        kubernetes-monitoring-dashboard:
          gnetId: 12740 # https://grafana.com/grafana/dashboards/12740-kubernetes-monitoring/
          revision: 1
          datasource: MydatasourceName  
LozanoMatheus commented 6 months ago

I think this ticket is duplicated with the #2596.

As far as I could debug, it seems the ConfigMap that reads the file, is actually only checking for the file in the Helm package. So, it only reads this file.

If you clone this repo and try to deploy locally, like

helm upgrade \
    --atomic \
    --timeout 2m \
    --cleanup-on-fail \
    --force \
    --install grafana \
    -f values.yaml \
    ./

Then it will work fine, but if you point it to grafana/grafana then it only gets the file that comes with the Helm package (custom-dashboard.json).

I couldn't find a way to get this. I'll open a ticket with Helm to see if they know how to do it and I'll share it here. The issue opened with the Helm docs here.