GitOps предполагает, что артефакты сначала создаются в репозитории, а потом синхронизируются с целью. Но в случае дашбордов это хоть и рабочий вариант, но очень болезненный: все-таки, большинство вещей “накликивается” через веб-морду, а не описываются через JSON (тем более, что в Grafana создать через UI одну панельку, а не весь дашборд, даже из готового JSON весьма нетривиально). При этом создание дашборда через CI позволяет его шаблонировать и относительно легко разворачивать на несколько сред (например, чтобы иметь одинаковый дашборд для stage и prod, если их дашборды в разных местах).

Однако шаблонировать можно и средствами самой Grafana. В дашборде можно создавать переменные (литералы, словари, мультивыбор), причем заполнять значения можно с помощью запроса. При этом переменные можно скрывать. Отдельно отмечу константные переменные — в них очень хорошо хранить то, что меняется между средами (например, namespace, домен и т.п.). Еще в переменные можно складывать частые фильтры и куски запросов, чтобы не копипастить их.

Если все обложить переменными, то тогда можно легко импортировать дашборд для внешнего использования. При импорте для другой Grafana будет автоматически предложено поменять все источники данных и, что самое важное, все константные переменные — так что в них можно забить все отличия, а в репозитории хранить только бэкапы. Таким образом можно и репе все хранить, и менять все более удобным способом.