GeralLinux

Gerar gráficos com Grafana e Graphite, Carbon e Collectd

Grafana

Esse definitivamente não é um setup simples. E certamente gráficos com Grafana e Graphite são bem mais apreciados por administradores de sistema do que a galera de IoT. Tem muita beleza, sem dúvida. Mas o setup, não é simples.

Apesar de ter uma série de dependências entrelaçadas, dá pra usar também um broker MQTT para monitorar dispositivos, mas vou deixar essa parte para outra ocasião.

Configuração do ambiente

Para esse setup você vai precisar no mínimo de um computador x86 e uma série de serviços deverão ser configurados:

  • MySQL
  • Apache
  • Carbon
  • Grafana
  • Graphite
  • Collectd

Invés de instalar no sistema nativo, fiz o setup dentro de um container Ubuntu. Logo, o sistema nativo pode ser qualquer um, desde que suporte Docker. Para preparar um container, siga esses passos:

Ao executar o último comando, nos conectamos automaticamente à instância. Se sair, ela pára sua execução. para iniciá-la em background, use o comando:

E para conectar-se ao console novamente:

Como o container foi criado para iniciar o shell, os serviços que rodarão dentro dele precisarão de interação. Por essa razão, fiz um singelo script que inicia os serviços:

Salve esse conteúdo em um arquivo. Eu criei um upServices.sh. Depois dê todas as permissões ao proprietário (que será o root):

Instalação de pacotes

Agora que o sistema está pronto para uso, dentro dele deveremos instalar tudo o que for necessário. Comecemos por esses pacotes:

Configurando o MySQL

Como estamos instalando os pacotes agora, durante a instalação deveremos escolher uma senha para o usuário root, então nada melhor do que começar a configuração por ele mesmo.

Tão logo os pacotes tenham sido instalados, conecte-se ao MySQL (não preciso citar que é digitando mysql no console, certo?) e execute esses comandos:

A senha utilizada para o usuário graphite não precisa ser a mesma que a do usuário root, ok? Só lembre-se de que os serviços que utilizam o usuário graphite devem usar a respectiva senha.

Configuração inicial do Graphite

E já que estamos falando de Graphite, vamos iniciar agora sua configuração. Devemos alterar 3 valores no arquivo /etc/graphite/local_settings.py. Encontre-os no arquivo e defina os seguintes valores:

Após, devemos executar duas vezes o seguinte comando:

Isso porque ocorrerá um erro na primeira execução:

django.db.utils.IntegrityError: (1215, u’Cannot add foreign key constraint’)

Não se preocupe, na segunda vez não haverá mais mensagens de erro e tudo funcionará.

Cache do Carbon no boot

O Carbon é o “cara” que recebe os dados e os repassa. Para configurá-lo, edite o arquivo /etc/default/graphite-carbon e ajuste o parâmetro:

Configurar o tempo de armazenamento

Esses parâmetros são bastante flexíveis, mas siga esse padrão para que reduzamos o tamanho do artigo. Edite o arquivo /etc/carbon/storage-schemas.conf e ajuste-o conforme abaixo:

O arquivo no final deverá ficar mais ou menos assim:

E se for necessário modificar alguma coisa, não se esqueça de parar o serviço, remover os whisper files e reiniciar o serviço. Os arquivos a remover estarão localizados em /var/lib/graphite/whisper.

Feitas essas configurações, já podemos iniciar o serviço:

Mas ainda não vale um sorriso, tem uma enormidade de coisas a configurar ainda.

Configurar o Grahpite web

Não vamos utilizá-lo, mas precisa ser configurado. Comece habilitando o site:

Sempre uso uma porta específica em minhas configurações. Quem me conhece pessoalmente sabe a origem (não, não é por causa do DNS do Google). Configure a porta para 8888 no arquivo /etc/apache2/sites-available/apache2-graphite.conf:

E na configuração de portas do Apache, devemos colocá-la em Listen (/etc/apache2/ports.conf):

Habilite a configuração e reinicie o Apache:

Agora já pode dar um sorrisinho, porque se não obteve nenhum erro, será possível ver o Graphite no browser:

Graphite para o Grafana

Mas calma, não é esse o nosso objetivo. Sigamos.

Instalação do Grafana

Precisaremos adicionar um repositório e baixá-lo via apt. para tal:

Supondo que a configuração não esteja sendo feita em um container, mas sim em um sistema nativo (Ubuntu Xenial ou Debian Stretch), digite esses comandos:

Agora, voltamos ao Apache.

Configurar o Apache como proxy reverso para o Grafana

Essa configuração fará o redirecionamento automatico de HTTP para HTTPS. Edite ou crie o arquivo /etc/apache2/sites-available/apache2-grafana.conf e adicione esse conteúdo:

Já faz um tempinho que não mexia com servidores, mas como sempre digo, o mais importante não é decorar procedimentos, mas absorver conceitos. Tendo os conceitos, as coisas são relembradas ou compreendidas rapidamente. Se quiser dar olhada em algumas coisas relacionadas ao mod_rewrite, veja esse outro artigo que escrevi a respeito.

Agora devemos habilitar uma série de módulos. Se algum módulo for esquecido, cairá diretamente nos logs, não deixe de dar uma olhada em /var/log. Para habilitá-los:

Agora já dá pra dar um sorriso mais largo. mas ainda não acabou:

Primeiro login no Grafana

O usuário e senha padrão são admin. Não se esqueça de mudar isso. Mas sugiro que termine as configurações antes de fazer o login.

Grafana

Depois, com mais tempo e já tendo contemplado o dashboard ao final do processo, sugiro que dê uma olhada no arquivo de configuração do Grafana, que está localizado em etc/grafana/grafana.ini.

Graphite como data source do Grafana

Acima, repare no ícone com o texto “Add data source”. Clique nele e replique os parâmetros descritos.

Grafana backend

Troque Statusengine por Collectd. Ao clicar em “testar e salvar”, nada além desse botão ao lado deve ficar vermelho, ok?

Collectd como backend do Graphite

Tem mil maneira de utilizar o Grafana e o Graphite. Estou descrevendo uma delas nesse tutorial. O Collectd é um daemon que ficará enviando métricas para o Carbon e daí o nível vai subindo até chegar no Grafana. Não precisa se preocupar com o background da coisa, faça funcionar e depois você poderá analisar desfrutando do setup.

A instalação do Collectd traz uma sacola de dependências. Ainda bem que temos o apt:

Arquivo de configuração do collectd

O arquivo de configuração do serviço fica em /etc/collectd/collectd.conf. O hostname no arquivo será seu identificador na árvore de diretórios que aparece no browser quando abrimos a URL do Graphite. Escolha o nome que quiser, mas não use caracteres especiais.

Na parte inicial do arquivo estão dispostos os plugins que podem ser ativados. As sessões de parâmetros para a configuração de cada um deles está mais adiante. Basicamente, se for habilitado o plugin df, sua respectiva sessão pode ser localizada buscando por uma estrutura com abertura e fechamento nesse formato:

Abaixo, um exemplo da configuração para o df:

Se estiver utilizando um container, a raíz do sistema realmente aparecerá como none. Se estiver configurando no sistema nativo, basta pegar o dispositivo raíz com o comando df  ou mount.

É importante atentar-se que, se alguma sessão for descomentada, o respectivo plugin no início do arquivo também deve ser descomentado. O oposto nem sempre é necessário, porque a maioria dos plugins tem parâmtros de configuração padrão que atendem em diversos casos.

Supondo um servidor Apache rodando em uma máquina da rede, um exemplo da respectiva sessão seria algo como:

lembre-se de ajustar o IP correto em todas as partes da configuração.

Personalização de parâmetros

Adicionalmente, parâmetros podem ser incluídos para cada um dos plugins suportados. Para conhecer os parâmetros, refíra-se à página 5 do manual do collectd.conf (digite man 5 collectd.conf no terminal do servidor em que o serviço estiver instalado).

Plugin write_graphite

Esse plugin é a estrela de nossa configuração, dê a devida atenção a essa parte, pois é através dele que conseguiremos publicar as informações no Graphite.

A porta de serviço do Graphite é a 2003/tcp. No parâmetro Prefix podemos adicionar um ponto (como lá está), de modo que todo o conteúdo relacionado a essa configuração seja criado dentro de um diretório chamado collectd.

Configurando o Apache para para reportar status

Puxa, vida. Voltamos ao Apache. Mas quer saber porque a configuração está distribuida? Bem, vou discorrer, querendo ou não.

O caso é que cada configuração está sendo citada conforme a parte a qual está relacionada. Se tiver erro em algum ponto da configuração, através desse tutorial você conseguirá depurar o problema com mais facilidade.

Voltando à configuração, o bloco relacionado ao server status é assim:

O arquivo deve ficar semelhante a esse conteúdo:

Salve a configuração e recarregue o Apache.

Faça um teste inicial para ver se a configuração foi aplicada. Para tal, abra o browser no endereço correspondente ao servidor cuja configuração está sendo aplicada (utilizando abaixo o IP do container com Ubuntu):

O resultado deve ser semelhante a esse:

server status - Grafana

Os gráficos já deverão estar sendo exibidos no painel do Graphite, mas a maneira mais rápida e clara de perceber a comunicação do collectd é avaliando a comunicação. Para tal, utilize o programa tcpdump. Como ele não está instalado por padrão, proceda com a instalação previamente a seu uso:

Para analisar a comunicação pelas flags TCP, utilize a forma mais simples do sniffer:

Aqui temos que dar atenção a alguns pontos específicos. Por exemplo, a interface. No caso do container Ubuntu, a respectiva interface era realmente a eth0, mas é necessário saber qual a interface que estabelecerá a comunicação entre os recursos. Para tal, preceda com a coleta de nomes de interfaces do servidor em questão:

Ainda, a conexão será estabelecida apenas uma vez, tratando-se de um socket bruto com comunicação persistente, por isso ao analisar as flags após dado o início dos serviços, só será possível notar (dentro do período estabelecido como intervalo) as flags PUSH ([P.]) e o placeholder ([.]). Não se preocupe em não ver SYN e ACK se não estiver fazendo o sniffing dos pacotes desde o início do serviço.
Para finalizar os pontos de atenção dessa parte da configuração, podemos ver o número de conexões estabelecidas na porta de serviço com o comando:

Para analisar os dados que estão sendo tramitados entre os pontos, podemos abrir os pacotes para ver seu conteúdo:

A imagem abaixo exemplifica o tipo de saída resultante dos comandos anteriormente citados.

tcpdump - Grafana

Configurar o dashboard do Grafana

Seguindo um exemplo simples da documentação do Grafana, após selecionar o dashboard criado na tela principal pós-login, clique na opção ADD ROW. Aparecerão diversa opções, cada qual para seu propósito. Para gráficos, selecionamos a primeira opção (Graph). Criar-se-á um painel, com o título padrão “Panel Title“. Clique sobre o título e vá à opção Edit. Nesse primeiro momento a aba que se abre é a Metrics. Nela, devemos selecionar o data source então os sub-ítens. Na aba General podemos renomear o painel, entre outras configurações.
Assista o video a seguir para ver um exemplo da criação de um gráfico.

Criação de parâmetros personalizados

Primeiramente, devemos compreender que o receptor dos dados é o serviço Carbon (carbon-agent). O serviço abre um socket na porta 2003 e entre o Collectd e ele, a conexão TCP é persistente. Dependendo do número de processos monitorados e o intervalo de tempo, poderiamos agendar execuções periódicas no Cron do sistema (crontab -e). Nesse caso, executar um script shell também é uma possibilidade, entre tantas outras.

Testando um tópico

Ao enviar um novo tópico, ele é criado automaticamente na estrutura de dados e pode ser alimentado a partir de então. Quando necessário podemos testar previamente o serviço para visualizar o comportamento da monitoração pretendida.

Usando netcat

Utilizando a ferramenta de gerenciamento de pacotes da distribuição Linux em questão, instale o programa netcat. Para esse exemplo, veremos a saturação do disco, portanto devemos instalar também o programa sysstat. Para enviar um tópico através do shell, basta executar o comando a seguir (baseando-se no IP de exemplo 172.17.0.2):

Como exemplificado, a expansão das váriaveis resultaria em algo como:

Repare que temos apenas 3 campos; <metrica> <valor da metrica> <timestamp>.

Para inserir apenas um dado simples de teste, podemos usar a seguinte linha diretamente no shell:

Criando um gerente de serviço

Supopndo que queiramos tirar muitos parâmetros de uma máquina; fazê-lo por shell script abrindo um número de sockets indefinido não é uma boa ideia. Como a conexão TCP com o Carbon é persistente, podemos abrir um socket Python no sistema, que ficaria responsável por repassar os dados através de uma conexão persistente estabelecida entre ele e o Carbon. A recepção desses dados pode acontecer de diversas maneiras. Por exemplo, abrindo UNIX sockets para fazer IPC. O manager então pode receber dados via socket UNIX e repassá-los via conexão TCP.
Outra maneira de fazer esse repasse é mantendo esse serviço gerente recebendo dados de um FIFO (um pipe; um arquivo descritor criado a partir do mkfifo).

Informações complementares importantes

  • Outros backends podem ser configurados para comunicar-se com o Graphite, como o Sensu ou influxDB ou vários outros.

  • Lembre-se de verificar se todos os serviços relacionados estão em execução. No caso de monitoramento da própria máquina de monitoramento, também o collectd. Considerando isso, os serviços que devem estar configurados e em execução são:

mysql
apache2
carbon-cache
grafana-server
collectd

  • Ainda que devidamente configurados, analise os logs do sistema para garantir que não haja um ponto de falha (/var/log/).
  • Não se esqueça que a porta do Graphite é a 8888, para quando desejar abrí-lo no browser.
  • A porta de comuonicação do coletor é a 2003/tcp.

Próximo artigo relacionado

Pretendo mostrar em um próximo artigo a configuração de um outro backend. O Artigo ficará bem menor, já que aqui temos um setup completo de todo o resto.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR

https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR

https://www.facebook.com/groups/raspberrybr/
Orange Pi BR

https://www.facebook.com/groups/OrangePiBR/
Odroid BR

https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR

https://www.facebook.com/groups/SistemasEmbarcadosBR/

Sistemas Eletrônicos

https://www.facebook.com/groups/544679592355388/

Projetos Arduino | Eletrônica

https://www.facebook.com/groups/projetosarduinoeletronica/

ESP8266 e ESP32

https://www.facebook.com/groups/ESP8266BR/

ARM Brasil

https://www.facebook.com/groups/508153815944410/

MIPS BR

https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte

https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!