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

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

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

  • Secure networking. Deep Dive

    Глибоке занурення в протоколи TLS/SSL та інфраструктуру відкритих ключів (PKI). Основні поняття, процес встановлення захищеного з'єднання, роль сертифікатів та ланцюжка довіри

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

    Security
  • Поширені помилки у дизайні REST API

    У довгочиті розглядаються поширені помилки при проектуванні REST API та способи їх уникнення: версіонування, використання DTO, підхід CQRS, робота з мікросервісами, та інші практики для підвищення продуктивності, безпеки й зручності API

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

    Java
  • Java. Короткий огляд еволюції багатопотоковості

    У перших версіях Java багатопоточність реалізовувалася за допомогою класу Thread, який дозволяв створювати нові потоки. Проте ця модель мала багато недоліків:

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

    Java

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

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

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

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