:::: MENU ::::

Configurando ELK com Docker e Filebeat

ELK (Elasticsearch, Logstash e Kibana) tomou espaço muito rapidamente no mundo dos logs e das métricas, principalmente por ser open-source e altamente escalável. Mesmo com tamanha adoção esta stack não é simples de configurar, muito pelo contrário, ela exige um bom conhecimento de cada um dos membros que formam o trio ELK.

Neste post a orquestração dos serviços será feita usando o docker-compose na versão 2 que dispensa o uso de links para rede entre os serviços (para entender melhor leia este artigo) e cada um rodará em um container DockerTodos os arquivos estão disponíveis neste repositório, basta clonar e seguir o tutorial abaixo.

Iniciando o ELK

No arquivo docker-compose.yml está toda a configuração do docker-compose para orquestrar o ELK e o Filebeat (que vou explicar na sequência).

O primeiro serviço a ser configurado é o Elasticsearch, o servidor de busca distribuido que irá armazenar os logs. A imagem utilizada está na versão 2.3.

  elasticsearch:
    image: elasticsearch:2.3.3
    command: elasticsearch -Des.network.host=0.0.0.0

O segundo serviço é o Kibana. O Kibana permite a criação de vizualizações e dashboards baseadas em buscas realizadas no elasticsearch. Na configuração abaixo, além de expor a porta 5601 para que a interface web fique acessível, também é configurada a dependência do container do elasticsearch com o parâmetro depends_on que informa ao docker-compose que o container do elasticsearch deve ser iniciado primeiro.

  kibana:
    image: kibana:4.5.1
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

O terceiro serviço é o Logstash que é o responsável por parsear os logs e enviar para o elasticsearch. Para que seja possível alterar as configurações do logstash na hora de iniciar o container foi utilizado o parâmetro volumes do docker-compose, que permite sincronizar diretórios da maquina host com o container. O parâmetro command informa para o logstash qual arquivo de configuração ele deve carregar, ou seja, o arquivo que foi sincronizado para dentro do container.

  logstash:
    image: logstash:2.3.2
    command: logstash -f /etc/logstash/conf.d/logstash.conf
    volumes:
      - ./logstash:/etc/logstash/conf.d
      - ./logstash/patterns:/opt/logstash/patterns
    depends_on:
      - elasticsearch

O ultimo serviço é o Filebeat. Filebeat é responsável  por ler os arquivos de log e enviar para o logstash. Na configuração dele além de sincronizar a configuração também é sincronizado o diretório de logs  “../fake-logs:/var/log” que neste caso deve ser alterado para o caminho de onde estão os logs que devem ser parseados.

  filebeat:
    image: prima/filebeat
    volumes:
      - ./filebeat/filebeat.yml:/filebeat.yml
      - ../fake-logs:/var/log
    depends_on:
      - logstash

Configurando o Filebeat

O filebeat remove a necessidade do logstash de ler arquivos diretamente do disco, esse comportamento é similar a produção, quando não é possível ter acesso ao disco de um servidor para ler os logs, desta maneira os logs serão enviados para o logstash através de uma determinada porta.
Dentro de “./filebeat” esta o arquivo de configuração filebeat.yml responsável por toda a configuração da leitura de logs.

filebeat:
  prospectors:
    -
      paths:
        - /var/log/nginx/vs_access.log
      input_type: log
      document_type: nginx_access
      scan_frequency: 10s
    -
      paths:
        - /var/log/error.log
      input_type: log
      document_type: app_error
      scan_frequency: 10s
output:
  logstash:
    hosts: ["logstash:5044"]
logging:
  files:
    rotateeverybytes: 10485760 # = 10MB
  selectors: ["*"]
  level: warning

Prospectors são um ou mais paths de arquivos que o filebeat ficara acompanhando em busca de mudanças para enviar para o logstash. Cada paths possui parâmetros adicionais como document_type que é referente ao type do elasticsearch  onde o log sera salvo.

O output foi configurado para o logstash usando o host “logstash:5044” referente ao container docker com o nome de logstash.

Mais opções de configurações para o filebeat podem ser encontradas aqui.

Configurando o Logstash

Agora que o filebeat ja está configurado e pronto para enviar logs para a porta 5044 do logstash, o mesmo deve estar pronto para receber e parsear esses dados e também envia-los para o elasticsearch depois de parseados.

O arquivo “logstash.conf” dentro de “./logstash” vai ficar assim:

input {
  beats {
    port => 5044
  }
}

filter {
  if [type] == "nginx_access" {
    grok {
      patterns_dir => "./patterns"
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
  }
}

output {
  elasticsearch {
    hosts => "elasticsearch"
  }
}

O logstash consiste em três etapas: Input (onde os dados entram), Filter (onde são parseados) e Output (saída). O input acima esta configurado para o filebeat na porta 5044, tudo que for recebido nesta porta sera tratado como algo enviado pelo filebeat.

Na etapa de filter é realizado um teste que verifica se os dados fazem parte do type nginx_access, caso sim, é usado o plugin grok que permite realizar expressões regulares nos logs. COMBINEDAPACHELOG é um grupo de expressões regulares que consegue fazer parse das linhas de log do arquivo nginx_access, para descobrir qual tipo de parser consegue parsear uma determinada linha de log foi usado o grok debugger.

O output será feito apenas para o elasticsearch. No hosts  foi passado apenas o nome do container ja que o tutorial usa docker.

Iniciando o docker compose 

Para iniciar os serviços basta rodar o comando “docker-compose up” no mesmo diretório onde está o arquivo docker-compose.yml. O kibana estará disponível na porta 5601:

Screen Shot 2016-07-11 at 8.12.58 PM

 

Exemplo de dashboard com visualization agrupando as requisições por status code.

Screen Shot 2016-07-20 at 9.13.59 PM

O intuito de escrever este post foi para introduzir a configuração, o video a seguir repassa esses pontos e fala sobre como criar dashboards e vistualizations no kibana.

Até o próximo galera, valeu!

Share this content