ELK STACK. The Elastic Logstash Kibana (ELK) Stack… | by Faisal Basha |  Medium

Інтро

У світі сучасної розробки та використання програмних продуктів, ефективне управління логами стало надзвичайно важливим. Це дозволяє забезпечити високу доступність, швидку діагностику та вирішення проблем, а також оптимізацію продуктивності. Один із найбільш популярних інструментів для цієї мети – це ELK стек.

ELK

ELK стек (Elasticsearch, Logstash, Kibana) є потужним інструментом для збору, обробки та візуалізації логів. Інтеграція Spring Boot застосунку з ELK стеком дозволяє централізовано зберігати логи, здійснювати їхній аналіз та створювати інформативні дашборди для моніторингу. У цьому пості ми розглянемо, як налаштувати Docker Compose для ELK стеку та Spring Boot застосунку, а також як налаштувати конфігурації для інтеграції.

Компоненти ELK стеку

Elasticsearch - це розподілений пошуковий та аналітичний двигун/сервер, побудований на Apache Lucene. Він забезпечує швидкий повнотекстовий пошук та аналіз великих обсягів даних у режимі реального часу.

Основні характеристики:

  • Розподілена архітектура, що забезпечує високу доступність та масштабованість

  • Підтримка RESTful API для взаємодії

  • Гнучкість схеми, що дозволяє зберігати дані різної структури

  • Можливість агрегації та аналізу даних

Logstash - це інструмент для збору, обробки та передачі логів. Він може приймати дані з різних джерел, трансформувати їх та відправляти в Elasticsearch або інші сховища.

Ключові особливості:

  • Підтримка широкого спектру вхідних та вихідних форматів

  • Можливість фільтрації та трансформації даних на льоту

  • Плагінна архітектура для розширення функціональності

  • Буферизація даних для забезпечення надійності передачі

Kibana - це веб-інтерфейс для візуалізації та аналізу даних, що зберігаються в Elasticsearch.

Основні можливості:

  • Створення інтерактивних дашбордів

  • Потужні інструменти для візуалізації даних (графіки, діаграми, etc)

  • Можливість виконання складних запитів до даних

  • Налаштування оповіщень на основі заданих умов

Як це працює разом

  1. Збір даних. Logstash збирає логи та метрики з різних джерел (файли, бази даних, мережеві потоки).

  2. Обробка. Logstash фільтрує та трансформує дані відповідно до заданих правил.

  3. Індексація. Оброблені дані відправляються в Elasticsearch для індексації та зберігання.

  4. Аналіз та візуалізація. Kibana дозволяє користувачам створювати запити до Elasticsearch та візуалізувати результати.

Розглянемо найпростіший спосіб інтеграції з ELK. Ми логи будемо писати у файл, читати з файлу і відправляти їх просто як рядки, не як json. По цьому можна зробити окремий пост.

Налаштування Docker Compose для ELK

Спочатку, подивимось на ієрархію директорій. Це важливо.

  • elk/logstash/config/logstash.yml

Файл logstash.yml використовується для загальної конфігурації Logstash. Він визначає основні параметри роботи сервісу Logstash, такі як налаштування мережі, шляхи до конфігураційних файлів, etc.

http.host: "0.0.0.0" # Вказує Logstash приймати HTTP-запити з будь-якої IP-адреси
log.level: debug # Рівень логування для виведення докладної інформації для відладки
node.name: logstash # Ім'я вузла Logstash в кластері
path.config: /usr/share/logstash/pipeline/logstash.conf # Шлях до конфігураційного файлу Logstash (logstash.conf)
path.logs: /usr/share/logstash/logs # Шлях до директорії для зберігання логів Logstash
  • elk/logstash/config/logstash.conf

Файл logstash.conf використовується для конфігурації Logstash, Цей файл містить три основні секції: input, filter та output, кожна з яких виконує специфічну роль у процесі обробки даних.

input - Ця секція визначає джерела даних, які Logstash буде збирати та обробляти. Вона вказує, звідки Logstash має отримувати логи або інші дані.

filter - Ця секція визначає, як обробляти, трансформувати або фільтрувати дані, які були отримані з джерел. Вона дозволяє виконувати різні операції, такі як парсинг, перетворення даних та видалення непотрібної інформації.

output - Ця секція визначає, куди будуть відправлені оброблені дані. Це може бути Elasticsearch, інші бази даних, файли або інші системи.

input {
  file {
    path => "/usr/share/logstash/logs/*.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "service-%{+YYYY.MM.dd}"
  }
}
  • elk/docker-compose.yml

version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.13
    ports:
      - "9200:9200" # Порт для доступу до Elasticsearch
      - "9300:9300" # (-)
    networks:
      - elk-network
    environment:
      - discovery.type=single-node # Налаштування для одновузлового кластера
      - xpack.security.enabled=false # Вимкнення безпеки X-Pack для спрощення налаштування

  logstash:
    image: docker.elastic.co/logstash/logstash:7.17.13
    ports:
      - "50000:50000" # Порт для отримання даних Logstash
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml # Налаштування Logstash
      - ./logstash/pipeline:/usr/share/logstash/pipeline # Конфігурації Logstash
      - ../logs:/usr/share/logstash/logs # Логи, які обробляються Logstash
    command: [ "-f", "/usr/share/logstash/pipeline/logstash.conf"] # Команда для запуску з конкретним конфігом
    depends_on:
      - elasticsearch # Запуск Logstash після Elasticsearch
    networks:
      - elk-network # Мережа для взаємодії з іншими сервісами ELK стеку

  kibana:
    image: docker.elastic.co/kibana/kibana:7.17.13
    ports:
      - "5601:5601" # Порт для доступу до Kibana
    depends_on:
      - logstash # Запуск Kibana після Logstash
    networks:
      - elk-network

volumes:
  esdata:
    driver: local # Локальний драйвер для зберігання даних Elasticsearch

networks:
  elk-network:
    driver: bridge # Тип мережі для взаємодії всіх сервісів ELK стеку

Зверніть увагу на volumes(томи) у logstash. Ви маєте правильно замаунтити локальну директорію з логами.

Контейнери взаємодіють через спільну мережу та томи. Застосунок записує логи у спільний том, доступний також контейнеру Logstash. Logstash зчитує ці логи з тому, обробляє їх і відправляє до Elasticsearch через спільну мережу. Elasticsearch індексує отримані дані, а Kibana використовує ці дані для створення візуалізацій і дашбордів для аналізу. Томи забезпечують спільний доступ до даних між контейнерами, а мережа дозволяє контейнерам обмінюватися даними та взаємодіяти один з одним.

Налаштування застосунку для роботи з ELK

  • application.yml (application level)

...
logging:
  level:
    root: info
  file:
    name: logs/community.log
  • docker-compose.yml (application level)

version: '1'
services:
  
  app:
    image: overpathz/communitybot
    build: .
    container_name: community-app
    ports:
      - "8080:8080"
    depends_on:
      - redis
      - rabbitmq
      - db
    environment:
      .. env vars
    volumes:
      - ./logs:/app/logs

.. other containers
- ./logs:/app/logs

Будучи в директорії elk →

docker-compose -f docker-compose.yml build && docker-compose -f docker-compose.yml up -d

Маємо побачити ось це

Запускаємо і дивимось логи

Щоб переконатися, що Kibana працює, переходимо за адресою:

http://localhost:5601/app/home

Чекаємо ще трішки, оновлюємо сторінку і потрапляємо сюди

Окей. ELK піднятий. Далі, билдаємо і ранимо наш застосунок. Та сама команда, але тепер в руті нашого проекту.

docker-compose -f docker-compose.yml build && docker-compose -f docker-compose.yml up -d

У вас може не бути стільки контейнерів, нас цікавить наш основний (якщо це не мікросервіс), в мене це app.

Заходимо всередину → Files → Маємо впевнитися, що наш лог файл справді існує і він не пустий (тобто, що в нього дійсно пишуться логи)

дабл тап на файл і побачимо що все окей

Заходимо в кібану.

Index Pattern (шаблон індексу) в Kibana визначає набір індексів в Elasticsearch для пошуку та візуалізації даних. Наприклад, шаблон service-* включатиме всі індекси, що починаються з service-, як-от service-2023.07.07.

Logstash відправляє* оброблені логи до Elasticsearch, де вони зберігаються в індексах з іменами у форматі service-YYYY.MM.dd. Щоб Kibana могла отримати доступ до цих індексів, потрібно створити відповідний Index Pattern. Таким чином, Logstash обробляє і відправляє дані до Elasticsearch, де вони індексуються і стають доступними для пошуку і візуалізації в Kibana через Index Pattern.

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "service-%{+YYYY.MM.dd}"
  }
}

Тепер, після додавання індекс патерну, заходимо сюди:

Вуаля. Логи в кібані.


https://github.com/overpathz/elk-stack-java

Демо-версія проекту, де за тими ж інструкціями ви зможете запустити ELK стек та застосунок та подивитися на логи (які будуть автоматично згенеровані за вас).

Можливо, з’явиться довгочит про налаштування графани і прометеуса.
Але не від мене.
Yaroslav? :)

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

6.9KПрочитань
1Автори
93Читачі
На Друкарні з 19 квітня

Більше від автора

Вам також сподобається

  • Why Java is the Most Popular Language for Selenium Automation Testing

    Explore why Java is the most popular language for Selenium automation testing, with strong community support, rich libraries, and easy integration.

    Публікація містить описи/фото насилля, еротики або іншого чутливого контенту.

    Теми цього довгочиту:

    Selenium Training
  • Frontend [TypeScript] 2

    TypeScript - Як писати код швидше та надійніше. Про неочевидні речі.

    Теми цього довгочиту:

    It
  • Лямбда-вирази у Java

    Коментар щодо використання лямбда-виразів у програмуванні. Порівняння імплементації ЛВ у різних мовах, функціональне програмування vs/& ООП, особливість імплементації у Java.

    Теми цього довгочиту:

    Java

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається

  • Why Java is the Most Popular Language for Selenium Automation Testing

    Explore why Java is the most popular language for Selenium automation testing, with strong community support, rich libraries, and easy integration.

    Публікація містить описи/фото насилля, еротики або іншого чутливого контенту.

    Теми цього довгочиту:

    Selenium Training
  • Frontend [TypeScript] 2

    TypeScript - Як писати код швидше та надійніше. Про неочевидні речі.

    Теми цього довгочиту:

    It
  • Лямбда-вирази у Java

    Коментар щодо використання лямбда-виразів у програмуванні. Порівняння імплементації ЛВ у різних мовах, функціональне програмування vs/& ООП, особливість імплементації у Java.

    Теми цього довгочиту:

    Java