尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Grafana 开源版导出 Dashboard PDF 教程:Docker 部署 Image Renderer 完整指南
将仪表板直接导出为 PDF 是 Grafana Enterprise企业版和 Grafana Cloud 的专属功能。Grafana Enterprise / Cloud原生支持 PDF 导出。Grafana OSS开源版默认不包含此功能。如果使用的是开源版需考虑通过社区插件如grafana-image-renderer或grafana-dashboard-reporter-app或第三方工具来实现。本文主要介绍grafana-image-renderer。一、环境使用 Docker 搭建涉及镜像grafana/grafana:13.0.7-ubuntugrafana/grafana-image-renderer:latestdocker pull ghcr.io/netcracker/qubership-grafana-reporter:main二、创建默认桥接网络相同容器使用同一网络时相互间可直接通过容器名访问也可减少对外暴露的端口。创建默认桥接网络docker network create -d bridge my-bridge查看创建结果$ docker network ls NETWORK ID NAME DRIVER SCOPE 683a3001d0e6 bridge bridge local 5229938d4079 host host local 78b45e3d0f76 my-bridge bridge local cbac34a7b69e none null local $ docker network list NETWORK ID NAME DRIVER SCOPE 683a3001d0e6 bridge bridge local 5229938d4079 host host local 78b45e3d0f76 my-bridge bridge local cbac34a7b69e none null local三、启动渲染服务grafana-image-renderer1、生成一个安全令牌生成随机安全令牌渲染服务和 Grafana Server 均配置相同值。$ openssl rand -base64 32 G5Reu8h28jKHPSLSFdfykNfpOlgBSy35cZWscA9Gs2、运行渲染器并设置令牌docker run -d --name renderer \ --rm \ --restartno \ --network my-bridge \ -e BROWSER_TZAsia/Shanghai \ -e AUTH_TOKENG5Reu8h28jKHPSLSFdfykNfpOlgBSy35cZWscA9Gs \ -e BROWSER_PATH/usr/bin/chromium \ -e BROWSER_READINESS_NETWORK_IDLE_TIMEOUT0s \ -e RENDERING_ARGS--no-sandbox,--disable-setuid-sandbox,--disable-dev-shm-usage,--disable-gpu,--window-size1920x1080 \ -e RENDERING_MODEclustered \ -e RENDERING_CLUSTERING_TIMEOUT300 \ grafana/grafana-image-renderer:latest参数说明BROWSER_TZ浏览器渲染页面时使用的时区。影响截图里图表时间轴显示要和 Grafana 时区保持一致否则截图时间会偏移。AUTH_TOKEN核心鉴权 tokenBROWSER_PATH指定 Chromium 浏览器二进制路径若不指定可能出现如下异常BROWSER_READINESS_NETWORK_IDLE_TIMEOUT页面就绪等待网络空闲超时时间0s关闭 “等待网络空闲” 逻辑页面 DOM 加载完成就直接渲染截图 如果仪表盘有大量异步查询设置 0s 可能出现截图图表空白出现空白截图可以调大例如5s。RENDERING_ARGS1. Chromium 启动参数非常关键容器环境必配 *--no-sandbox/--disable-setuid-sandbox关闭沙盒容器内运行 Chromium 必须否则启动失败 *--disable-dev-shm-usage不使用宿主机/dev/shm容器共享内存不足时防止渲染崩溃、浏览器卡死 *--disable-gpu关闭 GPU 硬件加速服务器环境无显卡 *--window-size1920x1080浏览器视窗默认分辨率导出图片默认画布大小RENDERING_MODE1. 渲染运行模式 *clustered集群模式会启动多个 Chromium 工作进程支持并发渲染适合多任务、报表导出量大场景 *single单进程模式只有一个 Chromium 实例并发能力弱小量使用RENDERING_CLUSTERING_TIMEOUT集群模式下单个渲染任务超时时间单位秒超过 300 秒任务直接丢弃防止卡死进程。四、运行 Grafana Serverdocker run -d --namegrafana \ --restartno \ --network my-bridge \ -p 3001:3001 \ -e TZAsia/Shanghai \ -e GF_SERVER_HTTP_PORT3001 \ -e GF_USERS_DEFAULT_TIMEZONEAsia/Shanghai \ -e GF_RENDERING_SERVER_URLhttp://renderer:8081/render \ -e GF_RENDERING_CALLBACK_URLhttp://grafana:3001 \ -e GF_RENDERING_RENDERER_TOKENG5Reu8h28jKHPSLSFdfykNfpOlgBSy35cZWscA9Gs \ -e GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINSoracle-datasource \ -e GF_RENDERING_CONCURRENT_RENDER_REQUEST_LIMIT90 \ -e GF_RENDERING_RENDER_KEY_LIFETIME10m \ -e GF_RENDERING_CONCURRENT_RENDER_REQUEST_PER_USER_LIMIT10 \ -v /data/volumes/grafana:/var/lib/grafana \ grafana/grafana:13.0.7-ubuntu参数说明TZ设置时区GF_SERVER_HTTP_PORTWeb 服务监听端口对应[server]段GF_USERS_DEFAULT_TIMEZONE[users]配置段新建用户默认时区上海 已存在用户时区不受影响。GF_RENDERING_SERVER_URL渲染服务器地址GF_RENDERING_CALLBACK_URLrenderer 回调 grafana 的地址GF_RENDERING_RENDERER_TOKEN安全 tokengrafana 和 renderer 必须配置一样GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS允许未签名插件多个插件用逗号分隔GF_RENDERING_CONCURRENT_RENDER_REQUEST_LIMIT全局最大并发渲染请求同时最多 90 个截图 / PDF 导出任务GF_RENDERING_RENDER_KEY_LIFETIME渲染请求 key 有效期 10 分钟超过时间渲染任务作废GF_RENDERING_CONCURRENT_RENDER_REQUEST_PER_USER_LIMIT单用户最大并发渲染请求防止单个用户大量导出 PDF 打满渲染服务五、验证选任意一个 dashboard参考下图找到 Export as image图片实际上是在 renderer 服务中通过 Chromium 渲染服务配置越低渲染时间越长。官方推荐如下配置项官方推荐值说明系统内存至少 16 GiB渲染时会启动浏览器实例这是内存消耗大户。并行渲染需要更多内存。CPU 核心至少 4 核渲染任务本身是计算密集型。部署方式Docker (推荐)官方提供了维护良好的 Docker 镜像。渲染完成后效果如下所示再点击“Download image”即可将 dashboard 保存为图片。六、导出 PDFgrafana-image-renderer服务本身支持 PDF 导出但 Grafana OSS 的用户界面UI中不会直接出现“导出为 PDF”的按钮。这个“一键导出”的功能是 Grafana Enterprise 和 Grafana Cloud 的专属特性。1、通过 API 导出图片按前文配置完成后可以通过调用 Grafana 内部的 API 端点来生成并下载但生成的仍是 PNG 图片。若仅是导出图片不如前文所述通过界面导出方便但仍有一些适用场景尤其是 panel 导出图片在自动化生成报告的场景中可直接集成 Grafana Panel 图片增强报告说服力邮件监控场景自动附上指标图表通过邮件即可查看指标详情ID 获取方式仪表板 UID当打开一个仪表板时浏览器地址栏的 URL 格式通常是http://grafana地址/d/仪表板UID/仪表板名称。仪表板UID就是d/后面的那串字符。例如在 URLhttp://localhost:3000/d/qWVHP27Mz/my-dashboard中qWVHP27Mz就是该仪表板的 UID。面板 ID如果想获取特定面板的 ID可以先点击面板标题在下拉菜单中选择查看 (View)。这时浏览器的 URL 会发生变化并在末尾添加?viewPanel面板ID的参数这个数字就是面板 ID。例如URL 变为http://localhost:3000/d/qWVHP27Mz/my-dashboard?viewPanel4其中的4就是面板 ID。1导出 dashboardAPI 请求格式curl -H Authorization: Bearer 你的令牌 \ http://localhost:3001/render/d/仪表板UID?orgId1fromnow-30dtonowwidth1920height5000autofitpanelstimeout120 \ --output my-dashboard.png示例curl -H Authorization: Bearer glsa_qP76rppFL7dqId10vqO4G03Cri80S2CF_e265de91 \ http://localhost:3001/render/d/adssekxv?orgId1fromnow-30dtonowwidth1920height500autofitpanelstimeout120 \ --output my-dashboard.png导出效果如下导出的不是 PDF是 PNG 图片默认包含左侧菜单栏和顶部导航栏对 width 和 height 的要求较高若配置不当显示效果较差如上图挤压在一起了2导出 panelAPI 请求格式GET 你的Grafana地址/render/d-solo/dashboard_uid/dashboard_name?panelIdpanel_idorgId1from...to...注意Grafana 版本不同地址也会有区别参数说明参数说明是否必需dashboard_uid仪表盘的唯一标识符UID是panel_id要导出的面板 ID是orgId组织 ID默认为1否from/to时间范围如now-24h否width/height输出图片尺寸像素否scale缩放因子用于提高分辨率否timeout渲染超时时间秒否autofitpanels自动调整面板以适应画布否示例curl -H Authorization: Bearer glsa_qP76rppFL7dqId10vqO4G03Cri80S2CF_e265de91 \ http://localhost:3001/render/d-solo/adssekxv/Index?panelIdpanel-1orgId1fromnow-30dtonowwidth1000height500 \ --output my-panel.png效果2、使用grafana-dashboard-reporter-app插件这是一个社区插件专门用于生成包含一个或多个面板的 PDF 报告。但没有验证通过经过反复尝试后怀疑是与grafana:13.0.7版本不兼容。插件下载Releases · mahendrapaipuri/grafana-dashboard-reporter-app · GitHub3、使用 qubership-grafana-reporterQuberShipNetcracker维护的 grafana-reporter 实际发布在GitHub Container Registryghcr.io上而且它的主分支 tag 是main来源正确的镜像地址可用 tagQuberShip 版Netcracker 维护ghcr.io/netcracker/qubership-grafana-reportermain非 latest原版IzakMaraisDocker Hubizakmarais/grafana-reporterlatest、2.3.1ghcr.io/netcracker/qubership-grafana-reporter是 PDF 报表生成中间服务不内置浏览器依赖外部grafana-image-renderer获取面板 PNG 截图再通过 LaTeX 生成完整 PDF 报表对外提供 HTTP API 生成仪表盘 PDF 报告。1拉取镜像# 拉 QuberShip 版推荐含 PDF 导出增强 docker pull ghcr.io/netcracker/qubership-grafana-reporter:main # 拉原版在 Docker Hub若更偏好 docker.io 源 docker pull izakmarais/grafana-reporter:latest2前置条件Grafana 必须已安装grafana-image-renderer插件 ——reporter 靠它把每个面板渲染成 PNG再合成 PDF。检查 / 安装# 在 Grafana 容器内检查 grafana-cli plugins ls | grep image-renderer # 未安装则安装 grafana-cli plugins install grafana-image-renderer同时确认 Grafana 允许匿名访问或已配置 API Key / 账号密码reporter 需要访问 Grafana 读取 dashboard JSON。3构建新镜像默认镜像里没有 pdflatex直接使用报错{time:2026-08-31T02:43:00.266,level:INFO,source:report.go:535,msg:Response GET \http://grafana:3001/render/d-solo/adssekxv/index?fromnow-30mheight960panelId2themelighttonowwidth1920\ received,status:500 Internal Server Error} {time:2026-08-31T02:43:00.27,level:ERROR,source:report.go:454,msg:Error occurred when requesting for panel. The request will be sent again in 5 seconds: failed to get Grafana panel: Status code is 500,panelId:2.png} {time:2026-08-31T02:43:05.275,level:INFO,source:report.go:456,msg:Requesting for the panel again. URL: \http://grafana:3001/render/d-solo/adssekxv/index?fromnow-30mheight960panelId2themelighttonowwidth1920\. Remaining attempts: 1,panelId:2.png} {time:2026-08-31T02:43:05.289,level:ERROR,source:generate.go:91,msg:Error occurred when tex command executing,err:exec: \pdflatex\: executable file not found in $PATH} {time:2026-08-31T02:43:05.292,level:ERROR,source:generate.go:137,msg:Error occurred while generating PDF report. Error: exec: \pdflatex\: executable file not found in $PATH} {time:2026-08-31T02:43:05.294,level:ERROR,source:generate.go:125,msg:Invalid image file,error:null,file:/tmp/adssekxv_report_now-30m-now/1.png} {time:2026-08-31T02:43:05.294,level:ERROR,source:report.go:173,msg:Error occurred while generating report file: exec: \pdflatex\: executable file not found in $PATH} {time:2026-08-31T02:43:05.294,level:INFO,source:report.go:363,msg:The request /api/v1/report/adssekxv took 3m18.110449661s} {time:2026-08-31T02:43:05.294,level:ERROR,source:report.go:366,msg:Error occurred when generating report. Error: exec: \pdflatex\: executable file not found in $PATH}DockerfileFROM ghcr.io/netcracker/qubership-grafana-reporter:main LABEL versionghcr.io/netcracker/qubership-grafana-reporter:main \ authorcheney.panaliyun.com \ desc安装texlive USER root RUN sed -i s|//archive.ubuntu.com|//mirrors.tuna.tsinghua.edu.cn|g; s|//security.ubuntu.com|//mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list.d/ubuntu.sources \ apt-get update \ apt-get install -y --no-install-recommends \ texlive-latex-base texlive-latex-recommended texlive-fonts-recommended \ rm -rf /var/lib/apt/lists/* USER 2001 EXPOSE 8881注意ghcr.io/netcracker/qubership-grafana-reporter:main 镜像的默认端口有些材料写的是 8686但实际上是 8881因此Dockerfile 中显式指定了 8881 端口。构建新镜像docker build -t grafana-reporter:pdf .4启动服务REST API 服务模式推荐随时按需导出因此不再赘述一次性 CLI 任务模式docker run -d --name grafana-reporter \ --rm \ --restartno \ --network my-bridge \ -p 8881:8881 \ -e TZAsia/Shanghai \ grafana-reporter:pdf \ -httpServiceModetrue \ -grafana http://grafana:3001 \ -token glsa_qP76rppFL7dqId10vqO4G03Cri80S2CF_e265de91 \ -template gridTemplate环境变量配置参数说明TZ设置时区MAX_CONCURRENT_RENDER_REQUESTS默认值4 并发向 grafana-image-renderer 请求面板截图的最大并发数不要设置过高会打满 renderer 负载SAVE_TEMP_IMAGES默认值false 报表生成完毕后是否保留临时 PNG 图片false 自动删除调试排错可设 true命令行 CLI 参数CLI 参数是否必填说明默认-logLevel否日志级别debug/info/warn/errorinfo-httpServiceMode否true 常驻 HTTP API 服务false 一次性执行生成 PDF 后退出false-grafana是Grafana 服务地址容器网络内地址例http://grafana:3001localhost-dashboard一次性模式必填仪表盘 UID仅一次性模式生效http 模式由 API URL 传入 UID--token二选一Grafana API Key推荐优先使用--user二选一Grafana 基础认证用户名basic auth--password二选一Grafana 基础认证密码--vars否仪表盘变量格式var-xxxvalvar-yyyvalhttp 模式可在 url 传参--template否PDF 模板名称 •gridTemplate复刻仪表盘原有面板布局默认 •simpleTemplateA4 纸张面板从上往下堆叠 •pngTemplate输出 PNG 而非 PDFgridTemplate-defaultFrom否API 未指定时间范围时报表默认起始时间支持 Grafana 时间语法now-24hnow-30m-defaultTo否API 未指定时间范围时报表默认结束时间now-insecureSkipVerify否是否跳过 Grafana TLS 证书校验 HTTPS 环境自签名证书设 truefalse-ca否CA 证书文件名挂载路径/grafana/certificates/ca.pem/grafana/certificates/ca.pem-cert否client 证书文件名/grafana/certificates/cert.crt-pKey否client 私钥文件名/grafana/certificates/cert.key导出 PDF# 基本认证 curl http://user:passwordlocalhost:8881/api/v1/report/DASHBOARD_UID --output report.pdf # API Key curl http://localhost:8881/api/v1/report/DASHBOARD_UID \ -H Authorization: Bearer api_key --output report.pdf # 宿主机执行容器内默认没有 curl 命令 # 基本认证 curl http://admin:admin123localhost:8881/api/v1/report/adssekxv --output report1.pdf curl http://admin:admin123localhost:8881/api/v1/report/adssekxv?fromnow-30dtonow --output report1.pdf curl -4 -u admin:admin123 http://127.0.0.1:8881/api/v1/report/adssekxv?fromnow-30dtonowtemplatesimpleTemplate --output report2.pdf # API Key curl http://localhost:8881/api/v1/report/adssekxv \ -H Authorization: Bearer glsa_qP76rppFL7dqId10vqO4G03Cri80S2CF_e265de91 --output report3.pdf验证 PDF# 期望report.pdf 非空PDF document, version ... $ ls -lh report1.pdf file report1.pdf -rw-rw-r-- 1 ph ph 62K Aug 31 05:51 report1.pdf report1.pdf: PDF document, version 1.7API 参数说明参数说明from/to时间范围相对或毫秒如date -d 2026-08-30 00:00:00 %s%3NtemplategridTemplate默认按原布局simpleTemplateA4 逐面板竖排pngTemplate输出 PNGvar-*Grafana 模板变量多个用renderCollapsedtrue时展开折叠面板渲染PDF 效果Grafana UI 实际效果七、遗留问题问题描述PDF 显示的是 UTC 时间使用qubership-grafana-reporter插件导出的 PDF 文件头部显示的是 UTC 时间没有适配本地时区。PDF 布局比较鸡肋如前文效果图PDF 与 Grafana UI 界面效果相差较远且没有发现有参数可以调整。这极大影响实际使用。不知道Grafana Enterprise / Cloud导出的 PDF 效果如何。
RELATED

相关推荐

参数变更如何做到可审计与可回滚

参数变更如何做到可审计与可回滚

文章目录每日一句正能量1. 背景与问题2. 环境与数据3. 复现过程4. 方案实施5. 结果对比6. 故障排查与应急处理6.1 内存溢出(work_mem 设置过大)6.2 连接数超限(max_connections 调整不当)6.3 主备延迟增大(参数变更引发…

📅 2026/10/26 20:45:58
SAP HANA Cloud 连接远程数据源实战,数据虚拟化与实时复制到底应该怎么选

SAP HANA Cloud 连接远程数据源实战,数据虚拟化与实时复制到底应该怎么选

在一个企业级 SAP 数据架构里,真正棘手的问题往往不是数据有没有,而是数据到底放在哪里。 销售订单可能还留在 SAP S/4HANA 里,历史交易数据存放在企业内部的 SAP HANA 数据库里,新开发的分析应用已经运行在 SAP HANA Cloud 上,另外一部分外部数据又来自云端数据库。业务…

📅 2026/9/8 23:07:59
SRC---接口漏洞实战(第三更)

SRC---接口漏洞实战(第三更)

在我们信息收集获取webvpn或sslvpn后,我们可以进入一站是服务大厅进行漏洞挖掘一、漏洞介绍水平越权访问是一种“基于数据的访问控制”设计缺陷引起的漏洞。由于服务端在接收到请求数据进行操作时没有对用户的权限进行严格的校验,这种漏洞最容易出现的位…

📅 2026/10/13 17:28:29
MORE NEWS

更多资讯

📰

大模型推理弹性扩容新范式:Upcycle与YOCO协同优化显存与计算

1. 项目概述:当大模型扩容不再只是“堆卡”——KITE框架里Upcycle与YOCO的务实合流最近在几个核心AI工程团队的内部技术复盘会上,反复听到一个词:“KITE”。不是风筝,也不是某个新出的开源库代号,而是指代一套正在被高…

📰

geckodriver配置与Selenium Firefox自动化打包排错实战

简介:面向使用 Python 进行 Web 自动化测试、网络爬虫和桌面脚本开发的读者,这份资源提供了可运行的 Python 环境文件以及 Firefox 自动化驱动 Geckodriver,重点解决 Selenium 调用浏览器时驱动缺失、依赖组件不全和运行环境配置繁琐等问题。…

📰

LXC原理与实战:Linux内核级容器技术详解

1. LXC到底是什么,它和Docker、虚拟机有啥区别?LXC(Linux Containers)这个词在运维圈和开发圈里经常被提起,但很多人第一次听到时会下意识把它和Docker划等号,或者误以为是“轻量级虚拟机”。其实这种理解既…

📰

军工卫星视频传输的WebUploader增强方案

1. 军工行业卫星视频传输的特殊挑战军工行业的卫星视频传输系统面临着几个独特的技术挑战。首先,卫星视频文件通常体积庞大,单个文件可能达到几十GB甚至上百GB。这类文件在传统HTTP上传过程中容易出现超时、中断等问题,而军工领域的网络环境往…

📰

深入解析AQS原理与ReentrantLock实现

1. 从ReentrantLock的加锁流程看AQS本质第一次看到ReentrantLock的lock()方法实现时,很多人会困惑为什么一个简单的加锁操作需要如此复杂的代码结构。实际上,这正是AQS(AbstractQueuedSynchronizer)设计精妙之处——它将同步器的公…

📰

Java工程师转型大模型:核心技能与高薪路径

1. 转型背景与行业现状2023年被称为AI大模型爆发的元年,ChatGPT的横空出世彻底改变了技术行业的格局。作为一名有5年经验的Java后端工程师,我清晰地记得第一次使用GPT-4时的那种震撼——它不仅能理解复杂的技术问题,还能给出可运行的代码解决…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬