Перейти к содержанию

Отслеживание асинхронных запросов

Список асинхронных запросов

Список всех или отобранных по фильтру запросов.

Информация о запросах старше двух месяцев регулярно автоматически удаляется из системы.

Информация о запросах 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
            }

           .........
          ]
}

Состояние асинхронного запроса

{

 "action" : "track.get" 

,"id"     : номер трекера

}

ответ

{
 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
}

ответ:

{

 <общие поля>

}