diff --git a/cloudkitty/storage/v2/elasticsearch/client.py b/cloudkitty/storage/v2/elasticsearch/client.py index 79651b8c..eca5f1ee 100644 --- a/cloudkitty/storage/v2/elasticsearch/client.py +++ b/cloudkitty/storage/v2/elasticsearch/client.py @@ -308,7 +308,14 @@ def retrieve(self, begin, end, filters, metric_types, scroll_id = resp['_scroll_id'] self._scroll_ids.add(scroll_id) - total = resp['hits']['total'] + total_hits = resp['hits']['total'] + + if isinstance(total_hits, dict): + LOG.debug("Total hits [%s] is a dict. Therefore, we only extract " + "the 'value' attribute as the total option.", total_hits) + total_hits = total_hits.get("value") + + total = total_hits chunk = resp['hits']['hits'] output = chunk[offset:offset+limit if paginate else len(chunk)] diff --git a/releasenotes/notes/fix-response-total-for-elastic-search-a3a9244380ed046f.yaml b/releasenotes/notes/fix-response-total-for-elastic-search-a3a9244380ed046f.yaml new file mode 100644 index 00000000..e67fc22f --- /dev/null +++ b/releasenotes/notes/fix-response-total-for-elastic-search-a3a9244380ed046f.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fix response format ``total`` for v2 dataframes API. The response for v2 + dataframes is ``{"total": 3}``. However, for Elasticsearch search response, + the ``"hits.total"`` in the response body is ``{"value": 3, "relation": + "eq"}``, which does not match the API response schema.