DevOps

Как включить изображения в Grafana Telegram алерты

Пошаговая настройка отправки скриншотов панелей в Telegram уведомлениях Grafana 11 в Docker. Включаем захват изображений, настраиваем контактный пункт и обходим проблемы с рендерингом. Работает с unified alerting.

Как включить отправку изображений в Grafana для Telegram уведомлений?

У меня Grafana 11.2.10 развернута в Docker и настроен рендеринг. Рендеринг работает - я могу перейти на дашборд -> share -> Direct link rendered image и изображение открывается. Однако я не могу понять, как настроить отправку этих изображений в Telegram алертах. Подскажите, пожалуйста, как включить инклуд картинок в алертные сообщения Telegram?

Да — Grafana может прикреплять скриншоты панелей к уведомлениям, но это не делается «по‑умолчанию»: нужно включить захват скриншотов в секции [unified_alerting.screenshots] (или через переменные GF_), пробросить и дать права на data‑путь в Docker и корректно настроить контактный пункт Telegram. Если встроенная загрузка изображений недоступна в вашей сборке, простой и надёжный обход — webhook или скрипт, который скачивает render‑link и отправляет фото через Telegram Bot API.


Содержание


Grafana Telegram алерты — почему картинки иногда не отправляются

Коротко: раньше (и в некоторых конфигурациях) стандартная интеграция Telegram в Grafana отправляет только текст. С переходом на unified alerting у Grafana появилась возможность делать скриншоты панелей и прикреплять их к уведомлениям, но для этого нужно отдельно включить захват скриншотов и разрешить их загрузку/прикрепление — иначе в Telegram придёт только текст. Подробно это описано в документации Grafana по изображениям в уведомлениях и по интеграции Telegram: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/images-in-notifications/ и https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram/.

Есть нюанс истории: у некоторых версий/настроек рендеринг скриншотов для алертов временно убирали — поэтому если включение настроек не даёт результата, это может быть как баг/ограничение конкретной сборки. Об этом — обсуждения и баги, например: https://stackoverflow.com/questions/72336054/why-grafana-does-not-include-images-to-alerts.


Пошаговая настройка: включаем скриншоты в Grafana (Docker)

Ниже — практическая последовательность действий для Grafana 11.2.10 в Docker, предполагая, что рендеринг уже работает (у вас открывается Direct link rendered image).

  1. Включите скриншоты в конфигурации Grafana:
  • В grafana.ini добавьте (или в UI/ENV задайте):
[unified_alerting.screenshots]
capture = true
upload_external_image_storage = true

Или в Docker-окружении через переменные окружения:

GF_UNIFIED_ALERTING_SCREENSHOTS_CAPTURE=true
GF_UNIFIED_ALERTING_SCREENSHOTS_UPLOAD_EXTERNAL_IMAGE_STORAGE=true
  1. Убедитесь, что Grafana может записывать скриншоты на диск:
  • Пробросьте volume для data-пути (по умолчанию /var/lib/grafana) в docker-compose или docker run.
  • Проверьте права: процесс Grafana в контейнере обычно запускается под UID 472 — на хосте выполните chown -R 472:472 /path/to/grafana-data.
  • При создании тома убедитесь, что место доступно (не readonly).
  1. Проверьте корректность корневого URL:
  • GF_SERVER_ROOT_URL (или root_url в grafana.ini) должен быть реальным URL, по которому Grafana может сама к себе обратиться для рендеринга. Неправильный root_url ломает генерацию и загрузку скриншотов.
  1. Перезапустите контейнер и проверьте логи:
  • docker-compose restart grafana или docker restart <container>
  • docker logs -f grafana — следите за сообщениями о создании/загрузке скриншотов.
  1. Привязка алерта к панели:
  • Скриншоты формируются только для панелей, указанных в правиле алерта (dashboardUID + panelID). Создавайте (или редактируйте) правило алерта из панели, чтобы Grafana знала, какую панель снимать.

Настройка контактного пункта Telegram в Grafana

  1. Создайте бота и получите токен:
  • Через BotFather в Telegram получите токен BOT_TOKEN.
  1. Узнайте chat_id:
  • Отправьте сообщение боту и посмотрите getUpdates, либо используйте вспомогательный бот или API.
  1. В Grafana UI:
  1. Включите «Include image» / аналогичный флаг, если он есть в UI:
  • Некоторые инструкции/гайды (и сторонние материалы) упоминают опцию «Include image» в настройках уведомления; включите её, если она доступна — это говорит контактному пункту прикреплять картинку, если Grafana её подготовила. Например, практическое описание есть на стороннем ресурсе: https://www.ispsystem.ru/docs/vmmanager-admin/monitoring/grafana/grafana-nastrojka-uvedomlenij
  1. Что если картинка не прикрепляется?
  • Если после включения скриншотов и перезапуска Telegram всё ещё получает только текст, вероятно, либо контактный пункт не поддерживает прикрепление в вашей конкретной сборке, либо Grafana не смог загрузить/сохранить скриншот. См. раздел отладки ниже.

Обходной путь: webhook / скрипт (скачать render → sendPhoto)

Иногда проще и надёжнее обрабатывать отправку изображения вне Grafana: настроить контактный пункт Webhook, который вызовет ваш небольшой сервис — он скачает render‑link и отправит фото в Telegram через Bot API.

Пример curl-цепочки (простая, без сервиса):

  1. Скачиваем изображение (если Grafana требует авторизацию — передаём API key):
curl -s -H "Authorization: Bearer <GRAFANA_API_KEY>" \
 "https://grafana.example.com/render/d-solo/<dashboardUID>/<slug>?from=now-1h&to=now&panelId=2&width=1000&height=500" \
 -o panel.png
  1. Отправляем в Telegram:
curl -s -X POST "https://api.telegram.org/bot<TELEGRAM_TOKEN>/sendPhoto" \
 -F chat_id=<CHAT_ID> -F photo="@panel.png"

Python (requests) — минимальный пример для использования в webhook/скрипте:

python
import requests

GRAFANA_URL = "https://grafana.example.com/render/d-solo/....&panelId=2"
GRAFANA_HEADERS = {"Authorization": "Bearer <GRAFANA_API_KEY>"} # если требуется
TG_TOKEN = "<TELEGRAM_TOKEN>"
CHAT_ID = "<CHAT_ID>"

r = requests.get(GRAFANA_URL, headers=GRAFANA_HEADERS, timeout=30)
r.raise_for_status()

files = {'photo': ('panel.png', r.content)}
data = {'chat_id': CHAT_ID}
resp = requests.post(f"https://api.telegram.org/bot{TG_TOKEN}/sendPhoto", data=data, files=files)
print(resp.json())

Преимущества такого подхода:

  • Контролируете размер/формат изображения.
  • Можно добавлять подписи, кнопки или ссылки.
  • Работает, даже если встроенная интеграция не прикрепляет файлы.

Есть практические реализации, например обсуждение и скрипты в сообществе: https://qna.habr.com/q/1379564.


Тестирование и отладка: что смотреть в Docker и логах

Если картинка не приходит — проверьте по шагам:

  • Рендеринг работает? Откройте Direct link rendered image вручную. Если картинка открывается — рендер OK.
  • Скриншоты создаются? Посмотрите папку данных Grafana (том): ls /path/to/grafana-data (ищите подпапки, связанные с alert screenshots). Логи могут писать путь.
  • Логи Grafana: docker logs -f grafana — ищите слова screenshot, upload, failed, error.
  • Права доступа: если Grafana не может записать файл — screenshot не появится. Выполните chown -R 472:472 /path/to/grafana-data на хосте.
  • Contact point: в UI нажмите Test. Если Test возвращает ошибку — посмотрите точное сообщение ошибки.
  • root_url: неверный GF_SERVER_ROOT_URL ломает внутренние ссылки; убедитесь, что Grafana видит саму себя по указанному URL.
  • Нагрузки и время: создание скриншота увеличивает нагрузку. Если в контейнере мало CPU/RAM/времени на рендер — процесс может падать. Практический комментарий по влиянию опции «Include image» на производительность в Docker — см. https://www.ispsystem.ru/docs/vmmanager-admin/monitoring/grafana/grafana-nastrojka-uvedomlenij

Если после всех проверок Grafana по‑прежнему не прикрепляет изображения — используйте webhook/скрипт (см. выше).


Примеры: docker-compose и Python-скрипт отправки изображения

Пример docker-compose (минимум, с переменными для скриншотов):

yaml
version: '3.8'
services:
 grafana:
 image: grafana/grafana:11.2.10
 environment:
 - GF_UNIFIED_ALERTING_SCREENSHOTS_CAPTURE=true
 - GF_UNIFIED_ALERTING_SCREENSHOTS_UPLOAD_EXTERNAL_IMAGE_STORAGE=true
 - GF_SERVER_ROOT_URL=https://grafana.example.com
 volumes:
 - grafana-data:/var/lib/grafana
 ports:
 - "3000:3000"

volumes:
 grafana-data:

Не забудьте на хосте дать томy права: chown -R 472:472 /path/to/volume.

Ещё один рабочий пример сценария-обработчика (Flask), который Grafana вызывает как webhook и который скачивает картинку и шлёт в Telegram — шаблон легко адаптировать под ваши переменные окружения и авторизацию. Подробности и вариации (curl/Python) — см. обсуждение на Habr: https://qna.habr.com/q/1379564.


Источники


Заключение

Если кратко: для отправки grafana изображений в Telegram включите захват скриншотов ([unified_alerting.screenshots] / GF_UNIFIED_ALERTING_SCREENSHOTS_…), пробросьте и дайте права на data‑том в Docker, настройте контактный пункт Telegram и привяжите правило к панели. Если встроенная загрузка не срабатывает — надёжный обходной путь — webhook/скрипт, который скачивает render‑link и отправляет фото через Telegram Bot API. Успехов в настройке — при затруднениях пришлите логи и пример docker-compose, помогу детальнее.

Авторы
Проверено модерацией
Модерация