Практическое применение elasticsearch+fluent-bit

Данная связка будет применяться для хранения логов от приложений. Ниже пример compose файла:

version: "3.5"
services:
  elasticsearch:
    image: elasticsearch:8.19.3
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.type=single-node
      - xpack.security.enabled=false  # Disable security for development
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/logs:/usr/share/elasticsearch/logs
  fluentbit:
    build: .
    ports:
      - "8888:8888"
      - "24224:24224"
      - "24224:24224/udp"
    depends_on:
      - elasticsearch

Примеры Dockerfile для сервиса fluentbit:

FROM fluent/fluent-bit:4.0
ADD fluent-bit.conf /fluent-bit/etc/

Пример конфигурации fluent-bit.conf

[SERVICE]
    log_level debug

[INPUT]
    Name http
    Listen 0.0.0.0
    port 8888

[INPUT]
    Name forward
    Listen 0.0.0.0
    port 24224

[OUTPUT]
    Name es
    Match **
    Host elasticsearch
    Port 9200
    # When Logstash_Format is enabled, the Index name is composed using a prefix and the date
    #Logstash_Format True
    Suppress_Type_Name On
    Index logs
    Id_Key id
    # HTTP_User <user>
    # HTTP_Passwd <pw>
    # Alternative time key, useful if your log entries contain an @timestamp field that is used by Elasticsearch
    # Time_Key es_time
    # If your Elasticsearch is using TLS, configure this
    # tls On
    # tls.verify Off

В итоге должна быть следующая структура:

  • elasticsearch — папка для хранения данных от elasticsearch, подключенная через volume
  • docker-compose.yml — файл compose
  • Dockerfile — собственный образ fluent-bit:4.0
  • fluent-bit.conf — конфигурация fluent-bit

После выполнения команды docker compose up будут запущены хосты:

Примеры

Передача данных при помощи curl:

curl -X POST -H "Content-Type: application/json" -d '
{
	"@timestamp":"2099-11-15T13:12:00",
	"message":"Hello World"
}' "localhost:9200/logs/_create/1"

Передача данных через python:

from fluent import sender
from fluent import event
 
sender.setup('INFO', host='localhost', port=24224)
event.Event('INFO', {
    "id": 2,
    "@timestamp":"2099-11-15T13:13:00",
    "message":"Hello World"
})

Пример проекта на github

Добавить комментарий