Post

Implementação do Grafana Image Renderer

Guia técnico de instalação e configuração do serviço de renderização remota para exportação de painéis via Docker.

Implementação do Grafana Image Renderer

O Grafana Image Renderer é um serviço que transforma dashboards e painéis do Grafana em imagens estáticas (PNG), essenciais para o envio de alertas via e-mail, Telegram ou Slack.

Historicamente, essa funcionalidade era integrada ao Grafana, mas devido ao alto consumo de recursos do Chromium, foi segregada em um microsserviço ou plugin separado. Para ambientes de produção, a execução via Docker (Remote Rendering) é a abordagem superior por isolar as dependências do navegador e não onerar o binário principal do Grafana.

1. Arquitetura e Decisão de Instalação

Existem duas formas principais de implementar o Renderer:

  1. Plugin (Local): Fácil instalação via CLI, mas instável em sistemas sem as bibliotecas do Chrome compartilhadas.
  2. Remote Rendering (Docker): Recomendado. O Grafana envia uma requisição HTTP para um container dedicado que processa a imagem e devolve o binário.

Nota de Performance: Renderizar imagens exige CPU e RAM significativos. Em instâncias com menos de 2GB de RAM, o processo frequentemente falha com erros de timeout.

2. Implementação via Docker Compose

Esta é a configuração estratégica para máxima alavancagem de recursos e isolamento.

Passo 1: Configurar o docker-compose.yml

Crie um serviço dedicado para o renderer. Ele deve compartilhar a mesma rede que o Grafana.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
services:
  grafana:
    image: grafana/grafana-enterprise:latest
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      GF_RENDERING_SERVER_URL: http://renderer:8081/render
      GF_RENDERING_CALLBACK_URL: http://grafana:3000/
      GF_LOG_LEVEL: info
    networks:
      - monitoring

  renderer:
    image: grafana/grafana-image-renderer:latest
    container_name: grafana-renderer
    ports:
      - "8081"
    environment:
      ENABLE_METRICS: "true"
      BROWSER_TZ: "America/Sao_Paulo"
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

Passo 2: Variáveis Críticas de Ambiente

  • GF_RENDERING_SERVER_URL: Endereço onde o Grafana encontra o serviço de renderização.
  • GF_RENDERING_CALLBACK_URL: Essencial. É o endereço que o Renderer usa para acessar o Grafana e “tirar o print”. Se o Renderer não conseguir resolver este host, a imagem retornará em branco ou erro 500.

3. Configuração no grafana.ini (Caso não use Docker)

Se estiver operando em Bare Metal, edite o arquivo de configuração do Grafana (geralmente em /etc/grafana/grafana.ini):

1
2
3
4
[rendering]
server_url = http://localhost:8081/render
callback_url = http://localhost:3000/
concurrent_render_limit = 30

4. Validação e Uso

Após subir os serviços, a funcionalidade de “Share” será expandida.

Como gerar a imagem:

  1. Abra qualquer Panel no seu Dashboard.
  2. Clique no título do painel > Share.
  3. Uma nova aba/botão chamado Direct Link Rendered Image aparecerá.
  4. Ao clicar, o Grafana enviará a chamada para o Renderer, que abrirá uma instância headless do Chromium, carregará o painel e gerará o PNG.

Teste via URL direta:

Você pode forçar a renderização via parâmetro na URL: http://<grafana-ip>:3000/render/d-solo/<dashboard-id>/<slug>?orgId=1&panelId=<id>&width=1000&height=500

5. Troubleshooting (Resolução de Problemas Reais)

Problema Causa Provável Solução Técnica
Imagem com erro “Unauthorized” O Renderer não tem acesso ao Dashboard. Certifique-se de que a opção viewers_can_edit ou permissões de snapshot estão ativas.
Timeout ao renderizar Falta de recursos (CPU/RAM). Aumente o limite de memória do container ou incremente GF_RENDERING_RENDER_KEY_TIMEOUT.
Fontes quebradas/Quadrados Ausência de fontes no container. Utilize a imagem oficial grafana-image-renderer que já inclui fonts-noto.
Gráfico em branco callback_url incorreta. O Renderer precisa “enxergar” o Grafana pelo IP/DNS definido nesta variável.
Esta postagem está licenciada sob CC BY 4.0 pelo autor.