> For the complete documentation index, see [llms.txt](https://devops.nataliagranato.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://devops.nataliagranato.xyz/monitorando-nosso-gerador-de-senhas-com-prometheus-e-grafana.md).

# 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`:

```yaml
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`:

```yaml
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.

```yaml
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**](https://grafana.nataliagranato.xyz/public-dashboards/56431da54e9143438ef8e5da78258347)

### 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"}`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://devops.nataliagranato.xyz/monitorando-nosso-gerador-de-senhas-com-prometheus-e-grafana.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
