{"id":19860896,"url":"https://github.com/cloudeteer/grafana-pdf-report-app","last_synced_at":"2025-05-02T04:30:27.966Z","repository":{"id":254101505,"uuid":"826368444","full_name":"cloudeteer/grafana-pdf-report-app","owner":"cloudeteer","description":"Grafana app for generate PDFs based on dashboards","archived":false,"fork":false,"pushed_at":"2025-04-30T03:22:37.000Z","size":1241,"stargazers_count":6,"open_issues_count":14,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-04-30T04:25:17.245Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cloudeteer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-07-09T15:16:36.000Z","updated_at":"2025-04-16T15:06:15.000Z","dependencies_parsed_at":"2024-10-28T18:23:50.864Z","dependency_job_id":"83397fd3-2d83-4169-a8c0-0f3db3b23893","html_url":"https://github.com/cloudeteer/grafana-pdf-report-app","commit_stats":null,"previous_names":["cloudeteer/grafana-pdf-report-app"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudeteer%2Fgrafana-pdf-report-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudeteer%2Fgrafana-pdf-report-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudeteer%2Fgrafana-pdf-report-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudeteer%2Fgrafana-pdf-report-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloudeteer","download_url":"https://codeload.github.com/cloudeteer/grafana-pdf-report-app/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251986621,"owners_count":21675950,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T15:07:31.781Z","updated_at":"2025-05-02T04:30:27.671Z","avatar_url":"https://github.com/cloudeteer.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![ci](https://github.com/cloudeteer/grafana-pdf-report-app/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/cloudeteer/grafana-pdf-report-app/actions/workflows/ci.yml?query=branch%3Amain) [![docs](https://img.shields.io/badge/docs-passing-green?style=flat\u0026link=https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/src/README.md)](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/src/README.md) [![Release](https://img.shields.io/github/v/release/cloudeteer/grafana-pdf-report-app.svg?include_prereleases)](https://github.com/cloudeteer/grafana-pdf-report-app/releases/latest) [![GitHub License](https://img.shields.io/github/license/cloudeteer/grafana-pdf-report-app)](https://gitlab.com/cloudeteer/grafana-pdf-report-app) [![Go Report Card](https://goreportcard.com/badge/github.com/cloudeteer/grafana-pdf-report-app)](https://goreportcard.com/report/github.com/cloudeteer/grafana-pdf-report-app) [![code style](https://img.shields.io/badge/code%20style-gofmt-blue.svg)](https://pkg.go.dev/cmd/gofmt)\n\n# Grafana Dashboard Reporter\n\nThis Grafana plugin app can create PDF reports of a given dashboard using headless `chromium`\nand [`grafana-image-renderer`](https://github.com/grafana/grafana-image-renderer).\n\n![Sample report](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/docs/pngs/sample_report.png)\n\nThis plugin is based on the original work\n[grafana-reporter](https://github.com/IzakMarais/reporter) and \n[grafana-dashboard-reporter-app](https://github.com/mahendrapaipuri/grafana-dashboard-reporter-app)\n\nThe core of the plugin is heavily inspired from the above stated work with some\nimprovements and modernization.\n\n- The current plugin uses HTML templates and headless chromium to generate reports\n  instead of LaTeX. `grafana-image-renderer` is a prerequisite for both current and\n  original plugins.\n\n- The current plugin app exposes the reporter as a custom API end point of Grafana instance without\n  needing to run the [grafana-reporter](https://github.com/IzakMarais/reporter)\n  as a separate web service. The advantage of the plugin approach is the authenticated\n  access to the reporter app is guaranteed by Grafana auth.\n\n- The plugin is capable of including all the repeated rows and/or panels in the\n  generated report.\n\n- The plugin can be configured by Admins and users either from\n  [Configuration Page](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/src/img/light.png) or query parameters to the report API.\n\n\nA Grafana plugin to create PDF reports from dashboard panels. This app has been\nheavily inspired from the original work [grafana-reporter](https://github.com/IzakMarais/reporter).\nThe core backend follows very closely to the original work. Instead of using LaTeX\nto generate reports, the current plugin generates it from HTML templates using headless\nchromium similar the reporting app in Grafana Enterprise offering. The plugin app also integrates\nthe frontend components to be able to configure the reporter from the Configuration page.\n\nBy default the user needs to be authenticated with Grafana to access the service and\nmust have role `Viewer` on the dashboard that user wants to create a PDF report.\n\n## Prerequisites\n\nThis plugin app depends on following:\n\n- Grafana \u003e= 11\n\n- Another Grafana plugin [`grafana-image-renderer`](https://github.com/grafana/grafana-image-renderer) to render panels into PNG files.\n\n- If `grafana-image-renderer` is installed as Grafana plugin, no other external\ndependencies are required for the plugin to work. `grafana-image-renderer` ships the\nplugin with a standalone instance of `chromium` and the same `chromium` will be used\nto render PDF reports. If `grafana-image-renderer` is deployed as a service on a\ndifferent host, `chromium` must be installed on the host where Grafana is installed.\n\n\u003e [!IMPORTANT]\n\u003e `grafana-image-renderer` advises to install `chromium` to ensure that all the\ndependent libraries of the `chromium` are available on the host.\n\n## Installation\n\n### Installation via `grafana-cli`\n\nGrafana Enterprise offers a very similar plugin [reports](https://grafana.com/docs/grafana/latest/dashboards/create-reports/#export-dashboard-as-pdf)\nand hence, their plugin policies do not allow to publish the current plugin in their\nofficial catalog.\n\nIt is important to note that the current plugin does not offer all the functionalities\noffered by Enterprise plugin and it is only relevant if users would like to create a\nPDF report of a given dashboard. If users needs more advanced functionalities like\ngenerating and sending reports automatically, they should look into official plugin.\n\nHowever, it is still possible to install this plugin on on-premise Grafana installations\nas an unsigned plugin. The installation procedure is briefed in\n[Local installation](#local-installation) section below.\n\n### Local installation\n\nDownload the [latest Grafana Dashboard Reporter](https://github.com/cloudeteer/grafana-pdf-report-app/releases/latest).\n\nCreate a directory for grafana to access your custom-plugins\n_e.g._ `/var/lib/grafana/plugins/cloudeteer-pdfreport-app`.\n\nThe following shell script downloads and extracts the latest plugin source\ncode into the the current working directory. Run the following inside your grafana\nplugin directory:\n\n```bash\ncd /var/lib/grafana/plugins\ncurl https://raw.githubusercontent.com/cloudeteer/grafana-pdf-report-app/main/scripts/bootstrap-dashboard-reporter-app.sh | bash\n```\n\nThis will install the latest release of plugin in the `/var/lib/grafana/plugins` folder\nand upon Grafana restart, the plugin will be loaded.\n\nIf user wants to install the latest nightly release, it is enough to add a environment\nvariable `NIGHTLY` to `bash`\n\n```bash\ncd /var/lib/grafana/plugins\ncurl https://raw.githubusercontent.com/cloudeteer/grafana-pdf-report-app/main/scripts/bootstrap-dashboard-reporter-app.sh | NIGHTLY=1 bash\n```\n\n\u003e [!IMPORTANT]\n\u003e The final step is to _whitelist_ the plugin as it is an unsigned plugin and Grafana,\nby default, does not load any unsigned plugins even if they are installed. In order to\nwhitelist the plugin, we need to add following to the Grafana configuration file\n\n```ini\n[plugins]\nallow_loading_unsigned_plugins = cloudeteer-pdfreport-app\n```\n\nOnce this configuration is added, restart the Grafana server and it should load the\nplugin. The loading of plugin can be verified by the following log lines\n\n```bash\nlogger=plugin.signature.validator t=2024-03-21T11:16:54.738077851Z level=warn msg=\"Permitting unsigned plugin. This is not recommended\" pluginID=cloudeteer-pdfreport-app\nlogger=plugin.loader t=2024-03-21T11:16:54.738166325Z level=info msg=\"Plugin registered\" pluginID=cloudeteer-pdfreport-app\n\n```\n\n### Install with Docker-compose\n\nThere is a docker compose file provided in the repo. Create a directory `dist` in the\nroot of the repo and extract the latest version of the plugin app into this folder `dist`.\nOnce this is done, starting a Grafana server with plugin installed can be done\nas follows:\n\n```bash\ndocker-compose -f docker-compose.yaml up\n```\n\n## Configuring the plugin\n\nAfter successful installation of the plugin, it will be, by default, disabled. We can\nenable it in different ways.\n\n- From Grafana UI, navigating to `Apps \u003e Dashboard Reporter App \u003e Configuration` will\nshow [this page](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/src/img/light.png)\nand plugin can be enabled there. The configuration page can also be\naccessed by URL `\u003cGrafana URL\u003e/plugins/cloudeteer-pdfreport-app`.\n\n\u003e [!NOTE]\n\u003e The warning about `Invalid plugin signature` is not fatal and it is simply saying\nthat plugin has not been signed by Grafana Labs.\n\n- By using [Grafana Provisioning](https://grafana.com/docs/grafana/latest/administration/provisioning/).\nAn example provision config is provided in the [repo](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/provisioning/plugins/app.yaml)\nand it can be installed at `/etc/grafana/provisioning/plugins/reporter.yml`. After installing\nthis YAML file, by restarting Grafana server, the plugin will be enabled with config\nsettings used in the `reporter.yml` file.\n\nGrafana Provisioning is a programmatic way of configuring the plugin app. Some of the\nconfiguration settings can be set from the environment variables too. Note that any\nconfigured environment variable takes precedence over configuration file settings. Thus,\nthe plugin app can be configured at install time using either provisioning through YAML\nfile or using environment variables or mix of both. It is possible to modify these\nsettings at the runtime using Grafana UI.\n\nTo resume, the configuration settings can be set in the following ways:\n\n- Using provisioning through a YAML file at install time\n- Using environment variables set on Grafana server at install time\n- Using Grafana UI at runtime\n\nThe configuration options set in the above stated methods are applied `Org` wide\nin Grafana acting as baseline configuration for the plugin. Hence, these settings can\nonly be changed by a user with a `Admin` role using Grafana UI.\n\nDifferent configuration settings are explained below. As each configuration option can\nbe set with different sources, the name of the option in each source is identified as\nwell. `file` stands for provisioning through YAML file, `env` stands for environment\nvariable and `ui` stands for name in Grafana UI. When a source is emitted, it means\nthat it is not possible to set that configuration option using that specific source.\n\n### Authentication settings\n\nThis config section allows to configure authentication related settings.\n\n- `file:saToken; ui:Service Account Token`: A service account token that will be used\n   to generate reports _via_ API requests. More details on how to use it is briefed in\n  [Using Grafana API](#using-grafana-api) section.\n\n### Report settings\n\nThis config section allows to configure report related settings.\n\n- `file:theme; env:GF_REPORTER_PLUGIN_REPORT_THEME; ui: Theme`: Theme of the panels in\n  the report.\n\n- `file:layout; env:GF_REPORTER_PLUGIN_REPORT_LAYOUT; ui:Layout`: Layout of the report.\n  Using grid layout renders the report as it is rendered in the browser. A simple\n  layout will render the report with one panel per row. Available options: `simple`\n  and `grid`.\n\n- `file:orientation; env:GF_REPORTER_PLUGIN_REPORT_ORIENTATION; ui:Orientation`: Orientation\n  of the report. Available options: `portrait` and `landscape`.\n\n- `file:dashboardMode; env:GF_REPORTER_PLUGIN_REPORT_DASHBOARD_MODE; ui:Dashboard Mode`:\n  Whether to render default dashboard or full dashboard. In default mode, collapsed rows\n  are ignored and only visible panels are included in the report. Whereas in full mode,\n  rows are un collapsed and all the panels are included in the report. Available options:\n  `default` and `full`.\n\n- `file:timeZone; env:GF_REPORTER_PLUGIN_REPORT_TIMEZONE; ui:Time Zone`: The time zone\n  that will be used in the report. It has to conform to the\n  [IANA format](https://www.iana.org/time-zones). By default, local Grafana server's\n  time zone will be used.\n\n- `file:logo; env: GF_REPORTER_PLUGIN_REPORT_LOGO; ui:Branding Logo`: This parameter\n  takes a base64 encoded image that will be included in the footer of each page in the\n  report. Typically, operators can include their organization logos to have \"customized\"\n  reports. Images of format PNG and JPG are accepted. **There is no need to add the base64 header**.\n  Based on the content, Mime type will be detected and appropriate header will be added.\n\n### Additional settings\n\nThe following configuration settings allow more control over plugin's functionality.\n\n- `file:appUrl; env: GF_REPORTER_PLUGIN_APP_URL; ui: Grafana Hostname`: The URL at which\n  Grafana is running. By default, `http://localhost:3000` is used which should work for\n  most of the deployments.\n\n- `file:skipTlsCheck; env: GF_REPORTER_PLUGIN_SKIP_TLS_CHECK; ui: Skip TLS Verification`:\n  If Grafana instance is configured to use TLS with self signed certificates\n  set this parameter to `true` to skip TLS certificate check.\n\n- `file:remoteChromeUrl; env: GF_REPORTER_PLUGIN_REMOTE_CHROME_URL; ui: Remote Chrome URL`:\n  A URL of a running remote chrome instance which will be used in report generation. Grafana\n  running on k8s can opt to use this option when installing `chromium` inside Grafana\n  container is not desired. An example [docker-compose file](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/docker-compose.yaml) shows how to run `chromium` in an `init` container. When remote chrome instance is being used, ensure\n  that `appUrl` is accessible to remote chrome.\n\n- `file:maxBrowserWorkers; env: GF_REPORTER_PLUGIN_MAX_BROWSER_WORKERS; ui: Maximum Browser Workers`:\n  Maximum number of workers for interacting with chrome browser.\n\n- `file:maxRenderWorkers; env: GF_REPORTER_PLUGIN_MAX_RENDER_WORKERS; ui: Maximum Render Workers`:\n  Maximum number of workers for generating panel PNGs.\n\n\u003e [!NOTE]\n\u003e Starting from `v1.4.0`, config parameter `dataPath` is not needed anymore as the plugin\nwill get the Grafana's data path based on its own executable path. If the existing provisioned\nconfigs have this parameter set, it will be ignored while loading the plugin's configuration.\n\n#### Overriding global report settings\n\nAlthough configuration settings can only be modified by users with `Admin` role for whole `Org`\nof Grafana, it is possible to override the global defaults for a particular report\nby using query parameters. It is enough to add query parameters to dashboard report URL\nto set these values. Currently, the supported query parameters are:\n\n- Query field for theme is `theme` and it takes either `light` or `dark` as value.\n  Example is `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\u0026theme=dark`\n\n- Query field for layout is `layout` and it takes either `simple` or `grid` as value.\n  Example is `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\u0026layout=grid`\n\n- Query field for orientation is `orientation` and it takes either `portrait` or `landscape`\n  as value. Example is `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\u0026orientation=landscape`\n\n- Query field for dashboard mode is `dashboardMode` and it takes either `default` or `full`\n  as value. Example is `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\u0026dashboardMode=full`\n\n- Query field for dashboard mode is `timeZone` and it takes a value in [IANA format](https://www.iana.org/time-zones)\n  as value. **Note** that it should be encoded to escape URL specific characters. For example\n  to use `America/New_York` query parameter should be\n  `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\u0026timeZone=America%2FNew_York`\n\nBesides there are two special query parameters available namely:\n\n- `includePanelID`: This can be used to include only panels with IDs set in the query in\n  the generated report. An example can be\n  `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\u0026includePanelID=1\u0026includePanelID=5\u0026includePanelID=8`.\n  This request will only include the panels `1`, `5` and `8` in the report and ignoring the rest.\n  When `grid` layout is used with `includePanelID`, the report layout will leave the gaps\n  in the place of panels that are not included in the report.\n\n- `excludePanelID`: This can be used to exclude any unwanted panels in\n  the generated report. An example can be\n  `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\u0026excludePanelID=2\u0026excludePanelID=7`.\n  This request will only exclude panels `2`, and `7` in the report and including the rest.\n  When `grid` layout is used with `excludePanelID`, the report layout will leave the gaps\n  in the place of panels that are excluded in the report.\n\n\u003e [!NOTE]\n\u003e If a given panel ID is set in both `includePanelID` and `excludePanelID` query parameter,\n  it will be **included** in the report. Query parameter `includePanelID` has more\n  precedence over `excludePanelID`.\n\n### Grafana API Token\n\nThe plugin needs to make API requests to Grafana to fetch resources like dashboard models,\npanels, _etc._  Depending on the Grafana version the operators need to perform some\nextra configuration to get an API token from Grafana.\n\n- `Grafana \u003c= 10.4.3`: Until Grafana 10.4.3, Grafana was forwarding the user cookies to\n  plugin apps and the plugin will use the same user cookie to make API requests to Grafana.\n  Thus, if `Grafana \u003c= 10.4.3` is being used, there is no need to provide any API token\n  to the the plugin.\n\n- `Grafana \u003e 10.4.3`: For these Grafana deployments, the plugin needs an API token from\n  Grafana to make API requests to Grafana. This can be done automatically by enabling\n  feature flag `externalServiceAccounts`, which will create a service account and\n  provision a service account token automatically for the plugin. To enable this feature,\n  it is necessary to set `enable = externalServiceAccounts` in `feature_toggles` section\n  of Grafana configuration.\n\n\u003e [!NOTE]\n\u003e If the operators do not wish or cannot use `externalServiceAccounts` feature flag on\ntheir Grafana deployment, it is possible to manually create an API token and set it in\nthe [plugin configuration options](#authentication-settings).\n\n## Using plugin\n\n### Using Grafana web UI\n\nThe prerequisite is the user must have at least `Viewer` role on the dashboard that they\nwant to create a PDF report. After the user authenticates with Grafana, creating a\ndashboard report is done by visiting the following end point\n\n```bash\n\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\n```\n\nIn addition to `dashUid` query parameter, it is possible to pass time range query\nparameters `from`, `to` and also dashboard variables that have `var-` prefix. This\npermits to integrate the dashboard reporter app into Dashboard links.\n\nThe layout and orientation options can be passed by query parameters which will override\nthe global values set by admins in the plugin configuration. `layout` will take either\n`simple` or `grid` as query parameter and `orientation` will take `portrait` or\n`landscape` as parameters.\n\nFollowing steps will configure a dashboard link to create PDF report for that dashboard\n\n- Go to Settings of Dashboard\n- Go to Links in the side bar and click on `Add Dashboard Link`\n- Use Report for `Title` field, set `Type` to `Link`\n- Now set `URL` to `\u003cgrafanaAppUrl\u003e/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e`\n- Set `Tooltip` to `Create a PDF report` and set `Icon` to `doc`\n- By checking `Include current time range` and `Include current template variables values`,\n  time range and dashboard variables will be added to query parameters while creating\n  PDF report.\n\nNow there should be link in the right top corner of dashboard named `Report` and clicking\nthis link will create a new PDF report of the dashboard.\n\n### Using Grafana API\n\nThe plugin can generate reports programmatically using Grafana API by using\n[Grafana service accounts](https://grafana.com/docs/grafana/latest/administration/service-accounts/).\n\nOnce a service account is created with appropriate permissions by following\n[Grafana docs](https://grafana.com/docs/grafana/latest/administration/service-accounts/#to-create-a-service-account),\ngenerate an [API token](https://grafana.com/docs/grafana/latest/administration/service-accounts/#add-a-token-to-a-service-account-in-grafana)\nfrom the service account. If `externalServiceAccounts` feature flag is not enabled,\neither the same or another API token must be added to the\n[plugin configuration](#authentication-settings) as well. Once the token has been\ngenerated and configured in the plugin, reports can be created using\n\n```bash\ncurl --output=report.pdf -H \"Authorization: Bearer \u003csupersecrettoken\u003e\" \"https://example.grafana.com/api/plugins/cloudeteer-pdfreport-app/resources/report?dashUid=\u003cUID of dashboard\u003e\"\n```\n\nThe above example shows on how to generate report using `curl` but this can be done with\nany HTTP client of your favorite programming language.\n\n## Security\n\n### `Grafana \u003c= 10.4.3`\n\nWhen reports are generated from browser, there is minimal to no security risks as the\nplugin forward the current Grafana cookie in the request to make API requests to other\nGrafana resources. This ensures that user will not be able to generate reports for\nthe dashboards that contains data sources that they do not have permissions to query. The\nplugin _always_ prioritizes the cookie for authentication when found. Disabling basic auth\nfor Grafana will force the users to generate reports from browser, thus forcing them to\nuse cookie for authentication.\n\n### `Grafana \u003e 10.4.3`\n\nStarting from `Grafana 10.4.4`, user cookies are not forwarded to the plugin apps anymore.\nWhen the user cookie is not found and the plugin needs a manually configured service account\ntoken or `externalServiceAccounts` feature must be enabled (for Grafana \u003e= 10.3.0). If the\nconfigured service account token has broader permissions than the user making the request,\nthe user _may_ generate reports of dashboards on the data sources that they do not\nhave permissions to.\n\n## Examples\n\nHere are the example reports that are generated out of the test dashboards\n\n- [Report with portrait orientation, simple layout and full dashboard mode](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/docs/reports/report_portrait_simple_full.pdf)\n- [Report with landscape orientation, simple layout and full dashboard mode](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/docs/reports/report_landscape_simple_full.pdf)\n- [Report with portrait orientation, grid layout and full dashboard mode](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/docs/reports/report_portrait_grid_full.pdf)\n- [Report with landscape orientation, grid layout and full dashboard mode](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/docs/reports/report_landscape_grid_full.pdf)\n- [Report with portrait orientation, grid layout and default dashboard mode](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/docs/reports/report_portrait_grid_default.pdf)\n\n## Troubleshooting\n\n- When TLS is enabled on Grafana server, `grafana-image-renderer` tends to throw\ncertificate errors even when the TLS certificates are signed by well-known CA. Typical\nerror messages will be as follows:\n\n  ```bash\n  logger=plugin.grafana-image-renderer t=2024-05-09T10:46:00.117454724+02:00 level=error msg=\"Browser request failed\" url=\"https://localhost/d-solo/f5a26bea-adf2-4f2c-8522-79159ba26c0f/_?from=now-24h\u0026height=500\u0026panelId=6\u0026theme=light\u0026to=now\u0026width=1000\u0026render=1\" method=GET failure=net::ERR_CERT_COMMON_NAME_INVALID\n  logger=plugin.grafana-image-renderer t=2024-05-09T10:46:00.118784778+02:00 level=error msg=\"Error while trying to prepare page for screenshot\" url=\"https://localhost:443/d-solo/f5a26bea-adf2-4f2c-8522-79159ba26c0f/_?from=now-24h\u0026height=500\u0026panelId=6\u0026theme=light\u0026to=now\u0026width=1000\u0026render=1\" err=\"Error: net::ERR_CERT_COMMON_NAME_INVALID\"\n  ```\n\n  To solve this issue set environment variables `GF_RENDERER_PLUGIN_IGNORE_HTTPS_ERRORS=true`\n  and `IGNORE_HTTPS_ERRORS=true` for the `grafana-image-renderer` service.\n\n- If `chromium` fails to run, it suggests that there are missing dependent libraries on\nthe host. In that case, we advise to install `chromium` on the machine which will\ninstall all the dependent libraries.\n\n## Development\n\nSee [DEVELOPMENT.md](https://github.com/cloudeteer/grafana-pdf-report-app/blob/main/DEVELOPMENT.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudeteer%2Fgrafana-pdf-report-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudeteer%2Fgrafana-pdf-report-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudeteer%2Fgrafana-pdf-report-app/lists"}