Descripción general
DashPDF es un servicio para exportar paneles de Grafana, completos o individuales, a PDF y PNG. Convierte un dashboard de trabajo en un documento que se puede descargar, archivar o enviar periódicamente por correo electrónico.
DashPDF funciona mediante un app plugin instalado en Grafana. El plugin ejecuta las consultas de los paneles dentro de la infraestructura del usuario, recopila el JSON del dashboard y los data frames preparados, y envía el snapshot para su renderizado mediante una solicitud saliente. El acceso a Grafana y las credenciales de las fuentes de datos permanecen en el entorno del usuario.
El producto es compatible con Grafana 12 y 13. Ambas versiones forman parte de la matriz de pruebas automatizadas.
Funciones del producto
DashPDF ofrece:
- Exportación de un dashboard completo o de un único panel
- Salida en PDF y PNG
- Tamaños de página A4 y Letter
- Orientación vertical y horizontal
- Diseño paginado o una sola página larga
- Filas de paneles completas al pasar de una página a otra
- Conservación del intervalo temporal y los valores de las variables elegidos
- Compatibilidad con paneles y filas repetidos, fuentes de datos mixtas, filtros ad hoc y library panels
- Programaciones con expresión cron, zona horaria y ventana temporal relativa
- Entrega de los informes terminados por correo electrónico
- Un portal con los informes, las instancias de Grafana conectadas y sus programaciones
Los destinatarios se configuran directamente en cada programación. Tras una ejecución, el PDF llega como archivo adjunto; si el archivo es grande, el correo incluye un enlace al informe en el portal. Los errores repetidos pausan la programación y hacen visible el problema en lugar de omitir la entrega silenciosamente.
DashPDF está disponible de forma gratuita durante la fase preview, mientras el equipo estudia cómo se exportan y distribuyen los informes en flujos de trabajo reales.
Arquitectura
DashPDF está desarrollado como un monorepo e incluye:
- Un portal web con Next.js
- Una API en Go con contrato OpenAPI
- Un app plugin para Grafana escrito en TypeScript y Go
- Un plugin de fuente de datos interno que suministra los data frames guardados al entorno de renderizado
- PostgreSQL para cuentas, instancias conectadas, tokens, snapshots, tareas de renderizado y programaciones
- Redis para coordinar la carga fragmentada de snapshots entre réplicas de la API
- Mailoo como CMS headless para el blog
El inicio de sesión en el portal está separado del acceso del plugin a la API: el navegador utiliza su propia sesión y cada instancia de Grafana conectada recibe un token independiente.
Para cada renderizado, la API inicia una instancia aislada de Grafana con la misma versión principal que el sistema de origen y añade los plugins públicos de panel necesarios. Las fuentes de datos de la copia del dashboard se sustituyen por una fuente interna que sirve los frames ya recopilados. Headless Chrome genera el PDF o PNG.
Los entornos de renderizado se reutilizan para una misma combinación de versión de Grafana y conjunto de plugins, y se detienen después de un periodo de inactividad. Así se aceleran las exportaciones repetidas y se limita el número de instancias en ejecución permanente.
Infraestructura y SRE
El proyecto cuenta con:
- GitLab CI con comprobaciones de código, pruebas y análisis de calidad
- Construcción de contenedores con Kaniko
- Imágenes independientes para el portal web, la API y el migrador
- Despliegue GitOps mediante Argo CD
- Una tarea independiente de migración de la base de datos antes de actualizar la API
- Health checks para el portal y la API
- Pruebas end-to-end con Playwright sobre Grafana 12 y Grafana 13
- Un pool limitado de entornos de renderizado
- Eliminación automática del contenido de los snapshots al terminar su periodo de conservación
- Límites de tamaño y de cargas incompletas simultáneas
Los frames del snapshot solo están disponibles para el entorno de renderizado dentro del perímetro del servicio. La API pública recibe el material preparado por el plugin y gestiona la tarea, mientras que un canal interno independiente atiende a la instancia temporal de Grafana.
Retos de ingeniería
El principal reto de ingeniería de DashPDF consiste en producir un informe reproducible a partir de un dashboard activo sin romper el límite de confianza que rodea la instalación de Grafana del usuario.
El plugin ejecuta las consultas allí donde ya están configurados el acceso a las fuentes de datos y los permisos del usuario. El servicio recibe el material de una exportación concreta y el renderizado se realiza en una instancia separada de Grafana con una versión compatible. Así se reproducen los paneles sin entregar al servicio acceso a la infraestructura de monitorización.
Los dashboards grandes utilizan una carga fragmentada del snapshot. Su estado se coordina de forma centralizada, lo que permite que una API con varias réplicas acepte distintas partes de una misma carga.
Las programaciones se ejecutan mediante el plugin dentro de Grafana. Al guardar una programación, el plugin registra el plan de consultas y lo repite más adelante para la ventana temporal necesaria. Si el dashboard cambia después de registrar el plan, la ejecución muestra una advertencia hasta que el plan se vuelve a registrar.
El PDF paginado requiere una fase de maquetación propia: los paneles se agrupan por filas y se desplazan como una unidad para que un gráfico o una tabla no quede dividido por un salto de página.
El resultado añade exportación y entrega programada a una instalación existente de Grafana, mientras las consultas a las fuentes de datos y el control de acceso permanecen dentro de la infraestructura del usuario.