Logo

EcoRouter

EcoNAT

EcoQOE

EcoBypass

EcoSwitch

Описание API QoE EcoQoE Documentation / Описание API QoE

Базовые принципы

Для автоматизации доставки данных QoE во внешние аналитические системы предусмотрен программный интерфейс (API) с архитектурой REST. В качестве транспортного протокола используется HTTP. Для обращения к функциям API формируются HTTP-запросы по определённым URL. В настоящий момент URL к функциям содержит путь, совпадающий с маской /api/v1/*. Аутентификация запросов к HTTP-серверу выполняется базовым методом.

Ответ функций представляет собой структуру-словарь в формате JSON, в котором обязательно присутствует ключ error. Если функция API выполнена без ошибок, то значение данного ключа – 0. Если при выполнении функции API возникла ошибка, то в ключе error передаётся номер ошибки, а в ключе message – её описание.

Пример ответа с ошибкой:

{
    «error»: 1,
    «message»: «No matched data»
}

В случае успешного выполнения функции ответ содержит ключ response с результатами выполнения функции.

Входные параметры передаются в GET-переменных.

Данные по RTT

Для доступа к измерениям, касающимся задержек в сети оператора (задержки между SYNACK-ACK) используется метод API rtt. Данный метод аналогичен блоку «Распределение RTT» в Web-интерфейсе (см. рисунок ниже).

URL-PATH: /api/v1/rtt

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

Параметр

Примеры значений и допустимые значения

Описание

start_date
end_date
start_date=01.04.19%2014:00
end_date=15.04.19

Начальная и конечная дата периода, за который выводится статистика. Допустимый формат: DD.MM.YY HH:MM – дата и время, DD.MM.YY – только дата. Эти параметры можно также передавать с целочисленными значениями, которые обрабатываются как unixtimestamp. Если параметры не заданы, то будет выведена статистика за сутки

host
host=10.1.0.2
host=10.2.0.0/24

Фильтрация по абоненту или по IP-адресу. В качестве значения можно задать номер договора, IP-адрес абонента или подсеть. Если параметр не задан, то выводится статистика по всем абонентам сети

filter_group
filter_value

filter_group=district&filter_value=Московский

Допустимые значения параметра filter_group задаются в конфигурационном файле /opt/econat_qoe/econat_qoe/local_settings.py и могут отличаться в каждом отдельном случае.

Пример критериев:

·         crc – количество ошибок CRC

·         switch – коммутатор доступа

·         service – услуга

·         mag_device – магистральный коммутатор

·         num_contract – номер договора

·         district – район

·         router_type – тип Wi-Fi

·         mac_vendor – вендор абонентского устройства

·         router_model – модель роутера

·         cable_length – длина кабеля

Внимание! Указанные критерии – это набор признаков со строковыми значениями. Эти признаки необходимы для фильтрации и группировки больших объёмов записей с ключевыми полями ip или num_contract. Смысл признаков определяется оператором на этапе разработки телекоммуникационных услуг

Фильтрация по группе абонентов. В параметре filter_group задаётся критерий, по которому должны быть сгруппированы данные (например, город, услуга или модель маршрутизатора абонента), а в параметре filter_value – значение, по которому необходимо отфильтровать результаты (например, только активные пользователи или величина RTT). Если параметры не заданы, то выводится статистика по всем абонентам сети

В ответ на запрос функция возвращает ключевые параметры распределения задержек в сети оператора в формате JSON. Ключ response содержит следующие параметры:

  • average_rtt – среднее значение RTT,
  • median_rtt – медианное значение RTT (половина сессий быстрее данного значения, половина – медленнее),
  • total_sessions – количество TCP-сессий,
  • long_sessions – количество сессий с RTT более 5 мс,
  • quantiles – массив квантилей: время для 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% самых быстрых сессий.

Из массива квантилей можно, например, рассчитать ширину разброса RTT, отбросив 10% самых быстрых и 10% самых медленных сессий, или построить график частотного распределения задержек (плотности вероятности RTT). На следующем рисунке показан пример построения графика в Excel.

На вышеприведённом графике по оси X откладываются значения RTT, по оси Y – плотность вероятности ΔP/Δrtt = 10/Δrtt (шаг вероятности для последующих квантилей – 10%). Вероятность того, что измеренное значение RTT окажется в промежутке между rtt1 и rtt2 равна площади трапеции, ограниченной графиком и прямыми x=rtt1, x=rtt2, y=0. Таким образом, площадь под всем графиком равна 90%.

При успешном выполнении запроса тело ответа, помимо response, может содержать ключ filters, в котором указаны применённые параметры фильтрации (диапазон времени, IP-адрес, группы абонентов и др.). В таблице ниже даны примеры содержимого ключа filters.

Запрос

Ответ

start_date=07.04.19&end date=08.04.19&host=10.210.0.0/16
«filters»: { 
        «end_ipn»: 181600255,
        «end_timestamp»: 1554670800,
        «start_ipn»: 181534720,
        «start_timestamp»: 1554584400
    },
host=rdp
«filters»: { 
        «end_timestamp»: 1554822000,
        «num_contract»: «rdp»,
        «start_timestamp»: 1554735600
    },
filter_group=district&filter_value=Люберцы
«filters»: { 
        «end_timestamp»: 1554822000,
        «filter_group»: «district»,
        «filter_value»: «\u041b\u044e\u0431\u0435\u0440\u0446\u044b»,
        «start_timestamp»: 1554735600
    },

Кроме того, в ответе присутствует параметр available_filter_groups, в котором указаны заданные в системе допустимые значения входного параметра filter_group.

Пример запрашиваемого URL:

https://10.10.10.10/api/v1/rtt?start_date=16.04.19+10%3A05&end_date=17.04.19+10%3A05&filter_group=district&filter_value=%D0%9A%D0%BE%D0%BC%D0%BC%D1%83%D0%BD%D0%B0%D1%80%D0%BA%D0%B0&groupby=mac_vendor


Пример запроса и ответа на уровне HTTP:

GET /api/v1/rtt?;host=10.1.0.2 HTTP/1.1
Host: 192.168.251.114
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Basic XXXXXXXXXXXXXXXXXXX=
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: csrftoken=AD3paWVCjfh1d663mbjaGhVQEMZv6V8Z

HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 17 Apr 2019 07:29:59 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Language: ru

2f6
{«available_filter_groups»: [{«group»: «switch», «title»: «\u041a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0430»}, {«group»: «agg_switch», «title»: «\u0423\u0437\u0435\u043b-\u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438»}, {«group»: «num_contract», «title»: «\u0414\u043e\u0433\u043e\u0432\u043e\u0440»}, {«group»: «district», «title»: «\u0420\u0430\u0439\u043e\u043d»}], «response»: {«total_sessions»: 1895, «median_rtt»: 10.0, «long_sessions»: 1414, «average_rtt»: 12.396569920844328, «quantiles»: [1.7000000000000002, 4.2, 6.4, 8.4, 10.0, 12.0, 14.0, 18.8, 31.3]}, «filters»: {«start_timestamp»: 1555399500, «start_ipn»: 167837698, «end_ipn»: 167837698, «end_timestamp»: 1555485900}, «error»: 0}
0

Пример JSON-ответа (для удобства текст декодирован):

{
»available_filter_groups»:[
{
«group»:»crc»,
«title»:»Количество ошибок CRC»
},
{
«group»:»switch»,
«title»:»Коммутатор доступа»
},
{
«group»:»service»,
«title»:»Услуга»
},
{
«group»:»mag_device»,
«title»:»Магистральный коммутатор»
},
{
«group»:»num_contract»,
«title»:»Договор»
},
{
«group»:»district»,
«title»:»Район»
},
{
«group»:»router_type»,
«title»:»Тип Wifi»
},
{
«group»:»mac_vendor»,
«title»:»Вендор абонентского устройства»
},
{
«group»:»router_model»,
«title»:»Модель роутера»
},
{
»group»:»cable_length»,
«title»:»Длина кабеля»
}
],

Структура «available_filter_groups» содержит допустимые значения для filter_group

«error»:0,
«filters»:{
«end_timestamp»:1555484700,
«filter_group»:»district»,
»filter_value»:»Коммунарка»,
«start_timestamp»:1555398300
},

Структура «filters» содержит примененные фильтры

«response»:{
«average_rtt»:4.508310752482343,
«long_sessions»:4931189,
«median_rtt»:2.4000000000000004,
«quantiles»:[
0.5,
0.8,
1.4000000000000001,
1.9000000000000001,
2.4000000000000004,
3.1,
4,
5.6000000000000005,
11.200000000000001
],
«total_sessions»:22782209
}
}

Структура «response» содержит данные по QoE


Если по заданным критериям в базе данных ничего не найдено, то придёт ответ с ошибкой:

{
    «error»: 1,
    «message»: «No matched data»
}

Информация об абонентах

Для доступа к данным по абонентам используется API-метод qoe_table. Данный метод реализует аналог таблицы «Аналитика QoE» в Web-интерфейсе (см. рисунок ниже).

URL-PATH: /api/v1/qoe_table

Входные параметры те же, что и для API-метода rtt (см. раздел «Данные по RTT» выше).

В ответ на запрос функция возвращает данные в формате JSON. Ключ response содержит таблицу состояния абонентов в виде массива, где каждый элемент массива – словарь с различными параметрами абонента. Помимо response, ответ может содержать ключ filters, в котором указаны применённые параметры фильтрации (диапазон времени, IP-адрес, группы абонентов и др.). Кроме того, в ответе присутствует параметр available_filter_groups, в котором указаны заданные в системе допустимые значения входного параметра filter_group. Подробные примеры filters и available_filter_groups приведены и разобраны в описании API-метода rtt (см. раздел «Данные по RTT»). В этом разделе для краткости приведён только пример структуры response. Конкретный список ключей-параметров абонента в response зависит от настроек системы; в первую очередь от того, какие критерии группировки в неё загружены.

Пример запроса:

/api/v1/qoe_table?host=rdp

Ответ:

«response»:[
    {
        «avg_rtt_width»:21.150000000000002,
        «cable_length»:»«,
        «crc»:»«,
        «district»:»Ядро»,
        «empty_ses»:0,
        «fp_count»:2,
        «ip»:»10.210.10.2»,
        «ipn»:181537282,
        «mac_vendor»:»«,
        «mag_device»:»«,
        «max_time»:1555419900,
        «median_rtt»:6.5,
        «min_time»:1555419600,
        «num_contract»:»rdp»,
        «pkt_per_ses»:146.2857142857143,
        «router_model»:»«,
        «router_type»:»«,
        «rtt_avg»:11.608333333333334,
        «rtt_width»:21.150000000000002,
        «rx_retr_percent»:0.19607843137254902,
        «service»:»Телефония»,
        «ses_per_sec»:0.0001388888888888889,
        «session_count»:12,
        «switch»:»«,
        «tx_retr_percent»:2.307692307692308,
        «tx_retr_quantile»:1.2448132780082988
    },
    {
        «avg_rtt_width»:0.30000000000000004,
        «cable_length»:»«,
        «crc»:»«,
        «district»:»Ядро»,
        «empty_ses»:0,
        «fp_count»:1,
        «ip»:»10.210.9.98»,
        «ipn»:181537122,
        «mac_vendor»:»Intel Corporate»,
        «mag_device»:»«,
        «max_time»:1555455000,
        «median_rtt»:0.4,
        «min_time»:1555455000,
        «num_contract»:»rdp»,
        «pkt_per_ses»:87.875,
        «router_model»:»«,
        «router_type»:»«,
        «rtt_avg»:0.38571428571428573,
        «rtt_width»:0.30000000000000004,
        «rx_retr_percent»:0,
        «service»:»Телефония»,
        «ses_per_sec»:0.00008101851851851852,
        «session_count»:7,
        «switch»:»«,
        «tx_retr_percent»:0,
        «tx_retr_quantile»:0
    },
...
]

Загрузка критериев через API

Для загрузки словарей со списком признаков, привязанных к ip или num_contract абонента, используется API-метод upload_groups.

URL-PATH: /api/v1/upload_groups

Этот метод является аналогом страницы «Загрузка критериев» в Web-интерфейсе (см. рисунок ниже) и позволяет загрузить в систему данные о привязке абонентов к району, услугам, коммутаторам и т. п.

Загружаемые данные перезаписывают текущие данные полностью, поэтому нужно всегда загружать полную таблицу данных. Пример содержимого CSV-файла:


ip;num_contract;district;switch;mag_device;service;router_type;router_model;cable_length

10.1.0.1;11;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.2;12;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.3;13;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.4;14;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.5;15;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.6;16;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.7;17;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.8;18;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

10.1.0.9;19;1-1 район;E600-DEGR;EcoRouter110;IP-DEGR;b;ER-110;10

Поля определяются в конфигурационном файле /opt/econat_qoe/econat_qoe/local_settings.py на платформе аналитической подсистемы и могут отличаться в каждом индивидуальном случае. Неизвестные системе поля будут ею проигнорированы.

Подготовленный CSV-файл передаётся в POST в «сыром» виде.

Пример вызова из командной строки:

root@qoe:~# wget --post-file=dict.csv  -q -O – http://login:password@server.address/api/v1/upload_groups 
 {
     «response»: {
         «service»: 510,
         «primary_key»: «ip»,
         «primary_key_index»: 0,
         «undescribed_columns»: [
             «router_type»,
             «router_model»,
             «cable_length»],
         «valid_cells»: 2550,
         «switch»: 510,
         «invalid_length_rows»: 1,
         «mag_device»: 510,
         «num_contract»: 510,
         «district»: 510,
         «valid_columns»: 5
     },
     «error»: 0
 }

На выходе система передаёт в ключе response информацию о количестве загруженных записей. Если формат CSV-файла не был распознан, то значение ключа error будет не ноль, а ключ message будет содержать сообщение об ошибке.