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