Monitorando um Cluster Kafka com ferramentas Open Source
Prometheus e Grafana
Um dos principais pontos para que possamos tomar medidas assertivas é monitorando nossas aplicações e infraestrutura. A monitoração é um conceito que não pode faltar no seu dia a dia como SysAdmin e/ou DevOps.
O Apache Kafka é um dos mais utilizado e consolidado sistemas de Publish Subscribe (PubSub). Porém, um cluster Kafka (como qualquer outra ferramenta e aplicação) sem monitoração é um risco grande para o seu negocio.
Nesse post vou mostrar como é fácil configurar uma monitoração para um cluster Kafka com ferramentas Open Source (Prometheus e Grafana).
Vamos partir do pressuposto de que o seu cluster já esteja funcionando, vamos apenas acoplar a monitoração nele.
A versão do Apache Kafka que vamos utilizar no nosso lab é a versão da Confluent.
O primeiro passo é configurar o server que ficará o Prometheus e Grafana. Eles podem ficar no mesmo servidor ou você pode configurar servidores separados, ai fica ao seu critério.
Instalando o Prometheus
Para instalar o Prometheus vamos seguir os passos abaixo:
Acesse a página de download do Prometheus e baixe a ultima versão no link abaixo:
No momento em que escrevo esse post a versão mais estável é a 2.30.3, vamos utilizar essa no nosso lab.
Baixando o Prometheus:
# wget https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz
Descompactando no diretório /srv
# tar -zxvf prometheus-2.30.3.linux-amd64.tar.gz -C /srv/
Criando o grupo e usuário de sistema para o prometheus
# useradd -s /usr/sbin/nologin prometheus
Mudando o dono da pasta do prometheus
# chown prometheus:prometheus /srv/prometheus-2.30.3.linux-amd64/ -R
Adicionando o arquivo service do prometheus
# vim /etc/systemd/system/prometheus.service
O arquivo acima deve conter o seguinte conteúdo
[Unit]
Description=Prometheus
After=network-online.target[Service]
Type=simple
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/srv/prometheus-2.30.3.linux-amd64/prometheus --config.file=/srv/prometheus-2.30.3.linux-amd64/prometheus.yml --storage.tsdb.path=/srv/prometheus-2.30.3.linux-amd64/data --web.listen-address=0.0.0.0:9090
LimitNOFILE=65000
LockPersonality=true
NoNewPrivileges=true
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectHome=true
RemoveIPC=true
RestrictSUIDSGID=true
ProtectSystem=fullSyslogIdentifier=prometheus
Restart=always[Install]
WantedBy=multi-user.targe
Executando o daemon-reload e iniciando o serviço
# systemctl daemon-reload
# systemctl start prometheus
Para ver se o serviço iniciou com sucesso:
# systemctl status prometheus
Se tudo ocorrer bem, a saída do comando acima será algo parecido com isso:
Nós colocamos para o Prometheus ficar disponível na porta 9090, então vamos acessa-lo:
http://seu-ip:9090
Com o prometheus funcionando vamos agora realizar o mesmo procedimento de instalação para o Grafana
Instalando o Grafana
A instalação do Grafana é mais fácil, para instala-lo basta acessar o seguinte link https://grafana.com/grafana/download e seguir os passos descrito no link.
Depois de instalado, vamos iniciar o Grafana
# systemctl start grafana-server
O Grafana por padrão sobe na porta 3000, então vamos acessa-lo
http://seu-ip:3000
O usuário e senha default do Grafana é admin, no seu primeiro acesso é solicitado para trocar.
Após acessar o Grafana, vamos adicionar o datasource do Prometheus:
Clique na opção “add data source”
Depois escolha a opção Prometheus
Como o Prometheus está rodando no mesmo servidor, no nosso caso, vamos colocar o localhost no campo URL. Se você estiver executando em servers separado coloque o IP e porta do servidor que está rodando o Prometheus. Depois clique em “Save & Test”
Seu Grafana e Prometheus estão instalados, agora vamos instrumentar os agentes de monitoração no cluster Kafka.
Configurando jmx_exporter
Nas máquinas do Kafka vamos baixar os seguintes arquivos.
# wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar# wget https://raw.githubusercontent.com/prometheus/jmx_exporter/master/example_configs/kafka-2_0_0.yml
Vamos mover esses arquivos para dentro do diretório do Kafka
# mv jmx_prometheus_javaagent-0.16.1.jar kafka-2_0_0.yml /etc/kafka/
Agora vamos alterar o arquivo service do Kafka
# vim /usr/lib/systemd/system/confluent-kafka.service
Adicione a linha abaixo no service do kafka. O nosso agent do Prometheus irá subir na porta 8081, caso queira outra porta altere a parte destacada abaixo.
Environment="EXTRA_ARGS=-javaagent:/etc/kafka/jmx_prometheus_javaagent-0.12.0.jar=8081:/etc/kafka/kafka-2_0_0.yml"
O arquivo service deve ficar mais ou menos assim:
Depois execute o comando daemon-reload e faça um rolling restart no seu cluster Kafka
# systemctl daemon-reload
# systemctl restart confluent-kafka
Depois de seguir os passos acima, já temos o nosso cluster Kafka expondo as métricas na porta configurada, para ver se deu certo, acesse o ip do kafka na porta 8081 e verá algo parecido com a imagem abaixo:
Configurando o Prometheus
Agora vamos adicionar os targets no Prometheus para que o nosso server busque as métricas nos servidores Kafka.
Acesse o servidor do Prometheus e altere o arquivo abaixo:
# vim /srv/prometheus-2.30.3.linux-amd64/prometheus.yml
Adicione no final do arquivo as seguintes linhas:
- job_name: 'kafka'
static_configs:
- targets: ['XXX.XXX.XXX.XXX:8081', 'XXX.XXX.XXX.XXX:8081', 'XXX.XXX.XXX.XXX:8081']
Depois execute um reload no serviço do Prometheus:
# systemctl reload prometheus
Agora nosso servidor Prometheus está buscando as métricas nos servers Kafka. Para ter certeza que deu certo, acesse o Prometheus e vá no menu Status > Targets. Nele você verá as máquinas em estado UP:
Vamos adicionar um dash no Grana para visualizar as métricas de maneira mais simples. Acesse o link abaixo do dash especifico para as métricas do Kafka e copie o seu ID:
No Grafana, importe o dash clicando no botão “+” e depois “Import”. Na página de import, cole o id do dash acima, ao colar o ID irá carregar a seguinte página:
Selecione o data source do Prometheus já configurado anteriormente em “Select a Prometheus data source” e depois clique em “Import” .
Pronto, temos o nosso cluster Kafka monitorado e com o dash configurado no Grafana:
Agora vamos produzir e consumir mensagem para ver como os gráficos vão se comportar.
Com o comando abaixo iremos produzir 50 milhões de mensagem e depois consumir-las:
$ kafka-producer-perf-test --topic meu-topico --num-records 50000000 --record-size 100 --throughput -1 --producer-props acks=1 bootstrap.servers=127.0.0.1:9092 batch.size=990000
Consumindo as mensagens:
$ kafka-console-consumer --bootstrap-server localhost:9092 --topic meu-topico --from-beginning --max-messages 50000000
Ao rodar os testes, veremos o nosso gráfico mostrando quantas mensagens estão entrando por segundo e quantos bytes estão saindo por segundo.
Conclusão
O Apache Kafka oferece centenas de métricas via JMX e nesse post mostrei as mais básicas para você monitorar o seu cluster. Para ter um ambiente confiável e escalável, é necessário você ter sempre boas métricas e alertas, pois é isso que vai lhe ajudar nos momentos de troubleshooting.
Se você quer saber quais são todas as métricas disponíveis e o que é cada uma segue o link da documentação do Kafka com todas as métricas disponíveis: