grafana_gen/config.go

208 lines
11 KiB
Go
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
const (
// Database settings
// Рекомендуется задавать через .env файл или переменные окружения
DefaultDBUser = "" // Задать через DB_USER в .env
DefaultDBPassword = "" // Задать через DB_PASSWORD в .env
DefaultDBName = "waf_info"
DefaultDBPort = 5432
DefaultPrimaryDBHost = "10.100.10.8"
DefaultSecondaryDBHost = "10.100.13.5"
// Git repository settings
DefaultTemplatesRepo = "https://svc-git.cirex.ru/cloudstack/grafana_gen_template.git"
DefaultTemplatesBranch = "master"
DefaultTemplatesPath = "/etc/grafana_gen/templates" // Системный путь
DefaultStateFile = "/var/lib/grafana_gen/state.json" // Системный путь для state
// DefaultGitToken - Gitea access token для доступа к репозиторию
// ВАЖНО: Рекомендуется задавать через .env файл или переменную окружения!
//
// Как создать токен в Gitea:
// 1. Gitea → Settings → Applications → Generate New Token
// 2. Выбрать scope: repository (read)
//
// Варианты использования (в порядке приоритета):
// 1. Флаг командной строки: -git-token "your-gitea-token"
// 2. Переменная окружения: export GIT_TOKEN="your-gitea-token"
// 3. Файл .env: GIT_TOKEN=your-gitea-token
// 4. Hardcode здесь (не рекомендуется): DefaultGitToken = "your-gitea-token"
//
// Оставьте пустым для использования только флага/env/.env файла
DefaultGitToken = ""
// DefaultGrafanaAPIKey - Grafana API ключ для создания дашбордов
// ВАЖНО: Рекомендуется задавать через .env файл или переменную окружения!
//
// Варианты использования (в порядке приоритета):
// 1. Флаг командной строки: -grafana-api-key "glsa-xxxxxxxxxxxx"
// 2. Переменная окружения: export GRAFANA_API_KEY="glsa-xxxxxxxxxxxx"
// 3. Файл .env: GRAFANA_API_KEY=glsa_xxxxxxxxxxxx
// 4. Hardcode здесь (не рекомендуется): DefaultGrafanaAPIKey = "glsa-xxxxxxxxxxxx"
//
// Оставьте пустым для использования только флага/env/.env файла
DefaultGrafanaAPIKey = ""
// DefaultGrafanaURL - URL Grafana сервера
// Можно захардкодить для быстрого запуска
DefaultGrafanaURL = ""
// Пример:
// DefaultGrafanaURL = "https://grafana.cirex.ru"
// DefaultGrafanaFolder - папка в Grafana куда будут созданы дашборды
// Пример: "WAF - PTAF" создаст путь: Home -> Dashboards -> WAF - PTAF -> [Dashboard]
// Оставьте пустым для создания в General папке (корень)
DefaultGrafanaFolder = "WAF - Auto Generated"
// Можно переопределить под ваши нужды:
// DefaultGrafanaFolder = "WAF - PTAF"
// Alerts settings
DefaultAlertsFolder = "WAF - PTAF"
DefaultAlertsReceiver = "tg+mail+mattermost PTAF Grafana"
DefaultAlertsGroup = "PTAF Grafana"
DefaultAlertsDatasource = "af84zsvlp9blsa" // UID datasource OpenSearch
// VictoriaLogs second dashboard
DefaultVLDatasourceUID = "efewdonokxybkf"
DefaultVLDashboardTitle = "PT AF Requests (VictoriaLogs)" // Название второго дашборда
DefaultVLGrafanaFolder = "" // Пустая = та же папка что и основная
DefaultVLDatasourceType = "victoriametrics-logs-datasource-ptaf-sw" // Тип VL datasource плагина
DefaultVLDashboardUID = "pt-af-requests-auto-vl" // UID второго дашборда
DefaultSPDashboardTitle = "SP PT AF Requests (VictoriaLogs)" // Название SP дашборда
DefaultSPDashboardUID = "pt-af-requests-auto-sp" // UID SP дашборда
DefaultSPGrafanaFolder = "" // Пустая = та же папка что и основная
DefaultSPAlertsGroup = "SP PTAF Grafana" // Группа алертов для SP
DefaultSPAlertsReceiver = "For_SP" // Contact point для SP алертов
// DefaultDashboardTitle - название единого дашборда со всеми клиентами
// Пример результата: Home -> Dashboards -> WAF - PTAF -> PT AF Nodes
DefaultDashboardTitle = "PT AF Requests"
// Другие примеры названий:
// DefaultDashboardTitle = "WAF Monitoring"
// DefaultDashboardTitle = "All Clients"
// DefaultDashboardTitle = "PTAF Overview"
)
type Config struct {
DBHost string
DBPort int
DBUser string
DBPassword string
DBName string
GrafanaURL string
GrafanaAPIKey string
GrafanaFolder string // Папка в Grafana для дашбордов
DashboardTitle string // Название единого дашборда
DryRun bool
TemplatesRepo string
TemplatesBranch string
TemplatesPath string
SkipGitPull bool
StateFile string
ForceRun bool
GitToken string // GitLab token для приватного репозитория
AlertsFolder string // Папка в Grafana для алертов
AlertsReceiver string // Receiver (канал уведомлений) для алертов
AlertsGroup string // Имя группы алертов в Grafana
AlertsDatasourceUID string // UID datasource для алертов OpenSearch
AlertsOSEnabled bool // Генерировать алерты для OpenSearch (default: true)
AlertsVLEnabled bool // Генерировать алерты для VictoriaLogs (default: true)
DashboardOSEnabled bool // Генерировать дашборд для OpenSearch (default: true)
DashboardVLEnabled bool // Генерировать дашборд для VictoriaLogs (default: true)
// VictoriaLogs второй дашборд
VLDatasourceUID string // UID VictoriaLogs datasource
VLDashboardTitle string // Название второго дашборда (пустая строка = не генерировать)
VLGrafanaFolder string // Папка для VL дашборда (пустая = та же что и основная)
VLDashboardUID string // UID второго дашборда в Grafana
SPDashboardTitle string // Название SP дашборда (пустая строка = не генерировать)
SPDashboardUID string // UID SP дашборда в Grafana
SPGrafanaFolder string // Папка для SP дашборда (пустая = та же что и основная)
SPAlertsGroup string // Группа алертов для SP клиентов
SPAlertsReceiver string // Contact point для SP алертов
}
type ClientData struct {
ClientTitle string
Domains []DomainInfo
RPSLimit int // 0 = алерт не создавать (NULL или не задан в БД)
RPSCommercialLimit int // коммерческий лимит, при NULL берётся 100
WafProvider string // waf_provider из client_info (spik, sp, ...)
PtafFallbackCode string // HTTP код блокировки PTAF из client_info (напр. "418"), "pass" = алерт не нужен
}
type DomainInfo struct {
SID string
DomainName string
Aliases string
Limit4xx int // порог 4xx ошибок в % (из apps_settings, default 20)
Limit5xx int // порог 5xx ошибок в % (из apps_settings, default 10)
PtafFallbackCodeAlertCount int // порог 418 ошибок в штуках (из apps_settings, default 1)
}
type DashboardTemplate struct {
Version string `json:"version"`
Description string `json:"description"`
Datasource map[string]interface{} `json:"datasource"`
DashboardMeta map[string]interface{} `json:"dashboard_meta"` // uid, tags, version — больше не хардкод в Go
Dashboard map[string]interface{} `json:"dashboard"`
Layout LayoutConfig `json:"layout"`
Conditions map[string]ConditionDefinition `json:"conditions"`
PanelTemplates map[string]interface{} `json:"panel_templates"`
QueryTemplates map[string]interface{} `json:"query_templates"`
Panels map[string]interface{} `json:"panels"`
Queries map[string]interface{} `json:"queries"`
Templating map[string]interface{} `json:"templating"` // Переменные дашборда Grafana
}
type LayoutConfig struct {
TenantPanels []PanelLayout `json:"tenant_panels"`
PreDomainPanels []PanelLayout `json:"pre_domain_panels"` // Панели один раз перед всеми доменными
DomainPanels []PanelLayout `json:"domain_panels"`
InterDomainPanels []PanelLayout `json:"inter_domain_panels"` // Панели один раз между группами доменных
TrafficDomainPanels []PanelLayout `json:"traffic_domain_panels"` // Панели трафика per-domain после inter_domain
UseCollapsedRows bool `json:"use_collapsed_rows"`
OverviewPanels []PanelLayout `json:"overview_panels"` // Панели обзора перед клиентскими строками
OverviewRowTitle string `json:"overview_row_title"` // Заголовок collapsed row обзора
ErrorPanels []PanelLayout `json:"error_panels"` // Панели ошибок (только VL)
ErrorRowTitle string `json:"error_row_title"` // Заголовок collapsed row ошибок
}
type PanelLayout struct {
PanelKey string `json:"panel_key"`
PanelTemplate string `json:"panel_template,omitempty"`
Scope string `json:"scope,omitempty"`
TitleFormat string `json:"title_format,omitempty"`
TitleSuffix string `json:"title_suffix,omitempty"`
Field string `json:"field,omitempty"`
Width int `json:"width"`
XOffset int `json:"x_offset"`
YOffset int `json:"y_offset,omitempty"`
CollapsedRow bool `json:"collapsed_row,omitempty"`
QueryConfig *QueryConfig `json:"query_config,omitempty"`
Condition *PanelCondition `json:"condition"`
}
type QueryConfig struct {
BaseQuery string `json:"base_query"`
Filters []string `json:"filters"`
Metric string `json:"metric"`
Interval string `json:"interval"`
Field string `json:"field,omitempty"`
Extra map[string]interface{} `json:"extra,omitempty"`
}
type PanelCondition struct {
Type string `json:"type"`
Value interface{} `json:"value"`
}
type ConditionDefinition struct {
Description string `json:"description"`
Evaluator string `json:"evaluator"`
}