Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Grafana não reconhece prometheus como fonte de dados

Olá, tudo bem?

Estou seguindo o projeto conforme as aulas, mas me deparei com o seguinte problema ao tentar incluir o Prometheus como fonte de dados do grafana:

Post "http://192.168.0.7:9090/api/v1/query": dial tcp 192.168.0.7:9090: i/o timeout - There was an error returned querying the Prometheus API.

Porém, quando eu coloco o dns do container (http://prometheus-api-cursos:9090) ao invés do meu IP, o grafana reconhece.

O problema maior é que o prometheus não consegue buscar as informações que constam em /actuator/prometheus. Por exemplo, a query abaixo:

http_server_requests_seconds_bucket{application="api-cursos"}

retorna o seguinte:

Empty query result

Segue meu prometheus.yml e docker-compose.yml abaixo, respectivamente:

global:
  scrape_interval: 15s

scrape_configs:

- job_name: prometheus-api-cursos
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  static_configs:
  - targets:
    - prometheus-api-cursos:9090

- job_name: api-cursos
  metrics_path: /actuator/prometheus
  static_configs:
  - targets:
    - 192.168.0.7:8080
version: '3.8'

networks:
  database:
  monit:
  
services:

  database:
    image: postgres:15
    container_name: database-api-cursos
    restart: unless-stopped
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
      timeout: 45s
      interval: 10s
      retries: 10
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=h5UzM2kEnp8Q42
      - APP_DB_USER=alura
      - APP_DB_PASS=nJ6vsW37rCd1v88
      - APP_DB_NAME=logsdb
      - PGDATA=/var/lib/postgresql/data HOME=/root
      - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/15/bin
    ports:
      - '5432:5432'
    volumes:
      - ./postgres/db:/docker-entrypoint-initdb.d/
      - ./postgres/data:/var/lib/postgresql/data
    networks:
      - database

  prometheus-api-cursos:
    image: prom/prometheus:latest
    user: "root:root"
    container_name: prometheus-api-cursos
    restart: unless-stopped
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
    ports:
      - 9090:9090
    networks:
      - monit

  grafana-api-cursos:
    image: grafana/grafana
    user: "root:root"
    container_name: grafana-api-cursos
    volumes:
      - ./grafana:/var/lib/grafana
    restart: unless-stopped
    ports:
      - 3000:3000
    networks:
      - monit

OBS: quando tento importar o dashboard no grafana, aparece essa mensagem:

Templating 
Failed to upgrade legacy queries

E quando atualizo a fonte de dados, e dou um 'run query', o resultado é:

Preview of values
None

Gostaria de saber o que posso estar fazendo errado. Obrigado!!

3 respostas

Também estou recebendo esses erros nos logs do docker-compose:

grafana-api-cursos     | logger=context userId=1 orgId=1 uname=admin t=2024-01-25T17:51:45.841156148Z level=error msg="Dashboard not found" error="Dashboard not found" remote_addr=192.168.48.1 traceID=
grafana-api-cursos     | logger=context userId=1 orgId=1 uname=admin t=2024-01-25T17:51:45.841315071Z level=info msg="Request Completed" method=GET path=/api/dashboards/uid/8tnUJQbnz22 status=404 remote_addr=192.168.48.1 time_ms=11 
duration=11.251643ms size=46 referer=http://localhost:3000/dashboard/import handler=/api/dashboards/uid/:uid

Olá, Marco! Como vai?

Pelo que pude analisar na sua dúvida, parece que temos alguns pontos para verificar. Vamos lá:

  1. Sobre o Grafana não reconhecer o Prometheus usando o IP, mas reconhecer usando o nome do container, isso é normal quando estamos trabalhando com Docker. O Docker tem um DNS interno que permite a comunicação entre os containers usando o nome deles. Então, é mais comum e recomendado usar o nome do container ao invés do IP.

  2. Sobre o Prometheus não conseguir buscar as informações em /actuator/prometheus, o problema pode estar na configuração do seu prometheus.yml. Na parte de scrape_configs, você definiu o targets da api-cursos como 192.168.0.7:8080. Se a api-cursos está rodando em um container, você deve usar o nome do container ao invés do IP, assim como você fez com o Prometheus. Tente alterar para api-cursos:8080 e veja se resolve o problema.

  3. Sobre a mensagem de erro Failed to upgrade legacy queries ao importar o dashboard, isso pode acontecer se o dashboard que você está tentando importar foi criado em uma versão diferente do Grafana. Tente verificar se a versão do Grafana que você está usando é compatível com a versão que foi usada para criar o dashboard.

  4. Sobre a mensagem None ao rodar uma query, isso pode acontecer se o Prometheus não está conseguindo coletar as métricas da api-cursos. Verifique se a alteração que eu sugeri no item 2 resolve esse problema.

Espero ter ajudado e bons estudos!

solução!

Obrigado pela resposta, Renan!

Eu buildei a aplicação, gerei a imagem com Dockerfile e coloquei ela pra rodar em um container. Depois disso, o meu prometheus.yaml ficou assim:

...
- job_name: api-cursos
  metrics_path: /actuator/prometheus
  static_configs:
  - targets:
    - api-cursos:8080

E agora o Prometheus consegue buscar as métricas da aplicação corretamente!!

Além disso, agora o Grafana consegue buscar as métricas corretamente lá do Prometheus.

Muito obrigado pelas dicas!!!