ElasticSearch (ELK Stack) ajudando na qualidade do software

No post anterior lancei o desafio Como a Ciência de Dados pode melhorar a Qualidade do Software onde abordei necessidades, dados, a ciência de dados e as perguntas.

Neste post o objetivo é abordar as ferramentas que nos ajudarão a encontrar as respostas que queremos encontrar, ou seja, com as ferramentas poderemos extrair indicadores importantes para garantir a qualidade do software.

Do que precisamos ?

Precisamos de algo que nos forneça informações rápidas, de fácil visualização, on-line, desburocratizada, que nos leve facilmente às possíveis causas, que permita comparar, etc.

Abaixo um exemplo de um painel que nos dá informações neste aspecto:
kibana dashboard

Escolhendo as ferramentas certas

Seria muito simples se a ferramenta nos entregasse as respostas prontas, apenas conhecendo os arquivos de log certo? SIM. Mas enquanto ainda não chegamos neste nível, deixamos as áreas de inteligência artificial e aprendizado de máquina evoluam e vamos partir para a “mão na massa”.

Para inferir algo sobre a qualidade de software é necessário que tenhamos dados para extrair informações.  Precisamos coletar os logs deixando-os prontos para gerar relatórios na forma de gráficos, relatórios e painéis.

Você tem muitas opções para fazer isso, desde construir sua própria solução na linguagem de sua preferência,  adquirir um conjunto de ferramentas que fazem isso para você ou ainda procurar uma solução especializada free e open source.

Basicamente as opções são:

  1. Importar os arquivos manualmente em planilhas (Excel, LibreOffice, Google Docs), limpar os dados, agregar e gerar os resultados. Isso toda vez que os dados chegarem, ou seja, todo dia;
  2. Utilizar ferramentas muito boas e pagas, como por exemplo o Splunk;
  3. Pesquisar ferramentas free de código aberto, estáveis, que de tão toda abertura e flexibilidade para ajustes personalizados.

Durante algum tempo fiz tudo isso manualmente, mas é muito trabalhoso ficar gerando relatórios em planilhas. Ainda mais quando o volume diário de dados chega a 2 gigabytes compactados, por servidor. Depois de fazer isso muitas vezes, você tem que extrair a parte positiva de tudo isso: você aprende muito bem como são seus dados de log e extrai o que é realmente importante. Ou seja, você aprende a limpar os dados e tirar os lixos, trazendo o que é realmente de ajudará a buscar as respostas.

Depois de estudar essas possibilidades fui muito tendencioso à terceira opção. 😉

Por fim, conhecendo quais são os logs, o conteúdo deles, conhecendo a necessidade cheguei a Stack ELK: Elasticsearch, Logstash e Kibana.

General ELK Stack

Por que a Stack ELK ?

A Stack ELK é “foi feita para isso”, ou seja, é especializada. Nosso papel passa a ser customizar: Coletar os dados da melhor forma, automatizar a demanda (ou fazer coletas em lote) e criar bons relatórios para apresentação de resultados ou evidências que atendam nossa necessidade.

O Elastic.co possui um amplo e excelente conteúdo, além de bons exemplos. Você encontra também alguns Use Cases, e melhor ainda Use Cases High Tech citando algumas importantes organizações que utilizam a Stack ELK.

A Stack ELK oferece um conjunto de aplicações e utilitários, cada uma com um propósito, que combinadas oferecem uma plataforma de busca e análise de dados. O Logstash captura os dados de log, o ElasticSearch cataloga e armazena os dados para análise em tempo real, inclusive com linha do tempo, e o Kibana transforma os dados em poderosas visualizações, relatórios e painéis.

A plataforma é construída como o motor Apache Lucene através da licença Apache 2 Open-Source Licence.

Principais características:

  • Ferramenta poderosa para geração de análises rápidas;
  • Visualização de dados com o Kibana;
  • Orientado a documentos;
  • Sem necessidade de esquemas (Schema free), interpretação automática dos tipos de dados;
  • Gerência de conflito, com controle de versão otimizado;
  • Utilizam APIs padrões de mercado como RESTful e JSON.
  • Utilizam linguagens de programação conhecidas como Ruby, Java, NodeJs;
  • Funcionam em Linux e Windows;
  • Permite configuração para escalabilidade, se for necessário;
  • Permite configuração para alta disponibilidade, se for necessário;

Coletando os logs: Logstash

logstash-large-log-1[1]

O desafio do Logstash é “simples”: coletar os logs. Você pode usá-lo de forma simples, ou seja, coletar os logs e enviá-los “como são” sem processamento algum. Mas você também pode usá-lo filtrando os logs, transformando as informações, agregando os dados, etc.

Logstash é uma ferramenta para coletar eventos e logs. Escrito em JRuby requer a JVM para executar. Usualmente um client do logstash é instalado por host, e pode receber dados de múltiplas fontes incluíndo arquivos de log, eventos do Windows, eventos syslog, etc. A parte negativa do uso da JVM é a alocação de memória que pode ser mais alto do que você espera.
O slogan dele é “Collect, Enrich & Transport Data”, ele oferece uma sintaxe própria para interpretar os arquivos de logs, transformar os dados e depois enviar para “alguma lugar”, no nosso caso, o ElasticSearch.

O objetivo deste post náo é dar uma “graduação” em Logstash, para isso recomendo que você se aprofunde na página de documentação. Porém quero citar um pouco da forma configurá-lo, que achei muito simples e fácil.

A sua configuração é baseado em um arquivo de configuração, ou seja, um arquivo para cada “tipo” de log.
O conteúdo deste arquivo é textual e exige no mínimo as seções “input” e “output”, além do “filter” que é opcional.
Cada seção aceita plugins que é a parte mais poderosa e abrangente do Logstash que permite que você consiga importar “qualquer coisa” em alguns casos até incluir trechos de código ruby.

As seções do arquivo de configuração do Logstash:

  • input: Descreve basicamente as informações para que o Logstash conheça os arquivos de entrada, o formato, a frequência de leitura, o tipo de arquivo (CSV, texto puro, XML, JSON, linhas com base em tamanho das colunas, etc), o CHARSET;
  • filter: Define os metadados, ou seja, cada variável, tipo de dado, formatação, transformação, qual dado será aproveitado, qual será descartado, conversão de data e hora, etc.
  • output: Determina como os dados serão armazenados ou enviados. Armazenados em um arquivo em um formato desejado. Ou ainda enviados para alguma base de dados relacional ou não, no nosso caso o ElasticSearch.

Um exemplo da sintaxe do arquivo de configuração com dados ficticios – file.config:

input {
  file {
    path => "/etc/app/log/operations.log"
    type => "csv"
  }
}
filter {
  mutate {
    gsub => [
      # replace all forward slashes with underscore
      "message", "\"", "'"
    ]
  }
  csv {
    separator => ";"
    columns => [ "CLIENT","CALL1","CALL2","CALL3","OPERATION","TYPE",   "DATABASE","POOL","CONNECTION","USERID","CLIENTIP","DATE","TIME","CLASSNAME","METHOD" ]
    add_field => { "CALL" => "%{CALL1}.%{CALL2}.%{CALL3}" }
  }
  mutate {
    add_field => { "DATETIME" => "%{DATE} %{TIME}" }
  }
  date {
    locale => "br"
    match => ["DATETIME", "dd/MM/YYYY HH:mm:ss.SSS"]
    timezone => "America/Sao_Paulo"
    target => "@timestamp"
    add_tag => "dateHoraOk"
    remove_field => "DATETIME"
  }
}
output {
  elasticsearch {
    host => localhost
    protocol => "http"
    port => 9200
    index => "myindex-2015.09"
  }
}

Para executar o Logstash basta especificar o arquivo de configuração com o flag “-f”:

 bin/logstash -f file.config

Logstash ou Bulk API do ElasticSearch

Minha experiência com o Logstash é a seguinte: é uma ferramenta excelente e resolve uma gama de problemas de interpretação de arquivos de log e extração de dados, além de você encontrar na internet uma gama de arquivos de configuração prontos para uso, principalmente gerados por aplicações de mercado como JBoss, Apache HTTP, Wildfly, Linux, Postgresql, Tomcat, etc. Ou seja, está pronto para uso quando você simplesmente quer coletar os logs e armazenar.

Em alguns casos o arquivo de configuração Logstash ficou muito complexo, extenso e difícil de entender. Principalmente quando você começa a acrescentar muitos plugins para agregar dados, incluir condições, eventos, etc.

A execução do Logstash on-line concorrendo com a aplicação principal, coletando as informações dos arquivos junto com a geração dos logs ficou bem “pesada”. Durante o monitoramento do uso dos recursos, o Logstash consumiu muito os recursos de Disco, CPU e memória.

Essas situações abriram precedentes para pesquisa e onde encontrei uma alternativa: o uso da API RESTful do ElasticSearch para envio dos logs, a API Bulk.

A API Bulk permite que você envie os dados no formato JSON. O ElasticSearch é NO-SQL e No-Schema, ou seja, vai aceitar e interpretar os dados conforme você mandar, tanto que você obedeça sua API, tudo com objetos JSON. Muito mais fácil enviar um conjuntos de dados no estilo Chave x Valor concorda?

Eu criei um agente com conjunto de classes para facilmente  enviar dos logs via Bulk, atendendo necessidades específicas como geração de dados estatísticos antes de armazenar. Se tiver curiosidade posso descrever em outro post.

Existem alguns plugins prontos em Perl e Python que utilizam esta API.

ElasticSearch

logo-elastic[1]

Você pode instalar o ElasticSearch  em algumas distribuições linux, MacOS e Windows. Após instalado você pode configurar para receber requisições somente no host instalado ou de qualquer outro host.

Uma grande vantagem do ElasticSearch é que ele é muito simples de instalar e “sair usando”. Salvo situações onde você quer incluir configuração de cluster, replicação, alta escalabilidade, alta disponibilidade, backup, estratégia de rotação e limpeza de dados, etc. Para estes casos sugiro também um outro post.

Para o nosso caso ficamos com a parte simples do ElasticSearch: deixá-lo pronto para aceitar requisições do Logstash ou ainda da API Bulk (REST) e deixá-lo pronto para “espetar” o Kibana para análise e geração de painéis e gráficos.

O Kibana é o Cara

kibana

Instalando o Kibana você tem disponível uma sistema ligado diretamente aos índices gerados do ElasticSerach. Além de uma interface web pronta para configurar os índices e tipos de dados que você deseja analisar.

Kibana é o frontend da Stack ELK onde você consegue visualizar os dados enviados pelo Logstash ou Agente próprio, armazenados no ElasticSearch tudo isso em uma interface web.

O Kibana precisa conhecer quais índices do ElasticSearch ele vai avaliar, para isso você precisa apenar incluí-los através de uma tela específica do Kibana, mas garanto que é super simples.

As principais interações que o Kibana oferece:

  • Discover: Nesta seção você visualiza os dados, de um determinado índice, na forma de histograma, além de pesquisar pelos dados utilizando a sintaxe Lucene em tempo real;
  • Visualize: Seção específica para criar novas views que pode ser uma tabela, um gráfico de linhas, de pizza, de barras, um texto, um big number etc. Basicamente você cria views para depois compor os painéis (Dashboards);
  • Dashboard: Seção muito útil para apresentar dados analíticos, em tempo real, com atualização automática. Você pode criar painéis compondo diferentes views criadas na seção Visualize.

“Google It”: Faça um busca rápida no Google Imagens e você vai encontrar muitos dashboards gerados pelo Kibana, essenciais para vários tipos de análises de dados.

Views e Dashboards

kibana dashboard

Dashboard

Este dashboard a esquerda apresenta claramente uma análise de operações mais “pesadas” no servidor:

  • A tabela da esquerda mostra as Top 10 operações ordenadas por tempo de execução x quantidade de execuções;
  • Gráfico de pizza com as Top 10 operações apresentando a proporção de cada operação em relação às outras;

Gráfico empilhada do barras por dia apresentando a projeção das Top 10 operações mais executadas juntamente com uma linha do tempo.

dashboard3
Gráfico de barras
Esta view a direita apresenta as Top 10 telas mais lentas, com base no tempo médio de execução no servidor. Note que a tela mais lenta chega a quase 2 minutos de tempo médio de execução e a 10ª tela mais lenta está entre 600 e 800 milissegundos de tempo médio.

dashboard2

Gráfico de barras empilhadas com linha do tempo

view da esquerda apresenta as Top 5 SQLs mais pesadas por dia. Note que a SQL mais lenta se repete todos os dias.

 

E as respostas?

Neste post descrevi as ferramentas, portando não falamos diretamente das respostas mas sim do “motor” que nos levará até elas.

Sobre as respostas que queremos, lembre-se: em alguns casos encontraremos as respostas imediatamente e até literalmente. Em outros casos encontraremos apenas os registros de fatos que nos ajudarão a chegar às respostas.

Dica: Sugiro fortemente que você pesquise sobre o termo “Data Driven” no Google. Tem muitos artigos ajudando a ver o quanto é importante darmos direção às nossas decisões e idéias com base em dados reais, fatos, evidências. Mas esse é outro assunto… 😉

Conclusão

Agora conhecemos as  ferramentas indicadas para gerar indicadores para garantir a qualidade do software.

Os detalhes sobre instalação e configuração das ferramentas não foram abordados. Caso você considere relevante poderei produzir um post sobre instalação e configuração do Logstash, ElasticSearch ou Kibana, solicite nos comentários, será um prazer ajudá-lo.

Conforme prometido no post anterior cumpro aqui parte da minha “promessa” que era:

  • Armazenamento das evidências;
  • Geração de gráficos e dashboards;
  • Automação das operações de coleta;

Pretendo dar continuidade e detalhes deste assunto nos próximos posts.

Agradeço muito seu interesse e paciência. Espero seu comentário.

The following two tabs change content below.

Fabiano de Freitas Silva

Software Engineer at Softplan
Mais de 15 anos de experiência em Engenharia de Software, Desenvolvimento de Aplicativos, Administrador de banco de dados e Gestão de Projetos em uma ampla variedade de aplicações. Na Softplan atua como Analiste de Suporte ao Desenvolvimento, Scrum Master em uma Time Ágil, apoiador na tomada de decisões de liderança técnica, apoiador e facilitador de equipes de desenvolvimento de sistemas, entre outras demandas. Programador em sistemas de multithreading de alta disponibilidade para proporcionar uma melhor performance.

Sobre Fabiano de Freitas Silva

Mais de 15 anos de experiência em Engenharia de Software, Desenvolvimento de Aplicativos, Administrador de banco de dados e Gestão de Projetos em uma ampla variedade de aplicações. Na Softplan atua como Analiste de Suporte ao Desenvolvimento, Scrum Master em uma Time Ágil, apoiador na tomada de decisões de liderança técnica, apoiador e facilitador de equipes de desenvolvimento de sistemas, entre outras demandas. Programador em sistemas de multithreading de alta disponibilidade para proporcionar uma melhor performance.

Deixe uma resposta