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:

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:

  1. Acesse o Grafana em https://grafana.nataliagranato.xyz e faça login com o usuário admin e a senha definida anteriormente.

  2. No menu lateral clique em Configuration > Data Sources.

  3. Clique em Add data source.

  4. Selecione Alertmanager como tipo de data source.

  5. Dê um nome para a nova data source, por exemplo Alertmanager.

  6. Selecione a Implementation como Prometheus e habilite a opção Receive Grafana alerts para receber os alertas do Grafana no Alertmanager.

  7. 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 de Access deve ser Server.

  8. 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