Перейти к основному содержимому

Configurator

Сервис управления A/B-экспериментами.

Назначение

Configurator — центральный сервис платформы. Управляет жизненным циклом экспериментов: создание, настройка, расчёт результатов, визуализация.

Ключевые функции:

  • Управление схемами и миграциями ClickHouse (clickhouseInit: true при первом деплое)
  • Отправка конфигураций экспериментов (маркеры, сегменты) в Splitter
  • ETL-загрузки и аналитические запросы через Trino
  • Генерация DAG-конфигов для Airflow
  • API для Frontend и внешних интеграций

Деплой

Параметры инсталляции задаются в values-trisigma.yaml. Создайте файл из примера: cp values-trisigma.yaml.example values-trisigma.yaml.

примечание

values.yaml содержит значения по умолчанию — не изменяйте его напрямую, а переопределяйте нужные параметры в values-trisigma.yaml.

Параметры приложения

Образ сервиса

ПараметрОписание
image.repositoryОбраз сервиса в Container registry
image.tagТег образа сервиса в Container registry
warning
Не используйте registry.trisigma.io напрямую

Образы необходимо предварительно зеркалировать в ваш собственный Container Registry.

Миграции

ПараметрОписание
postgresqlMigrator.image.repositoryОбраз мигратора для PostgreSQL миграций

PostgreSQL

ПараметрОписание
postgresql.hostХостнейм для подключения к PostgreSQL
postgresql.portПорт для подключения. По умолчанию 6432
postgresql.databaseНазвание БД, к которой подключается сервис. По умолчанию master
postgresql.userУчетная запись для подключения к PostgreSQL

Redis (Valkey)

ПараметрОписание
redis.hostХостнейм Redis/Valkey
redis.portПорт. По умолчанию 6379
redis.loginУчетная запись. По умолчанию default

ClickHouse

ПараметрОписание
clickhouse.hostsСписок ClickHouse-хостов в формате host:port,host:port, например ch1.example.com:9440
clickhouse.userУчетная запись для подключения к ClickHouse

Trino

ПараметрОписание
trino.hostDNS Trino, например trisigma-trino.trisigma-trino
trino.portПорт. По умолчанию 8080

S3 — bucket вложений

ПараметрОписание
s3Attachments.hostEndpoint S3, например https://storage.yandexcloud.net
s3Attachments.bucketИмя bucket'а для вложений

S3 — bucket аналитических данных и загрузок

ПараметрОписание
s3AnalyticUploads.hostEndpoint S3
s3AnalyticUploads.bucketИмя bucket'а для аналитики

Git-репозиторий метрик

ПараметрОписание
repo.typeТип репозитория: github / bitbucket / gitlab
repo.hostURL API, например https://api.github.com
repo.nameИмя репозитория. По умолчанию trisigma_ab_metrics
repo.projectПроект/организация репозитория

Межсервисные связи

ПараметрОписание
splitter.urlIn-cluster URL Splitter, например http://trisigma-splitter.trisigma-splitter:8890
airflow.apiUrlURL Airflow API, например http://trisigma-airflow-webserver.trisigma-airflow:8080
airflow.configUploadUrlURL загрузки DAG-конфигов, например http://trisigma-airflow-configs-uploader.trisigma-airflow
frontend.urlBrowser-facing URL Frontend, например https://trisigma.example.com

Фоновые задачи (Crons)

ПараметрОписание
crons.image.repositoryОбраз планировщика фоновых задач
КронРасписаниеОписание
status_updaterКаждую минутуОбновление статусов экспериментов
dimensions_updaterКаждый часОбновление размерностей
report_updaterКаждые 10 минОбновление отчётов
holdout_updaterЕжедневно в 00:01Обновление состояния holdout-экспериментов
clickhouse_etlЕжедневно в 01:55Ночной ETL ClickHouse
trino_etlЕжедневно в 01:55Ночной ETL Trino
clickhouse_realtime_etlКаждые 20 мин в 8–22 чRealtime-ETL ClickHouse
lists_uploaderЕжедневно в 22:00Загрузка списков пользователей
experiments_archivatorЕжедневно в 09:00Архивация завершённых экспериментов
metrics_repo_syncКаждые 10 минСинхронизация репозитория метрик
metrics_repo_validate_prsКаждые 5 минВалидация PR в репозитории метрик
metrics_repo_apply_migrationsКаждую минутуПрименение миграций из репозитория метрик
airflow_dailyЕжедневно в 02:00Регулярная отправка DAG-конфигов в Airflow
export_segments_trinoКаждую минутуЭкспорт сегментов в Trino
export_segments_csvКаждую минутуЭкспорт сегментов в CSV
datamart_state_collectorКаждые 10 минСбор состояния витрин
iceberg_maintenanceЕжедневно в 01:11Обслуживание Iceberg-таблиц
remove_old_experiments_analytics_dataЕжедневно в 01:01Очистка устаревших аналитических данных
dwh_datamart_cache_warmup_todayВ начале каждого часаПрогрев кэша витрин на сегодня
dwh_datamart_cache_warmup_tomorrowНа 30-й мин каждого часаПрогрев кэша витрин на завтра
update_report_monitorНа 47-й мин каждого часаМониторинг обновления отчётов
mde_calculation_status_updaterКаждую минутуОбновление статусов MDE-расчётов
materialized_view_refreshКаждый часОбновление materialized views
materialized_view_refresherКаждую минутуТриггер обновления materialized views
materialized_view_event_generatorКаждый часГенерация событий для materialized views
outbox_queue_depth_metricsКаждую минутуМетрики глубины outbox-очереди
retro_updaterКаждые 20 минОбновление ретро-отчётов
clickhouse_maintenanceЕжедневно в 22:00Обслуживание ClickHouse
enrichments_duplicates_checkЕжедневно в 09:00Проверка дубликатов в enrichment'ах
report_metrics_getterКаждые 10 минСбор метрик отчётов
source_statistics_collectorЕжедневно в 20:00Сбор статистики источников
update_dimension_statsЕжедневно в 08:00Обновление статистик размерностей
metric_calculation_change_notifierЕжедневно в 10:10Нотификации об изменениях расчётов
metrics_recalculate_healthЕжедневно в 05:00Проверка здоровья пересчётов метрик

Расписание, включение/выключение и ресурсы каждого крона переопределяются в values-trisigma.yaml под ключом crons.jobs.<имя>.

Воркеры

Долгоживущие процессы, отдельные от основного API:

ВоркерНазначение
retro-starterЗапуск ретроспективных расчётов экспериментов
materialized-view-refresherОбработка очереди обновлений materialized views

Включение, реплики и ресурсы воркеров настраиваются в values-trisigma.yaml под ключом workers.<имя>.

Секреты приложения

Секреты в приложение можно передать двумя способами: задать значения напрямую в secrets-values.yaml — или указать имя существующего Kubernetes Secret в поле existingSecret в чарте (например, созданного через Vault или External Secrets Operator).

Создайте файл из примера: cp secrets-values.yaml.example secrets-values.yaml.

СекретКлючОписание
PGPASSWORDpostgresql.passwordПароль PostgreSQL
REDIS_PASSWORDredis.passwordПароль Redis/Valkey
CLICKHOUSE_PASSWORDclickhouse.passwordПароль ClickHouse
INTERNAL_API_KEYinternalApi.internalApiKeyВнутренний API-ключ
EXTERNAL_API_KEYinternalApi.externalApiKeyВнешний API-ключ
SECRET_KEYinternalApi.secretKeyСекретный ключ приложения для подписи JWT
S3_ATTACHMENTS_ACCESS_KEYs3Attachments.accessKeyS3 access key для bucket вложений
S3_ATTACHMENTS_SECRET_ACCESS_KEYs3Attachments.secretAccessKeyS3 secret key для bucket вложений
S3_ANALYTIC_UPLOADS_ACCESS_KEYs3AnalyticUploads.accessKeyS3 access key для bucket аналитики
S3_ANALYTIC_UPLOADS_SECRET_ACCESS_KEYs3AnalyticUploads.secretAccessKeyS3 secret key для bucket аналитики
TRINO_USER / TRINO_PASSWORDtrino.user / trino.passwordКреды Trino
TRINO_ADMIN_USER / TRINO_ADMIN_PASSWORDtrino.adminUser / trino.adminPasswordАдмин-креды Trino
TRINO_READONLY_USER / TRINO_READONLY_PASSWORDtrino.readonlyUser / trino.readonlyPasswordRead-only креды Trino
SPLITTER_TOKENsplitter.tokenТокен авторизации запросов в Splitter1
REPO_USER / REPO_TOKENrepo.user / repo.tokenКреды Git-репозитория метрик
REPO_SECRET_KEYrepo.secretKeyСекретный ключ для подписи webhook'ов репозитория
AIRFLOW_USER / AIRFLOW_PASSWDairflow.user / airflow.passwordКреды Airflow API
AIRFLOW_CONFIG_COPY_TOKENairflow.configCopyTokenТокен для загрузки DAG-конфигов в Airflow

Использование существующего Secret (existingSecret)

Если вы не хотите передавать значения через secrets-values.yaml — укажите название вашего собственного Secret:

kubectl create secret generic trisigma-configurator-secrets \
--from-literal=PGPASSWORD='...' \
--from-literal=REDIS_PASSWORD='...' \
--from-literal=CLICKHOUSE_PASSWORD='...' \
--from-literal=INTERNAL_API_KEY='...' \
--from-literal=EXTERNAL_API_KEY='...' \
--from-literal=SECRET_KEY='...' \
--from-literal=S3_ATTACHMENTS_ACCESS_KEY='...' \
--from-literal=S3_ATTACHMENTS_SECRET_ACCESS_KEY='...' \
--from-literal=S3_ANALYTIC_UPLOADS_ACCESS_KEY='...' \
--from-literal=S3_ANALYTIC_UPLOADS_SECRET_ACCESS_KEY='...' \
--from-literal=TRINO_USER='...' \
--from-literal=TRINO_PASSWORD='...' \
--from-literal=TRINO_ADMIN_USER='...' \
--from-literal=TRINO_ADMIN_PASSWORD='...' \
--from-literal=SPLITTER_TOKEN='...' \
--from-literal=REPO_USER='...' \
--from-literal=REPO_TOKEN='...' \
--from-literal=AIRFLOW_USER='...' \
--from-literal=AIRFLOW_PASSWD='...' \
-n trisigma-configurator
postgresql:
existingSecret: trisigma-configurator-secrets
secretKeys:
passwordKey: PGPASSWORD
redis:
existingSecret: trisigma-configurator-secrets
secretKeys:
passwordKey: REDIS_PASSWORD
clickhouse:
existingSecret: trisigma-configurator-secrets
secretKeys:
passwordKey: CLICKHOUSE_PASSWORD
internalApi:
existingSecret: trisigma-configurator-secrets
secretKeys:
internalApiKeyKey: INTERNAL_API_KEY
externalApiKeyKey: EXTERNAL_API_KEY
secretKeyKey: SECRET_KEY
s3Attachments:
existingSecret: trisigma-configurator-secrets
secretKeys:
accessKeyKey: S3_ATTACHMENTS_ACCESS_KEY
secretAccessKeyKey: S3_ATTACHMENTS_SECRET_ACCESS_KEY
s3AnalyticUploads:
existingSecret: trisigma-configurator-secrets
secretKeys:
accessKeyKey: S3_ANALYTIC_UPLOADS_ACCESS_KEY
secretAccessKeyKey: S3_ANALYTIC_UPLOADS_SECRET_ACCESS_KEY
trino:
existingSecret: trisigma-configurator-secrets
secretKeys:
userKey: TRINO_USER
passwordKey: TRINO_PASSWORD
adminUserKey: TRINO_ADMIN_USER
adminPasswordKey: TRINO_ADMIN_PASSWORD
splitter:
existingSecret: trisigma-configurator-secrets
secretKeys:
tokenKey: SPLITTER_TOKEN
airflow:
existingSecret: trisigma-configurator-secrets
secretKeys:
userKey: AIRFLOW_USER
passwordKey: AIRFLOW_PASSWD
repo:
existingSecret: trisigma-configurator-secrets
secretKeys:
userKey: REPO_USER
tokenKey: REPO_TOKEN

Если имя ключа в Secret отличается — например, pg_password вместо PGPASSWORD — укажите соответствие через secretKeys:

postgresql:
existingSecret: trisigma-configurator-secrets
secretKeys:
passwordKey: pg_password
примечание

Использовать одновременно secrets-values.yaml и existingSecret в одном блоке не получится, способы несовместимы друг с другом.

Helm-установка

cd helm/trisigma-configurator

helm upgrade --install trisigma-configurator . \
--namespace trisigma-configurator \
-f values.yaml \
-f values-trisigma.yaml \
-f secrets-values.yaml # уберите, если все секреты через existingSecret

Проверка деплоя

После установки убедитесь, что сервис работает:

curl http://<configurator-host>:8890/_info

Ожидаемый ответ:

{
"environment": {
"server": {
"host": "trisigma-configurator-<pod-id>",
"ip": "10.x.x.x",
"os": "Linux ..."
}
},
"language": {
"name": "python",
"version": "3.x.x",
"flaskVersion": "..."
},
"appTag": "trisigma-configurator",
"imageTag": "<git-sha>"
}

Footnotes

  1. Соответствует секрету interServiceAuth.configurationToken (CONFIGURATION_TOKEN) в Splitter.