Агрегирование данных

Использую filebeat logstash elastic kibana
есть у меня записи в логе типа
timestamp seriviceName guid ON
и
timestamp seriviceName guid OFF
Как мне вывести все ON для которых нет соответсвующих OFF и время как давно ON появился?

А сколько у вас этих разных seriviceName может быть в индексе?

Ну... наверно... 50-200

Наверное, я не то спросил. Вам ON без OFF нужен для одного и того же serviceName или для guid или для этой пары? И сколько таких уникальных значений будет?

Если нужно только по имени сервера и таких имен не очень много, то можно сгруппировать по имени сервера (или по серверу и guid), потом в каждой группе выбрать максимальное время для всех записей и для записей с ON и воспользоваться bucket_selector чтобы оставить только группы, где максимальное время равняется максимальному времени с ON. Короче, немного запутано, но выглядить это будет как-то так:

DELETE test

PUT test
{
  "mappings": {
    "_doc": {
      "properties": {
        "service": {
          "type": "keyword"
        },
        "state": {
          "type": "keyword"
        },
        "time": {
          "type": "date"
        }
      }
    }
  }
}

PUT test/_doc/1
{
  "service": "a",
  "state": "ON",
  "time": "2019-03-05T12:10:30Z"
}

PUT test/_doc/2
{
  "service": "a",
  "state": "OFF",
  "time": "2019-03-05T13:10:30Z"
}

PUT test/_doc/3
{
  "service": "a",
  "state": "ON",
  "time": "2019-03-05T14:10:30Z"
}


PUT test/_doc/4
{
  "service": "b",
  "state": "ON",
  "time": "2019-03-05T14:10:30Z"
}

PUT test/_doc/5
{
  "service": "b",
  "state": "OFF",
  "time": "2019-03-05T15:10:30Z"
}


PUT test/_doc/6
{
  "service": "c",
  "state": "OFF",
  "time": "2019-03-05T15:10:30Z"
}

PUT test/_doc/7
{
  "service": "d",
  "state": "ON",
  "time": "2019-03-05T15:10:30Z"
}


POST test/_search
{
  "size": 0,
  "aggs": {
    "by_service": {
      "terms": {
        "field": "service",
        "size": 1000
      },
      "aggs": {
        "last_timestamp": {
          "max": {
            "field": "time"
          }
        },
        "filter_on": {
          "filter": {
            "term": {
              "state": "ON"
            }
          },
          "aggs": {
            "last_timestamp": {
              "max": {
                "field": "time"
              }
            }
          }
        },
        "select_on": {
          "bucket_selector": {
            "buckets_path": {
              "last_all": "last_timestamp",
              "last_on": "filter_on>last_timestamp"
            },
            "script": "params.last_all == params.last_on"
          }
        }
      }
    }
  }
}

Надо сказать, я за elk взялся несколько дней назад, вообще ничего не понимаю. Знаю, что оно для просмотра логов подходит. Даже не представляю, куда вводить ваш запрос. С наскока, очевидно, не получилось.

Так что пойдука я, для чайников че нить почитаю.

Прошу прощения, сразу не понял. В этом случая, а порекомендовал-бы индексировать по другому - использовать seriviceName+guid как id. Таким образом будет храниться только последняя запись и то что вам надо можно реализовать простым фильтром по ON.

Если застрянете - спрашивайте. А еще лучше - приходите в наш класс :slight_smile: - все подробно объясним и научим.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.