Забираем звонки из Webitel
Довольно часто наши клиенты сталкиваются с необходимостью выгрузить информацию о звонках из раздела Call Detail Record к себе. Как вы уже знаете (даже если взять во внимание предыдущую запись в этом блоге, а именно 📲 Липкость звонка), вся историческая статистика хранится в базе elasticsearch. В документации вы так же могли увидеть пример получения данных с помощью нашего REST API. Но, что если звонков несколько сотен? Или несколько тысяч? Как правильно получить такой объем данных? Сегодня я расскажу как работать с большими объемами данных.
Scroll
Для получения большого количества данных, в elasticsearch предусмотрен функционал scroll, который мы повторили и в нашем REST API. Рассмотрим на примере:
webitel_scroll_request.json
{
"scroll" : "5m",
"limit": 1000,
"sort": {
"created_time": {
"order": "desc",
"unmapped_type": "boolean"
}
},
"index": "cdr-a",
"query": "*",
"columns": [
"created_time",
"uuid",
"direction",
"duration"
],
"filter": [
{
"bool": {
"must": [
{
"range": {
"created_time": {
"gte": "now/w",
"lte": "now"
}
}
}
]
}
}
]
}
В тело нашего запроса мы добавили 2 новых параметра:
scroll - как долго на сервере держать результат запроса
limit - какими порциями возвращать результат запроса
Дальше, выполняем первый запрос с указанным телом на REST API, для простоты я использую консольную утилиту cURL:
curl -s -L -XPOST \
-H 'Content-Type: application/json' \
-H 'X-Access-Token: ciOiJIUzI1NiJ9.jEyM2UxNThjLWVkNzMtNDAwi'\
"https://pre.webitel.com/engine/api/v2/cdr/text" -d@webitel_scroll_request.json
Вместе с результатом, который не будет превышать заданного в limit значения, мы получим _scroll_id:
Теперь все последующие запросы мы выполняем уже с scrollId в теле запроса. Пример:
curl -s -L -XPOST \
-H 'Content-Type: application/json' \
-H 'X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6I9.IjKpitL05OLjUPeUQyd4E'\
"https://pre.webitel.com/engine/api/v2/cdr/text/scroll" -d '
{
"scroll": "5m",
"scrollId": 'МНОГО_БУКВ_ПОЛУЧЕННОГО_ИД'
}'
Повторяем запрос, пока не заберем все данные с сервера.
Бонус
В качестве бонуса, подготовил небольшой bash скрипт, который с помощью cURL и jq поможет вам выкачать необходимые данные и сохранить в CSV файл:
Тело запроса должно находится в файле webitel_scroll_request.json в возле данного скрипта.
Удачи с запросами!