Monitorando nosso gerador de senhas com Prometheus e Grafana
No Kubernetes o Prometheus coleta métricas do Kubernetes de várias maneiras:
Exportadores: O Prometheus utiliza exportadores para coletar métricas de diferentes componentes do Kubernetes, como:
kube-state-metrics: Coleta métricas sobre o estado dos objetos do Kubernetes, como Pods, Nós, Deployments, etc.
node-exporter: Coleta métricas sobre o hardware e sistema operacional dos nós do Kubernetes.
Endpoints de métricas: Alguns componentes do Kubernetes, como o API server, controller manager e scheduler, expõem seus próprios endpoints de métricas que o Prometheus pode scrape diretamente.
Descoberta de serviço: O Prometheus utiliza a descoberta de serviço do Kubernetes para encontrar automaticamente os alvos (targets) a serem monitorados, como Pods e Serviços.
Regras de alerta: O Prometheus permite definir regras de alerta com base nas métricas coletadas, que podem ser usadas para notificar sobre problemas no cluster Kubernetes.
Então, em resumo, o Prometheus utiliza uma combinação de exportadores, endpoints de métricas e descoberta de serviço para coletar as métricas do Kubernetes de forma abrangente e automatizada.
O Prometheus utiliza uma combinação de exportadores, endpoints de métricas e descoberta de serviço para coletar as métricas do Kubernetes de forma abrangente e automatizada.
Em nosso projeto criamos dois objetos Kubernetes, o PodMonitor
e o ServiceMonitor
para monitorar a nossa aplicação.
Definição dos objetos
Instalando o Prometheus e o Grafana
Para fazer a instalação do Prometheus use os comandos abaixo:
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
kubectl create -f manifests/setup
kubectl create -f manifests/
Acessando o Prometheus
kubectl get service -n monitoring
kubectl port-forward -n monitoring service/prometheus-k8s 9090:9090
Acessando o Grafana
kubectl port-forward -n monitoring service/grafana 3000:3000
Por padrão a senha e o usuário do Grafana é admin
, posteriormente será solicitada a troca de senha. Foram criados manifestos de ingress para acessar o Prometheus e o Grafana, disponíveis na pasta /monitoring
.
As aplicações estão acessíveis através dos seguintes endereços:
Prometheus: https://prom.nataliagranato.xyz/
Grafana: https://grafana.nataliagranato.xyz
Criando um service monitor e um pod monitor
Para monitorar a nossa aplicação, criamos um ServiceMonitor
e um PodMonitor
. O ServiceMonitor
monitora os serviços da aplicação e o PodMonitor
monitora os pods da aplicação. As definições dos objetos estão disponíveis na pasta /monitoring
.
O nosso ServiceMonitor monitora o serviço giropops-senhas
no namespace giropops-senhas
:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: giropops-senhas
name: sm-giropops-senhas
namespace: giropops-senhas
spec:
endpoints:
- port: tcp-app
selector:
matchLabels:
app: giropops-senhas
O nosso PodMonitor monitora os pods do deployment giropops-senhas
no namespace giropops-senhas
:
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
labels:
app: giropops-senhas
name: pd-giropops-senhas
namespace: giropops-senhas
spec:
selector:
matchLabels:
app: giropops-senhas
podMetricsEndpoints:
- port: tcp-app
Para encontrar o service
e o pod
corretos o Prometheus utiliza o selector
e o port
definidos no ServiceMonitor
e no PodMonitor
.
Para verificar se o Prometheus começou a monitorar a aplicação, acesse a aba Status
do Prometheus e verifique se o ServiceMonitor
e o PodMonitor
estão aparecendo na lista de Service Discovery
.
Vamos aplicar os manifestos:
cd monitoring
kubectl apply -f service-monitor.yaml -n giropops-senhas
kubectl apply -f pod-monitor.yaml -n giropops-senhas
Criando um alerta no Prometheus com o Alertmanager
Para criar um alerta no Prometheus, precisamos definir uma regra de alerta e configurar o Alertmanager para enviar notificações. Vamos criar um alerta para monitorar caso o nosso deployment
fique fora do ar por mais de 1 minuto.
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: giropops-senhas-rules
namespace: monitoring
labels:
app.kubernetes.io/name: prometheus
spec:
groups:
- name: giropops-senhas
rules:
- alert: GiropopsSenhasDown
expr: up{namespace="giropops-senhas", app="giropops-senhas"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "A aplicação Giropops Senhas está fora do ar"
description: "A aplicação Giropops Senhas no namespace giropops-senhas está fora do ar por mais de 1 minutos."
Vamos aplicar o manifesto:
kubectl apply -f prometheus-rule.yaml -n monitoring
É possível visualizar o alerta no Prometheus, acessando a aba Alerts
do Prometheus.
Integrando o Alertmanager com o Grafana
Para integrar o Alertmanager com o Grafana, precisamos configurar Alertmanager como datasource no Grafana e criar um painel para exibir os alertas. Siga os passos abaixo:
Acesse o Grafana em https://grafana.nataliagranato.xyz e faça login com o usuário
admin
e a senha definida anteriormente.No menu lateral clique em Configuration > Data Sources.
Clique em
Add data source
.Selecione
Alertmanager
como tipo de data source.Dê um nome para a nova data source, por exemplo
Alertmanager
.Selecione a
Implementation
comoPrometheus
e habilite a opçãoReceive Grafana alerts
para receber os alertas do Grafana no Alertmanager.Configure o endereço do Alertmanager como
http://alertmanager-main.monitoring.svc.cluster.local:9093
. Estamos usando o DNS interno do Kubernetes para fazer a conexão entre o Grafana e o Alertmanager. O tipo deAccess
deve serServer
.Clique em
Save & Test
para salvar a data source.
Agora é possível visualizar os alertas do Prometheus no Grafana. Acesse Alerting > Alerts rules e procure pelo nome do alerta GiropopsSenhasDown
. Clique no botão Create Alert
para criar um painel com o alerta.
A dashboard está acessível em Painel do Grafana
Observação
No painel status da aplicação
usamos a opção de Value mapping
para mapear os valores de up
para 1
e 0
para up
e down
, respectivamente. Isso permite exibir o status da aplicação como up
ou down
no painel.
A query
usada para o painel status da aplicação
é up{namespace="giropops-senhas", app="giropops-senhas"}
.
Last updated