Help build the future of open source observability software Open positions

Check out the open source projects we support Downloads

We cannot remember your choice unless you click the consent notice at the bottom.

Guia passo a passo para configurar o Alertmanager do Prometheus com o Slack, PagerDuty, e Gmail

Guia passo a passo para configurar o Alertmanager do Prometheus com o Slack, PagerDuty, e Gmail

2020-02-25 8 min

Em meu post anterior, “Como explorar o Prometheus com um simples projetos‘Hello World’”, descrevi três projetos, onde usei para ter uma noção melhor do que o Prometheus pode fazer. Neste post, explico como me familiarizei melhor com o Alertmanager do Prometheus e como configurei notificações de alerta para o Slack, PagerDuty, e Gmail.

Vou fazer referência ao meu post anterior um pouco, então recomendo lê-lo antes de seguir em frente.

Noções básicas

Você pode começar a usar o Prometheus em minutos com o Grafana Cloud. Temos planos gratuitos e pagos do Grafana Cloud para atender a todos os casos de uso. Inscreva-se gratuitamente agora.

A configuração de alertas com o Prometheus é um processo de duas etapas:

Para começar, você precisa criar suas regras de alerta no Prometheus e especificar sob quais condições deseja receber alertas (como quando uma instância está inativa).

Em segundo lugar, você precisa configurar o Alertmanager, que recebe os alertas do Prometheus. O Alertmanager será capaz de fazer várias coisas, incluindo:

  • agrupar os alertas de natureza parecida numa única notificação
  • silenciar alertas por um tempo específico
  • silenciar notificações para determinados alertas, se outros alertas já estiverem disparando
  • escolher quais destinos do alerta específico

Etapa 1: Crie regras de alerta no Prometheus

Vamos começar com quatro subpastas que configuramos anteriormente para cada projeto: server, node_exporter, github_exporter, e prom_middleware. Explico este processo no meu post, sobre como explorar o Prometheus com projetos simples.

Passamos para a subpasta do servidor, abrimos o conteúdo no editor de código e, em seguida, criamos um novo arquivo de regras. Em rules.yml, você especificará as condições em que gostaria de receber alertas.

cd Prometheus/server
touch rules.yml

Tenho certeza de que todos concordam que é muito importante saber quando qualquer uma de suas instâncias está inativa. Portanto, vou usar a métrica up como nossa condição. Ao avaliar essa métrica na interface do Prometheus (http://localhost:9090), você verá que todas as instâncias em execução têm valor 1, enquanto todas as instâncias que não estão em execução têm valor 0 (no momento, só executamos nossa instância do Prometheus).

*Avaliar a métrica na interface do Prometheus para ver quais instâncias estão em execução.*
Avaliar a métrica na interface do Prometheus para ver quais instâncias estão em execução.

Depois de decidir as condições do seu alerta, você precisa especificá-las em rules.yml O conteúdo dela será o seguinte:

groups:
- name: AllInstances
  rules:
  - alert: InstanceDown
    # Condition for alerting
    expr: up == 0
    for: 1m
    # Annotation - additional informational labels to store more information
    annotations:
      title: 'Instance {{ $labels.instance }} down'
      description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute.'
    # Labels - additional labels to be attached to the alert
    labels:
      severity: 'critical'

Para resumir, ele diz que, se alguma das instâncias ficar inativa (up == 0) por um minuto, o alerta será disparado. Também incluí anotações e etiquetas que armazenam informações adicionais sobre os alertas. Para esses, você pode usar modelos de variáveis, como {{ $labels.instance }}, que são então adicionados para identificar instâncias específicas (como localhost:9100).

Você pode ler mais sobre as regras de alerta do Prometheus aqui.

Depois de preparar o rules.yml, você precisa vincular o arquivo ao prometheus.yml e adicionar a configuração de alerta. Seu prometheus.yml vai ficar assim:

global:
  # How frequently to scrape targets
  scrape_interval:     10s
  # How frequently to evaluate rules
  evaluation_interval: 10s

# Rules and alerts are read from the specified file(s)
rule_files:
  - rules.yml

# Alerting specifies settings related to the Alertmanager
alerting:
  alertmanagers:
    - static_configs:
      - targets:
        # Alertmanager's default port is 9093
        - localhost:9093

# A list of scrape configurations that specifies a set of
# targets and parameters describing how to scrape them.
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets:
        - localhost:9090
  - job_name: 'node_exporter'
    scrape_interval: 5s
    static_configs:
      - targets:
        - localhost:9100
  - job_name: 'prom_middleware'
    scrape_interval: 5s
    static_configs:
      - targets:
        - localhost:9091

Se você iniciou o Prometheus com o parâmetro --web.enable-lifecycle, você pode recarregar a configuração enviando a solicitação POST para /-/reload no endpoint curl -X POST http://localhost:9090/-/reload. Depois disso, inicie o aplicativo Prom_middleware (node index.js na pasta prom_middleware) e o node_exporter (./node_exporter na pasta node_exporter).

Depois disso, sempre que você quiser criar um alerta, basta parar o node_exporter ou o aplicativo prom_middleware.

Etapa 2: Configure o Alertmanager

Crie uma subpasta alert_manager na pasta do Prometheus, mkdir alert_manager. Use esta pasta para baixar e extrair o Alertmanager a partir do site do Prometheus e, sem nenhuma modificação no alertmanager.yml, execute o ./alertmanager --config.file=alertmanager.yml e abra a url localhost:9093.

Dependendo se você tem ou não algum alerta ativo, o Alertmanager deve estar configurado corretamente e ter uma aparência parecida com a imagem abaixo. Para ver as anotações que você adicionou na etapa acima, clique no botão +Info.

*Alertmanager do Prometheus com 2 alertas ativos.*
Alertmanager do Prometheus com 2 alertas ativos.

Com tudo concluído, agora podemos analisar as diferentes maneiras de utilizar o Alertmanager e enviar notificações.

Como configurar alertas para o Slack

Para receber notificações via Slack, você precisa fazer parte de um workspace do Slack. Se você não faz parte de nenhum ou deseja testar isso em um workspace separado, pode criar rapidamente um aqui.

Para configurar o alerta em seu workspace do Slack, você precisa URL da API do Slack. Vá para Slack -> Administração -> Gerenciar aplicativos.

*Abra **Gerenciar aplicativos** no seu espaço de trabalho do Slack.*
Abra Gerenciar aplicativos no seu espaço de trabalho do Slack.

No diretório Gerenciar aplicativos, pesquise WebHooks de entrada e adicione-os ao seu espaço de trabalho do Slack.

*Adicione **Webhooks de entrada** ao seu espaço de trabalho do Slack.*
Adicione Webhooks de entrada ao seu espaço de trabalho do Slack.

Em seguida, especifique em qual canal você deseja receber notificações do Alertmanager. Criei o canal #monitoring-infrastructure. Depois de confirmar e adicionar a integração WebHooks de entrada, a URL do webhook (que é a URL da sua API do Slack) é exibida. Copie.

*URL do webhook exibida.*
URL do webhook exibida.

Em seguida, você precisa modificar o arquivo alertmanager.yml. Primeiro, abra a subpasta alert_manager no seu editor de código e preencha seu alertmanager.yml com base no modelo abaixo. Use a URL que você acabou de copiar como slack_api_url.

global:
resolve_timeout: 1m
slack_api_url: 'https://hooks.slack.com/services/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'

route:
receiver: 'slack-notifications'

receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#monitoring-instances'
send_resolved: true

Recarregue a configuração enviando um POST para o endpoint  /-/reload, curl -X POST http://localhost:9093/-/reload. Em alguns minutos (depois de parar pelo menos uma de suas instâncias), você deve receber suas notificações de alerta pelo Slack dessa maneira:

 *Notificação de alerta recebido via Slack.*
Notificação de alerta recebido via Slack.

Se quiser aprimorar suas notificações e torná-las mais bonitas, você pode usar o modelo abaixo ou usar esta ferramenta e criar o seu próprio template de notificação.

global:
resolve_timeout: 1m
slack_api_url: 'https://hooks.slack.com/services/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'

route:
receiver: 'slack-notifications'

receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#monitoring-instances'
send_resolved: true
icon_url: https://avatars3.githubusercontent.com/u/3380462
title: |-
     [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}
{{- if gt (len .CommonLabels) (len .GroupLabels) -}}
       {{" "}}(
{{- with .CommonLabels.Remove .GroupLabels.Names }}
{{- range $index, $label := .SortedPairs -}}
           {{ if $index }}, {{ end }}
{{- $label.Name }}="{{ $label.Value -}}"
         {{- end }}
       {{- end -}}
       )
     {{- end }}
text: >-
{{ range .Alerts -}}
*Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}

*Description:* {{ .Annotations.description }}

*Details:*
{{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
       {{ end }}
     {{ end }}

E este é o resultado final:

*Notificações de alerta aprimoradas.*
Notificações de alerta aprimoradas.

Como configurar alertas para o PagerDuty

O PagerDuty é uma das plataformas de resposta a incidentes mais conhecidas para departamentos de TI. Para configurar os alertas através do PagerDuty, você precisa criar uma conta lá. O PagerDuty é um serviço pago, mas você pode fazer um teste gratuito de 14 dias. Depois de fazer login, vá para Configuração -> Serviços -> + Novo Serviço.

*Tela inicial do PagerDuty.*
Tela inicial do PagerDuty.

Selecione o Prometheus na lista de tipos de integração e dê um nome ao serviço. Decidi chamar o meu de Prometheus Alertmanager. Você também pode personalizar as configurações de incidentes, mas eu escolhi a configuração padrão. Em seguida, clique em Salvar.

*Adicione um serviço ao PagerDuty.*
Adicione um serviço ao PagerDuty.

A chave de integração será exibida. Copie a chave.

*Chave de integração do PagerDuty.*
Chave de integração do PagerDuty.

Você precisará atualizar o conteúdo do seu alertmanager.yml. Ele deve ser parecido com o exemplo abaixo, mas use sua própria service_key (chave de integração do PagerDuty). Pagerduty_url deve permanecer igual e deve ser definido como https://events.pagerduty.com/v2/enqueue. Salve e reinicie o Alertmanager.

global:
resolve_timeout: 1m
pagerduty_url: 'https://events.pagerduty.com/v2/enqueue'

route:
receiver: 'pagerduty-notifications'

receivers:
- name: 'pagerduty-notifications'
pagerduty_configs:
- service_key: 0c1cc665a594419b6d215e81f4e38f7
send_resolved: true

Pare uma de suas instâncias. Após alguns minutos, as notificações de alerta devem ser exibidas no PagerDuty.

*Alerta enviado para o PagerDuty.*
Alerta enviado para o PagerDuty.

Como configurar alertas do Gmail

Se preferir receber suas notificações diretamente através de um serviço de e-mail, a configuração é ainda mais fácil. O Alertmanager pode simplesmente repassar mensagens para o seu provedor (neste caso, usei o Gmail).

Não é recomendável que você use sua senha pessoal para isso, portanto, crie uma senha para o aplicativo. Para fazer isso, vá para Configurações da conta -> Segurança -> Entrar no Google -> Senha do aplicativo. Se você não vir a senha do aplicativo como opção, é possível que não tenha configurado a verificação em duas etapas, e precisará fazer isso primeiro. Copie a senha recém-criada.

*Crie uma senha do aplicativo para o Gmail.*
Crie uma senha do aplicativo para o Gmail.

Você precisará atualizar o conteúdo do seu alertmanager.yml novamente. O conteúdo deve ser parecido com o exemplo abaixo. Não se esqueça de inserir seu próprio endereço de e-mail e a senha.

global:
resolve_timeout: 1m

route:
receiver: 'gmail-notifications'

receivers:
- name: 'gmail-notifications'
email_configs:
- to: monitoringinstances@gmail.com
from: monitoringinstances@gmail.com
smarthost: smtp.gmail.com:587
auth_username: monitoringinstances@gmail.com
auth_identity: monitoringinstances@gmail.com
auth_password: password
send_resolved: true

Mais uma vez, após alguns minutos (depois de parar pelo menos uma das suas instâncias), as notificações de alerta devem ser enviadas para o seu Gmail.

*Notificações de alerta enviadas para o Gmail.*
Notificações de alerta enviadas para o Gmail.

É isso aí!