ELK: как сгруппировать трассировки стека по классу исключения в Kibana

Я настраиваю стек ELK для веб-приложения Java. Я успешно проанализировал многострочные трассировки стека Java с помощью logstash и отобразил количество исключений в кибане. Теперь я хотел бы отобразить гистограмму даты с количеством групп исключений по классам исключений, то есть 2 java.lang.NullPointerException, 3 java.lang.ArithmeticException за минуты или секунды.

В кибане я вижу полную проиндексированную трассировку стека. Но мне не удалось визуализировать свою группу исключений по классам. Какая здесь лучшая практика? Попытаться получить полное имя класса с помощью Logstash и выполнить фильтр терминов в кибане? или есть способ использовать силу ES в кибане?

Пример начала поля message:

2015-08-15 23:23:51.695 [qtp1010279661-1074] ERROR c.m.w.s.proxies.ProxyServlet:71 - Can't get content from url http://localhost:8080/...
org.apache.http.conn.HttpHostConnectException: Connect to localhost:8080 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1, localhost/fe80:0:0:0:0:0:0:1%1] failed: Connection refused
    at org.apache.http.impl.conn.HttpClientConnectionOperator.connect...

Моя конфигурация logstash:

input {
    file {
        path => "/Users/dbaq/web-app.log"
        start_position => beginning
    }
}

filter {
    multiline {
        pattern => "%{TIMESTAMP_ISO8601:timestamp}"
        negate => true
        what => "previous"
    }

    grok {
        match => ["message", "(?m)%{TIMESTAMP_ISO8601:timestamp} \[%{DATA:thread}\]\s*%{LOGLEVEL:severity}\s*%{DATA:class}:%{NUMBER:line:int}\s*\- %{GREEDYDATA:message}"]
        overwrite => [ "message" ]
    }

    date {
        match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
    }
}

output {
    elasticsearch {
        protocol => "http"
    }
    stdout {}
}

Спасибо за вашу помощь

РЕДАКТИРОВАТЬ 1: Мое поле class в моем шаблоне logstash представляет класс, в котором возникло исключение, в моем примере: c.m.w.s.proxies.ProxyServlet. Я хочу агрегировать по моему классу исключения: org.apache.http.conn.HttpHostConnectException.


person dbaq    schedule 16.08.2015    source источник


Ответы (2)


Как уже отмечал @Alain Collins, для визуализации можно использовать «таблицу данных».

Я бы посоветовал вам добавить в свой ввод многострочный кодек со следующим шаблоном:

input {
    file {
         path => "/Users/dbaq/web-app.log"
         start_position => beginning
         codec => multiline {
              pattern => "^\s"
              what => "previous"
         }
    }
}

Затем вы можете использовать предопределенное регулярное выражение Grok JAVASTACKTRACEPART, выполнив следующие действия:

if "multiline" in [tags] {
    grok {
        match => ["message", "%{JAVASTACKTRACEPART}"]
    }
}

Обратите внимание, что при этом также будет создано поле с именем class. Вы можете использовать это поле, чтобы выполнить поиск по терминам и применить к нему свой счетный показатель.

person Marvin    schedule 20.08.2015

Тип визуализации «таблица данных» должен позволять агрегировать («группировать по») ваше class поле и отображать количество.

РЕДАКТИРОВАТЬ: ой, неправильное поле.

В исходном Grok вы помещаете все после номера строки обратно в message. Чтобы извлечь местоположение исключения из этой строки, вам понадобится еще одна строфа Grok.

Как выглядит шаблон, зависит от того, насколько последовательны сообщения об ошибках. В вашем примере это выглядит как «описание дефиса ... двоеточие местоположения». Если они все такие, вы можете составить соответствующий узор.

person Alain Collins    schedule 16.08.2015
comment
Нет, мое поле class представляет класс, в котором возникло исключение, в моем примере: c.m.w.s.proxies.ProxyServlet. Я хочу агрегировать по моему классу исключения: org.apache.http.conn.HttpHostConnectException. Как я могу извлечь его для агрегирования? - person dbaq; 16.08.2015