Канал статистики

Содержит описание канала статистики для Ролевого приложения Аксател

Концепция решения

Ролевое приложение или внешний сервис (далее Визуальный Интерфейс) делает запрос по http методом POST на получение данных для хронологических отчетов и оперативных дашбордов. Все запросы обрабатываются служебным сценарием и возвращаются данные. Задачи отображения данных лежат на визуальном интерфейсе.

Протокол взаимодействия

Все запросы инициируются только Визуальным Интерфейсом. На каждый запрос возвращается один и только один ответ, содержащий запрашиваемую информацию или отчет об ошибке.

Запрос

Все запросы делаются на адрес

• для Ролевого Приложения описано в администрировании

• для Внешнего сервиса через token интеграционного канала

Метод запроса POST Content-type application/json; charset=utf-8 Body содержит сам запрос в формате json в виде

{
"entity":"text",
"action":"text",
"options": {"key":"value"}
}

Поле

Описание

entity

определяет раздел запроса.

action

определяет действие внутри entity.

options

содержит дополнительные параметры запроса в зависимости от entity и action и детально описан в разделе по каждому запросу.

Ответ

Ответ в формате json.

{
"success":true/false,
"error":null/"text",
"data": null/"text"
}

Поле

Описание

success

возвращает признак корректности выполнения запроса

• true = запрос выполнен без ошибок, результат в поле data

• false = запрос выполнен с ошибкой. Текст ошибки в поле error

error

Поле содержит описание ошибки (если success == false) или констрантно равно null (если success == true)

data

Поле содержит запрашиваемые данные (если success == true) или констрантно равно null (если success == false). При корректном выполнении запроса формат зависит от запроса и детально описан в разделе по каждому запросу.

Запросы хронологиской статистики

Запрос данных для отображения

Выполняет команду Select для получения блока данных из таблиц (подробно в Структура хронологических таблиц) Может содержать любые агрегации выборки в формате языка postgre sql.

Body запроса

{
"entity":"chronological",
"action":"data",
"options": {"psql":"тело запроса выборки в psql формате"}
}

Поле options.psql должно начинаться с Select. Иначе будет возвращена ошибка выполнения.

Успешный ответ

{
"success":true,
"error":null,
"data": []
}

В поле data будет возвращен массив запрашиваемых данных

Пример

Запрос

{
"entity":"chronological",
"action":"data",
"options": {"psql":"select
inviteid,anumber,acallednum,bnumber,duration,stopreason from calls.success limit
2"}
}

Ответ

{
"success":true,
"error":null,
"data":
[
{
"inviteid": "a72866b5-0631-87dd-2624-0900000334b5",
"anumber": "205",
"acallednum": "375291831767",
"bnumber": "375291831767",
"duration": 19,
"stopreason": "<<\"Bye from side a\">>"
},
{
"inviteid": "cb1a456e-0631-883c-c444-5c00000334b5",
"anumber": "205",
"acallednum": "375291831767",
"bnumber": "375291831767",
"duration": 22,
"stopreason": "<<\"Bye from side a\">>"
}
]
}

Запрос количества данных

Для получения количество строк удовлетворяющих Select необходимо выполнить запрос получения количества строк.

Body запроса

{
"entity":"chronological",
"action":"quantity",
"options": {"psql":"тело запроса получения количества строк выборки в psql
формате"}
}

Поле options.psql должно начинаться с select count. Иначе будет возвращена ошибка выполнения

Успешный ответ

{
"success":true,
"error":null,
"data": number
}

В поле data будет возвращено количество найденных строк в int

Пример

Запрос

{
"entity":"chronological",
"action":"data",
"options": {"psql":"select count (inviteid) from calls.success"}
}

Ответ

{
"success":true,
"error":null,
"data": 835
}

Для получения количества строк можно использовать action=data. В этом случае в поле data ответа будет [{"count":835}]

Запрос файла записи разговора

Запись разговора запрашивается напрямую из системы без сценария-обработчика.

Инфо по записи разговора

method = HEAD url = [fqdn]/rest/v1/journal/calls/<id>/attachment1 <id> = inviteid звонка

Успешный ответ

SIP Code = 200

В заголовках ответа содержится информация

content-type: audio/mpeg content-length: 50 kilobytes

Неуспешный ответ

SIP Code

Причина

404

Файл не найден

403

Доступ запрещен

Получение записи разговора

method = GET url = [fqdn]/rest/v1/journal/calls/<id>/attachment1?attachment=true/false <id> = inviteid звонка attachment=true ответ выдается с заголовком Content-Disposition: attachment; filename*=UTF-8''FILENAME.EXT , где FILENAME.EXT – имя и расширение файла в UrlEncoding, сделано для скачивания браузером attachment=false выдается с Content-Type, соответствующим mime-type расширения файла. сделано для проигрывания средствами браузера

Если запрос без ?attachment, то поведение аналогичное ?attachment=false

Успешный ответ

Для `attachment=false'

SIP Code = 200

В заголовках ответа содержится информация

content-type: audio/mpeg content-length: 50 kilobytes

В body возвращается файл записи

Для `attachment=true'

SIP Code = 200

В заголовках ответа содержится информация

content-length: 50 kilobytes content-type: audio/mpeg content-disposition: attachment; filename=mg1_1711382410-1589448421120.mp3

В body возвращается файл записи

Неуспешный ответ

SIP Code

Причина

404

Файл не найден

403

Доступ запрещен

Структура хронологических таблиц

Для составления хронологических отчетов доступны следующие схемы

Схема

Описание

alertcallevents

События по системе обзвона и оповещения

calls

События по звонкам

ivrhuntq

События по обработке звонков в очередях

ivrhuntqevents

События по состоянию объектов очередей

products

Дополнительные продуктовые данные

providerevents

События по состояниям внешних линий связи (SIP

scriptevents

События по сценариям

selectorevents

События по селекторным совещаниям

sipuserevents

События по сотояниям sip абонентов

sipusers

События по активностям sip абонентов

userevents

События по активностям пользователей

Схема alertcallevents

Позволяет получить все события по системе оповещения и массового автоматизированного обзвона.

Состоит из таблиц

Таблица

Описание

callinited

callpreanswered

callapproved

statechanged

prepared

callrejected

callstarted

callanswered

callfailed

callfinished

Схема calls

Позволяет получить статистические данные по звонкам. Состоит из таблиц

Таблица

Описание

success

Записи по успешным звонкам (был разговор)

cancelled

Записи по звонкам, у которых разговор не состоялся (пропущенные, не дозвонился и прочее)

failed

Записи у которых не было вызова стороны В

holds

Информация по постановке и снятию с удержания

routes

Информация по сработавшим правилам таблицы маршрутизации

forks

Информация по вызовам стороны В (дозвоны)

Основными идентифкатора связи между таблицами является пара полей inviteid и invitedt. Связать цепочку коммутаций можно при инициализации звонка с внешней линии по полю esgdlg. На каждый вызов может быть несколько записей в таблице forks (количество одновременно зарегистрированных устройств абонента В) и в таблице routes (количество успешно сработавших правил маршрутизации).

Таблица success

Содержит агрегирующую информацию по всем успешным звонкам. Успешным считается звонок, у которого сторона В поднял трубку (т.е. состоялась коммутация).

Поле

Тип

Описание

inviteid

uuid

Основной идентификатор по звонку

invitedt

timestamp without time zone

Время инициации первичного звонка в UTC

acallid

character

CallId стороны А

bcallid

character

CallId стороны B

anumber

character

Номер А

ausername

character

Имя пользователя стороны А

adomain

character

Домер стороны А

adisplayname

character

Имя отображения стороны А

anetworkaddr

character

IP адрес стороны А

acallednum

character

Номер, который пришел от А при инициации

arepresentative

character

Номер представления стороны А (при кроссдоменных звонках)

aouter

boolean

Битовый признак что сторона А является внешней линией

aprovidercode

character

Код провайдера стороны А

bnumber

character

Номер B

busername

character

Имя пользователя стороны B

bdomain

character

Домен стороны B

bdisplayname

character

Имя отображения стороны B

bnetworkaddr

character

IP адрес стороны B

bouter

boolean

Битовый признак что сторона B является внешней линией

bprovidercode

character

Код провайдера стороны B

dial_dt

timestamp without time zone

Время инициации вызова в UTC

start_dt

timestamp without time zone

Время начала разговора в UTC

stop_dt

timestamp without time zone

Время окончания разговора в UTC

dial_duration

integer

Продолжительность вызова в сек (кол-во секунд между dial_dt и start_dt)

duration

integer

Продолжительность разговора в сек (кол-во секунд между start_dt и stop_dt)

stopreason

character

Текстовая причина завершения звонка

isrec

boolean

Битовый признак, что разговор был записан

callrecpath

character

Относительный путь записи разговора

callstoragecode

character

Имя хранилища записи разговора

callrecsize

bigint

Размер файла в байтах

callrecdel_dt

timestamp without time zone

Время (UTC) когда запись разговора была удалена по правилам хранения записей

recordruleid

uuid

идентификатор правила записи разговоров

storageruleid

uuid

идентификатор правила хранения записей разговоров

recdomain

character

Домен, в котором велась запись звонка

recexpirets

timestamp withouttime zone

Время в UTC когда запись разговора будет удалена

recexpirets

timestamp withouttime zone

Время в UTC когда запись разговора будет удалена

sys_recdelts

bigint

системное поле

dlgbinding

character

Текстовое поле всех меток звонка

esgdlg

character

CallID внешнего абонента. Может служить единым признаком цепочки коммутаций при инициации звонка с внешней линии

isreplacing

boolean

признак что текущий звонок был переведен от другого

Таблица cancelled

Содержит агрегирующую информацию по всем звонкам без ответа (звонок у которых найдена сторона В, на сторону В отправлен вызов, но диалог / разговор не был начат). Примеры звонков - В не взял трубку или отменил вызов или занят и т.д.

Поле

Тип

Описание

inviteid

uuid

Основной идентификатор по звонку

invitedt

timestamp without time zone

Время инициации первичного звонка в UTC

dial_dt

timestamp without time zone

Время инициации вызова в UTC

stop_dt

timestamp without time zone

Время окончания дозвона в UTC

fromnumber

character

Номер А

fromusername

character

Имя пользователя стороны А

fromdomain

character

Домер стороны А

fromouter

boolean

Битовый признак что сторона А является внешней линией

fromprovidercod

character

Код провайдера стороны А

callednum

character

Номер, который пришел от А при инициации звонка

networkaddr

character

IP адрес стороны А

stoptype

character

SIP код ответа завершения звонка

stopreason

character

Текстовая причина завершения звонка

Таблица failed

Содержит агрегирующую информацию по всем неуспешным попыткам вызова. Неуспешная попытка - сторона В не найдена. Примеры ситуации - В не зарегистрирован, недоступна внешняя линия, набор запрещен по таблице маршрутизации и т.д.

Поле

Тип

Описание

inviteid

uuid

Основной идентификатор по звонку

invitedt

timestamp without time zone

Время инициации первичного звонка в UTC

fromnumber

character

Номер А

fromusername

character

Имя пользователя стороны А

fromdomain

character

Домер стороны А

fromouter

boolean

Битовый признак что сторона А является внешней линией

fromprovidercod

character

Код провайдера стороны А

callednum

character

Номер, который пришел от А при инициации звонка

networkaddr

character

IP адрес стороны А

sipcode

character

SIP код причины

reason

character

Текстовая причина неуспешного звонка

Таблица holds

Содержит информацию по постановке/снятию с удержания звонка.

Поле

Тип

Описание

inviteid

uuid

Основной идентификатор по звонку

invitedt

timestamp without time zone

Время инициации первичного звонка в UTC

side

character

Сторона кто поставил на удержание. Может быть a или b

hold_dt

timestamp without time zone

Время (UTC) постановки на удержание

unhold_dt

timestamp without time zone

Время (UTC) снятия с удержания

eventid

uuid

уникальный идентификатор события

Таблица routes

Содержит информацию по сработавшим маршрутам таблицы маршрутизации для каждого звонка в таблицах success, cancelled, failed.

Окончательно сработавшее правило всегда последнее в списке. Если несколько правил на один вызов, то значит все, кроме последнего, не смогли быть применены.

Поле

Тип

Описание

inviteid

uuid

Основной идентификатор по звонку

invitedt

timestamp without time zone

Время инициации первичного звонка в UTC

event_dt

timestamp without time zone

Время срабатывания правила в UTC

eventid

uuid

уникальный идентификатор события

vectorcode

character

Код вектора

ruleid

uuid

идентификатор правила

routeaction

character

Событие правила

routedomain

character

Домен правила

providercode

character

Код провайдера (если событие правила = outer)

featurecodeid

uuid

Идентификатор правила featurecode (если событие правила = featurecode)

featurecodetype

character

Тип кода абонентских функций (если событие правила = featurecode)

featurenumber

character

номер после обработки правилами featurecode (если событие правила = featurecode)

Таблица forks

Содержит Информацию по вызовы сторон В для всех звонков в таблицах success, cancelled.

Если на один вызов несколько записей форков, то значит сторона В имеет несколько одновременно зарегистрированных аппаратов.

Поле

Тип

Описание

inviteid

uuid

Основной идентификатор по звонку

invitedt

timestamp without time zone

Время инициации первичного звонка в UTC

busername

character

Имя пользователя стороны B

bdomain

character

Домер стороны B

bnetworkaddr

character

IP адрес стороны B

bouter

boolean

Битовый признак что сторона B является внешней линией

bprovidercode

character

Код провайдера стороны B

ispreanswered

boolean

Битовый признак был ли предварительный ответ SIP 18x от этого форка

isanswered

boolean

Битовый признак был ли окончательный ответ SIP 200 от этого форка. У каждого вызова таблицы success существует одна и только одна запись где данное поле == true

forkstart_dt

timestamp withouttime zone

Время инициации вызова на этот форк в UTC

forkpreansw_dt

timestamp without time zone

Время предварительного ответа в UTC

forkansw_dt

timestamp without time zone

Время окончательного ответа в UTC

sipcode

integer

Конечный результат вызова форка (SIP Code окончательного ответа)

reason

character

Конечный результат вызова форка (текстовое поле)

eventid

uuid

Уникальный идентифкатор данного форка

Схема ivrhuntq

huntq_calls
inviteid uuid NOT NULL,
huntq_id uuid,
callid character varying COLLATE pg_catalog."default",
esgdlg character varying COLLATE pg_catalog."default",
from_user character varying COLLATE pg_catalog."default",
from_displayname character varying COLLATE pg_catalog."default",
qid character varying COLLATE pg_catalog."default",
enqueue_result character varying COLLATE pg_catalog."default",
start_call_uid uuid,
dequeue_result character varying COLLATE pg_catalog."default", dequeue_reason character varying COLLATE pg_catalog."default", banned_user uuid,
final_stopreason character varying COLLATE pg_catalog."default", dt_greet timestamp without time zone, dt_enqueue timestamp without time zone,
dt_start_call timestamp without time zone,
dt_dequeue timestamp without time zone,
dt_preivr timestamp without time zone,
dt_userban timestamp without time zone,
dt_quit timestamp without time zone,
dt_final timestamp without time zone

Схема ivrhuntqevents

final
huntq_id character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default",
stopreason character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
queue_dequeue
qid character varying COLLATE pg_catalog."default",
huntq_id character varying COLLATE pg_catalog."default",
from_user character varying COLLATE pg_catalog."default",
from_displayname character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default",
result character varying COLLATE pg_catalog."default",
reason character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
queue_enqueue
qid character varying COLLATE pg_catalog."default",
huntq_id character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default",
from_user character varying COLLATE pg_catalog."default",
result character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
queue_greeting
huntq_id character varying COLLATE pg_catalog."default",
qivrscript character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default",
from_user character varying COLLATE pg_catalog."default",
from_displayname character varying COLLATE pg_catalog."default",
sys_iscopied boolean DEFAULT false,
sys_copyid bigint,
eventts timestamp without time zone
queue_preivr_start
qid character varying COLLATE pg_catalog."default",
userid character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
queue_quit
qid character varying COLLATE pg_catalog."default",
from_user character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
queue_start_call
qid character varying COLLATE pg_catalog."default",
userid character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default", eventts timestamp without time zone
queue_userban
qid character varying COLLATE pg_catalog."default",
huntq_id character varying COLLATE pg_catalog."default",
callid character varying COLLATE pg_catalog."default",
inviteid uuid,
esgdlg character varying COLLATE pg_catalog."default",
userid character varying COLLATE pg_catalog."default",
eventts timestamp without time zone

Схема products

filter_intervals
filter_id interval,
filter_text character varying COLLATE pg_catalog."default"
ref_huntblock_reasons
title character varying COLLATE pg_catalog."default", event_key character varying COLLATE pg_catalog."default", duration bigint,
type character varying COLLATE pg_catalog."default", is_allowed boolean

Схема providerevents

provider_state_changed
code character varying COLLATE pg_catalog."default",
objid character varying COLLATE pg_catalog."default",
state character varying COLLATE pg_catalog."default",
eventts timestamp without time zone

Схема scriptevents

script_start
type character varying COLLATE pg_catalog."default",
scrcode character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
script_stop
type character varying COLLATE pg_catalog."default",
scrcode character varying COLLATE pg_catalog."default",
stoptype character varying COLLATE pg_catalog."default",
stopreason character varying COLLATE pg_catalog."default",
eventts timestamp without time zone

Схема selectorevents

sel_abon_state_changed
id character varying COLLATE pg_catalog."default",
num character varying COLLATE pg_catalog."default",
name character varying COLLATE pg_catalog."default",
selid character varying COLLATE pg_catalog."default",
state character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
sel_create
id character varying COLLATE pg_catalog."default",
opts character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
sel_delete
id character varying COLLATE pg_catalog."default",
reason character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
sel_state_changed
id character varying COLLATE pg_catalog."default",
state character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
sel_update
id character varying COLLATE pg_catalog."default",
opts character varying COLLATE pg_catalog."default",
eventts timestamp without time zone
sel_voting_state_changed
id character varying COLLATE pg_catalog."default",
name character varying COLLATE pg_catalog."default",
selid character varying COLLATE pg_catalog."default",
state character varying COLLATE pg_catalog."default",
info character varying COLLATE pg_catalog."default",
eventts timestamp without time zone

Схема sipuserevents

sipuser_state_changed
login character varying COLLATE pg_catalog."default" NOT NULL,
state character varying COLLATE pg_catalog."default" NOT NULL,
sys_iscopied boolean DEFAULT false, sys_copyid bigint,
eventts timestamp without time zone NOT NULL
sipuser_transtate_set
login character varying COLLATE pg_catalog."default" NOT NULL,
state character varying COLLATE pg_catalog."default" NOT NULL,
ttl bigint,
strategy character varying COLLATE pg_catalog."default",
xinfo character varying COLLATE pg_catalog."default",
sys_iscopied boolean DEFAULT false, sys_copyid bigint,
eventts timestamp without time zone NOT NULL

Схема sipusers

states
eventid bigint,
event_name character varying COLLATE pg_catalog."default",
login character varying COLLATE pg_catalog."default",
state character varying COLLATE pg_catalog."default",
dt_start timestamp without time zone,
dt_stop timestamp without time zone,
len bigint,
xinfo character varying COLLATE pg_catalog."default",
strategy character varying COLLATE pg_catalog."default"

Схема userevents

usr_state_changed
user_id character varying COLLATE pg_catalog."default" NOT NULL,
state character varying COLLATE pg_catalog."default",
changed_by character varying COLLATE pg_catalog."default",
eventts timestamp without time zone