Grafana Error Guide: Provisioning 'Dashboard Not Found' — Fix the Path & Provider
Fix Grafana provisioning 'dashboard not found' errors — correct the provider path, file permissions, JSON validity, folder mapping, and reload provisioning so dashboards load from disk.
- #grafana
- #troubleshooting
- #errors
- #provisioning
Overview
Grafana can load dashboards from disk at startup and on an interval using a dashboard provider defined under /etc/grafana/provisioning/dashboards/. The provider points options.path at a directory of JSON files. When that path is wrong, unreadable, empty, or the JSON is invalid, Grafana logs a provisioning error and the expected dashboards never appear — even though the app starts fine.
The literal errors you will see:
logger=provisioning.dashboard type=file name=default error="dashboard not found"
logger=provisioning.dashboard error="failed to search for dashboards: stat /var/lib/grafana/dashboards: no such file or directory"
logger=provisioning.dashboard level=error msg="failed to load dashboard from " file=/var/lib/grafana/dashboards/prod.json error="invalid character '}' looking for beginning of object key string"
It occurs at boot and on each provisioning reload. The Grafana UI comes up, but the provisioned folder is empty or missing.
Symptoms
- Expected dashboards are absent from the folder after deploy.
- Startup log shows
provisioning.dashboard ... error. /api/dashboards/uid/<uid>returns404 Not Foundfor a UID you provisioned.- A container mounts the JSON but Grafana still shows nothing.
journalctl -u grafana-server --no-pager | grep -i "provisioning.dashboard" | tail
logger=provisioning.dashboard type=file name=default error="stat /var/lib/grafana/dashboards: no such file or directory"
Common Root Causes
1. Provider path doesn’t exist / isn’t mounted
The options.path directory is missing on the Grafana host or the volume mount didn’t land where the provider expects.
# /etc/grafana/provisioning/dashboards/default.yaml
apiVersion: 1
providers:
- name: 'default'
type: file
disableDeletion: false
updateIntervalSeconds: 30
allowUiUpdates: false
options:
path: /var/lib/grafana/dashboards
foldersFromFilesStructure: true
ls -la /var/lib/grafana/dashboards
ls: cannot access '/var/lib/grafana/dashboards': No such file or directory
2. File permissions block the grafana user
The JSON exists but is not readable by the grafana user (or Chrome/UID inside the container).
ls -la /var/lib/grafana/dashboards/*.json
-rw------- 1 root root 5123 prod.json # grafana user can't read it
3. Invalid dashboard JSON
A trailing comma or a templated value that wasn’t rendered makes the file unparseable, so that dashboard is skipped.
jq empty /var/lib/grafana/dashboards/prod.json
parse error: Expected another key-value pair at line 42, column 3
4. Target folder / folderUid mismatch
foldersFromFilesStructure or an explicit folder/folderUid points at a folder that doesn’t resolve, so dashboards load into an unexpected place — or not at all.
5. Provider config not picked up
The provider YAML is in the wrong directory, has a bad apiVersion, or Grafana wasn’t restarted/reloaded after the change.
Diagnostic Workflow
Step 1: Read the provisioning log for the exact failure
journalctl -u grafana-server --no-pager | grep -iE "provisioning.dashboard|failed to load dashboard" | tail -20
# Container:
docker logs grafana 2>&1 | grep -i provisioning | tail -20
Step 2: Verify the provider config and path
cat /etc/grafana/provisioning/dashboards/*.yaml
ls -la /var/lib/grafana/dashboards
Confirm options.path matches where the files actually are.
Step 3: Check permissions and readability
sudo -u grafana test -r /var/lib/grafana/dashboards/prod.json && echo readable || echo "NOT readable"
stat -c '%U:%G %a %n' /var/lib/grafana/dashboards/*.json
Step 4: Validate every JSON file
for f in /var/lib/grafana/dashboards/*.json; do jq empty "$f" 2>&1 | sed "s|^|$f: |"; done
Step 5: Reload provisioning without a full restart
curl -s -X POST -H "Authorization: Bearer $ADMIN_TOKEN" \
http://localhost:3000/api/admin/provisioning/dashboards/reload
{"message":"Dashboards config reloaded"}
Example Root Cause Analysis
A Helm-deployed Grafana starts cleanly but the “Platform” folder is empty. The log:
logger=provisioning.dashboard type=file name=platform error="stat /etc/grafana/dashboards: no such file or directory"
The provider expects /etc/grafana/dashboards, but the ConfigMap of JSON files was mounted at /var/lib/grafana/dashboards. The path in the provider YAML and the volumeMount disagree.
kubectl -n monitoring exec deploy/grafana -- ls /etc/grafana/dashboards 2>&1
kubectl -n monitoring exec deploy/grafana -- ls /var/lib/grafana/dashboards
ls: /etc/grafana/dashboards: No such file or directory
home.json prod.json
Fix: align the provider options.path with the actual mount:
options:
path: /var/lib/grafana/dashboards
Redeploy, then reload provisioning; the dashboards appear. Root cause: a path mismatch between the dashboard provider and the volume mount — Grafana was reading an empty directory.
Prevention Best Practices
- Keep the provider
options.pathand the actual mount path identical; template both from one variable in Helm/compose. - Ensure files are readable by the
grafanauser/UID (chmod 0644, correct ownership); avoidroot:root 600. - Validate dashboard JSON in CI with
jq empty(or a schema check) before it ships. - Use
foldersFromFilesStructure: trueintentionally and confirm folders resolve as expected. - After changing provider config, hit
/api/admin/provisioning/dashboards/reloadrather than assuming a hot reload. - See more Grafana guides and the sibling cannot-delete-provisioned guide.
Quick Command Reference
# Exact provisioning error
journalctl -u grafana-server | grep -iE "provisioning.dashboard|failed to load" | tail
docker logs grafana 2>&1 | grep -i provisioning | tail
# Provider config + path
cat /etc/grafana/provisioning/dashboards/*.yaml
ls -la /var/lib/grafana/dashboards
# Permissions + JSON validity
sudo -u grafana test -r /var/lib/grafana/dashboards/prod.json && echo ok || echo NO
for f in /var/lib/grafana/dashboards/*.json; do jq empty "$f"; done
# Reload provisioning (no restart)
curl -s -X POST -H "Authorization: Bearer $ADMIN_TOKEN" \
http://localhost:3000/api/admin/provisioning/dashboards/reload
Conclusion
A provisioning “dashboard not found” means the file provider couldn’t read valid dashboard JSON from the path you gave it. Grafana starts anyway, so the app being up doesn’t prove provisioning worked. Typical root causes:
- The provider
options.pathdoesn’t exist or the volume mounted elsewhere. - File permissions block the
grafanauser from reading the JSON. - Invalid JSON (trailing commas, unrendered templates) skips a dashboard.
- A folder/
folderUidmismatch loads dashboards into the wrong place or nowhere. - Provider config in the wrong dir or not reloaded.
Read the provisioning.dashboard log line first — it names the failing path or file — then reconcile the provider path with where the files actually live.
Download the Free 500-Prompt DevOps AI Toolkit
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.