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

Grafana как код: GaC-инструменты


В Части VII мы разбирали Provisioning — механизм поставки готовых дашбордов в Grafana. Но как создать сам дашборд без кликов мышкой в UI? Для этого нужны Grafonnet, grafanalib, Terraform provider, Ansible, Pulumi.


Grafonnet (Jsonnet)

Grafonnet — библиотека для программирования на языке Jsonnet, расширенном JSON с возможностью логики, переменных, импортов. Grafonnet генерирует дашборд в виде JSON, готовый для Provisioning.

local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';

grafana.dashboard.new(
  title='HTTP Overview',
  uid='http-overview',
  tags=['backend', 'production'],
)
.addPanels([
  grafana.panel.timeSeries.new(
    title='RPS',
    datasource='Prometheus',
    expression='rate(http_requests_total[5m])'
  )
])

Почему Jsonnet? Потому что весь Jsonnet — одна библиотека, а не горы copy-paste JSON-кода. Один файл с логикой создаёт целый дашборд. Поменяли функцию — пересобрали всё.


grafanalib (Python)

Для тех, кому ближе Python:

from grafanalib.core import Dashboard, TimeSeries, Target

dashboard = Dashboard(
    title="Python-generated dashboard",
    panels=[
        TimeSeries(
            title="Request Rate",
            dataSource="Prometheus",
            targets=[
                Target(expr='rate(http_requests_total{job="api"}[5m])')
            ]
        )
    ],
    uid="python-dash"
)

Удобно — Python даёт полный арсенал: циклы, классы, загрузка переменных из .env.


Terraform provider

Когда инфраструктурный код лежит в Terraform и хочется держать дашборды рядом с определением кластера:

resource "grafana_dashboard" "main" {
  config_json = jsonencode({ ... })
  folder      = grafana_folder.system.id
}

Минус: управление JSON дашборда внутри HCL — это боль. Поэтому обычно используют file() + сгенерированный JSON.


Pulumi

Инженеры AWS и GCP выбирают Pulumi. Библиотека grafana для Pulumi — вариация того же Terraform-провайдера. Python-микросервис генерит дашборд и сразу коммитится.

Аналогия: Grafonnet vs grafanalib vs Terraform/Pulumi — это как рисовать архитектуру здания в AutoCAD, Revit или рисовать на бумаге. Все инструменты создают результат, но один платформенно-нейтральный (Jsonnet), другой ближе разработчику (Python), третий — часть IaC (Terraform).



Далее: Code Review дашбордов