агрегация логов в графане - PullRequest
0 голосов
/ 29 мая 2020

У меня есть файл журнала, содержащий журналы, который выглядит следующим образом:

{"log_time": "2020-05-28 16:09:02", "log_level": "INFO", "event": "register", "login_key": "key1", "email": "user1.email.com", some other fields}   
{"log_time": "2020-05-28 16:09:03", "log_level": "INFO", "event": "register", "login_key": "key2", "email": "user2.email.com" some other fields}
{"log_time": "2020-05-28 16:09:05", "log_level": "INFO", "event": "button click", "login_key": "key1", some other fields}
{"log_time": "2020-05-28 16:09:06", "log_level": "INFO", "event": "page view", "login_key": "key2", some other fields}

каждый пользователь получает ключ входа в систему, который регистрируется со всеми его / ее действиями. также первое событие - это событие регистрации, которое содержит адрес электронной почты пользователя.

возможно, я прыгаю здесь над головой, но я пытаюсь создать таблицу в Grafana, которая будет показывать для каждого ключа входа в адрес электронной почты и последнего события . поэтому для этого случая это будет:

login_key   email             event           time
key1        user1@email.com   button click  2020-05-28 16:09:05
key2        user2@email.com   page view     2020-05-28 16:09:06

Я попытался создать таблицу, используя Loki в качестве источника данных с соответствующими производными полями, но не смог выполнить агрегацию или даже показать в таблице те поля, которые я хотел .

какие-нибудь идеи о том, как это сделать, используя локи или даже другой источник данных? Я думал попробовать его с elasticsearch, мой файл журнала не такой большой и настроить все filebeat-logsta sh -elasticsearch, так как это кажется немного накладными расходами. Я даже думал написать сценарий python для генерации таблицы и сохранения ее в моем postgres, который уже подключен к графане, но кажется неправильным.

любая помощь будет очень признательна

1 Ответ

2 голосов
/ 05 июня 2020

Хорошо, вы должны помнить об одном важном факте: Loki сильно отличается от других систем агрегирования логов, таких как ELK или Splunk . Хотя они извлекают и индексируют сами по себе, а соответствующие пересылки просто отправляют строки, Loki

не выполняет полнотекстовую индексацию журналов source

Большая часть тегов реализуется сервером пересылки журналов (например, promtail , но могут использоваться и другие серверы пересылки)

Чтобы извлечь данные из журналов, вам необходимо иметь от конвейера до промтейла scrape_configs. Вот пример:

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log
- job_name: nginx
  static_configs:
  - targets:
      - localhost
    labels:
      job: nginxlogs
      __path__: /var/log/nginx/*log

  pipeline_stages:
  - match:
      selector: '{job="nginxlogs"}'
      stages:
      - regex:
          expression: '.*level\s?=\s?(?P<level>[A-Z]*).*ip\s?=\s?(?P<ip>[0-9\.]*).*domain\s?=\s?(?P<domain>[a-z0-9\.]*).*http_status\s?=\s?(?P<http_status>[0-9]*).*user_agent\s?=\s?(?P<user_agent>.*)-'
      - labels:
          level:
          ip:
          domain:
          http_status:
          user_agent:

Здесь при сборе nginxlogs, promtail будет искать некоторые шаблоны строки на основе выражения регулярного выражения, чтобы отправить их в Loki. Изучая Loki с Grafana> 6.6, вы увидите эти метки

О ваших спецификациях c case

Как получить метки

Похоже, в ваших журналах есть уже был структурирован в формате json . Из этого не следует, что Loki будет рассматривать их как поля. Вам нужно будет явно указать в своем конвейере, что:

  • ваши журналы структурированы в JSON
  • полях, которые вы хотите отправить Loki
scrape_configs:
...
  pipeline_stages:
    - match:
      selector: '{name="name_of_your_job"}'
      stages:
      # The JSON stage reads the log line as a JSON string and extracts
      # the "level" field from the object for use in further stages.
      - json:
          expressions:
            log_time: log_time
            event: event
            login_key: login_key
            etc: etc

Как агрегировать по метке при использовании LogQL?

Взгляните на this . Общий синтаксис:

<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

Однако он предназначен для преобразования журналов в метрики (скажем, частота используемых ключей ).

avg(rate(({job="name_of_your_job"})[10s])) by (login_key)

В вашем случае вы не ищете агрегацию . Подробнее о способе отображения последних строк

...