Elasticsearch - Рассчитать агрегацию поддиапазона - PullRequest
0 голосов
/ 01 октября 2018

У меня следующий запрос ES для вычисления среднего значения ЦП хоста за последние 30 дней.

es_query = {
        "query": {
            "constant_score": {
                "filter": {
                    "bool": {
                        "must": [
                            {"range": {"@timestamp": {"gte": "now-30d",}}},
                            {"query_string": {"query": 'hostname: myhost',"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"}}
                }
            },
            "avg_monthly_cpu_pct": {
                "avg_bucket": {
                    "buckets_path": "group_by_time_interval>cpu_used_avg_pct" 
                }
            }

        }
    }

После выполнения верните среднее значение ЦП последних 30 дней, как и ожидалось.

Вопрос в том, как я могу также вычислить среднее значение ЦП за последние 7 дней, просто расширив приведенный выше запрос?

В настоящее время мое тупое решение - скопировать другой запрос, заменить "gte: now-30d "by" gte: now-7d "затем запустите снова, что занимает очень много времени.

Спасибо.Alex

1 Ответ

0 голосов
/ 01 октября 2018

Самое простое, что вы можете сделать, это просто добавить еще одну агрегацию, отфильтрованную за последние 7 дней:

{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "@timestamp": {
                  "gte": "now-30d"
                }
              }
            },
            {
              "query_string": {
                "query": "hostname: myhost",
                "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"
          }
        }
      }
    },
    "avg_monthly_cpu_pct": {
      "avg_bucket": {
        "buckets_path": "group_by_time_interval>cpu_used_avg_pct"
      }
    },
    "last_7_days": {
      "filter": {
        "range": {
          "@timestamp": {
            "gte": "now-7d"
          }
        }
      },
      "aggs": {
        "last_7_days_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"
              }
            }
          }
        },
        "avg_monthly_cpu_pct": {
          "avg_bucket": {
            "buckets_path": "last_7_days_interval>cpu_used_avg_pct"
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...