Hi,
We’ve been using standalone image renderer (helm chart imageRenderer.enabled: true
) to screenshot panels linked to alerts. In Grafana 11.3 it worked well but after update to 11.5 it stopped creating screenshots (both in 3.11.5 version as in latest version).
Logs (image renderer) that are probably related to this issue:
{"error":"TypeError: Cannot read properties of undefined (reading 'keys')","level":"error","message":"Browser uncaught exception"}
{"failure":"net::ERR_ABORTED","level":"error","message":"Browser request failed","method":"POST","url":"http://grafana-dev.grafana-dev/api/ds/query?ds_type=prometheus&requestId=SQR100"}
{"level":"debug","message":"10.244.0.199 - - [24/Mar/2025:08:16:35 +0000] \"GET /render?deviceScaleFactor=1.000000&domain=grafana-dev.grafana-dev&encoding=png&height=500&renderKey=DnjNxwkYtxn7XqE9uSWqDg3ZhO0iVkdd&timeout=30&timezone=&url=<url>&width=1000 HTTP/1.1\" - - \"-\" \"Grafana/11.5.2\"\n"}
{"level":"debug","message":"Connection closed","url":"<url>"}
{"err":"AbortError: This operation was aborted\n at new DOMException (node:internal/per_context/domexception:53:5)\n at AbortController.abort (node:internal/abort_controller:465:18)\n at IncomingMessage.<anonymous> (/usr/src/app/build/service/http-server.js:56:33)\n at IncomingMessage.emit (node:events:518:28)\n at emitCloseNT (node:internal/streams/destroy:148:10)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)","level":"error","message":"Error while performing step","step":"panelsRendered","url":"<url>"}
Logs from Grafana instance:
{"dashboard":"20e69027c8e0e703b4c63ec23c768afd","level":"debug","logger":"ngalert.image","msg":"Requesting screenshot","org_id":1,"panel":11,"rule_uid":"cegspyj2y639cc","t":"2025-03-24T10:34:24.062630217Z","traceID":"ac8aa0daeedfc11ef444503d39dd33f0"}
{"level":"info","logger":"rendering","msg":"Rendering","org_id":1,"path":"<dashboard path>","renderer":"http","rule_uid":"cegspyj2y639cc","t":"2025-03-24T10:34:24.070847904Z","traceID":"ac8aa0daeedfc11ef444503d39dd33f0","userID":0}
{"level":"debug","logger":"rendering","msg":"calling remote rendering service","org_id":1,"renderer":"http","rule_uid":"cegspyj2y639cc","t":"2025-03-24T10:34:24.085764779Z","traceID":"ac8aa0daeedfc11ef444503d39dd33f0","url":"http://grafana-dev-image-renderer.grafana-dev:8081/render?deviceScaleFactor=1.000000&domain=grafana-dev.grafana-dev&encoding=png&height=500&renderKey=t2KGzXlQOEQ2Vhoxe2UoD0zzILqVJKvk&timeout=30&timezone=&url=<url>%26render%3D1&width=1000"}
I’ve noticed that sometime Grafana logs 400
http error from datasource but the query itself for the dashboard is not malformed - in dashboard it appears correctly. Sometimes (mainly during resolving the alert by deleting the rule) imageUrl appears in the message, but not always (anyway more often than it does during “firing” the alert).
Both Grafana and image renderer are set to debug logs so I’m not sure I can provide any more data.
Config from Grafana’s side (helm chart, under grafana.ini
):
unified_alerting.screenshots:
capture: true
max_concurrent_screenshots: 5
capture_timeout: 30s
unified_alerting.state_history.annotations:
max_age: 14d
external_image_storage:
provider: local
rendering:
renderer_token: "-"
server_url: http://grafana-image-renderer.grafana-dev.svc.cluster.local:8081/render
callback_url: http://grafana-dev.grafana-dev.svc.cluster.local:3000/
config of imageRenderer
:
imageRenderer:
enabled: true
env:
HTTP_HOST: "0.0.0.0"
RENDERING_ARGS: --no-sandbox,--disable-gpu,--window-size=1280x758
RENDERING_MODE: clustered
IGNORE_HTTPS_ERRORS: true
AUTH_TOKEN: "-"
RENDERING_CLUSTERING_MODE: "context"
RENDERING_CLUSTERING_MAX_CONCURRENCY: 5
ENABLE_METRICS: true
XDG_CONFIG_HOME: /tmp/.chromium
XDG_CACHE_HOME: /tmp/.chromium
LOG_LEVEL: debug
resources:
limits:
cpu: 1
memory: 2Gi
networkPolicy:
limitIngress: false
Has someone struggled with this?