Отслеживание асинхронных запросов¶
Список асинхронных запросов¶
Список всех или отобранных по фильтру запросов.
Информация о запросах старше двух месяцев регулярно автоматически удаляется из системы.
Информация о запросах issue.send/personal хранится ещё меньше - два дня.
По умолчанию, не выдаются запросы issue.send/personal. Для их получения явно указывайте action = "issue.send/personal".
{
"action" : "track.list"
-- параметры фильтрации, должен быть хотя бы один параметр
--
-- если выбрана последняя порция списка, то ответ содержит "last_page" : 1
--
-- доступны поля
--
-- track.id -- "идентификатор трека"
-- track.host -- "хост последнего изменения"
-- track.pid -- "процесс последнего изменения"
-- track.login -- "автор запроса, строковое значение"
-- track.dt -- "дата создания (Ys)"
-- track.cron.id -- "номер действия по расписанию, при выполнении действия которого появился этот трекер" (null)
-- track.request -- "код запроса"
-- track.action -- "название запроса, соответствующее коду request"
-- track.dt_status -- "дата установки статуса (Ys)"
-- track.status -- "код статуса: -2 - закончился с ошибкой; -1 - закончился без ошибок; 0 - принят; -- остальное зависит от вызова"
-- track.error -- "код ошибки завершения (строковый)"
-- track.letter -- "номер письма"
-- track.email -- "адрес эл. почты"
-- track.objid -- "некий id объекта которые может обрабатываться/генерироваться запросом"
-- track.info -- "дополнительная информация, переданная в вызове, создавшем трекер через параметр track.info"
-- track.reltype -- число
-- track.relref -- число
,"filter" : [ фильтр в синтаксисе stat.uni ]
,"order" : [ сортировка ответа в синтаксисе stat.uni ]
,"skip" : количество пропускаемых записей от начала списка -- по умолчанию 0
,"first" : количество выбираемых записей после skip -- по умолчанию 50, не более 50
}
ответ:
{
<общие поля>
"list" : [
{
объект как track.get
для issue.send отсутствует letter->message по сравнению с track.get
}
.........
]
}
Состояние асинхронного запроса¶
ответ
{
obj : {
"id" : номер трекера
,"dt" : дата-время создания (YYYY-MM-DD hh:mm:ss)
,"action" : -- тип запроса
"issue.send"
"issue.send/personal"
"stat.uni"
"member.list"
"member.list.count"
"member.import"
"member.sendconfirm"
"member.update"
"member.delete"
"member/activate"
"issue.split.create"
"stoplist.add"
"stoplist.delete"
"stoplist.erase"
"sequence.member.start"
"sequence.member.pause"
"sequence.member.resume"
"sequence.member.stop"
"email.test"
"email.cleanerror"
"cron/run"
"sys.message"
,"status" : состояние запроса
-- -7 - действие приостановлено
-- -6 - действие не прошло модерацию
-- -5 - действие на премодерации
-- -4 - отложенное действие (например, отложенный выпуск рассылки)
-- -3 - отменён
-- -2 - закончился ошибкой
-- -1 - закончился успешно
-- 0 - принят
-- 1 - запущен
-- 2 - начата обработка
-- 3 - сортировка
-- 4 - форматирование
-- 5 - генерация отчёта
-- 6 - антиспам проверка
-- остальное - зависит от типа запроса
,"status.dt" : дата-время установки текущего состояния (YYYY-MM-DD hh:mm:ss)
,"cron.id" : номер действия по расписанию, при выполнении действия которого появился этот трекер (null)
,"error" : код ошибки -- не обязательно
-- смысл зависит от типа запроса
,"track.info" : "строка" -- дополнительная информация, переданная в вызове, создавшем трекер через параметр track.info. 1024 байта (null)
,reltype" : ...
,relref" : ...
-- дополнительные параметры в зависимости от запроса и его состояния
,"param" : {
-- === issue.send ===
-- === issue.send/personal ===
,"group.id" : "код группы"
,"group.name" : "название группы"
,"api.request" : { ... } -- оригинальный запрос на рассылку. для personal - не запоминается. для всех - без attaches. для masssending и без users.list.
,"api.request.id" : "........" -- оригинальный номер запроса на рассылку. для personal - не запоминается.
-- характеристики выпуска, если они уже известны
,"issue.id" : номер выпуска
,"issue.dt" : время начала выпуска
,"issue.size" : количество sms для sms или примерный размер сообщения в байтах для других
,"issue.members" : количество получателей, для которых уже сформированы письма
,"issue.format" : "email" , "sms" , "viber", "push", "vk", "tg" ,"vknotify" ,"pushapp" ,"max"
,"issue.name" : "название выпуска"
,"issue.split.id" : "номер сплит-тестирования, если это его выпуск"
,"issue.split.variant" : "номер варианта сплит тестирования"
,"issue.split.winner" : "выпуск - победитель в сплит тестировании"
-- в состоянии "начата обработка" примерная информация о достигнутом прогрессе
,"eta" : {
"rest" : примерное количество секунд до окончания
,"perc" : примерный процент обработки
,"dt.finished" : примерное дата-время окончания
,"dt.updated : дата-время последнего обновления информации eta
}
-- информация о номере письма для Транзакционных писем после завершения работы
,"letter" : номер письма -- пусто, если адресу не было отправлено письмо (например, подписчик отписался или какие-то ошибки выпуска)
,"email" : адрес получателя
,"error" : ошибка обработки если была
,"error.info" : дополнительная информация произвольной структуры об ошибке обработки
-- отчёт и статистика после завершения работы для Экспресс-выпуска
,"report_file" : "название файла" -- название файла с отчётом для использования в вызове rfs.file.get
-- отчёт формируется, если в выпуске были адреса с ошибкой обработки
-- название предсказуемо masssending/<НОМЕРВЫПУСКА>.zip, в котором содержится файл НОМЕРВЫПУСКА.csv
,"statistic" : {
"total" : всего строк
,"taked" : верных строк
,"erroneous" : строк с ошибками
,"repeated" : повторов адресов
,"only_unique" : 0|1 -- был ли выпуск запущен с запретом повторной
-- рассылки по дублирующимся адресам
}
-- === stat.uni ===
"report_file" : "название файла" -- пусто до окончания запроса
-- после окончания - название файла с отчётом для вызова rfs.file.get
-- или пусто, если заказывалась высылка на почту
,"api.request" : { ... } -- запрос, для которого появился трекер
,"api.request.id" : "........" -- номер запроса, для которого появился трекер
-- === member.list ===
"group.id" : "код группы" -- пусто, если считалось без указания группы,
-- иначе код группы, указанной для расчёта
,"group.name" : "название группы"
,"filter" : [ фильтр использованной группы или параметр group.filter ] -- если считалось по группе или по явно указанному фильтру
,"report_file" : "название файла"
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
-- === member.list.count ===
"group.id" : "код группы" -- пусто, если считалось без указания группы,
-- иначе код группы, указанной для расчёта
,"group.name" : "название группы"
,"filter" : [ фильтр использованной группы ] -- если считалось по группе
,"statistic" : { копия результата расчёта как в ответе вызова }
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
-- === member.import ===
"group.id" : "код группы" -- пусто, если при импорте не указывалось автосоздание новой
-- или заполнение существующей группы, иначе код автосозданной
-- существующей группы
,"group.name" : "название группы"
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
-- отчёты и статистика после завершения работы
,"report_file" : "название файла" -- файл в формате xlsx с отчётом в хранилище отчётов, если были ошибки
-- первые 1000 ошибок для просмотра человеком
,"report_file.json" : "название файла" -- файл в формате json запакованный zip с отчётом в хранилище отчётов если были ошибки
-- все ошибки в машиноразбираемом виде
,"report_file.csv" : "название файла" -- файл в формате csv запакованный zip с отчётом в хранилище отчётов если были ошибки
-- все ошибки в машиноразбираемом виде
,"statistic" : {
"inserted" : добавлено новых адресов
,"updated" : обновлено адресов
,"economed" : без изменений (вносимые данные совпали с имеющимися)
,"erroneous" : строк с ошибками
,"unconfirmed" : новых адресов внесённых без необходимости подтверждения
,"needconfirm" : новых адресов внесённых с необходимостью подтверждения
,"repeated" : повторов адресов
,"ignored" - : игнорировано из-за if_exists : ignore
,"listadd" : адреса, добавленные в группу импорта
,"datarows" : строк с данными (т.е. строк которые было было попробовано импортировать)
,"upserted" : inserted + updated
,"uniqs" : количество уникальных идентификаторов в импорте
}
,"api.request" : { ... } -- запрос, для которого появился трекер
,"api.request.id" : "........" -- номер запроса, для которого появился трекер
-- === member/activate ===
"group.id" : "код группы" -- код активируемой группы
,"group.name" : "название группы"
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
-- статистика после завершения работы
,"statistic" : {
"done : активировано адресов
,"notneed" : для какого количества адресов не требовалась активация
,"overlimit" : не активировано адресов из-за исчерпания лимита
}
-- === email.test ===
"group.id" : "код группы" -- пусто, если считалось без указания группы,
-- иначе код группы, указанной для расчёта
,"group.name" : "название группы"
,"report_file" : "название файла"
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
,"records" : число -- количество обработанных записей
,"method": "group | list | filter | url |stat.uni"
-- для filter
,"filter" : [ filter из запроса ]
-- для url
,"url" : "url из запроса"
-- для stat.uni
,"query" : [ query из запроса ]
-- === group.snapshot ===
"group.id" : "код исходной группы" -- пусто, если считается без указания группы,
-- иначе код группы, указанной для расчёта
,"group.name" : "название исходной группы"
"togroup.id" : "код получающей группы"
,"togroup.name" : "название получающей группы"
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
,"records" : число -- количество обработанных записей
,"method": "group | list | filter | url |stat.uni"
-- для filter
,"filter" : [ filter из запроса ]
-- для url
,"url" : "url из запроса"
-- для stat.uni
,"query" : [ query из запроса ]
-- === member.sendconfirm ===
-- === member.update ===
-- === member.delete ===
-- === stoplist.add ===
-- === stoplist.delete ===
-- === stoplist.erase ===
-- === group.clean ===
-- === sequence.member.start ===
-- === sequence.member.pause ===
-- === sequence.member.resume ===
-- === sequence.member.stop ===
-- === email.cleanerror ===
"group.id" : "код группы" -- пусто, если считается без указания группы,
-- иначе код группы, указанной для расчёта
,"group.name" : "название группы"
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
,"records" : число -- количество обработанных записей
,"method": "group | list | filter | url |stat.uni"
-- для filter
,"filter" : [ filter из запроса ]
-- для url
,"url" : "url из запроса"
-- для stat.uni
,"query" : [ query из запроса ]
-- === issue.split.create ===
-- отслеживается не "создание" (как формально следует из названия),
-- а процесс формирования списка получателей и назначения им того или иного варианта,
-- соответственно, трекер отслеживает тестирование в состояние "подготавливается к запуску"
"split.id" : "номер сплит-тестирования"
,"eta" : { в состоянии "начата обработка" примерная информация о достигнутом прогрессе }
-- === cron/run ===
"cron.id" : "номер крона"
"cron.name" : "название крона"
"errors" : "количество ошибочных запусков подряд"
"result" : { -- последний ответ api c ошибкой, полученной при исполнении крона, в нём интересен errors
.......
}
-- === sys.message ===
"text" : "сообщение от системы или Службы поддержки"
}
}
Изменить состояние асинхронного запроса¶
Выпуск рассылки управляется отдельно через issue.running.* !
Если трекер в состоянии 0 (принят), 1 (запущен) или 2 (начата обработка), то для поддерживаемых вызовов его состояние можно установить в -3 (отменено) или -7 (пауза).
Это приведёт через некоторое время к прекращению работы асинхронного запроса состояние которого отражает трекер.
Уже совершёные запросом действия останутся совершёнными - отмена или пауза приводит только к тому, что обработка всего списка адресов досрочно заканчивается, но действия совершённые над уже обработанной частью останутся в силе.
Если запрос по завершении работы должен сохранить или вывести отчёт, то такой отчёт может быть создан в не полном объёме, а только на основании обработанной части.
Например, отмена member.list вернёт список только тех, кого успел перечислить.
Поддерживаемые вызовы:
member.import
member.list member.list.count
stat.uni
group.snapshot
stoplist.add stoplist.delete
email.test email.cleanerror
member.delete member.update member.sendconfirm member.where
{
"action" : "track.set"
,"id" : номер трекера
,"status" : -3 -- отмена. для всех поддерживаемых вызовов
-7 -- пауза. для member.import
}
ответ: