В одной из заметок, Забираем звонки из 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
          }
        }
      ]
    }
  }
}