Grafana Provisioning: Automate Dashboards & Data Sources

Learn how to automate Grafana dashboard and data source management using provisioning. This guide covers best practices, YAML examples, and tips to streamline observability with configuration as code.

Introduction

Grafana provisioning transforms dashboard and data source management by enabling configuration as code. For DevOps engineers and SREs, this approach delivers reliable, reproducible, and scalable observability environments—ideal for fast-moving teams and modern CI/CD workflows.

What Is Grafana Provisioning?

Provisioning in Grafana is the process of defining dashboards, data sources, alerting rules, and other resources through configuration files, typically YAML. These files are version-controlled and automatically applied when Grafana starts, or updated continuously as files change. This eliminates manual configuration, reduces errors, and enables portability across environments.

Why Provision Grafana?

  • Consistency: Guarantee identical dashboards and data sources across dev, staging, and production.
  • Version Control: Store configurations in Git for auditability and collaboration.
  • Automation: Integrate with CI/CD pipelines for zero-touch deployments.
  • Scalability: Manage large, distributed Grafana deployments efficiently.

How Grafana Provisioning Works

Grafana actively scans defined provisioning directories for configuration files. When changes are detected, it creates or updates dashboards, data sources, and more, according to the file definitions. Supported resources include:

  • Dashboards
  • Data sources
  • Alerting resources (from v9+)
  • Folders

Directory Structure

The provisioning directory typically lives in /etc/grafana/provisioning/ or <install_dir>/conf/provisioning/. The structure is:

provisioning/
  datasources/
    datasource.yaml
  dashboards/
    dashboards.yaml
  alerting/
    alerting.yaml

Step-by-Step: Provisioning Dashboards

1. Configure Provisioning Paths

Edit grafana.ini to allow provisioning from desired directories. For example:

[feature_toggles]
provisioning = true
kubernetesDashboards = true

[paths]
permitted_provisioning_paths = /etc/grafana/provisioning/ | /var/lib/grafana/dashboards/

Restart Grafana after updating grafana.ini to apply changes.
Paths ensure only trusted directories are used for provisioning [1].

2. Create a Dashboard Provider

In provisioning/dashboards/, create a YAML file (e.g., default.yaml):

apiVersion: 1
providers:
  - name: 'default'
    orgId: 1
    folder: 'Production Monitoring'
    type: file
    disableDeletion: false
    updateIntervalSeconds: 10
    allowUiUpdates: false
    options:
      path: /var/lib/grafana/dashboards
      foldersFromFilesStructure: true

This configuration tells Grafana to scan /var/lib/grafana/dashboards every 10 seconds for JSON dashboard definitions, placing them in the Production Monitoring folder [4].

3. Add Dashboard JSON Files

Place exported dashboard JSON files in the /var/lib/grafana/dashboards directory. Example:

/var/lib/grafana/dashboards/
  node_exporter_overview.json
  application_latency.json

On Grafana startup—or when files change—these dashboards are created or updated automatically.

Step-by-Step: Provisioning Data Sources

1. Create a Data Source YAML

In provisioning/datasources/, create datasource.yaml:

apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: false

This defines a Prometheus data source, set as default and not editable from the UI [2][4].

Best Practices for Grafana Provisioning

  • Version Control: Store all YAML and dashboard JSON files in a Git repository.
  • CI/CD Integration: Use pipeline steps to deploy updated provisioning files as part of your release process [3].
  • Use Folders: Organize dashboards with folders for multi-team or multi-environment setups.
  • Secure Paths: Limit permitted_provisioning_paths to trusted directories only.
  • Test in Staging: Validate provisioning in a non-production environment before rolling out changes globally.

Advanced: Provisioning with CI/CD

Automate provisioning updates with a CI/CD pipeline. For example, using GitHub Actions:

name: Provision Grafana Dashboards
on:
  push:
    paths:
      - provisioning/**
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Copy provisioning files
        run: |
          scp -r provisioning/ user@grafana-server:/etc/grafana/provisioning/
      - name: Restart Grafana
        run: ssh user@grafana-server 'sudo systemctl restart grafana-server'

This ensures any dashboard or data source change in your repository is automatically applied to your Grafana server [3].

Troubleshooting Common Issues

  • Incorrect Paths: Ensure dashboard/data source files are in the correct directory, and that grafana.ini permits those paths.
  • File Permissions: The Grafana process must have read access to all provisioned files.
  • YAML Syntax: Watch out for indentation and formatting errors in YAML files.
  • Dashboard Visibility: If dashboards don't appear, check the provider configuration and ensure JSON files are valid.

Conclusion

Grafana provisioning is essential for scalable, reliable observability. By leveraging configuration as code, DevOps teams can streamline dashboard management, ensure consistency, and accelerate delivery. Start provisioning today to bring your observability workflows into the modern era.