Grafana-Image-Renderer result is Grafana login page

  • What Grafana version and what operating system are you using?
    • Grafana v11.1.4 (13173c9874)
    • Grafana-Image-Renderer at latest, of 22/10/2025 (7efef0feee0192f6a90a3bd13f7062c5c08a7d18ee6c79cd863c176550ca3d7d)
  • What are you trying to achieve?
    • Get an image of a dashboard from Grafana
  • How are you trying to achieve it?
    • Deploying Image renderer
  • What happened?
    • We are getting an image of the login page in Grafana
  • What did you expect to happen?
    • Get the dashboard image
  • Can you copy/paste the configuration(s) that you are having problems with?
  • Did you receive any errors in the Grafana UI or in related logs? If so, please tell us exactly what they were.

getting different errors in the image-renderer pod:

{“level”:“error”,“message”:“Browser console error”,“msg”:“Failed to load resource: the server responded with a status of 404 ()”,“url”:“https://<OUR_SUB_DOMAIN>.cloudflareaccess.com/favicon.ico”}

{“file”:“/tmp/f4768b44.png”,“level”:“debug”,“message”:“Deleting temporary file”}

{“level”:“debug”,“message”:“::ffff:127.0.0.1 - - [22/Oct/2025:09:18:39 +0000] \“GET /render?url=http%3a%2f%2fadmin%3…NK%40grafana.<OUR_DOMAIN>%2fd%2fcollector-pipeline%2fcollector-pipeline-monitoring%3forgId%3d1%26kiosk&encoding=png HTTP/1.1\” 200 22308 \”-\" \“curl/8.11.1\”\n"}

-–

{“level”:“error”,“message”:“::ffff:127.0.0.1 - - [22/Oct/2025:09:22:17 +0000] \“GET /render?encoding=png&url=http:// image-render:Vi6…Xv@grafana.<OUR_DOMAIN>/d/collector-pipeline/collector-pipeline-monitoring?orgId=1&kiosk=&CF-Access-Client-Id=6…1c.access&CF-Access-Client-Secret=a…e&X-Auth-Token=b…1 HTTP/1.1\” 401 74 \”-\" \“PostmanRuntime/7.46.1\”\n"}

-–

  • Did you follow any online instructions? If so, what is the URL?

Those are the configurations we used:

We have Grafana installed as part of the kube-prometheus-stack on our GKE cluster using it’s official helm chart. We use ArgoCD and configure - chart: kube-prometheus-stack repoURL: Prometheus Community Kubernetes Helm Charts | helm-charts targetRevision: 62.3.0

Those are the relevant parts from the values file
grafana:

enabled: true

namespaceOverride: “”

envFromSecrets:

- name: oauth-client-id

- name: oauth-secret

- name: grafana-password

- name: grafana-image-rendering-token

plugins:

- grafana-clock-panel

- grafana-image-renderer

securityContext:

runAsUser: 472

runAsGroup: 0

fsGroup: 472

fsGroupChangePolicy: “OnRootMismatch”

grafana.ini:

server:

root_url: https://grafana.<OUR_DOMAIN>

auth.google:

enabled: true

name: Google

log:

mode: console

level: debug

rendering:

# server_url: http:// image-renderer.default.svc.cluster.local/render ##[spaces intendent]

# callback_url: http:// prometheus-grafana.default.svc.cluster.local/ ##[spaces intendent]

auth_token: $__env{grafana-image-rendering-token}

unified_alerting:

screenshots:

capture: true

upload_external_image_storage: false

max_concurrent_screenshots: 5

grafana_net:

serviceAccount:

create: true

autoMount: true

annotations:

http:// iam .gke.io/ gcp-service-account: mailto: prometheus-grafana @be-testing-429605.iam.gserviceaccount.com ##[spaces intendent]

env:

GF_RENDERING_SERVER_URL: https://grafana.<OUR_DOMAIN>/render

GF_RENDERING_CALLBACK_URL: https://grafana.<OUR_DOMAIN>/grafana

GF_UNIFIED_ALERTING_SCREENSHOTS_CAPTURE: true

GF_UNIFIED_ALERTING_SCREENSHOTS_UPLOAD_EXTERNAL_IMAGE_STORAGE: false

GF_LOG_LEVEL: debug

GF_LOG_FILTERS: “rendering:debug”

We deploy grafana-image-renderer using those 2 yamls:grafana-image-renderer-deployment.yaml:

apiVersion: apps/v1kind: Deploymentmetadata:name: image-renderernamespace: prometheusspec:selector:matchLabels:app.kubernetes.io/name: image-rendererreplicas: 1template:metadata:labels:app.kubernetes.io/name: image-rendererspec:containers:- name: image-rendererimage: http:// docker .io /grafana/grafana-image-renderer: latestports:- ##[spaces intendent] containerPort: 8081name: httpenv:- name: ENABLE_METRICSvalue: “true”- name: LOG_LEVELvalue: “debug”- name: AUTH_TOKENvalueFrom:secretKeyRef:name: grafana-image-rendering-tokenkey: GF_RENDERING_AUTH_TOKENgrafana-image-renderer-service.yaml:

apiVersion: v1kind: Servicemetadata:name: image-renderernamespace: prometheusspec:selector:app.kubernetes.io/name: image-rendererports:- name: httpprotocol: TCPport: 80targetPort: http

We try to send requests in the following manner:

curl --location ‘https://grafana.<OUR_DOMAIN>/render?url=https://grafana.<OUR_DOMAIN>/d-solo/alertmanager-overview/alertmanager-overview?kiosk=1&width=1200&height=600’ \ --header ‘Authorization: Bearer glsa_2rZP…52’ \ --output image-renderer-output.png

The Authorization: Bearer values is from a token of a service account we created in Grafana.But we always getting only the Grafana login page.What are we missing?Every suggestion would be much appreciated - we done a lot of different tries and invested a lot of time into this.

  • Anything else we need to know?:
    • We also have a Zero-Trust configuration (Cloud-Flare) which we want to bypass when sending the requests.We have CF-Access-Client-Id & CF-Access-Client-Secret. We disable Cloud-Flare when doing testing, but also want to know how to send the request when it’s active. (Preferably the communication between Grafana ↔ Image Renderer should be internal so it shouldn’t even encounter Cloud-Flare.