'How to import custom dashboards to grafana using helm

I'm trying to understand helm and I wonder if someone could ELI5 to me something or help me with something.

So i did run below:

helm repo add coreos https://s3-eu-west-1.amazonaws.com/coreos-charts/stable/

Then I installed kube-prometheus by using below:

helm install coreos/kube-prometheus --name kube-prometheus -f values.yaml --namespace monitoringtest

Everything works fine but I'm trying to add some custom dashboards from json files and I'm struggling to understand how to do it.

I was following this: https://blogcodevalue.wordpress.com/2018/09/16/automate-grafana-dashboard-import-process/

In my values.yaml I added below

serverDashboardConfigmaps:
  - example-dashboards

I understand that if I do:

helm upgrade --install kube-prometheus -f values.yaml --namespace monitoringtest coreos/kube-prometheus

That should cause grafana to pickup a below configmap called example-dashboards and load *.json files from custom-dashboards folder.

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-dashboards
data:
{{ (.Files.Glob "custom-dashboards/*.json").AsConfig | indent 2 }}

# Or
# 
# data:
#   custom-dashboard.json: |-
# {{ (.Files.Get "custom.json") | indent 4 }}
#
# The filename (and consequently the key under data) must be in the format `xxx-dashboard.json` or `xxx-datasource.json`
# for them to be picked up.

Now two questions:

How do I add above configmap to this helm release?

Where is this custom-dashboards folder located? Is it on my laptop and then is send to grafana?

Do I need to copy all of https://s3-eu-west-1.amazonaws.com/coreos-charts/stable/ onto my laptop?

Sorry for explaining everything but I'm just trying to understand this.



Solution 1:[1]

In the latest version of kube-prometheus-stack chart in 2021, According to this answer on github, You should just create a configmap with dashboard data and right labels and it will be checked by sidecar in grafana pod.

Example:

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-dashboards-custom-1
  namespace: monitoring
  labels:
     grafana_dashboard: "1"
     prometheus: my-value
     release: prometheus

data:
  app-status.json: |-
    {
    "annotations": {
        "list": [
        {

prometheus: my-value comes from this helm chart value:

prometheus:
  prometheusSpec:
    serviceMonitorSelector:
      matchLabels:
        prometheus: my-value

Solution 2:[2]

I partially figured it out. I can load dashboards from a configmap. Not from separate json files yet but it'a progress.

For anyone interested I put this on my github page: https://github.com/tretos53/notes/blob/master/Grafana/Readme.MD

Solution 3:[3]

You can find a good example of how to do this in the charts for prometheus-operator here:

https://github.com/helm/charts/tree/master/stable/prometheus-operator/templates/grafana

It is a ConfigMapList that gets all JSONs from a given directory and stores them into ConfigMaps which are read by Grafana.

{{- $files := .Files.Glob "dashboards/*.json" }}
{{- if $files }}
apiVersion: v1
kind: ConfigMapList
items:
{{- range $path, $fileContents := $files }}
{{- $dashboardName := regexReplaceAll "(^.*/)(.*)\\.json$" $path "${2}" }}
- apiVersion: v1
  kind: ConfigMap
  metadata:
    name: {{ printf "%s-%s" (include "prometheus-operator.fullname" $) $dashboardName | trunc 63 | trimSuffix "-" }}
    namespace: {{ template "prometheus-operator.namespace" . }}
    labels:
      {{- if $.Values.grafana.sidecar.dashboards.label }}
      {{ $.Values.grafana.sidecar.dashboards.label }}: "1"
      {{- end }}
      app: {{ template "prometheus-operator.name" $ }}-grafana
{{ include "prometheus-operator.labels" $ | indent 6 }}
  data:
    {{ $dashboardName }}.json: {{ $.Files.Get $path | toJson }}
{{- end }}
{{- end }}

Mind that the size of a ConfigMap might be limited: https://stackoverflow.com/a/53015758/4252480

Solution 4:[4]

There are different ways to do so. It also depends on the Grafana/Prometheus Stack Chart version. The info is here: https://github.com/grafana/helm-charts/tree/main/charts/grafana#import-dashboards (Grafana chart can override kube-prometheus-stack values since the latter is dependent on Grafana)

The one that definitely worked for me is Sidecar for dashboards. If you want to import dashboards for all Grafana organizations as well, you need to use dashboardProviders: {} Some details: https://grafana.com/tutorials/provision-dashboards-and-data-sources/

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Unique_boy96
Solution 2 tr53
Solution 3
Solution 4 t7e