Provisioning источников данных¶
Источники данных — первое, с чего начинается любой дашборд. Без Prometheus или Loki просто нечего показывать. Ручное создание каждого источника данных в UI при пересоздании окружения — это путь к человеческой ошибке. Provisioning источников данных — основа воспроизводимости Grafana.
Формат YAML/JSON¶
Grafana принимает конфигурацию источников как YAML так и JSON. Исторически сложилось, что YAML удобнее для чтения человеком, JSON — для машин. Выбирайте YAML.
Базовый пример — один источник Prometheus:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus:9090
access: proxy
isDefault: true
jsonData:
timeInterval: 15s
queryTimeout: 30
httpMethod: POST
secureJsonData:
basicAuthPassword: ""
apiVersion: 1 — текущая (и единственная пока) версия формата.
access: proxy — Grafana выступает прокси для запросов к источнику. Это важный момент: браузер пользователя НЕ должен обращаться напрямую к Prometheus. Всегда ставьте proxy — это и безопасность, и возможность работать из-за firewall.
Ключевые поля:
name: имя в интерфейсе Grafana.type: точный идентификатор плагина:prometheus,loki,tempo,mimir,postgres,elasticsearch, etc.url: адрес, по которому Grafana стучится к источнику. Для Docker это http://имя-контейнера:порт. Для Kubernetes — http://service.namespace:порт.isDefault: true— будет выбран по умолчанию в Explore и в редакторе запросов при создании новой панели. Только один источник данных в списке должен быть с этим флагом.jsonData— все настройки, специфичные для плагина (таймауты, HTTP-метод, дефолтный scrapeInterval).secureJsonData— секретные поля, пароли, токены. Никогда не храните реальные пароли в plaintext в конфигах (особенно в Git). Вместо этого используйте environment variables — мы посмотрим как это делать.readOnly: true— запрещает редактирование источника данных через UI.
Удаление источников¶
Ключевое: deleteDatasources. Если в вашем конфиге источник был, а вы его убрали — Grafana должна его удалить? Зависит от настройки:
deleteDatasources:
- name: Old-Prometheus
orgId: 1
Или массово:
deleteDatasources:
- name: ".*"
orgId: 1
Это удалит ВСЕ источники данных, кроме указанных в текущем файле. Опасная операция. Используйте с осторожностью и всегда в паре с review.
Примеры для популярных источников¶
Loki¶
datasources:
- name: Loki
type: loki
url: http://loki:3100
access: proxy
jsonData:
maxLines: 1000
derivedFields:
- name: traceID
matcherRegex: '"traceid":"(\w+)"'
url: "${__value.raw}"
Обратите внимание на derivedFields: Loki возвращает логи как строки, но внутри этих строк может содержаться traceId. Grafana умеет извлекать его регулярным выражением и превращать во внутреннюю ссылку.
Tempo¶
datasources:
- name: Tempo
type: tempo
url: http://tempo:3200
access: proxy
jsonData:
tracesToLogsV2:
datasourceUid: 'loki-uid'
spanStartTimeShift: '-1h'
spanEndTimeShift: '1h'
filterByTraceID: true
filterBySpanID: false
Ключевое здесь — tracesToLogsV2. Grafana сама найдёт по traceID логи в Loki — и покажет их на таймлайне трейса. Магия корреляции между трейсами и логами включается простым конфигом.
Mimir¶
datasources:
- name: Mimir
type: prometheus
uid: mimir-uid
url: http://mimir:9009
access: proxy
jsonData:
alertmanagerUid: 'alertmanager-uid'
exemplarTraceIdDestinations:
- name: traceID
datasourceUid: tempo-uid
Mimir — это Prometheus-совместимый бэкенд, поэтому type: prometheus. Но настройки отличаются: тут сразу настраиваются связи с Tempo через exemplarTraceIdDestinations — чтобы от метрики переходить к трейсу (exemplars).
Environment Variables¶
Пароли, токены, ключи: в Git — никогда в открытом виде. Provisioning поддерживает интерполяцию переменных окружения в YAML:
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus:9090
secureJsonData:
basicAuthPassword: ${PROMETHEUS_BASIC_AUTH_PASSWORD}
Внутри ${...} — имя переменной. При старте Grafana подставляет значение из environment. Если переменная не задана — это не ошибка, а предупреждение. Grafana продолжит стартовать.
Provisioning через файлы vs Provisioning через API¶
Файловый provisioning идеален для:
- Развёртывания с нуля (bootstrap).
- Иммутабельной инфраструктуры, где конфигурация намертво привязана к версии образа.
- Не для динамического управления через внешний оркестратор — для этого есть API и Terraform.
API же (POST /api/datasources) нужен когда:
- Источник данных должен создаваться динамически (по требованию команды).
- Управление из CI/CD (например, GitLab pipeline после создания нового кластера k8s автоматически создаёт источник данных для Grafana).
- Terraform-провайдер должен управлять ресурсом.
Но помните: файловая provisioning-модель задаёт источники данных readOnly, если указан readOnly: true. API не сможет изменить такой источник. Вы сознательно запираете источник.
Далее: Provisioning дашбордов