Агрегированные показатели по звонкам
В одной из заметок, Забираем звонки из Webitel, я описал, как с помощью REST API вы можете забирать информацию о звонках из Webitel. Сегодня мы рассмотрим на примере Звонки по направлениям, как работать с агрегациями и показателями. Для лучшего понимания примера, настоятельно рекомендую ознакомится с разделом агрегации документации по elasticsearch.
Предположим, что нам нужно рассчитать количество, а так же показатели общей и средней длительности звонков по направлениям за текущие сутки. Тело запроса будет иметь следующий вид:
calls_by_direction.json
{
"index": "cdr-a",
"limit": 0,
"aggs": {
"direction": {
"terms": {
"field": "direction",
"order": {
"_count": "desc"
},
"size": 5
},
"aggs": {
"talksec_sum": {
"sum": {
"field": "talksec"
}
},
"talksec_avg": {
"avg": {
"field": "talksec"
}
}
}
}
},
"filter": [
{
"bool": {
"must": [
{
"range": {
"created_time": {
"gte": "now/d",
"lte": "now"
}
}
}
]
}
}
]
}
В нашем запросе группировка происходит по полю direction, а среднее и суммарное значение мы вычисляем по полю talksec. Дополнительно мы добавляем фильтр по времени: от текущей даты до начала суток.
Запрос с помощью утилиты cURL будет иметь вид:
curl -s -L -XPOST \
-H 'Content-Type: application/json' \
-H 'X-Access-Token: eyJMDU0NjAwMDAwMCwhaW4iLCJ2IjoyfQ.VeWrCqkv_lG1bLVv6tvOFPz2XfhiTpQG8XcFji8gSS4'\
"https://cloud-eu.webitel.com/engine/api/v2/cdr/text" -d@calls_by_direction.json
В результате мы получим JSON документ с результатом запроса в объекте aggregations, который уже легко можем обработать любимыми инструментами:
ответ
{
"took": 45,
"timed_out": false,
"_shards": {
"total": 33,
"successful": 33,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 343,
"max_score": 0,
"hits": []
},
"aggregations": {
"direction": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "outbound",
"doc_count": 209,
"talksec_sum": {
"value": 7093
},
"talksec_avg": {
"value": 55.4140625
}
},
{
"key": "inbound",
"doc_count": 94,
"talksec_sum": {
"value": 2430
},
"talksec_avg": {
"value": 73.63636363636364
}
},
{
"key": "internal",
"doc_count": 12,
"talksec_sum": {
"value": 172
},
"talksec_avg": {
"value": 24.571428571428573
}
}
]
}
}
}