Как оценивать время между сообщениями журнала с помощью ElasticSearch

Я хочу узнать, как долго выполняются разные действия в моем старом PHP-приложении. Существует файл журнала, который записывает сообщения, когда действие запускается и заканчивается. Это выглядит так:

LOGFILE

2018-08-13 13:05:07,217 [30813] ControllerA: actionA start
2018-08-13 13:05:07,280 [30813] ControllerA: actionA end
2018-08-13 13:05:08,928 [30813] ControllerB: actionA start
2018-08-13 13:05:08,942 [30813] ControllerB: actionA end
2018-08-13 13:05:09,035 [17685] ControllerC: actionA start
2018-08-13 13:05:09,049 [17685] ControllerC: actionA end
2018-08-13 13:05:09,115 [8885] ControllerB: actionB start
2018-08-13 13:05:09,128 [8885] ControllerB: actionB end

Я проанализировал журналы с помощью logstash и фильтра grok, чтобы получить формат JSON, который может понять ElasticSearch.

LOGFILE

grok {
    match => { "message" => "%{EXIM_DATE:timestamp} \[%{NUMBER:pid}\] %{WORD:controller}: %{WORD:action} %{WORD:status}" }
}

Результат затем индексируется ElasticSearch, но я не знаю, как я могу узнать, сколько времени занимает каждое действие. На основе pid, имени контроллера и имени действия, а также состояния начала и конца, у меня есть вся информация, необходимая для выяснения того, как долго длится действие. Я хочу показать продолжительность каждого действия в Kibana, но сначала я попытался получить данные из индекса с запросом. Я читал об агрегациях и думал, что они могут быть подходящими для такого рода задач.

Я создал следующий запрос:

ES QUERY

{
    "aggs":{
        "group_by_pid": {
            "terms": {
                "field": "pid"
            }
        },
        "aggs": {
            "group_by_controller": {
                "terms": {
                    "field": "controller"
                }
            }
            "aggs": {
                "group_by_action": {
                    "terms":{
                        "field": "action"
                    }
                }
            }
        }
    }
}

Но ответ всегда пуст. В настоящее время я не уверен, могу ли я даже рассчитать между каждым началом и конечным действием, или если мне нужно обновить полное ведение журнала и вычислить продолжительность в PHP.

Любые предложения приветствуются!

0
задан 13 August 2018 в 14:42

1 ответ

Благодаря подсказке Val и его ответе на другой вопрос мне удалось получить агрегированные времена для разных журнальных событий, используя logstash.

Это конфигурация:

input {
    file {
        path => "path/to/log.log"
    }
}
filter {
    grok {
        match => { "message" => "%{EXIM_DATE:timestamp} \[%{NUMBER:pid}\] %{WORD:controller}: %{WORD:action} %{WORD:status}" }
        add_tag => [ "%{status}" ]
    }

    elapsed {
        unique_id_field => "pid"
        start_tag => "start"
        end_tag => "end"
        new_event_on_match => false
    }

    if "elapsed" in [tags] {
        aggregate {
            task_id => "%{pid}"
            code => "map['duration'] = [(event.get('elapsed_time')*1000).to_i]"
            map_action => "create"
        }
    }
}
output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
        index => "my_index_%{+xxxx_M}"
        action => "index"
    }
}

В Kibana я могу теперь использовать поле elapsed_time, созданное , его ответ на другой вопрос , чтобы визуализировать время, которое требуется каждому запросу.

0
ответ дан 15 August 2018 в 17:02

Другие вопросы по тегам:

Похожие вопросы: