Создание пользовательских правил модели с помощью Terraform
Пользовательские правила модели в Knowledge Graph позволяют определить, как сущности обнаруживаются и моделируются на основе запросов Prometheus. Эти правила дают возможность создавать собственные типы сущностей, задавать их взаимосвязи и указывать, как они должны обогащаться дополнительными данными.
Сведения об управлении сущностями и связями в интерфейсе Knowledge Graph см. в разделе Manage entities and relations.
Базовые пользовательские правила модели
Создайте файл с именем custom-model-rules.tf и добавьте следующее:
# Basic custom model rule for services
resource "grafana_asserts_custom_model_rules" "basic_service" {
provider = grafana.asserts
name = "basic-service-model"
rules {
entity {
type = "Service"
name = "service"
defined_by {
query = "up{job!=''}"
label_values = {
service = "job"
}
literals = {
_source = "up_query"
}
}
}
}
}
Расширенная модель сервиса с областью действия и поиском
Определите сущности сервисов с ограничением по среде и сопоставлениями связей:
# Advanced service model with environment scoping
resource "grafana_asserts_custom_model_rules" "advanced_service" {
provider = grafana.asserts
name = "advanced-service-model"
rules {
entity {
type = "Service"
name = "workload | service | job"
scope = {
namespace = "namespace"
env = "asserts_env"
site = "asserts_site"
}
lookup = {
workload = "workload | deployment | statefulset | daemonset | replicaset"
service = "service"
job = "job"
proxy_job = "job"
}
defined_by {
query = "up{job!='', asserts_env!=''}"
label_values = {
service = "service"
job = "job"
workload = "workload"
namespace = "namespace"
}
literals = {
_source = "up_with_workload"
}
}
defined_by {
query = "up{job='maintenance'}"
disabled = true
}
}
}
}
Конфигурация модели с несколькими сущностями
Определите несколько типов сущностей в одной конфигурации:
# Multiple entity types in a single model
resource "grafana_asserts_custom_model_rules" "multi_entity" {
provider = grafana.asserts
name = "kubernetes-entities"
rules {
# Service entity
entity {
type = "Service"
name = "service"
scope = {
namespace = "namespace"
cluster = "cluster"
}
defined_by {
query = "up{service!=''}"
label_values = {
service = "service"
namespace = "namespace"
cluster = "cluster"
}
}
}
# Pod entity
entity {
type = "Pod"
name = "Pod"
scope = {
namespace = "namespace"
cluster = "cluster"
}
lookup = {
service = "service"
workload = "workload"
}
defined_by {
query = "kube_pod_info{pod!=''}"
label_values = {
Pod = "pod"
namespace = "namespace"
cluster = "cluster"
service = "service"
}
literals = {
_entity_type = "Pod"
}
}
}
# Namespace entity
entity {
type = "Namespace"
name = "namespace"
scope = {
cluster = "cluster"
}
defined_by {
query = "kube_namespace_status_phase{namespace!=''}"
label_values = {
namespace = "namespace"
cluster = "cluster"
}
}
}
}
}
Сложная сущность с обогащением
Создайте сущности сервисов с несколькими источниками данных и обогащением:
# Service entity with enrichment from multiple sources
resource "grafana_asserts_custom_model_rules" "enriched_service" {
provider = grafana.asserts
name = "enriched-service-model"
rules {
entity {
type = "Service"
name = "service"
enriched_by = [
"prometheus_metrics",
"kubernetes_metadata",
"application_logs"
]
scope = {
environment = "asserts_env"
region = "asserts_site"
team = "team"
}
lookup = {
deployment = "workload"
Pod = "pod"
container = "container"
}
# Primary definition from service up metrics
defined_by {
query = "up{service!='', asserts_env!=''}"
label_values = {
service = "service"
environment = "asserts_env"
region = "asserts_site"
team = "team"
}
literals = {
_primary_source = "service_up"
}
}
# Secondary definition from application metrics
defined_by {
query = "http_requests_total{service!=''}"
label_values = {
service = "service"
environment = "environment"
version = "version"
}
literals = {
_secondary_source = "http_metrics"
}
}
# Disabled definition for testing
defined_by {
query = "test_metric{service!=''}"
disabled = true
}
}
}
}
Сущности баз данных и инфраструктуры
Определите модели сущностей баз данных и инфраструктуры:
# Database and infrastructure entity models
resource "grafana_asserts_custom_model_rules" "infrastructure" {
provider = grafana.asserts
name = "infrastructure-entities"
rules {
# Database entity
entity {
type = "Database"
name = "database_instance"
scope = {
environment = "env"
region = "region"
}
lookup = {
host = "instance"
port = "port"
db_name = "database"
}
defined_by {
query = "mysql_up{instance!=''}"
label_values = {
database_instance = "instance"
database = "database"
env = "environment"
region = "region"
}
literals = {
_db_type = "mysql"
}
metric_value = "1"
}
defined_by {
query = "postgres_up{instance!=''}"
label_values = {
database_instance = "instance"
database = "datname"
env = "environment"
}
literals = {
_db_type = "postgresql"
}
}
}
# Load balancer entity
entity {
type = "LoadBalancer"
name = "lb_instance"
scope = {
environment = "env"
}
defined_by {
query = "haproxy_up{proxy!=''}"
label_values = {
lb_instance = "instance"
proxy = "proxy"
env = "environment"
}
literals = {
_lb_type = "haproxy"
}
}
}
}
}
Справочник по ресурсам
grafana_asserts_custom_model_rules
Управление пользовательскими правилами модели Knowledge Graph через API Grafana. Этот ресурс позволяет определять собственные модели сущностей на основе запросов Prometheus с расширенными возможностями сопоставления и обогащения.
Аргументы
Блок rules
Каждый блок rules поддерживает следующее:
Блок entity
Каждый блок entity поддерживает следующее:
Блок defined_by
Каждый блок defined_by поддерживает следующее:
Note
Когда для запроса
defined_byзаданоdisabled = true, для сопоставления используется только полеquery. Все остальные поля блока игнорируются.
Рекомендации
При создании пользовательских правил модели с помощью Terraform учитывайте следующие рекомендации.
Модели сущностей
- Проектируйте модели сущностей так, чтобы они отражали вашу фактическую инфраструктуру и архитектуру приложений
- Используйте описательные имена для пользовательских правил модели, отражающие их цель и область применения
- Начинайте с базовых определений сущностей и постепенно добавляйте сложность по мере необходимости
- Определяйте чёткие области действия сущностей с помощью параметра
scope, чтобы организовать сущности по среде, региону или команде
Проектирование запросов и производительность
- Пишите эффективные запросы Prometheus, которые не перегружают вашу систему мониторинга
- Тестируйте запросы Prometheus отдельно, прежде чем использовать их в правилах модели
- Используйте конкретные фильтры по меткам, чтобы по возможности сократить область действия запросов
- Учитывайте влияние кардинальности ваших определений сущностей
- Используйте флаг
disabled, чтобы временно отключить проблемные запросы во время отладки
Связи и обогащение
- Используйте сопоставления
lookupдля установления связей между различными типами сущностей - Задействуйте
enriched_by, чтобы указать дополнительные источники данных для обогащения сущностей - Сопоставляйте метки Prometheus с атрибутами сущностей, используя понятные и описательные имена
- Используйте осмысленные
literalsдля добавления статических метаданных, помогающих идентифицировать сущности
Управление метками и атрибутами
- Установите единообразные соглашения о метках для всей инфраструктуры
- Используйте
label_valuesдля извлечения динамических атрибутов из метрик - Документируйте значение и ожидаемые значения пользовательских литералов
- Убедитесь, что имена меток совпадают в разных определениях сущностей для корректного обнаружения связей
Проверка
После применения конфигурации Terraform убедитесь, что:
- Пользовательские правила модели применены в вашем экземпляре Knowledge Graph
- Сущности обнаруживаются в соответствии с заданными запросами
- Связи сущностей и обогащение работают должным образом
- Графы сущностей отображают правильные типы сущностей и связи
- Запросы выполняются эффективно и не создают чрезмерной нагрузки