Monitorando um Cluster Kafka com ferramentas Open Source

Prometheus e Grafana

Álvaro Bacelar
6 min readSep 28, 2019

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=full
SyslogIdentifier=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:

saída do comando systemctl

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
saída do comando systemctl

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:

--

--

Álvaro Bacelar

IT Engineer, Infrastructure Especialist, Developer and Enthusiastic DevOps