helm / charts

⚠️(OBSOLETE) Curated applications for Kubernetes
Apache License 2.0
15.49k stars 16.83k forks source link

Uploading Grafana Dashboards #1079

Closed afritzler closed 6 years ago

afritzler commented 7 years ago

Did I get it correct, that uploading a Grafana dashboard is done via adding the dashboard JSON to the values.yaml?

serverDashboardFiles: {}

Any reason why you should not use an upload curl job (like the datesource registration)? Would be nice to have a way to define a list of publically reachable endpoints hosting the dashboard files.

dkoshkin commented 7 years ago

@afritzler did you get this working, I dont know what is the format that this is expecting? Is it the path to the file, JSON, yaml?

afritzler commented 7 years ago

@dkoshkin Not really. I was also not able to find a working example so far. From looking at the template files, it seems like local dashboard files should be referenced here.

dkoshkin commented 7 years ago

Hey @afritzler, here is what I got: Note that the graphs have DS_PROMETHEUS variable that needs to be substituted with the datasource name. Also in the Grafana dropdown all of the graphs are being shown twice, will update if I find a fix.

serverDashboardFiles:
  all-nodes-dashboard.json: |+
    {
      "__inputs": [
          {
              "description": "",
              "label": "prometheus",
              "name": "prometheus",
              "pluginId": "prometheus",
              "pluginName": "Prometheus",
              "type": "datasource"
          }
      ],
      "__requires": [
          {
              "id": "grafana",
              "name": "Grafana",
              "type": "grafana",
              "version": "4.1.1"
          },
          {
              "id": "graph",
              "name": "Graph",
              "type": "panel",
              "version": ""
          },
          {
              "id": "prometheus",
              "name": "Prometheus",
              "type": "datasource",
              "version": "1.0.0"
          },
          {
              "id": "singlestat",
              "name": "Singlestat",
              "type": "panel",
              "version": ""
          }
      ],
      "annotations": {
          "list": []
      },
      "description": "Dashboard to get an overview of one server",
      "editable": true,
      "gnetId": 22,
      "graphTooltip": 0,
      "hideControls": false,
      "id": null,
      "links": [],
      "refresh": false,
      "rows": [
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 3,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_cpu{mode=\"idle\"}[2m])) * 100",
                              "hide": false,
                              "intervalFactor": 10,
                              "legendFormat": "",
                              "refId": "A",
                              "step": 50
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Idle cpu",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "percent",
                              "label": "cpu usage",
                              "logBase": 1,
                              "max": null,
                              "min": 0,
                              "show": true
                          },
                          {
                              "format": "short",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 9,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(node_load1)",
                              "intervalFactor": 4,
                              "legendFormat": "load 1m",
                              "refId": "A",
                              "step": 20,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_load5)",
                              "intervalFactor": 4,
                              "legendFormat": "load 5m",
                              "refId": "B",
                              "step": 20,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_load15)",
                              "intervalFactor": 4,
                              "legendFormat": "load 15m",
                              "refId": "C",
                              "step": 20,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "System load",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "percentunit",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "short",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          },
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 4,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "node_memory_SwapFree{instance=\"172.17.0.1:9100\",job=\"prometheus\"}",
                              "yaxis": 2
                          }
                      ],
                      "span": 9,
                      "stack": true,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(node_memory_MemTotal) - sum(node_memory_MemFree) - sum(node_memory_Buffers) - sum(node_memory_Cached)",
                              "intervalFactor": 2,
                              "legendFormat": "memory usage",
                              "metric": "memo",
                              "refId": "A",
                              "step": 4,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_memory_Buffers)",
                              "interval": "",
                              "intervalFactor": 2,
                              "legendFormat": "memory buffers",
                              "metric": "memo",
                              "refId": "B",
                              "step": 4,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_memory_Cached)",
                              "interval": "",
                              "intervalFactor": 2,
                              "legendFormat": "memory cached",
                              "metric": "memo",
                              "refId": "C",
                              "step": 4,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_memory_MemFree)",
                              "interval": "",
                              "intervalFactor": 2,
                              "legendFormat": "memory free",
                              "metric": "memo",
                              "refId": "D",
                              "step": 4,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Memory usage",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "individual"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": "0",
                              "show": true
                          },
                          {
                              "format": "short",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "cacheTimeout": null,
                      "colorBackground": false,
                      "colorValue": false,
                      "colors": [
                          "rgba(50, 172, 45, 0.97)",
                          "rgba(237, 129, 40, 0.89)",
                          "rgba(245, 54, 54, 0.9)"
                      ],
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "format": "percent",
                      "gauge": {
                          "maxValue": 100,
                          "minValue": 0,
                          "show": true,
                          "thresholdLabels": false,
                          "thresholdMarkers": true
                      },
                      "id": 5,
                      "interval": null,
                      "links": [],
                      "mappingType": 1,
                      "mappingTypes": [
                          {
                              "name": "value to text",
                              "value": 1
                          },
                          {
                              "name": "range to text",
                              "value": 2
                          }
                      ],
                      "maxDataPoints": 100,
                      "nullPointMode": "connected",
                      "nullText": null,
                      "postfix": "",
                      "postfixFontSize": "50%",
                      "prefix": "",
                      "prefixFontSize": "50%",
                      "rangeMaps": [
                          {
                              "from": "null",
                              "text": "N/A",
                              "to": "null"
                          }
                      ],
                      "span": 3,
                      "sparkline": {
                          "fillColor": "rgba(31, 118, 189, 0.18)",
                          "full": false,
                          "lineColor": "rgb(31, 120, 193)",
                          "show": false
                      },
                      "targets": [
                          {
                              "expr": "((sum(node_memory_MemTotal) - sum(node_memory_MemFree) - sum(node_memory_Buffers) - sum(node_memory_Cached)) / sum(node_memory_MemTotal)) * 100",
                              "intervalFactor": 2,
                              "metric": "",
                              "refId": "A",
                              "step": 60,
                              "target": ""
                          }
                      ],
                      "thresholds": "80, 90",
                      "title": "Memory usage",
                      "type": "singlestat",
                      "valueFontSize": "80%",
                      "valueMaps": [
                          {
                              "op": "=",
                              "text": "N/A",
                              "value": "null"
                          }
                      ],
                      "valueName": "avg"
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          },
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 6,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "read",
                              "yaxis": 1
                          },
                          {
                              "alias": "{instance=\"172.17.0.1:9100\"}",
                              "yaxis": 2
                          },
                          {
                              "alias": "io time",
                              "yaxis": 2
                          }
                      ],
                      "span": 9,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_disk_bytes_read[5m]))",
                              "hide": false,
                              "intervalFactor": 4,
                              "legendFormat": "read",
                              "refId": "A",
                              "step": 8,
                              "target": ""
                          },
                          {
                              "expr": "sum(rate(node_disk_bytes_written[5m]))",
                              "intervalFactor": 4,
                              "legendFormat": "written",
                              "refId": "B",
                              "step": 8
                          },
                          {
                              "expr": "sum(rate(node_disk_io_time_ms[5m]))",
                              "intervalFactor": 4,
                              "legendFormat": "io time",
                              "refId": "C",
                              "step": 8
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Disk I/O",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "ms",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "cacheTimeout": null,
                      "colorBackground": false,
                      "colorValue": false,
                      "colors": [
                          "rgba(50, 172, 45, 0.97)",
                          "rgba(237, 129, 40, 0.89)",
                          "rgba(245, 54, 54, 0.9)"
                      ],
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "format": "percentunit",
                      "gauge": {
                          "maxValue": 1,
                          "minValue": 0,
                          "show": true,
                          "thresholdLabels": false,
                          "thresholdMarkers": true
                      },
                      "id": 7,
                      "interval": null,
                      "links": [],
                      "mappingType": 1,
                      "mappingTypes": [
                          {
                              "name": "value to text",
                              "value": 1
                          },
                          {
                              "name": "range to text",
                              "value": 2
                          }
                      ],
                      "maxDataPoints": 100,
                      "nullPointMode": "connected",
                      "nullText": null,
                      "postfix": "",
                      "postfixFontSize": "50%",
                      "prefix": "",
                      "prefixFontSize": "50%",
                      "rangeMaps": [
                          {
                              "from": "null",
                              "text": "N/A",
                              "to": "null"
                          }
                      ],
                      "span": 3,
                      "sparkline": {
                          "fillColor": "rgba(31, 118, 189, 0.18)",
                          "full": false,
                          "lineColor": "rgb(31, 120, 193)",
                          "show": false
                      },
                      "targets": [
                          {
                              "expr": "(sum(node_filesystem_size{device!=\"rootfs\"}) - sum(node_filesystem_free{device!=\"rootfs\"})) / sum(node_filesystem_size{device!=\"rootfs\"})",
                              "intervalFactor": 2,
                              "refId": "A",
                              "step": 60,
                              "target": ""
                          }
                      ],
                      "thresholds": "0.75, 0.9",
                      "title": "Disk space usage",
                      "type": "singlestat",
                      "valueFontSize": "80%",
                      "valueMaps": [
                          {
                              "op": "=",
                              "text": "N/A",
                              "value": "null"
                          }
                      ],
                      "valueName": "current"
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          },
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 8,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "transmitted ",
                              "yaxis": 2
                          }
                      ],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_network_receive_bytes{device!~\"lo\"}[5m]))",
                              "hide": false,
                              "intervalFactor": 2,
                              "legendFormat": "",
                              "refId": "A",
                              "step": 10,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Network received",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 10,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "transmitted ",
                              "yaxis": 2
                          }
                      ],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_network_transmit_bytes{device!~\"lo\"}[5m]))",
                              "hide": false,
                              "intervalFactor": 2,
                              "legendFormat": "",
                              "refId": "B",
                              "step": 10,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Network transmitted",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          }
      ],
      "schemaVersion": 14,
      "style": "dark",
      "tags": [
          "prometheus"
      ],
      "templating": {
          "list": []
      },
      "time": {
          "from": "now-1h",
          "to": "now"
      },
      "timepicker": {
          "refresh_intervals": [
              "5s",
              "10s",
              "30s",
              "1m",
              "5m",
              "15m",
              "30m",
              "1h",
              "2h",
              "1d"
          ],
          "time_options": [
              "5m",
              "15m",
              "1h",
              "6h",
              "12h",
              "24h",
              "2d",
              "7d",
              "30d"
          ]
      },
      "timezone": "browser",
      "title": "All Nodes",
      "version": 1
    }
sfrique commented 7 years ago

I've also tried before but failed. Will see this example later. I tried without the + and it failed, could have been that. But it would be nicer to use external references so we don't have such a big file.

dkoshkin commented 7 years ago

Seems that the json file support is broken and being deprecated. Perhaps the chart should use something like grafana-watcher until it gets fixed upstream.

travishaagen commented 7 years ago

Example YAML by @dkoshkin worked for me with my own exported dashboard. Thx!

afritzler commented 7 years ago

@travishaagen the example above also worked for me. However I always end up with 2 identical dashboards.

dkoshkin commented 7 years ago

This is actually a problem with grafana and loading the dashboards from a file. I've had good luck using a sidecar to load the dashboards until it gets fixed upstream in Grafana. https://github.com/apprenda/kismatic-charts/tree/master/charts/grafana

linuxbsdfreak commented 7 years ago

@dkoshkin - Where could i get the Example yaml file? I dont see any thing attached.

linuxbsdfreak commented 7 years ago

@dkoshkin - How are you launching the sidecar? I am using the chart given above. https://github.com/apprenda/kismatic-charts/tree/master/charts/grafana

travishaagen commented 7 years ago

I don't use the serverDashboardFiles property anymore, but instead wrote a parent Helm Chart that has a batch/job template that uses Grafana's REST API to create a dashboard. It uses the same technique that the Grafana chart currently uses to create a datasource in grafana/templates/job.yaml.

One thing to note is that when you upload a dashboard, you need to make sure the root "id" field in your dashboard JSON is null or else Grafana will complain.

linuxbsdfreak commented 7 years ago

@travishaagen. Could you share some additional details on how you are doing it with the stable grafana helm chart? I have to setup multiple dashboards when the grafana pod is deployed

travishaagen commented 7 years ago

Two ways that my team has tried:

  1. Define a configmap that contains the dashboard JSON definitions and then inject configmap properties into environment variables that gets sent by the CURL command in the job. You could have all of your dashboards defined in a single configmap, with each having their own name/key. This can be nice if you want to add template logic to the dashboard YAML.
  2. Define a file for each dashboard JSON, write a bash script that iterates over them and builds up the CURL command. In this case, the job executes the bash script directly, instead of the CURL command.

Example configmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ template "fullname" . }}-grafana-dashboard-configmap
data:
  dashboard.json: |+
    {
      "id": null,
     ...
    }

Example job:

apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app: {{ template "fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    heritage: "{{ .Release.Service }}"
    release: "{{ .Release.Name }}"
  name: {{ template "fullname" . }}-grafana-dashboard-job
spec:
  activeDeadlineSeconds: 450
  template:
    metadata:
      labels:
        app: {{ template "fullname" . }}
        release: "{{ .Release.Name }}"
    spec:
      containers:
      - name: {{ template "fullname" . }}-grafana-dashboard-curl
        image: "appropriate/curl:latest"
        env:
        - name: DASHBOARD_JSON
          valueFrom:
            configMapKeyRef:
              name: {{ template "fullname" . }}-grafana-dashboard-configmap
              key: dashboard.json
        args:
          - "http://{{ .Values.grafana.server.adminUser }}:{{ .Values.grafana.server.adminPassword }}@{{ template "grafana.fullname" . }}:{{ .Values.grafana.server.service.httpPort }}/api/dashboards/db"
          - "--max-time"
          - "10"
          - "-H"
          - "Content-Type: application/json;charset=UTF-8"
          - "--data-binary"
          - "{ \"dashboard\":$(DASHBOARD_JSON), \"overwrite\":false }"
      restartPolicy: "OnFailure"

Again, this is all done in a parent Helm Chart that has the Grafana chart as a dependency.

linuxbsdfreak commented 7 years ago

@travishaagen Thx for the info. The steps were helpful to try. So if I get it correct if I do step 1 then step 2 is not needed Could you share some info on how you are doing step2 wither bash script with helm? I have currently 6 dashboards that need to load and would like to avoid populating json data in files

linuxbsdfreak commented 7 years ago

@travishaagen. Could you share your helm charts so that i can understand the flow? I am new to helm and trying to understand it.

randrewedwards commented 6 years ago

@linuxbsdfreak Having the same issue as you, seems like a bit an issue with helm. I have the same problem in a few other charts having to put the contents of the file instead of referencing a file. It makes it incredibly difficult to create additional dashboards/ have some actual version control in a chart.

fiunchinho commented 6 years ago

I confirm that adding dashboards using serverDashboardFiles, grafana creates the dashboards twice.

alex-voigt commented 6 years ago

@fiunchinho we got the same problem here

bivas commented 6 years ago

I've created a PR to address these issues and able to import using the Grafana API endpoint with a Job. Tested it and dashboards are imported once and can even be imported with the URL alone (no need to copy long JSONs to values.yaml)

mbarison commented 6 years ago

The import job provided with the stable chart (v0.8.3) does not work, as the current json templates include variables (e.g. ${DS_PROMETHEUS}) that do not get expanded by the import job. Will try a workaround that replaces the variables after downloading the json specs from the grafana repo.

bivas commented 6 years ago

@mbarison this has nothing to do with the chart itself, the data source syntax you quote is the Grafana best practice on importing dashboards. The charts should not care what you include in the dashboard json, just import it.

mbarison commented 6 years ago

@bivas if I run the stable chart as it is now, the imported dashboards fail with the error "Unknown source ${DS_PROMETHEUS}" I think the import job should replace that value, but if you have another solution, please tell me, because I have been banging my head against the desk all day long.

bivas commented 6 years ago

Like I said, you're mixing 2 things. The chart just import the dashboard json file. It shouldn't manipulate it. Check the json files from Grafana site and you'll see that this is their suggested import. You should Google the error and you'll notice it was there long before Helm.

mbarison commented 6 years ago

In my opinion, the dashboard import job is a convenience for the user to automate the set up of dashboards, so that whether there are multiple dashboards and multiple clusters, human interaction is kept at a minimum.

Grafana's suggested import procedure is a two steps procedure:

  1. Import the JSON spec defining your dashboard
  2. Use a dialog box in the GUI to specify the datasource to be used with the imported dashboard

The Job spec supplied with the Grafana chart only performs step 1, and leaves the dashboard in an unusable state. Moreover, as the import happens through the API rather than the GUI, step 2 is not accessible anymore. So now if I want to fix my dashboards, I have to manually go through the imported specs and modify them by hand. Which I don't think is the spirit of what Helm is used for.

I do agree that the problem is with Grafana and not with Helm, but if the idea is to automate the provisioning of Grafana, Helm should accommodate for Grafana's flaws, not work against them.

I will try my approach, and if you don't like it, you can shoot it down at the PR ;)

fejta-bot commented 6 years ago

Issues go stale after 90d of inactivity. Mark the issue as fresh with /remove-lifecycle stale. Stale issues rot after an additional 30d of inactivity and eventually close.

If this issue is safe to close now please do so with /close.

Send feedback to sig-testing, kubernetes/test-infra and/or fejta. /lifecycle stale

fejta-bot commented 6 years ago

Stale issues rot after 30d of inactivity. Mark the issue as fresh with /remove-lifecycle rotten. Rotten issues close after an additional 30d of inactivity.

If this issue is safe to close now please do so with /close.

Send feedback to sig-testing, kubernetes/test-infra and/or fejta. /lifecycle rotten /remove-lifecycle stale

davidkarlsen commented 6 years ago

How did it go @mbarison ?

stale[bot] commented 6 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Any further update will cause the issue/pull request to no longer be considered stale. Thank you for your contributions.

stale[bot] commented 6 years ago

This issue is being automatically closed due to inactivity.