Überblick
DashPDF ist ein Dienst zum Exportieren von Grafana-Dashboards und einzelnen Panels als PDF oder PNG. Aus einem Arbeits-Dashboard entsteht ein Dokument, das heruntergeladen, archiviert oder regelmäßig per E-Mail an Empfänger versendet werden kann.
DashPDF arbeitet über ein App-Plugin in Grafana. Das Plugin führt die Panel-Abfragen innerhalb der Infrastruktur des Nutzers aus, sammelt das Dashboard-JSON und die aufbereiteten Data Frames und übermittelt den Snapshot über eine ausgehende Anfrage zum Rendern. Der Zugriff auf Grafana und die Zugangsdaten der Datenquellen verbleiben beim Nutzer.
Das Produkt unterstützt Grafana 12 und 13. Beide Versionen sind Teil der automatisierten Testmatrix.
Produktfunktionen
DashPDF bietet:
- Export eines vollständigen Dashboards oder eines einzelnen Panels
- Ausgabe als PDF und PNG
- Seitengrößen A4 und Letter
- Hoch- und Querformat
- Seitenaufteilung oder eine einzige lange Seite
- Zusammenhalt vollständiger Panel-Zeilen über Seitenumbrüche hinweg
- Übernahme des gewählten Zeitraums und der Variablenwerte
- Unterstützung für wiederholte Panels und Zeilen, gemischte Datenquellen, Ad-hoc-Filter und Library Panels
- Zeitpläne mit Cron-Ausdruck, Zeitzone und relativem Zeitfenster
- Versand fertiger Berichte per E-Mail
- Ein Portal mit Berichten, verbundenen Grafana-Instanzen und deren Zeitplänen
Die Empfänger werden direkt im jeweiligen Zeitplan hinterlegt. Nach einem Lauf kommt das PDF als Anhang; bei einer großen Datei enthält die E-Mail einen Link zum Bericht im Portal. Wiederholte Fehler pausieren den Zeitplan und machen das Problem sichtbar, statt die Zustellung unbemerkt auszulassen.
Während der Preview-Phase ist DashPDF kostenlos verfügbar. In dieser Zeit untersucht das Team, wie Berichte in realen Abläufen exportiert und verteilt werden.
Architektur
DashPDF ist als Monorepo aufgebaut und umfasst:
- Ein Webportal auf Basis von Next.js
- Eine Go-API mit OpenAPI-Vertrag
- Ein Grafana-App-Plugin in TypeScript und Go
- Ein internes Data-Source-Plugin, das gespeicherte Data Frames für die Rendering-Umgebung bereitstellt
- PostgreSQL für Konten, verbundene Instanzen, Tokens, Snapshots, Rendering-Aufgaben und Zeitpläne
- Redis zur Koordination mehrteiliger Snapshot-Uploads zwischen API-Replikaten
- Mailoo als Headless CMS für den Blog
Die Anmeldung am Portal ist vom API-Zugriff des Plugins getrennt: Der Browser verwendet eine eigene Sitzung, während jede verbundene Grafana-Instanz ein separates Token erhält.
Für das Rendering startet die API eine isolierte Grafana-Instanz mit derselben Hauptversion wie das Quellsystem und ergänzt die benötigten öffentlichen Panel-Plugins. Die Datenquellen in der Dashboard-Kopie werden durch eine interne Data Source ersetzt, die die bereits erfassten Frames liefert. Headless Chrome erzeugt anschließend das PDF oder PNG.
Rendering-Umgebungen werden für dieselbe Kombination aus Grafana-Version und Plugin-Satz wiederverwendet und nach einer Leerlaufzeit beendet. Dadurch werden wiederholte Exporte schneller, während die Zahl dauerhaft laufender Instanzen begrenzt bleibt.
Infrastruktur und SRE
Für das Projekt sind eingerichtet:
- GitLab CI mit Codeprüfungen, Tests und Qualitätsanalyse
- Container-Builds mit Kaniko
- Separate Images für Webportal, API und Migrator
- GitOps-Deployment über Argo CD
- Eine separate Datenbankmigration vor API-Aktualisierungen
- Health Checks für Portal und API
- Playwright-End-to-End-Tests mit Grafana 12 und Grafana 13
- Ein begrenzter Pool von Rendering-Umgebungen
- Automatisches Löschen von Snapshot-Inhalten nach Ablauf der Aufbewahrungsfrist
- Grenzen für Upload-Größe und gleichzeitig unvollständige Uploads
Snapshot-Frames sind nur für die Rendering-Umgebung innerhalb des Servicebereichs verfügbar. Die öffentliche API nimmt das vom Plugin vorbereitete Material entgegen und verwaltet die Aufgabe; ein separater interner Kanal versorgt die temporäre Grafana-Instanz.
Technische Herausforderungen
Die zentrale technische Aufgabe von DashPDF besteht darin, aus einem aktiven Dashboard einen reproduzierbaren Bericht zu erzeugen und gleichzeitig die Vertrauensgrenze um die Grafana-Installation des Nutzers zu erhalten.
Das Plugin führt Abfragen dort aus, wo der Zugriff auf Datenquellen und die Benutzerrechte bereits eingerichtet sind. Der Dienst erhält das Material für einen konkreten Export; das Rendering erfolgt in einer separaten Grafana-Instanz mit kompatibler Version. So lassen sich Panels reproduzieren, ohne dem Dienst Zugriff auf die Monitoring-Infrastruktur zu geben.
Große Dashboards verwenden einen mehrteiligen Snapshot-Upload. Dessen Zustand wird zentral koordiniert, sodass mehrere API-Replikate unterschiedliche Teile desselben Uploads annehmen können.
Zeitpläne werden vom Plugin innerhalb von Grafana ausgeführt. Beim Speichern zeichnet es den Abfrageplan auf und wiederholt ihn später für das benötigte Zeitfenster. Ändert sich das Dashboard danach, erhält der Lauf einen Hinweis, bis der Plan erneut aufgezeichnet wird.
Für paginierte PDFs ist ein eigener Layout-Schritt erforderlich: Panels werden nach Zeilen gruppiert und gemeinsam verschoben, damit ein Diagramm oder eine Tabelle nicht an einer Seitengrenze geteilt wird.
Damit ergänzt DashPDF eine bestehende Grafana-Installation um Export und planmäßige Zustellung, während Abfragen an Datenquellen und Zugriffskontrolle in der Infrastruktur des Nutzers verbleiben.