Шаблоны контрактов¶
Готовые шаблоны для быстрого создания контрактов данных. Каждый шаблон содержит подробные комментарии и best practices.
Обзор¶
Каждый контракт данных состоит из 6 файлов, каждый из которых имеет свой шаблон:
| Файл | Шаблон | Кто редактирует | Когда меняется версия |
|---|---|---|---|
contract.yaml | contract-template.yaml | Data Owner | Minor (новые теги) |
schema.avsc | schema-template.avsc | Application Developer | Major/Minor (схема!) |
quality_rules.yml | quality_rules-template.yml | QA Engineer | Patch (новые правила) |
sla.yml | sla-template.yml | Data Owner + SRE | Patch (изменение SLA) |
physical_layout.yml | physical_layout-template.yml | Data Engineer | Не меняет версию |
runbook.md | runbook-template.md | SRE | Не меняет версию |
Как создать контракт из шаблонов¶
Шаг 1. Создайте структуру¶
# Скопируйте шаблоны
mkdir -p contracts/domains/{namespace}/{entity}
cp contracts/templates/contract-template.yaml contracts/domains/{namespace}/{entity}/contract.yaml
cp contracts/templates/schema-template.avsc contracts/domains/{namespace}/{entity}/schema.avsc
cp contracts/templates/quality_rules-template.yml contracts/domains/{namespace}/{entity}/quality_rules.yml
cp contracts/templates/sla-template.yml contracts/domains/{namespace}/{entity}/sla.yml
cp contracts/templates/physical_layout-template.yml contracts/domains/{namespace}/{entity}/physical_layout.yml
cp contracts/templates/runbook-template.md contracts/domains/{namespace}/{entity}/runbook.md
Шаг 2. Заполните метаданные¶
Начните с contract.yaml — замените все {placeholder} на реальные значения.
Шаг 3. Определите схему¶
Заполните schema.avsc — определите поля, типы, обязательность.
Шаг 4. Задайте правила качества¶
Заполните quality_rules.yml — критичные проверки (error), предупреждения (warning), мониторинг (info).
Шаг 5. Настройте SLA¶
Заполните sla.yml — доступность, свежесть, retention, эскалация.
Шаг 6. Валидация¶
# Проверить контракт локально
pip install kruma-validator
python contracts/ci/validate_contract.py contracts/domains/{namespace}/{entity}/
contract.yaml¶
Основной файл контракта — бизнес-метаданные, владение, lineage, changelog.
Ключевые секции:
metadata— имя, namespace, описание, владелец, потребители, тегиschema— ссылка на Avro-схемуquality_rules— ссылка на правила качестваsla— ссылка на SLAlineage— upstream-источники и downstream-потребителиchangelog— история изменений контракта
Развернуть шаблон contract-template.yaml
# Версии
spec_version: "1.0.0"
contract_version: "1.0.0"
metadata:
name: "{entity}"
namespace: "{namespace}"
display_name: "{Название сущности}"
description: |
Краткое описание того, что представляют эти данные.
owner:
team: "{team-name}"
email: "{team-name}@company.ru"
mattermost: "{team-name}-alerts"
systems:
producer: "{Название системы-источника}"
consumers:
- name: "{Система-потребитель}"
team: "{consumer-team}"
criticality: "high"
tags:
- "{domain}"
schema:
file: "./schema.avsc"
format: "avro"
quality_rules:
file: "./quality_rules.yml"
enabled: true
sla:
file: "./sla.yml"
physical_layout:
file: "./physical_layout.yml"
runbook:
file: "./runbook.md"
lineage:
upstream:
- system: "{Источник}"
database: "{connection-string}"
tables:
- "{source_table}"
downstream:
- system: "{Назначение}"
database: "{connection-string}"
tables:
- "{destination_table}"
changelog:
- version: "1.0.0"
date: "{YYYY-MM-DD}"
author: "{email}"
changes:
- type: "initial"
description: "Первоначальное создание контракта"
breaking: false
schema.avsc¶
Apache Avro схема, определяющая структуру данных.
Ключевые элементы:
name— имя записи (PascalCase)namespace— домен.сущностьfields— поля с типами, nullable-обёртки, logical types для дат
Развернуть шаблон schema-template.avsc
{
"type": "record",
"name": "{EntityName}",
"namespace": "{namespace}.{entity}",
"doc": "{Описание entity}",
"fields": [
{
"name": "{field_id}",
"type": "string",
"doc": "Уникальный идентификатор"
},
{
"name": "{field_amount}",
"type": "double",
"doc": "Сумма/количество"
},
{
"name": "{field_status}",
"type": {
"type": "enum",
"name": "{EntityName}Status",
"symbols": ["active", "inactive", "pending"]
},
"doc": "Статус записи"
},
{
"name": "{nullable_field}",
"type": ["null", "string"],
"default": null,
"doc": "Опциональное поле"
},
{
"name": "created_at",
"type": {"type": "long", "logicalType": "timestamp-millis"},
"doc": "Дата и время создания (UTC)"
}
]
}
quality_rules.yml¶
Правила валидации данных. Каждая запись проверяется при прохождении через Quality Validator.
Типы правил:
| Тип | Описание | DMBOK-измерение |
|---|---|---|
not_null | Поле не должно быть пустым | Полнота |
unique | Уникальность в рамках батча | Уникальность |
range | Числовой диапазон | Корректность |
regex | Соответствие паттерну | Корректность |
enum | Допустимые значения | Корректность |
freshness | Свежесть временной метки | Своевременность |
format | Предопределённый формат (email, uuid) | Корректность |
custom | Python-выражение | Точность, Согласованность |
Развернуть шаблон quality_rules-template.yml
version: "1.0"
rules:
# NOT NULL — обязательные поля
- name: "id_not_null"
field: "id"
type: "not_null"
severity: "error"
message: "ID is required"
# RANGE — числовой диапазон
- name: "amount_positive"
field: "amount"
type: "range"
min: 0
severity: "error"
message: "Amount must be non-negative"
# ENUM — допустимые значения
- name: "status_valid"
field: "status"
type: "enum"
values: ["active", "inactive", "deleted"]
severity: "error"
message: "Invalid status"
# FRESHNESS — свежесть данных
- name: "data_freshness"
field: "created_at"
type: "freshness"
max_age_minutes: 60
severity: "error"
message: "Data older than 1 hour"
# UNIQUE — уникальность в батче
- name: "id_unique_in_batch"
field: "id"
type: "unique"
severity: "error"
message: "Duplicate ID"
# CUSTOM — бизнес-логика
- name: "discount_not_exceed_amount"
field: "discount"
type: "custom"
expression: "discount <= amount"
severity: "error"
message: "Discount exceeds amount"
sla.yml¶
Соглашения об уровне обслуживания: доступность, свежесть, retention, эскалация.
Ключевые секции:
availability— процент доступности и расписаниеfreshness— максимальный возраст данных, пороги алертовresponse_time— SLA реагирования на инциденты по приоритетамretention— политики хранения по слоям (Kafka → DWH → Archive)escalation— матрица эскалации
Развернуть шаблон sla-template.yml
version: "1.0.0"
availability:
target: "99.9%"
schedule:
weekdays: "00:00-23:59"
weekends: "00:00-23:59"
freshness:
max_age: "PT1H" # ISO 8601: 1 час
alert_threshold: "PT2H"
critical_threshold: "PT4H"
response_time:
critical: "PT15M"
high: "PT1H"
medium: "PT4H"
low: "P1D"
recovery_time:
target: "PT2H"
maximum: "PT4H"
retention:
raw:
duration: "P7D"
prod:
duration: "P30D"
dlq:
duration: "P90D"
dwh:
hot: { duration: "P1Y", storage_class: "ssd" }
warm: { duration: "P3Y", storage_class: "hdd" }
cold: { duration: "P7Y", storage_class: "archive" }
escalation:
level_1:
team: "{your-team}"
mattermost: "{alerts-channel}"
level_2:
team: "data-platform"
mattermost: "data-platform-oncall"
level_3:
team: "engineering-leadership"
physical_layout.yml¶
Конфигурация физического хранения для Apache Iceberg + Parquet. Этот файл не влияет на версию контракта.
Ключевые секции:
iceberg— конфигурация таблицы Iceberg (каталог, format version)partitioning— стратегия партиционирования (hidden partitioning)sort_order— порядок сортировки для ускорения запросовparquet— компрессия, bloom-фильтры, dictionary encodingcompaction— настройки объединения мелких файловquery_patterns— типичные запросы для оптимизации
Развернуть шаблон physical_layout-template.yml
version: "1.0"
iceberg:
format_version: 2
catalog:
type: "gravitino"
uri: "http://gravitino-server:8090"
warehouse: "s3://data-lake/warehouse"
partitioning:
strategy: "iceberg_hidden"
spec:
- source_column: "<timestamp_field>"
transform: "day"
sort_order:
fields:
- column: "<filtered_column>"
direction: "asc"
- column: "<timestamp_column>"
direction: "desc"
parquet:
compression:
codec: "zstd"
level: 3
bloom_filters:
- column: "<id_column>"
fpp: 0.01
runbook.md¶
Операционный runbook для реагирования на инциденты. Содержит все необходимые процедуры для дежурных инженеров.
Ключевые секции:
- Обзор и SLA
- Контакты и матрица эскалации
- Топики Kafka и endpoints
- Типичные инциденты с пошаговыми инструкциями
- Ошибки валидации и правила
- Процедуры отката
- Обработка DLQ
- Процедуры обслуживания
Best Practice
Runbook должен позволять новому инженеру диагностировать проблему и начать исправление в течение 15 минут без обращения к коллегам.
Примеры реальных контрактов¶
Посмотрите, как шаблоны используются на практике:
-
Полный пример с PII, 8 правилами качества, SLA 99.9%
-
Real-time данные, свежесть 5 минут, consistency checks
-
Демо-контракт с геоданными и ADS-B
Дополнительные материалы¶
- Спецификация контракта — подробное описание формата
- Contract Versioning — правила версионирования
- CI/CD Pipeline — автоматическая валидация