Утилита миграции данных из внешних источников
Запросы к ClickHouse
Запрос на получение метрик по объектам:
SELECT
sum(count) as count,
multiIf(portal_id in &ПереходыВыходы AND metric_type == 'out', 'in', portal_id in &ПереходыВыходы AND metric_type == 'in', 'out', toString(metric_type)) as metric_type,
toStartOfDay(toDateTime(timestamp, &ЧасовойПояс)) as timestampDay
FROM
metrics_by_portals FINAL
WHERE
portal_id in &ПереходыВсе
AND toDateTime(timestamp, &ЧасовойПояс) BETWEEN toDateTime(&ДатаНачалаОтбора, &ЧасовойПояс) AND toDateTime(&ДатаОкончанияОтбора, &ЧасовойПояс)
AND HOUR(toDateTime(timestamp, &ЧасовойПояс)) IN &МассивЧасовРаботы
AND multiIf(HOUR(toDateTime(timestamp, &ЧасовойПояс)) = &ЧасНачалаРаботы, MINUTE(toDateTime(timestamp, &ЧасовойПояс)) >= &МинутаНачалаРаботы, HOUR(toDateTime(timestamp, &ЧасовойПояс)) = &ЧасОкончанияРаботы, MINUTE(toDateTime(timestamp, &ЧасовойПояс)) < &МинутаОкончанияРаботы, MINUTE(toDateTime(timestamp, &ЧасовойПояс)) >= 0)
GROUP BY
(
metric_type,
timestampDay
)
HAVING metric_type = 'in'
SETTINGS optimize_move_to_prewhere_if_final = 1
где,
- &ПереходыВыходы - массив идентификаторов переходов, которые являются выходами для объекта (backward в direction).
- &ПереходыВсе - массив идентификаторов всех переходов объекта .
- &ЧасовойПояс - Часовой пояс объекта .
- &ДатаНачалаОтбора и &ДатаОкончанияОтбора - период отбора данных. Рекомендуется получать данные за полные дни.
- &МассивЧасовРаботы - массив часов работы объекта (см. пример запроса).
- &ЧасНачалаРаботы и &МинутаНачалаРаботы - час и минута времени начала работы объекта.
- &ЧасОкончанияРаботыи &МинутаОкончанияРаботы- час и минута времени окончания работы объекта.
Отбор по времени работы объекта использовать только в случае если объект не круглосуточный.
Пример заполненного запроса:
SELECT
sum(count) as count,
multiIf(portal_id in ('074d4fdd-6b5d-417b-a9b3-ee84b52b2252') AND metric_type == 'out', 'in', portal_id in ('4ad9d597-f21d-45dc-880a-72926630edea') AND metric_type == 'in', 'out', toString(metric_type)) as metric_type,
toStartOfDay(toDateTime(timestamp, 'Asia/Yekaterinburg')) as timestampDay
FROM
metrics_by_portals FINAL
WHERE
portal_id in ('05b6bef9-5c34-41b4-ae8f-8e09869e3f12', '074d4fdd-6b5d-417b-a9b3-ee84b52b2252')
AND toDateTime(timestamp, 'Asia/Yekaterinburg') BETWEEN toDateTime('2023-03-26 00:00:00', 'Asia/Yekaterinburg') AND toDateTime('2023-03-26 23:59:59', 'Asia/Yekaterinburg')
AND HOUR(toDateTime(timestamp, 'Asia/Yekaterinburg')) IN (5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)
AND multiIf(HOUR(toDateTime(timestamp, 'Asia/Yekaterinburg')) = 5, MINUTE(toDateTime(timestamp, 'Asia/Yekaterinburg')) >= 0, HOUR(toDateTime(timestamp, 'Asia/Yekaterinburg')) = 21, MINUTE(toDateTime(timestamp, 'Asia/Yekaterinburg')) < 25, MINUTE(toDateTime(timestamp, 'Asia/Yekaterinburg')) >= 0)
GROUP BY
(
metric_type,
timestampDay
)
HAVING metric_type = 'in'
SETTINGS optimize_move_to_prewhere_if_final = 1
Получение данных по объекту:
SELECT
object_id as object_id,
name as name,
portal_id as portal_id,
direction as direction,
working_hours.timezone,
working_hours.start_time,
working_hours.end_time,
working_hours.around_the_clock
FROM
objects
LEFT ANY JOIN working_hours AS wh
ON working_hours.object_id = objects.object_id
ORDER BY object_id
Пример результата запроса:
Описание
Настройки
Настройка производится путем изменения значений переменных среды или ENV файла.
ENV файл представляется собой текстовый файл, в котором описаны настройки в формате КЛЮЧ=ЗНАЧЕНИЕ. Каждая строка файла может содержать одну пару КЛЮЧ=ЗНАЧЕНИЕ. Для ENV файла допускается имя .env и win.env. Значение переменных из файла ENV имеют более высокий приоритет чем переменные среды.
Описание настроек
ниже описаны настройки, разбитые на группы
Настройки приложения
- SPPINDEX_APP_LOG_LEVEL - уровнь логгирования приложения
- тип: строка
- доступные значения: DEBUG, INFO, WARNING, ERROR, CRITICAL
- значение по умолчанию: INFO
- SPPINDEX_APP_PATH_DATA - расположение папки для хранения временных файлов
- тип: строка
- значение по умолчанию: var
Настройки локальной базы приложения
- SPPINDEX_DATA_METRICS_AGE - максимальное количество дней для хранения метрик в локальной базе
- тип: положительное целое число
- значение по умолчанию: 30
- SPPINDEX_DATA_METRICS_SAVE_CHUNK_SIZE - размер чанка данных для сохранения в локальной базе
- тип: положительное целое число
- значение по умолчанию: 1000
Настройки расписаний запуска задач
- SPPINDEX_CRON_DOWNLOAD - расписание для запуска задачи скачивания данных с источников
- тип: строка в формате CRONTAB
- значение по умолчанию: 0 * * * *
- SPPINDEX_CRON_UPLOAD - расписание для запуска задачи загрузки незагруженных данных в index-сервис
- тип: строка в формате CRONTAB
- значение по умолчанию: */10 * * * *
- SPPINDEX_CRON_VACUUM - расписание для запуска задачи очистки устаревших данных в локальной базе
- тип: строка в формате CRONTAB
- значение по умолчанию: 0 */6 * * *
Настройки для взаимодействия с index-сервисом
- SPPINDEX_SERVICE_TOKEN - токен доступа к index-сервису
- тип: строка
- SPPINDEX_SERVICE_URL - URL index-сервиса
- тип: строка в формате URL
- SPPINDEX_SERVICE_CHUNK_SIZE - количество метрика передаваемых в одном запросе
- тип: положительное целое число
- значение по умолчанию: 100
Настройки адаптера CLICKHOUSE
- SPPINDEX_CLICKHOUSE_HOST - адрес сервера
- тип: строка
- SPPINDEX_CLICKHOUSE_PORT - порт сервера
- тип: целое число в диапазоне 0-65535
- значение по умолчанию: 9000
- SPPINDEX_CLICKHOUSE_USERNAME - имя пользователя для доступа к серверу
- тип: строка
- значение по умолчанию: default
- SPPINDEX_CLICKHOUSE_PASSWORD - пароль пользователя для доступа к серверу
- тип: строка
- значение по умолчанию: default
- SPPINDEX_CLICKHOUSE_INCLUDE - список баз из которых будет производиться выгрузка.
- тип: строка. базы перечисляются через запятую
- если не задано - выгружается по всем базам кроме SPPINDEX_CLICKHOUSE_EXCLUDE
- SPPINDEX_CLICKHOUSE_EXCLUDE - список баз из которых не будет производиться выгрузка.
- тип: строка. базы перечисляются через запятую
- при заданном SPPINDEX_CLICKHOUSE_INCLUDE игнорируется
Настройки адаптера COUNTMAX
возможно задание нескольких экземпляров.
номер экземпляра задается необязательным окончанием _NUM,
где NUM - целое положительное числонапример
SPPINDEX_COUNTMAX_HOST - задает адрес сервера для нулевого экземпляра адаптера
SPPINDEX_COUNTMAX_HOST_1 - задает адрес сервера для первого экземпляра адаптера
сортировка адаптеров осуществляется по номеру экземпляра
допускается пропуск номеровв описании переменных необязательное окончание обозначается квадратными скобками
- SPPINDEX_COUNTMAX_HOST[_NUM] - адрес сервера
- тип: строка
- SPPINDEX_COUNTMAX_PORT[_NUM] - порт сервера
- тип: целое число в диапазоне 0-65535
- значение по умолчанию: 1433
- SPPINDEX_COUNTMAX_USERNAME[_NUM] - имя пользователя для доступа к серверу
- тип: строка
- значение по умолчанию: default
- SPPINDEX_COUNTMAX_PASSWORD[_NUM] - пароль пользователя для доступа к серверу
- тип: строка
- значение по умолчанию: default
- SPPINDEX_COUNTMAX_INCLUDE[_NUM] - список проектов по которым будет производиться выгрузка.
- тип: строка. проекты перечисляются через запятую
- SPPINDEX_COUNTMAX_EXCLUDE[_NUM] - список проектов по которым не будет производиться выгрузка.
-
- тип: строка. проекты перечисляются через запятую
-
Облако
Тестовый экземпляр утилиты миграции развернут в облаке. spp_agent_dev -> index-migration
Взаимодействие с index-сервисом
В зависимости от расписания заданного в SPPINDEX_CRON_UPLOAD запускается задача загрузки данных в index-сервис.
Загружаются только раннее не синхронизированные данные.
Последовательность действий итерации:
- Получение из локально кеша объектов по которым есть несихронизированные метрики
- Для каждого объекта из пункта 1 делается запрос http запрос в index-сервис для сохранения. В ответе получаем id объекта в базе сервиса
- Получение несинхронизированных метрик из локального кеша.
- Отправка данных из пункта 3 пачками в index-сервис
- При успешном запросе в п.4 помечаем метрики как синхронизированные
Описание API для взаимодействия с index-сервисом
Запрос сохранения объекта
POST: SPPINDEX_SERVICE_URL/control/clients/1/init_organization_object
{
"external_id": OBJECT_ID
"name": OBJECT_NAME
}
- OBJECT_ID - локальный ID объекта (external_id в терминологии index-сервиса)
- генерируется по правилу ADAPTERID_DBNAME_OBJECTID
- OBJECT_NAME - имя объекта из базы источника
Ответ сервиса:
{
"error": ERROR_FLAG,
"message": MESSAGE,
"id": REMOTE_OBJECT_ID
}
- ERROR_FLAG - булево значение
- true - ошибка есть
- false - ошибки нет
- MESSAGE - строка с ответом сервиса
- REMOTE_OBJECT_ID - ID объекта в базе index-сервиса
Запрос сохранения метрик
POST: SPPINDEX_SERVICE_URL/data/visits
[
...,
{
"object_id": REMOTE_OBJECT_ID,
"day": DATE,
"visits": VISITS_COUNT
},
...
]
- REMOTE_OBJECT_ID - строка с ID объекта в базе index-сервиса
- DATE - строка с датой в формате YYYY-MM-DD. Дата метрики
- VISITS_COUNT - целое число. Данные метрики (количество проходов)
Ответ сервиса:
{
"error": ERROR_FLAG,
"message": MESSAGE
}
- ERROR_FLAG - булево значение
- true - ошибка есть
- false - ошибки нет
- MESSAGE - строка с ответом сервиса