Elasticsearch - Подсчет и сумма ведра с условием - PullRequest
0 голосов
/ 27 августа 2018

Мой запрос:

es_query = {
        "query": {
            "constant_score": {
                "filter": {
                    "bool": {
                        "must": [
                            {"range": {"@timestamp": {"gte": "now-1d",}}},
                            {"query_string": {"query": "hostname: {} ".format(hostname),"analyze_wildcard": True}}
                        ],
                        "should": [
                            {"match": {"metricset.name": "cpu"}},
                        ]
                    }
                }
            }
        },
        "aggs": {
            "group_by_time_interval": {
                "date_histogram": {
                    "field": "@timestamp",
                    "interval": "1h",
                    "time_zone": "PST8PDT",
                    "min_doc_count": 1
                },
                "aggs": {
                    "cpu_used_avg_pct": {"avg": {"field": "system.cpu.total.pct"}},
                },

            }
        }
    }

Я пытаюсь показать среднее значение процессора за последние 1 день с интервалом 1 час.Вывод выглядит следующим образом:

        "group_by_time_interval": {
            "buckets": [
                {
                    "key_as_string": "2018-08-25T19:00:00.000-07:00", 
                    "doc_count": 24, 
                    "key": 1535248800000, 
                    "cpu_used_avg_pct": {
                        "value": 0.0
                    }
                }, 
                {
                    "key_as_string": "2018-08-25T20:00:00.000-07:00", 
                    "doc_count": 24, 
                    "key": 1535252400000, 
                    "cpu_used_avg_pct": {
                        "value": 0.0699
                    }
                }, 
                {
                    "key_as_string": "2018-08-25T21:00:00.000-07:00", 
                    "doc_count": 24, 
                    "key": 1535256000000, 
                    "cpu_used_avg_pct": {
                        "value": 0.071
                    }
                }, 
....

Я хочу подсчитать, сколько раз cpu_used_avg_pct равно 0. Это может быть сделано с помощью сценария записи, например:

count = 0

for res in results['aggregations']['group_by_time_interval']['buckets']:
    cpu_total_avg = res['cpu_used_avg_pct']['value']
    if float(cpu_total_avg) == 0.0:
        count += 1 

Однако, этоЕсть ли способ избежать дополнительного сценария, чтобы справиться с этим?Можем ли мы добавить фильтр непосредственно в запрос ES.

Большое вам спасибо.Алекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...