OpenObserve Report Server Setup: Generate and Email Dashboards

Use the OpenObserve Report Server to capture dashboards as PDFs and email them on a schedule. Configure Docker, SMTP (Gmail/SES), and env vars, then create reports from your dashboards. Perfect for audits and stakeholders who don’t log in daily.
Dashboards are ideal for real-time observability, but most stakeholders don’t log into OpenObserve on a daily basis. For compliance, audits, and regular visibility, you can easily schedule PDF reports.
That’s where the OpenObserve Report Server comes in. It converts your dashboards into PDF reports and automatically delivers them by email on a set schedule.
Unlike alerts, which notify you immediately when something goes wrong, reports provide scheduled summaries that capture the bigger picture over time. Think of alerts as fire alarms and reports as monthly health checkups: one offers instant protection, the other long-term insight.
In this guide, we’ll cover what the OpenObserve Report Server is, why it’s important, and how to set it up step-by-step in Docker.
Dashboards provide real-time insights, while the report server ensures that knowledge is consistently shared.
The Report Server is a OpenObserve service that:
When OpenObserve wants to generate a scheduled alert or report, it talks to the report-server over HTTP.
The report server itself doesn’t come with an SMTP engine; it connects to an external SMTP service. This can be:
Here’s what matters most:
ZO_REPORT_USER_EMAIL
→ Report server admin login (should match your OpenObserve admin) ZO_REPORT_USER_PASSWORD
→ Report server admin passwordZO_HTTP_PORT
→ Port where report server listens (default: 5090
) ZO_HTTP_ADDR
→ Bind address (0.0.0.0
for all interfaces)ZO_CHROME_NO_SANDBOX
→ Required in Docker (true
) ZO_CHROME_PATH
→ Custom Chrome binary (optional, auto-downloads if missing) ZO_CHROME_WINDOW_WIDTH/HEIGHT
→ Browser viewport size for rendering PDFsZO_SMTP_HOST
→ SMTP server (smtp.gmail.com
for Gmail) ZO_SMTP_PORT
→ Port (465
for SSL, 587
for STARTTLS) ZO_SMTP_USER_NAME
→ Gmail email address ZO_SMTP_PASSWORD
→ Gmail App Password (not your normal password) ZO_SMTP_FROM_EMAIL
→ Sender’s email (same as Gmail ID) ZO_SMTP_ENCRYPTION
→ ssltls
(for port 465) or starttls
(for port 587)ZO_WEB_URL
→ OpenObserve web URL (exposed on port 5080
) ZO_REPORT_SERVER_URL
→ Where OpenObserve can reach the report server (http://report-server:5090
)In this step-by-step tutorial, we’ll set up the O2 Report Server alongside OpenObserve and get it to send reports by email. Specifically, we will:
By the end, you’ll have a working setup where dashboards are automatically captured as PDFs and sent to your inbox on schedule.
Before starting, make sure you have:
5080
5090
Gmail doesn’t let you use your normal password anymore for SMTP. You must use an App Password.
report-server
abcd efgh ijkl mnop
Keep this safe, this is your ZO_SMTP_PASSWORD
.
To enable communication between the report server container and the OpenObserve Container, we need to create a network.
docker network create o2-network
simrankumari@Simrans-MacBook-Pro ~ % docker network create oo-network
5221f4d6d677b168c55cda9ec3954665c78ebc81f280d322cad8c44bbf33cc78 simrankumari@Simrans-MacBook-Pro
Run OpenObserve Container using the command:
docker run -d --name openobserve \
--network o2-network \
-v $PWD/data:/data \
-e ZO_DATA_DIR="/data" \
-e ZO_ROOT_USER_EMAIL="root@example.com" \
-e ZO_ROOT_USER_PASSWORD="Complexpass#123" \
-e ZO_REPORT_SERVER_URL="http://report-server:5090" \
-e ZO_WEB_URL="http://openobserve:5080" \
-p 5080:5080 \
o2cr.ai/openobserve/openobserve-enterprise:latest
You can look for OSS and enterprise versions of OpenObserve here.
docker run -d --name report-server \
--network o2-network \
-p 5090:5090 \
-e ZO_REPORT_USER_EMAIL="root@example.com" \
-e ZO_REPORT_USER_PASSWORD="Complexpass#123" \
-e ZO_HTTP_ADDR="0.0.0.0" \
-e ZO_HTTP_PORT=5090 \
-e ZO_SMTP_HOST="smtp.gmail.com" \
-e ZO_SMTP_PORT=465 \
-e ZO_SMTP_USER_NAME="yourgmail@gmail.com" \
-e ZO_SMTP_PASSWORD="your app password" \
-e ZO_SMTP_FROM_EMAIL="yourgmail@gmail.com" \
-e ZO_SMTP_ENCRYPTION="ssltls" \
-e ZO_CHROME_NO_SANDBOX=true \
public.ecr.aws/zinclabs/report-server:v0.11.0-4ab788d
⚠️ Notes:
587
and ZO_SMTP_ENCRYPTION=starttls
. ZO_SMTP_USER_NAME
and ZO_SMTP_FROM_EMAIL
must be the same Gmail ID. You can look for the latest version of the report server here, and update the image tag in the docker command accordingly.
docker logs -f report-server
To test out the report server, you need to try out sending some data to OpenObserve and creating a dashboard out of it. Follow these steps:
Next to trigger reports, you need to create one.
Report body supports Markdown formatting. Reports are not stored permanently in Report Server; they’re generated on demand.
On a successful Report Trigger you will receive an email from the specified SMTP username, along with the Dashboard PDF.
On successful run your report-server logs will show up like:
If you plan to run the Report Server in production, it’s important to make it resilient and secure from the start.
Even with the right environment variables, the first Docker setup is where most users stumble. Here are some common issues and their fixes:
Error contacting report server: error sending request for url (http://172.19.0.3:5090/api/…)
This usually occurs because the report server is listening only on 127.0.0.1
. Other containers can’t access it that way.
Fix: Run the report server with -e ZO_HTTP_ADDR=0.0.0.0
so it listens on all interfaces.
Also, in OpenObserve’s environment, set:
-e ZO_REPORT_SERVER_URL=http://report-server:5090
Avoid using 172.x.x.x
container IPs — they change. Always use the container name (report-server
) on the same Docker network.
Chrome binary could not be detected
called `Result::unwrap()` on an `Err` value
The container can’t find Chrome to render dashboards.
Fix: Explicitly set a path with:
-e ZO_CHROME_PATH="./download/win64-1045629/chrome-win/chrome.exe"
Running as root without --no-sandbox is not supported
Fix: Disable sandboxing in Docker with:
-e ZO_CHROME_NO_SANDBOX=true
This is safe inside container isolation, but in hardened environments, you may prefer running as a non-root user.
Error generating pdf … No such file or directory (os error 2)
This usually means OpenObserve can’t be reached.
Fix: Make sure you set the correct web URL:
-e ZO_WEB_URL="http://openobserve:5080"
If you get errors like:
Error finding email input box
current url: chrome-error://chromewebdata/
That means Chrome loaded an error page instead of the OpenObserve login page.
Fix: Check that your login credentials are correct:
-e ZO_REPORT_USER_EMAIL="root@example.com"
-e ZO_REPORT_USER_PASSWORD="Complexpass#123"
And verify the report server can reach OpenObserve inside the container:
docker exec -it report-server curl http://openobserve:5080/
If you get a redirect to /web/
, you’re good. If not, check your ZO_WEB_URL
in OpenObserve’s container, it must not point to localhost
.
The OpenObserve Report Server bridges the gap between real-time dashboards and shareable scheduled reports. By running the Report Server alongside your OpenObserve instance, you can automate PDF generation and email delivery, turning your dashboards into hands-free, scheduled snapshots of system health.
Try setting up your first scheduled report today and see how much easier it is to share observability with your team. For deeper configurations and advanced features, check out the OpenObserve documentation and explore more ways to streamline your observability workflows.
Ready to put this into practice? Sign up for an OpenObserve cloud account (14-day free trial) or visit our downloads page to self host OpenObserve.