O 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 Docker. Todos 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:
Exemplo de dashboard com visualization agrupando as requisições por status code.
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!