Перейти к содержанию

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 дашбордов