Мой запрос:
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.
Большое вам спасибо.Алекс