Руководство по системному администрированию#
Сценарии администрирования#
При deploy в системе контейнеризации все токены, пароли, сертификаты и иная чувствительная информация хранится в одном из типов хранилищ:
в секретах системы управления контейнерами;
в файловой системе pod. Получены из внешней системы хранения секретов Secret Management System.
Стратегия снятия резервных копий зависит от критичности данных, подлежащих сохранению, и определяется группой сопровождения.
К сценариям администрирования относятся все действия и настройки, указанные в этом разделе, а также просмотр журналов (logs) и метрик мониторинга.
Сценарий «Управление конфигурацией»#
Настройка способа получения конфигурации выполняется в файле <src/main/resources/bootstrap.yml>.
Если используется Spring Cloud, необходимо его включить и указать адрес сервера конфигурации:
spring.cloud.config.uri: http://localhost:8080
spring.cloud.config.enabled: true
Если используется локальная конфигурация, Spring Cloud необходимо отключить:
spring.cloud.config.enabled: false
В зависимости от текущего профиля настройки могут быть переопределены в файлах конфигурации профиля <src/main/resources/application-{profile}.yml>.
Файл application.yml должен содержать следующие конфигурационные блоки:
блок
management— настройки actuator, необходимые для получения метрик;блок
oidc— настройки аутентификации и авторизации на backend-сервисе;блок
logging— настройки требуемого уровня логирования в системе;блок
spring— настройки spring-приложения;блок
сallback— настройки, связанные с реализацией Callback;блок
api— настройки пользовательского API;блок
events— настройки отправки событий бизнес-мониторинга;блок
audit— настройки аудита;блок
tracing— настройки отправки сообщений в систему tracing (трейсинга);блок
index— настройки интеграции с сервисом индексирования;блок
transport— настройки асинхронного взаимодействия с внешними системами.
Настройка аутентификации и авторизации#
Подробнее о каждом режиме аутентификации и авторизации описано в документе «Настройки режимов аутентификации и авторизации пользователей».
Настройка режима работы#
Предусмотрено 2 режима:
без поддержки мультитенантности;
с поддержкой мультитенантности – один потребитель в одной инсталляции (multiinstance);
Режим работы определяется переменной multitenancy.mode в файле application.yml:
Режим работы |
multitenancy.mode |
|---|---|
Без поддержки мультитенантности |
off |
multiinstance |
singletenant |
При валидации конфигурационного файла должны быть соблюдены следующие правила:
Режим работы компонента TaskList (UTSK) продукта Platform V Flow (BPM) |
Режим работы сервиса Аудит |
Режим работы сервиса авторизации |
Конфигурация переменных |
|---|---|---|---|
Без поддержки мультитенантности |
Без поддержки мультитенантности |
Без поддержки мультитенантности |
multitenancy.mode – off audit.multitenant – false |
multiinstance |
Без поддержки мультитенантности/С поддержкой мультитенантности |
С поддержкой мультитенантности |
multitenancy.mode – singletenant audit.multitenant – false/true |
Если валидация не прошла успешно, приложение не запускается. В лог-файл приложения добавляется запись об ошибке запуска.
Настройки подключения к БД#
Для работы компонента TaskList (UTSK) продукта Platform V Flow (BPM) необходимо настроить подключение к БД.
Для настройки подключения к БД необходимо указать соответствующие опции в файле application.yml.
Работа с БД осуществляется через pg_bouncer. Для этого в URL для подключения должен быть указан не порт БД, а порт pg_bouncer.
В данный момент используется две БД – master и StandIn.
Список рекомендуемых БД представлен в Руководстве по установке, «Системное программное обеспечение».
Создание структуры БД происходит автоматически во время инициализации (запуска) приложения.
Отключение функционала автоматической миграции БД при старте приложения возможно с помощью настройки:
spring.liquibase.enabled: false
Для подключения к серверу БД необходимо указать следующую информацию:
username— имя пользователя БД (пароль хранится в разделе secrets).driver— имя драйвера;jdbc-url— путь к БД, в качестве порта должен быть указан порт pg_bouncer;prepareThreshold=0в конце строки отключает механизм prepared statement, так как этот механизм временно не работает с pg_bouncer.
maximumPoolSize— максимальный размер pool соединений;jpa— блок настройки взаимодействия с БД.
spring:
datasource:
username: htm-test
driver: org.postgresql.Driver
jdbc-url: jdbc:postgresql://vm.esrt.cloud.ru:5433/bdtl?prepareThreshold=0
maximumPoolSize: 60
jpa:
show-sql: false
hibernate.dll-auto: validate
properties.hibernate.dialect: org.hibernate.dialect.PostgreSQL95Dialect
liquibase:
enabled: true
Настройки механизма очистки БД#
Настройка механизма очистки удаленных данных из БД осуществляется через файл application.yml, блок cleanup.
Доступные настройки:
enabled— включение/выключение механизма очистки данных;frequency— настройка периодичности запуска механизма очистки данных из БД в cronlike формате;lifetime— настройка (в секундах) срока восстановления удаленных данных (время нахождения в статусе DELETED, во время которого запись можно восстановить).
cleanup:
enabled: true
frequency: 0 0 */2 ? * *
lifetime: 86400
Механизм очистки данных удаляет из БД только soft-deleted записи, у которых истек срок восстановления удаленной записи (cleanup.lifetime)
Настройка Spring actuator#
Блок Management содержит настройки spring actuator, необходимые для получения метрик.
Для настройки доступа к данным Spring actuator необходимо указать порт, на котором будут доступны данные: server.port 8086, а также список endpoint, по которым необходимо получать данные.
Метрики, отвечающие за работу приложения, необходимо обогатить:
rn – соответствует resourceName потребителя.
Предварительно Потребитель должен создать подключение к сервису Объединенный мониторинг Unimon (MONA) продукта Platform V Monitor (OPM), используя соответствующий resourceName.
endpoint |
Описание |
|---|---|
auditevents |
Предоставляет информацию о событиях аудита для текущего приложения. Требуется bean AuditEventRepository |
beans |
Отображает полный список всех компонентов Spring в приложении |
caches |
Открывает доступные cache |
conditions |
Показывает условия, которые были созданы для классов конфигурации и автоматической конфигурации, а также причины, по которым они совпадают или не совпадают |
configprops |
Отображает упорядоченный список @ConfigurationProperties |
env |
Показывает свойства от Spring's ConfigurableEnvironment |
flyway |
Показывает все примененные миграции базы данных Flyway. Требуется один или несколько Flyway beans |
health |
Показывает информацию о состоянии приложения |
httptrace |
Отображает информацию HTTP-трассировки (по умолчанию последние 100 обменов HTTP-запросом-ответом). Требуется bean HttpTraceRepository |
info |
Отображает произвольную информацию о приложении |
integrationgraph |
Показывает график интеграции Spring. Требуется зависимость от spring-integration-core |
loggers |
Показывает и изменяет конфигурацию логгеров в приложении |
liquibase |
Показывает все примененные миграции базы данных Liquibase. Требуется один или несколько Liquibase beans |
metrics |
Показывает информацию «метрики» для текущего приложения (список метрик приведен ниже) |
mappings |
Отображает упорядоченный список всех @RequestMapping путей |
scheduledtasks |
Отображает запланированные задачи в приложении |
sessions |
Позволяет получать и удалять пользовательские сеансы из хранилища сеансов Spring Session. Требуется веб-приложение на основе servlet, использующее Spring Session |
shutdown |
Позволяет корректно завершить работу приложения. По умолчанию отключено |
startup |
Показывает данные о шагах запуска, собранные платформой ApplicationStartup |
threaddump |
Выполняет дамп потока |
heapdump |
Возвращает hprof дамп файл |
logfile |
Возвращает содержимое файла журнала (если установлены свойства logging.file.name или logging.file.path). Поддерживает использование Range заголовка HTTP для получения части содержимого файла журнала |
prometheus |
Предоставляет метрики в формате, который может быть извлечен сервером Prometheus. Требуется зависимость от micrometer-registry-prometheus |
index |
Предоставляет возможность ручного управления синхронизацией с сервисом индексирования: |
loggers.enabled |
Предоставляет возможность редактирования конфигурации логирования |
logging.scan-period |
Период обновления конфигурации из файла logback конфигурации |
Настройка Callback#
Настройка Callback производится через файл application.yml, блок callback.
Для конфигурирования доступны следующие переменные:
start— полный URL внешней системы для подтверждения старта задачи;abort— полный URL внешней системы для подтверждения прерывания назначения задачи;complete— полный URL внешней системы для подтверждения выполнения задачи;assign— полный URL внешней системы для подтверждения назначения задачи;discharge— полный URL внешней системы для подтверждения снятия назначения задачи.
Важно!
URL указывается целиком: <протокол>:[//<хост>[:<порт>][/<путь>]]
Настройка тайм-аутов и повторных вызовов в случае неуспешного результата исполнения callback производится в блоке timeout.
Значение -1 не вносит изменений в значение по-умолчанию netty.
timeout.connection-request— время ожидания подключения к сервису в мс;timeout.connect— время ожидания соединения в мс;timeout.read— время ожидания чтения сокета в мс;timeout.write— время ожидания записи сокета в мс;timeout.retry.maxAttempts— количество повторных вызовов в случае неуспешного ответа или тайм-аута;timeout.retry.minBackOffMills— начальный интервал повтора в случае неуспешного ответа или тайм-аута, в мс. Последующий интервал = (начальный интервал) * 2 ^ (номер повтора).
callback:
start: http://...
abort: http://...
complete: http://...
assign: http://...
discharge: http://...
timeout:
connection-request: 1
connect: 1
read: 1
write: 1
retry:
maxAttempts: 3
minBackOffMills: 300
Настройка трейсинга (tracing)#
Настройка отправки Span (специализированный термин, обозначающий событие трейсинга) в систему трейсинга (tracing). Span отправляются в формате OpenZipkin при входящих и исходящих вызовах UTSK.
Настройка работы трейсинга (tracing) осуществляется через файл application.yml, блок tracing.
Доступные настройки:
enabled— включение/выключение трейсинга;url— URL трейсинг-коллектора;service-name— наименование сервиса UTSK в системе трейсинга;max-queue-size— максимальный размер очереди;batch-size— максимальный размер отправляемой партии (количество span отправляемых в одном запросе);delay-ms— задержка отправки очереди span;timeout:connection-request— время ожидания подключения к сервису;connect— время ожидания соединения;read— время ожидания чтения сокета.
tracing:
enabled: false
url: http://localhost:9321/spans
service-name: htm-app
max-queue-size: 1000
batch-size: 5
delay-ms: 10000
timeout:
connection-request: 5000
connect: 10000
read: 30000
Схема сообщения Span:
Параметр |
Описание |
|---|---|
id |
Генерируемый при создании 16-значный ID Span |
traceId |
ID трейсинга, получаемый из HTTP заголовка запроса к UTSK (x-b3-traceid) |
parentId |
ID родительского Span, получаемый из HTTP заголовка запроса (x-b3-spanid) |
name |
Наименование операции |
timestamp |
– В случае вызова стороннего сервиса "время отправки запроса" в мкс, |
duration |
Длительность обработки запроса в мкс. |
kind |
– В случае вызова API UTSK сторонним сервисом – "SERVER", |
localEndpoint: serviceName |
Наименование сервиса UTSK (из настройки service-name) |
localEndpoint: ipv4 |
IP адрес UTSK |
localEndpoint: port |
Порт UTSK |
remoteEndpoint: serviceName |
В случае вызова стороннего сервиса "url вызываемого метода" |
remoteEndpoint: ipv4 |
В случае вызова стороннего сервиса "IP вызываемого сервиса" |
remoteEndpoint: port |
В случае вызова стороннего сервиса "порт вызываемого сервиса" |
tags |
Массив tags может содержать следующие дополнительные параметры (теги): |
Настройка бизнес-мониторинга#
Публикуемые события:
Создание задачи;
Назначение задачи на исполнителя менеджером;
Взятие задачи исполнителем в работу;
Снятие задачи с исполнителя;
Старт задачи;
Завершение задачи;
Прерывание задачи;
Изменение параметров задачи.
Настройки отправки событий:
enabled— отвечает за включение отправки событий;bam-project-id: urn:sbrfsystems:99-tasklist— параметр bamProjectId (по требованию Platform V Monitor);format— формат сообщения kogito|synapse;kafka:bootstrap-servers— адрес Kafka брокера;client-id— префикс клиента Kafka. Строка идентификатора, передаваемая на сервер при выполнении запросов:properties.reconnect.backoff.ms— базовое время ожидания перед попыткой повторного подключения к узлу;
template.default-topic: EventsTaskList— топик по умолчанию;producer:retries— количество попыток повторной отправки в случае ошибки;key-serializer: org.apache.kafka.common.serialization.StringSerializer— класс сериализатора для ключа;value-serializer: org.apache.kafka.common.serialization.StringSerializer— класс сериализатора для значения.
events:
enabled: true
bam-project-id: urn:sbrfsystems:99-tasklist
format: kogito
kafka:
bootstrap-servers: localhost:9092
client-id: @project.name@
properties.reconnect.backoff.ms: 10000
template.default-topic: EventsTaskList
producer:
retries: 0
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
Схема события Kogito
____ |
Элемент |
Описание |
|---|---|---|
____ |
bamProjectId |
Идентификатор системы UTSK в Platform V Monitor (urn:sbrfsystems:99-tasklist) |
____ |
resourceName |
Имя ресурса (для режима multiinstance будет использоваться вместо bamProjectId) |
____ |
id |
id события |
____ |
kogitoProcessId |
id процесса |
____ |
kogitoProcessinstanceId |
id экземпляра процесса |
____ |
source |
Ссылка на форму выполнения задачи form_url |
____ |
specversion |
Версия спецификации |
____ |
time |
Время события |
____ |
type |
Тип задачи (type) |
____ |
kogitoUserTaskinstanceId |
id экземпляра шага в процессе компонента Engine (BPMX) продукта Platform V Flow (BPM) |
____ |
kogitoUserTaskinstanceState |
Статус задачи UTSK |
data |
aborted |
Дата прерывания задачи |
data |
abortReason |
Причина прерывания задачи (abort_reason) |
data |
adminGroups |
Список ролей, которые могут изменять задачу (manager_role) |
data |
adminUsers |
Список пользователей, которые могут изменять задачу |
data |
assigned |
Дата назначения задачи |
data |
completed |
Дата завершения задачи |
data |
created |
Дата создания задачи |
data |
excludedUsers |
Список пользователей которым недоступна задача (excluded_usernames) |
data |
id |
id экземпляра задачи BPMX, совпадает с processId |
data |
inputs |
Дополнительные атрибуты задачи |
data |
outputs |
Результат выполнения задачи (параметры) |
data |
processInstanceId |
id экземпляра процесса |
data |
potentialGroups |
Список ролей, которые могут выполнять пользовательскую задач (executor_role) |
data |
potentialUsers |
Список пользователей, которые могут выполнять пользовательскую задач |
data |
referenceName |
Заголовок задачи (title) |
data |
started |
Дата начала выполнения задачи |
data |
state |
Статус задачи UTSK |
data |
taskDescription |
Описание задачи (description) |
data |
taskListId |
id экземпляра задачи UTSK |
data |
taskName |
Тип задачи (type) |
data |
taskPriority |
Приоритет задачи |
Пример:
{
"bamProjectId": "urn:sbrfsystems:99-tasklist",
"id": "df180b56-2e81-4aa4-a16e-72c7c9194a15",
"kogitoProcessId": "4d899471-19dd-485d-b7f4-b31318d",
"kogitoProcessinstanceId": "63c297cb-f5ac-4e20-8254-02f37bd72b80",
"specversion": "1.1",
"time": "2021-04-28T15:58:37.811541+03:00",
"type": "UserTaskInstanceEvent",
"source": "http://localhost:8080/userTask",
"kogitoUserTaskinstanceId": "4d899471-19dd-485d-b7f4-b313185d430d",
"kogitoUserTaskinstanceState": "COMPLETED",
"data": {
"processInstanceId": "4d899471-19dd-485d-b7f4-b313185d430d",
"id": "4d899471-19dd-485d-b7f4-b313185d430d",
"taskListId": "4d8fe443-19dd-485d-b7f4-72c7c9194a15",
"taskName": "Apply for visa",
"taskDescription": null,
"taskPriority": "1",
"referenceName": "Task",
"state": "COMPLETED",
"created": "1645163501",
"assigned": "1645163501",
"started": "1645163501",
"completed": "1645163501",
"aborted": "1645163501",
"abortReason": "value",
"potentialUsers": [
],
"potentialGroups": [
"TestGroup"
],
"excludedUsers": [
"TestActor"
],
"adminUsers": [
],
"adminGroups": [
"TestAdmin"
],
"inputs": {
"parameter1": "value",
"parameter2": "value"
},
"outputs": {
"parameter1": "value",
"parameter2": "value"
}
}
}
Схема события Synapse
header
Элемент |
Описание |
|---|---|
evtDate |
Дата возникновения события |
evtId |
Идентификатор события (случайный UUID) |
evtType |
Идентификатор типа события и соответствующей ему схемы — TaskListEvent |
evtVersion |
Версия схемы события |
sndDate |
Дата отправки события источником |
srcModule |
Источник события — formUrl |
body
Тело сообщения генерируется аналогично схеме сообщения для Kogito, представленной выше.
Настройка marketplaces для плеера форм#
Настройка marketplaces для плеера форм осуществляется через файл application.yml, блок app:
marketplaces.name— наименование marketplace.marketplaces.baseUrl— url marketplace.
app:
marketplaces:
- name: marketplace/list
baseUrl: http://marketplace.space/marketplace/
- name: marketplacesandbox/list
baseUrl: http://marketplace.space/marketplacesandbox/
Настройка ограничения количества задач#
Для массовых операций#
Настройка ограничения максимального количества задач для массовых операций осуществляется через файл application.yml, блок app:
massOperationsLimit— максимальное количество задач, передаваемое API массовой операции. По умолчанию 20, максимум 100. В случае если значение 0, то массовые операции перестанут работать (в ответе АПИ массовых операций будет возвращаться сообщение, что они отключены).
app:
massOperationsLimit: 20
Для назначения#
Применяется только для связанных задач при их назначении на пользователя.
Настройка ограничения количества задач для назначения осуществляется через файл application.yml, блок app:
linked.limit— глобальное ограничение количества задач для назначения при отсутствии явно заданного значения. Ограничение распространяется на общее количество задач, включая исходную, по которой происходит поиск связанных. По умолчанию 30.linked.max— максимально допустимое количество задач для назначения. По умолчанию 100.
app:
linked:
limit: 30
max: 100
Настройка ограничения количества значений справочника для атрибута DICTIONARY#
Настройка ограничения количества задач при выборках осуществляется через файл application.yml, блок app:
dictionaryLimit— максимальное количество уникальных значений для атрибута с типом DICTIONARY, возвращаемое в ответе запроса получения списка атрибутов. По умолчанию 100.
app:
dictionaryLimit: 100
Настройка ограничения payload в запросах к API#
Настройка ограничения максимального размера payload в запросах к API UTSK осуществляется через файл application.yml, блок app:
payloadLimit— максимальный размер payload в запросах к API UTSK в байтах. По умолчанию null (функционал отключен). При указании значений null, 0 или пустого значения функционал лимитирования будет отключен.
app:
payloadLimit: 3000
Настройка индексирования#
Настройка индексирования пользовательских задач в Elasticsearch (ES) осуществляется через файл application.yml, блок index.
Доступные настройки:
enabled— включение/выключение сервиса индексирования;host— список адресов сервисов индексирования;resource— имя индекса. При отсутствии значения будет использоваться имя "tasks";connectTimeout— тайм-аут подключения к сервису индексирования;socketTimeout— тайм-аут сокета подключения;chunkSize— количество записей, отправляемых одним пакетом для индексирования в ES. По умолчанию: 500;username— логин пользователя для авторизации в ES;
index:
enabled: false
host: http://localhost:9200/, http://localhost:9222/
resource: tasks
connectTimeout: 3000
socketTimeout: 3000
chunkSize-size: 500
username: test-user
При включенном сервисе индексирования:
Включен механизм синхронизации задач с ES. Механизм синхронизации задач с сервисом индексирования выполняется при запуске приложения htm-app или вручную через spring actuator.
Ограничение: До завершения выполнения механизма синхронизации задач запросы получения задач могут работать некорректно (возвращать пустые или неполные списки задач).
Доступные операции для ручного запуска через spring actuator:
synchronize – синхронизацию задач с сервисом индексирования. При выполнении измененные, но не проиндексированные задачи, будут проиндексированы в ES.
rebuild – перестроение индексов задач. При выполнении все задачи будут переиндексированы в ES (у всех задач будет очищена дата индексирования и ошибка индексирования, после чего запущен механизм индексирования задач).
reset – сброс ошибок индексирования. При выполнении задачи с ошибкой индексирования будут переиндексированы в ES.
Выполняется индексация задач в ES при создании/изменении/удалении задач;
Поисковые запросы по задачам (получение задач менеджера, получение задач исполнителя, поиск связанных задач, поиск доступных задач однопоточного исполнителя выполняются в ES);
Ограничение: При выполнении поисковых запросов по задачам (через API UTSK) количество задач в ответе будет ограничено значением по умолчанию – 10000 (конфигурация ES).
Поиск количественных значений по задачам для статистики менеджера и исполнителя выполняется в ES.
Настройка размера сообщения WebClient#
Настройка размера буфера сообщений WebClint осуществляется через файл application.yml в блоке spring.
codec.max-in-memory-size— максимальный размер сообщений WebClient. По умолчанию 512 KB.
spring:
codec:
max-in-memory-size: 512KB
Интеграция с внешними системами#
Настройка асинхронного взаимодействия с внешними системами#
Публикуемые события:
Завершение задачи
Прерывание задачи
Принимаемые события:
Создание задачи
Прерывание задачи
Настройки включения асинхронного взаимодействия:
enabled— включение или выключение асинхронного взаимодействия;format— формат событий (cloud-events-spec);userTaskInboundEventsTopic— топик входящих событий по пользовательской задачи;userTaskOutboundEventsTopic— топик исходящих событий по пользовательской задачи;acceptedModuleIds— фильтрация сообщений по header 'moduleId', работает при наличии этого параметра;kafka:bootstrap-servers— адрес Kafka брокера;client-id— префикс клиента Kafka. Строка идентификатора, передаваемая на сервер при выполнении запросов:properties.reconnect.backoff.ms— базовое время ожидания перед попыткой повторного подключения к узлу;template.default-topic: EventsTaskList— топик по умолчанию;producer:retries— количество попыток повторной отправки в случае ошибки;key-serializer: org.apache.kafka.common.serialization.StringSerializer— класс сериализатора для ключа;value-serializer: org.apache.kafka.common.serialization.StringSerializer— класс сериализатора для значения.
consumer:groupId— id группы потребителя;auto-offset-reset— стратегия установки смещения курсора для чтения сообщения из topic;propertiesmax.poll.interval.ms— максимальная задержка между запросами к брокеру;session.timeout.ms— ttl сессии.
transport:
enabled: true
format: cloud-events-spec
userTaskInboundEventsTopic: toHtmUserTaskEvents
userTaskOutboundEventsTopic: fromHtmUserTaskEvents
acceptedModuleIds:
- bpmx
kafka:
bootstrap-servers: localhost:9092
client-id: @project.name@
properties.reconnect.backoff.ms: 10000
template.default-topic: EventsTaskList
producer:
retries: 0
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
groupId: htm_main
auto-offset-reset: earliest
properties:
'max.poll.interval.ms': 35000
'session.timeout.ms': 30000
Настройка Prometheus/Объединенный мониторинг Unimon (MONA) Platform V Monitor (OPM)#
Метрики по стандарту prometheus выставляются приложением. Для подключения компонента Объединенный мониторинг Unimon (MONA) продукта Platform V Monitor (OPM) требуется указание дополнительных аннотаций в service htm-app:
prometheus.io.path |
/actuator/prometheus |
|---|---|
prometheus.io.port |
8086 |
prometheus.io.scrape |
true |
Настройка интеграции с компонентом Прикладной журнал (APLJ) Platform V Backend (опционально)#
Для обеспечения возможности проведения технологических работ с БД без недоступности системы используется механизм функционального StandIn. Данный механизм предполагает наличие двух контуров БД (master и StandIn) и один набор отсеков (pods) htm-app и htm-app-replica, подключенных к обоим контурам БД. Master контур используется как основной, StandIn контур – как резервный. Компонент UTSK осуществляет логическую репликацию данных между контурами БД, используя внешний сервис – компонент Прикладной журнал (APLJ) продукта Platform V Backend (#BD), далее – ПЖ.
Для работы приложения UTSK в режиме StandIn необходимо настроить параметры подключения к БД для обоих экземпляров (htm-app и htm-app-replica) следующим образом:
standin:
enabled: true
serializerType: json_gson
cloud:
client:
stub: false
zoneId: test
mmt-proxy-url: localhost
kafka.bootstrapServers: localhost
kafka.producerConfig.max.request.size=5242880
datasource:
username: htm-admin
driver: org.postgresql.Driver
jdbc-url: jdbc:postgresql://localhost:6544/bdpprb?prepareThreshold=0
jpa:
show-sql: false
hibernate.dll-auto: validate
properties.hibernate.dialect: org.hibernate.dialect.PostgreSQL95Dialect
liquibase:
enabled: true
Интеграция с компонентом Аудит (AUDT) Platform V Audit SE (AUD)#
В связи с требованиями безопасности рекомендуется осуществлять передачу информации о произведенных действиях в компонент Аудит (AUDT) Platform V Audit SE (AUD).
Журнал регистрации событий, отправляемых в компонент Аудит, хранится в Аудит (AUDT) продукта Platform V Audit SE (AUD).
Для настройки отправки сообщений в компонент AUDT необходимо в файле application.yml в блоке audit определить следующие переменные:
enabled— включение/выключение Аудита;multitenant— режим работы Аудита: false – обычный, true – мультитенантный;proxyUri— адрес сервиса платформенного Аудита;proxyVersion— версия протокола взаимодействия;eventMode— тип передачи данных в Аудит: Быстрый/Надежный (Speed/Reliability). По умолчанию Reliability;nodeId— имя namespace, в который устанавливается модуль, для передачи в Аудит (ex. hostname);retryTimeout— время ожидания перед повторной отправкой сообщения (мс). По умолчанию 60000;maxQueueSize— максимальный размер сообщений в очереди на отправку в Аудит. По умолчанию 100;timeout:connection-request— время ожидания подключения к сервису;connect— время ожидания соединения;read— время ожидания чтения сокета.
Пример:
audit:
enabled: true
multitenant: false
proxyUri: http://localhost:9321/audit
proxyVersion: v1
nodeId: utsk.htm-app
retryTimeout: 60000
maxQueueSize: 100
timeout:
connection-request: 5000
connect: 10000
read: 30000
Взаимодействие производится через Rest API.
Интеграция с компонентом Журналирование (LOGA) Platform V Monitor (OPM)#
Настройка компонента LOGA осуществляется в sidecar-контейнере сервиса журналирования.
serviceHostname— настройки хоста sidecar сервиса LOGA;image— образ sidecar сервиса LOGA;cluster— имя кластера для поля в сервисе LOGA;zoneId— идентификатор зоны для отправки событий;events— адрес отправки событий LOGA.
Для отправки событий журнала в компонент LOGA sidecar-контейнер должен быть подключен к тому же каталогу, что обеспечит ему возможность чтения и обработки событий.
Для корректного разбора событий необходимо, чтобы формат событий соответствовал шаблону разбора fluent-bit. Формат событий описан в xml-файле конфигурации для библиотеки logback-spring.xml.
Для режима multiinstance файл logback-spring.xml содержит дополнительные атрибуты:
RN – идентификатор ресурса (тип строка) – содержится в конфигурации экземпляра;
CN из сертификата потребителя (тип строка) – содержится в конфигурации экземпляра;
traceId – идентификатор трейса, с которым связана лог-запись (тип строка), получение из заголовка x-b3-traceid.
Рекомендации по использованию механизмов безопасности#
В рамках выполнения требований безопасной работы системы рекомендуется:
Предоставлять доступ к администрированию только сотрудникам, которым он необходим в соответствии с их должностными обязанностями.
Разделять среды разработки, тестирования и эксплуатации.
Администраторам системы осуществлять контроль использования средств защиты информации.
Использовать компоненты аутентификации, авторизации и аудита в качестве внешних средств защиты.
Настройка подключения OTT#
Компонент UTSK может быть развернут как с возможностью интеграции с сервисом OTT, так и без нее.
Подключение OTT производится в виде sidecar-контейнера dc Ingress. Конфигурация хранится в отельной ConfigMap.
Настройки, необходимые для подключения, описаны в документации на (OTTS) One-Time Password (OTP)/OTT Platform V Backend.
Для получения сертификатов приложения, публичного ключа OTT Service и их подключения:
при помощи keytool сгенерируйте
key-storec ключами с помощью алгоритма SHA256withECDSA, длина ключа 256 бит;отправьте файл с расширением .pem администратору OTT в заявке на генерацию сертификата для модуля. В заявке явно указать, что сертификат должен быть сгенерирован из приложенного запроса по инструкции. Администратор OTT подписывает/генерирует ключи, высылает их обратно;
импортируйте полученные от администратора OTT ключи в
key-storeв формате p12.Создайте два секрета:
с сертификатами;
с паролями к ключам.
Для работы OTT-sidecar необходимо наличие в дистрибутиве ConfigMap с настройками сервиса. Создание ConfigMap выполняется на этапе установки сервиса.
Настройка подключения Istio#
Подключение Istio осуществляется в соответствии с документацией на него.
Выпуск и установка сертификатов Istio для Ingress/Egress
Выпустите и установите сертификаты Istio Ingress/Egress:
istio-egressgateway-ca-certs;istio-egressgateway-certs;istio-ingressgateway-ca-certs;istio-ingressgateway-certs.
После чего будет создан набор необходимых артефактов, в том числе секреты с сертификатами cert, ca-cert.
Созданные секреты содержат, в том числе, наименования файлов tls.crt, tls.key, ca-chain.cert.pem.
В секретах istio-ingressgateway-ca-certs и istio-egressgateway-ca-certs должен присутствовать один файл ca-chain.cert.pem со всей цепочкой сертификатов. Если в секрете указаны два отдельных сертификата, то вызовы через Ingress по HTTP(S) не будут работать.
Возможен вариант, когда в секретах в файле ca-chain.cert.pem содержится вся цепочка сертификатов (т.е. добавлено содержимое из ca.pem), но сам файл ca.pem не удален. В этом случае все будет работать корректно.
Осуществление межсервисной аутентификации при входящем и исходящем запросе#
Запрос от клиента попадает на входящий граничный прокси (IGEG) Synapse Service Mesh.
После прохождения handshake устанавливается защищенное mTLS соединение (серверные сертификаты монтируются к граничному прокси (IGEG) Synapse Service Mesh). Если включена поддержка фильтров валидации входящих сообщений, происходит проверка совпадения информации из клиентского сертификата с содержимым фильтра валидации.
При совпадении – запрос проходит дальше, при несовпадении клиенту возвращается ошибка 403. Далее sidecar ОТТ проверяет валидность входящего запроса по информации из заголовков ОТТ.
Также возможна проверка разрешения через механизм ACL со стороны сервера ОТТ. Если все вышеозначенные требования удовлетворены – запрос маршрутизируется на pod приложения.
При исходящем запросе происходит маршрутизация на исходящий граничный прокси (IGEG) Synapse Service Mesh. Через sidecar ОТТ запрос подписывается ОТТ-токеном, после чего данные заголовки добавляются к запросу.
Также граничный прокси (IGEG) Synapse Service Mesh добавляет к запросу необходимые сертификаты для установки защищенного соединения по mTLS.
Настройки, связанные с использованием сервисов OTT, Synapse Service Mesh, описаны в документации на данные сервисы.
События системного журнала#
Все события, собираемые приложением во время работы, публикуются в компоненте Журналирование (LOGA) продукта Platform V Monitor (OPM), далее по тексту – компонент Журналирование.
События регистрируются в формате json.
Настройки интеграции с компонентом описаны в разделе «Интеграция с компонентом Журналирование (LOGA) Platform V Monitor (OPM)». Журнал регистрации событий располагается в АРМ сервиса Журналирование (LOGA) продукта Platform V Monitor (OPM). Адрес сервиса Журналирования необходимо уточнять у администраторов сред.
Регистрируются события уровней:
TRACE – менее приоритетные записи (logs) для отладки, с наименьшим уровнем логирования. На уровень попадает:
Расширенная информация об этапах выполнения всех запросов к приложению. Включает в себя логи уровня ERROR, WARN, INFO, DEBUG.
DEBUG – записи (logs), необходимые для отладки приложения. Для уверенности в том, что система делает именно то, что от нее ожидают, или описания действия системы. На уровень попадает:
Информация об этапах выполнения всех запросов к приложению (от информации о пользователе и параметрах запроса до результатов выполнения запроса). Включает в себя лог-записи уровня ERROR, WARN, INFO.
INFO – записи (logs), которые содержат важные действия в приложении. Это не ошибки, это не предостережение, это ожидаемые действия системы. На уровень попадает:
Информация о включении сервисов, блокировки связанные с индексами. Включает в себя логи уровня ERROR, WARN.
WARN – записи (logs), которые содержат предостережение. Произошло неожиданное действие, несмотря на это система устояла и выполнила запрос. На уровень попадает:
Информация об ошибках возникающих при некорректных запросах к приложению (например: ошибки отсутствия callback). Включает в себя лог-записи уровня ERROR.
ERROR – уровень ошибок, когда есть проблемы, которые нужно решить. Ошибка не останавливает работу приложения в целом. Остальные запросы могут работать корректно. На уровень попадает:
Информация о всех ошибках приложения (например: bad request, ошибка отправки span в сервис трейсинга (tracing), ошибка оправки события в аудит, ошибки Kafka и т.д.).
Изменение корневого уровня логирования доступно через настройку logging.level.root. По умолчанию включен уровень INFO. Для изменения уровня логирования конкретной группы лог-записей, добавьте соответствующую строчку в параметры конфигурации.
Доступные для изменения уровня логирования группы:
app— верхний уровень логов приложения;system— группа системных лог-записей jdk;server— лог-записи Catalina, Coyote, Tomcat;spring— лог-записи Spring Framework;hibernate— лог-записи Hibernate;sql— лог-записи SQL;elasticsearch— лог-записи elasticsearch;template— группа лог-записей по функциональности работы с шаблонами задач;task— группа лог-записей по функциональности работы с задачами;group— группа лог-записей по функциональности динамических групп;user— группа лог-записей по функциональности получения пользователей;stats— группа лог-записей по функциональности статистики;audit— лог-записи по функциональности отправки событий в компонент AUDT;monitoring— логи по функционалу отправки событий в Kafka бизнес-мониторинга;transport— лог-записи по функциональности асинхронного взаимодействия с внешними системами;tracing— логи по функционалу отправки span в Сервис трассировки (TRAS) ;metrics— лог-записи по функциональности метрик;index— лог-записи по функциональности индексации задач;filter— лог-записи по фильтрации API запросов.
Пример:
logging:
level:
root: INFO
task: DEBUG
group: ERROR
События уровней Trace и Debug не рекомендуется включать в ПРОМ среде.
Пример перечня событий:
Уровень |
Текст/шаблон сообщения |
Перевод |
|---|---|---|
ERROR |
You can only delete an aborted task. Task id: '{}', status: '{}' |
Вы можете удалить прерванную задачу. Задача с идентификатором: {} имеет статус: {} |
ERROR |
Task id: '{}' has no json form |
Задача с идентификатором: {} не имеет JSON формы |
ERROR |
Unable to create a task template with an empty or missing owner role. User roles: '{}', template owner role: '{}' |
Невозможно создать шаблон задачи с пустой или отсутствующей ролью владельца. Роль пользователя: {}, роль владельца шаблона: {} |
WARN |
Task already aborted. Task id: '{}', user context: '{}' |
Задача уже прервана. Задача с идентификатором: {}, контекст: {} |
WARN |
Created callback not used |
Созданный callback не используется |
DEBUG |
Metrics of statuses '{}' tasks are increment. TemplateId: '{}', success: '{}', result: '{}' |
Метрика задач в статусе {} увеличена. TemplateId: '{}', success: '{}', result: '{}' |
DEBUG |
Checking attributes of template successful. Template: '{}' |
Проверка атрибутов шаблона прошла успешно. Шаблон: {} |
TRACE |
Sending a monitoring message about the aborted. CallerId: {}, UserTaskId: {}, TaskTemplateId: {}, ResourceName: {} |
Отправка сообщения мониторинга о прерывании. CallerId: {}, UserTaskId: {}, TaskTemplateId: {}, ResourceName: {} |
События мониторинга#
Приложение UTSK публикует метрики в формате prometheus.
Список метрик доступен администраторам среды контейниризации по URL приложения taskList – http://{tasklist-url}/actuator/metrics (доступны в формате prometheus ../actuator/prometheus).
Для сбора метрик возможно использование компонента Объединенный мониторинг Unimon (MONA) продукта Platform V Monitor (OPM). Предварительно необходимо создать подключение к компоненту MONA. Настройки интеграции с компонентом описаны в разделе «Настройка Prometheus/Объединенный мониторинг Unimon (MONA) Platform V Monitor (OPM)».
Метрики, публикуемые приложением UTSK, можно разделить на следующие типы:
Метрика готовности приложения UTSK;
Метрики JVM (Java Virtual Machine);
Метрики состояния БД;
Метрики состояния сервиса индексирования;
Метрики состояния Kafka клиента;
Метрики состояния интеграции с внешними сервисами;
Метрики состояния компонентов SpringBoot-приложения;
Метрики HTTP клиента;
Бизнес метрики приложения UTSK;
Метрики событий журналирования.
Метрика готовности приложения UTSK#
application_ready_time_seconds — Время, необходимое (мс) для того, чтобы приложение было готово к обслуживанию запросов.
Метрики JVM (Java Virtual Machine)#
Включают основные метрики JVM (утилизация CPU, загруженность диска, используемая память и др.):
jvm_memory_committed_bytes— объем памяти в байтах, выделенный для использования JVM;jvm_memory_max_bytes— максимальный объем памяти в байтах, который можно использовать для управления памятью;jvm_memory_used_bytes— объем памяти, используемой JVM;jvm_gc_pause_seconds_count— пауза работы сборщика мусора (garbage collector) в секундах;jvm_gc_pause_seconds_sum— суммарное время пауз работы сборщика мусора (garbage collector) в секундах;jvm_gc_pause_seconds_max— максимальное время сборщика мусора (garbage collector) в паузе в секундах;jvm_threads_live_threads— текущее количество активных потоков, включая демон-потоки;jvm_threads_daemon_threads— текущее количество активных демон-потоков;jvm_threads_peak_threads— максимальное количество активных потоков, зарегистрированное с момента запуска JVM или с момента последнего сброса данного значения;process_files_open_files— количество открытых файловых дескрипторов;process_files_max_files— максимальное количество файловых дескрипторов;process_start_time_seconds— время начала процесса, в секундах, по системе UNIX Epoch;process_cpu_usage— процент использования процессора за недавнее время процессом JVM;system_cpu_count— количество процессоров, доступных для виртуальной машины Java;system_cpu_usage— «Недавнее использование CPU» системы, в которой запущено приложение;disk_free_bytes— количество байтов, свободных на диске;disk_total_bytes— общее количество байт на диске.
Метрики состояния БД#
Включают основные метрики состояния БД HikariCP (утилизации дискового пространства базой данных и др.):
hikaricp_connections_usage_seconds_max— максимальное время использования соединения;hikaricp_connections_usage_seconds_sum— суммарное время использования соединения;hikaricp_connections_usage_seconds_count— время использования соединения;hikaricp_connections_acquire_seconds_max— максимальное время установления соединения;hikaricp_connections_acquire_seconds_sum— суммарное время установления соединения;hikaricp_connections_acquire_seconds_count— время установления соединения;hikaricp_connections_creation_seconds_max— максимальное время создания соединения;hikaricp_connections_creation_seconds_sum— суммарное время создания соединения;hikaricp_connections_creation_seconds_count— время создания соединения;hikaricp_connections— общее количество соединений;hikaricp_connections_max— максимальное количество подключений;hikaricp_connections_min— минимальное количество соединений;hikaricp_connections_active— активные подключения;hikaricp_connections_pending— ожидание соединения;hikaricp_connections_timeout_total— общее количество тайм-аутов (время ожидания) подключения;hikaricp_connections_idle— неработающие соединения;hikaricp_connections_active— активные подключения.
Включают основные метрики jdbc (текущие активные, максимально допустимые и минимально разрешенные соединения в pool):
jdbc_connections_max— максимальное количество активных подключений, которые могут быть выделены одновременно;jdbc_connections_min— минимальное количество незанятых подключений в pool;jdbc_connections_idle— количество установленных, но неработающих соединений;jdbc_connections_active— текущее количество активных подключений, выделенных из источника данных.
Метрики состояния сервиса индексирования#
index_sync_status— метрика, отображающая статус синхронизации с сервисом индексирования: 0 – бездействует; 1 – в работе; 2 – завершена; -1 – ошибка;index_sync_total— общее количество проиндексированных задач;index_sync_successful— количество успешно индексированных задач;index_sync_errors— количество неудачных попыток индексирования задач;index_sync_deleted— количество удаленных из индекса задач.
Метрики состояния Kafka клиента#
Метрики состояния Kafka клиента бизнес-мониторинга:
events_availability— метрика, отображающая состояние клиента: 0 – не инициализирован, 1 – доступен, -1 (минус 1) – не доступен;events_total— общее количество сообщений;events_successful_total— количество успешно отправленных сообщений;events_failure_total— количество неудачных попыток отправки сообщений.
Метрики состояния Kafka клиента асинхронного взаимодействия с внешними системами:
transport_availability— метрика, отображающая состояние клиента: 0 – не инициализирован, 1 – доступен, -1 (минус 1) – не доступен;transport_total— общее количество сообщений;transport_successful_total— количество успешно отправленных сообщений;transport_failure_total— количество неудачных попыток отправки сообщений.
Метрики брокера Kafka:
kafka_producer_— группа метрик брокера Kafka (глобальные метрики запросов, метрики подключения, показатели брокера, метрики топиков).
Метрики состояния интеграции с внешними сервисами#
Метрики состояния интеграции с компонентом AUDT
audit_availability— метрика, отображающая состояние клиента: 0 – не инициализирован, 1 – ошибка отправки, 2 – асинхронная отправка, 3 – синхронная отправка;audit_errors_connection_total— количество неудачных попыток подключения к серверу;audit_errors_service_total— количество незарегистрированных событий аудита;audit_total— общее количество событий;audit_successful_total— количество успешно отправленных событий.
Метрики состояния интеграции с системой Трейсинга (Tracing)
tracing_availability— метрика, отображающая состояние клиента: 0 – не инициализирован, 1 – доступен, -1 (минус 1) – не доступен;tracing_total— количество сгенерированных span попавших в очередь;tracing_request_successful— количество успешных попыток отправки запросов в систему Трейсинга;tracing_request_failure— количество неуспешных попыток отправки запросов в систему Трейсинга;tracing_message_sent— количество успешно отправленных Span;tracing_message_dropped— количество просроченных Span – сообщения удаленные из очереди по причине переполнения буфера.
Метрики состояния компонентов SpringBoot-приложения#
tomcat_sessions_expired_sessions_total— общее количество закончившихся по тайм-ауту подключений Tomcat;tomcat_sessions_created_sessions_total— общее количество созданных подключений Tomcat;tomcat_sessions_active_max_sessions— максимальное количество подключений Tomcat, с момента старта JVM, либо с момента последнего сброса значения данной метрики;tomcat_sessions_rejected_sessions_total— общее количество подключений Tomcat, которые не были приняты;tomcat_sessions_active_current_sessions— количество подключений Tomcat, активных на данный момент;tomcat_sessions_alive_max_seconds— максимальная продолжительность жизни подключения Tomcat, в секундах.
Метрики HTTP клиента#
Включают основные метрики сетевых запросов Reactor Netty:
reactor_netty_http_client_data_sent_time_seconds_max— максимально допустимое время отправки данных во внешние сервисы;reactor_netty_http_client_data_sent_time_seconds_count— количество отправок данных во внешние сервисы;reactor_netty_http_client_data_sent_time_seconds_sum— время на отправку данных во внешние сервисы. Для получения среднего времени отправки данных, необходимо разделить значение reactor_netty_http_client_data_sent_time_seconds_sum на reactor_netty_http_client_data_sent_time_seconds_count;reactor_netty_http_client_data_received_bytes_max— максимально допустимый объем полученных данных в байтах;reactor_netty_http_client_data_received_bytes_count— количество полученных данных в байтах;reactor_netty_http_client_data_received_bytes_sum— объем полученных данных в байтах;reactor_netty_http_client_data_received_time_seconds_max— максимально допустимое время получения данных из внешних сервисов;reactor_netty_http_client_data_received_time_seconds_count— количество получений данных из внешних сервисов;reactor_netty_http_client_data_received_time_seconds_sum— время получения данных из внешних сервисов. Для получения среднего времени отправки данных, необходимо разделить значение reactor_netty_http_client_data_received_time_seconds_sum на reactor_netty_http_client_data_received_time_seconds_count;reactor_netty_http_client_response_time_seconds_max— максимально допустимое время обработки запроса;reactor_netty_http_client_response_time_seconds_count— количество обработок запроса;reactor_netty_http_client_response_time_seconds_sum— время обработки запроса. Для получения среднего времени обработки запроса, необходимо разделить reactor_netty_http_client_response_time_seconds_sum на reactor_netty_http_client_response_time_seconds_count;reactor_netty_http_client_connect_time_seconds_max— максимально допустимый объем отправленных данных в байтах;reactor_netty_http_client_connect_time_seconds_count— количество отправок данных;reactor_netty_http_client_connect_time_seconds_sum— объем отправленных данных в байтах;reactor_netty_http_client_data_sent_bytes_max— количество успешно обработанных соединений, которые активно используются;reactor_netty_http_client_data_sent_bytes_count— количество отправок данных;reactor_netty_http_client_data_sent_bytes_sum— объем отправленных данных в байтах;reactor_netty_connection_provider_active_connections— количество успешно обработанных соединений, которые активно используются;reactor_netty_connection_provider_max_pending_connections— максимальное количество запросов, которые будут поставлены в очередь в ожидании готового соединения;reactor_netty_connection_provider_total_connections— количество всех подключений, активных или неактивных;reactor_netty_connection_provider_idle_connections— количество незанятых соединений;reactor_netty_connection_provider_pending_connections— количество запросов, ожидающих установления соединения.
Метрики загрузки executor сервера API:
executor_pool_max_threads— максимально допустимое количество потоков в pool;executor_pool_size— текущее количество потоков в pool;executor_active_threads— приблизительное количество потоков, активно выполняющих задачи;executor_completed_tasks_total— примерное общее количество задач, завершивших выполнение;executor_queued_tasks— примерное количество задач, поставленных в очередь на выполнение;executor_queue_remaining_tasks— количество дополнительных элементов, которые очередь может принять без блокировки.
Метрики длительности обработки запросов HTTP-сервера:
http_server_requests_seconds_max— максимальное время обработки входящих запросов;http_server_requests_seconds_sum— время обработки входящих запросов. Разделив данное значение на http_server_requests_seconds_count, получим среднее время выполнения запроса;http_server_requests_seconds_count— количество входящих запросов.
Метрики обработки запросов HTTP-сервера так же публикуются с разбиением по типам исполняющихся запросов:
htm_task_templates_seconds- операций с шаблонами пользовательских задач;htm_templates_seconds- операций с шаблонами пользовательских задач по коду и версии;htm_user_tasks_seconds- операций с пользовательскими задачами;htm_v2_tasks_seconds- операций с пользовательскими задачами API v2;htm_groups_seconds- операций с динамическими группами;htm_marketplaces_seconds- операций с маркетплейс;htm_appinfo_seconds- запросы получения информации о системе.
Бизнес метрики приложения UTSK#
utsk_tasks_status_total — количество операций изменений статусов задач. По метрике публикуются следующие лейблы:
businessFamily— businessFamily в рамках которой создана задача;operation— тип операции (CREATE, ASSIGN, START, COMPLETE, ABORT);result— результат операции;success— флаг успешности выполнения операции.
Метрики событий журналирования#
logback_events_total— количество событий журналирования по типам (trace, debug, info, warn, error).
Публикация метрик в режиме мультиинстанс#
В режиме «мультиинстанс» метрики отвечающие за работу приложения дополнены:
rn – соответствует resourceName потребителя.
Предварительно потребитель должен создать подключение к компоненту MONA, используя соответствующий resourceName.
Часто встречающиеся проблемы и пути их устранения#
Общие рекомендации#
Алгоритм для диагностирования и решения проблем с внешними интеграциями:
Проанализируйте журнал UTSK на наличие ошибок/успешных запросов.
Проанализируйте журнал Istio Proxy в pod сервиса на наличие ошибок/успешных запросов.
Проанализируйте журнал Egress Gateway на наличие ошибок/успешных запросов.
Проанализируйте журнал OTT Sidecar на Egress на наличие ошибок/успешных запросов.
Проблема после изменения ограничение размера description#
Проблема:
После изменения ограничения размера параметра description на 10000 символов, в случае если у задачи в поле description хранится более 10000 символов - все операции с данной задачей (назначение, завершение, изменение, и тд.) будут возвращать ошибку.
Решение:
Для проблемных задач выполнить запрос обрезания размера description. Пример запроса:
UPDATE user_tasks
SET description = substring(description, 0, 10000)
Часто встречающиеся ошибки в лог-файлах#
Ошибка:
Bad request exception: Невозможно обновить завершенную задачу.
Access denied: Нельзя стартовать завершенную задачу.
Решение:
Задача находится в конечном статусе (COMPLETED, ABORTED). Через API UTSK из конечного статуса задачу перевести нельзя.