Fazendo o Discourse ver o IP do servidor Prometheus

Olá a todos!

Até agora, se entendi corretamente, para garantir que uma instância do Prometheus possa coletar dados do endpoint /metrics, precisamos adicionar o endereço IP dessa máquina na lista de permissões, editando DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX.

Existe alguma outra maneira de fazer isso? Nossa instância do Discourse está atrás do proxy DNS da Cloudflare e não consegue ver o endereço IP real dos usuários finais. Eu realmente preferiria se pudéssemos encontrar uma maneira de fazer isso com chaves de API, embora isso pareça improvável devido às restrições de como o Prometheus pode ingerir dados.

Então o Discourse está com problemas e você precisa adicionar o modelo do Cloudflare.

Acho que isso funcionaria. Você já tentou? Ah, mas não acho que seja possível fazer o Grafana colocar as chaves no cabeçalho, e é por isso que adicionei esse recurso inicialmente.

1 curtida

Então o Discourse está com defeito e você precisa adicionar o template do Cloudflare.

Ah, o que você quer dizer com “template do Cloudflare”?

Acho que isso funcionaria. Você tentou? Oh, mas não acho que seja possível fazer o Grafana colocar as chaves no cabeçalho, e é por isso que adicionei esse recurso inicialmente.

Sim, tentei. O Prometheus ainda não permite cabeçalhos arbitrários nas configurações do scraper. Portanto, não há como eu ingerir métricas do Discourse no Prometheus se não puder listar o IP do servidor do Prometheus na lista de permissões, o que não é possível no meu caso.

Provavelmente há outras pessoas que executam suas instâncias do Discourse atrás de proxies como o Cloudflare. Então, com essa premissa em mente, acredito que precisaremos ajustar um pouco o exporter.

A API do Discourse usa seus próprios cabeçalhos Api-Key e Api-Username em vez de algo mais ou menos padronizado, como autenticação básica HTTP (que é suportada pelo subsistema de scraper do Prometheus). Portanto, realmente não tenho como usar isso na minha configuração.

Você precisará pesquisar. Mas você pode encontrá-lo dentro do diretório de modelos e adicioná-lo ao seu app.yml.

1 curtida

Obrigado!

Ativei o cloudflare.template.yml. :slight_smile: Mas, se entendi corretamente, isso foi apenas para desativar a limitação de taxa no tráfego proveniente dos endereços IP da Cloudflare.

Por enquanto, é assim que minha configuração do Prometheus se parece:

scrape_configs:
        - job_name: forum
          scrape_interval: 5s
          scheme: https
          static_configs:
                  - targets:
                          - forum-behind-cloudflare-dns-proxy.com

Agora, o problema que estou enfrentando é que o Discourse não consegue ver o endereço IP real de uma solicitação. Portanto, para que a abordagem de lista de permissões funcione, tentei o seguinte:

  1. Adicionei o endereço IPv6 do meu servidor Prometheus à variável de ambiente DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX no app.yml.

  2. Codifiquei manualmente o endereço IPv6 real do fórum no arquivo /etc/hosts do servidor Prometheus. Agora, o fórum consegue ver o endereço IP do meu servidor Prometheus e permitir o acesso a ele. :slight_smile:

Ainda tenho alguns outros problemas. Por exemplo, estou executando o Prometheus em um container. O /etc/hosts do host não é compartilhado dentro do container. Assim, ele continua resolvendo o endereço do fórum para um IP da Cloudflare e falha durante a autenticação.

Posso compartilhar o /etc/hosts do host no container Docker assim: -v /etc/hosts:/etc/hosts ao iniciar o Prometheus, mas isso resulta em um erro como:

Get "https://forum-behind-cloudflare-dns-proxy.com:443/metrics": dial tcp [<endereço-ipv6>]:443: connect: cannot assign requested address

Agora, só preciso resolver esse problema.

Edição #1: Descobri isso também. O IPv6 estava desativado dentro do container Docker. Posso corrigir isso ativando o IPv6 no container Docker ou simplesmente usando --net=host.

Você está atrás de um proxy reverso? É necessário configurar o nginx para permitir que o endereço remoto real chegue ao Discourse. Acredito que o artigo Rodando outros sites na mesma máquina que o Discourse pode te dar uma dica para resolver isso.

1 curtida

A instância do Discourse está, de fato, rodando atrás de um proxy reverso. O proxy reverso é fornecido pela Cloudflare e, como estamos apenas no plano Pro, não temos a opção de repassar o IP real do cliente até a instância do Discourse a partir da Cloudflare. De qualquer forma, meu problema já foi resolvido. :slight_smile:

O painel do Grafana provavelmente deveria ser atualizado neste momento. Com o tempo, o exportador do Prometheus foi atualizado, de modo que ele não envia mais certas métricas, mas o painel do Grafana ainda está configurado para ler valores dessas métricas (agora) inexistentes.

1 curtida