Как включить изображения в 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 алерты — почему картинки иногда не отправляются
- Пошаговая настройка: включаем скриншоты в Grafana (Docker)
- Настройка контактного пункта Telegram в Grafana
- Обходной путь: webhook / скрипт (скачать render → sendPhoto)
- Тестирование и отладка: что смотреть в Docker и логах
- Примеры: docker-compose и Python-скрипт отправки изображения
- Источники
- Заключение
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).
- Включите скриншоты в конфигурации 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
- Документация: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/images-in-notifications/
- Убедитесь, что Grafana может записывать скриншоты на диск:
- Пробросьте volume для data-пути (по умолчанию /var/lib/grafana) в docker-compose или docker run.
- Проверьте права: процесс Grafana в контейнере обычно запускается под UID 472 — на хосте выполните
chown -R 472:472 /path/to/grafana-data. - При создании тома убедитесь, что место доступно (не readonly).
- Проверьте корректность корневого URL:
- GF_SERVER_ROOT_URL (или root_url в grafana.ini) должен быть реальным URL, по которому Grafana может сама к себе обратиться для рендеринга. Неправильный root_url ломает генерацию и загрузку скриншотов.
- Перезапустите контейнер и проверьте логи:
docker-compose restart grafanaилиdocker restart <container>docker logs -f grafana— следите за сообщениями о создании/загрузке скриншотов.
- Привязка алерта к панели:
- Скриншоты формируются только для панелей, указанных в правиле алерта (dashboardUID + panelID). Создавайте (или редактируйте) правило алерта из панели, чтобы Grafana знала, какую панель снимать.
Настройка контактного пункта Telegram в Grafana
- Создайте бота и получите токен:
- Через BotFather в Telegram получите токен
BOT_TOKEN.
- Узнайте chat_id:
- Отправьте сообщение боту и посмотрите getUpdates, либо используйте вспомогательный бот или API.
- В Grafana UI:
- Alerting → Contact points (или Notification channels) → Add contact point → выберите Telegram.
- Укажите
bot tokenиchat id. Нажмите Test → Save. - Документация по интеграции Telegram: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram/
- Включите «Include image» / аналогичный флаг, если он есть в UI:
- Некоторые инструкции/гайды (и сторонние материалы) упоминают опцию «Include image» в настройках уведомления; включите её, если она доступна — это говорит контактному пункту прикреплять картинку, если Grafana её подготовила. Например, практическое описание есть на стороннем ресурсе: https://www.ispsystem.ru/docs/vmmanager-admin/monitoring/grafana/grafana-nastrojka-uvedomlenij
- Что если картинка не прикрепляется?
- Если после включения скриншотов и перезапуска Telegram всё ещё получает только текст, вероятно, либо контактный пункт не поддерживает прикрепление в вашей конкретной сборке, либо Grafana не смог загрузить/сохранить скриншот. См. раздел отладки ниже.
Обходной путь: webhook / скрипт (скачать render → sendPhoto)
Иногда проще и надёжнее обрабатывать отправку изображения вне Grafana: настроить контактный пункт Webhook, который вызовет ваш небольшой сервис — он скачает render‑link и отправит фото в Telegram через Bot API.
Пример curl-цепочки (простая, без сервиса):
- Скачиваем изображение (если 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
- Отправляем в 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/скрипте:
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 (минимум, с переменными для скриншотов):
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.
Источники
- https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram/
- https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/images-in-notifications/
- https://www.ispsystem.ru/docs/vmmanager-admin/monitoring/grafana/grafana-nastrojka-uvedomlenij
- https://qna.habr.com/q/1379564
- https://stackoverflow.com/questions/72336054/why-grafana-does-not-include-images-to-alerts
- https://grafana.com/blog/2023/12/28/how-to-integrate-grafana-alerting-and-telegram/
- https://community.grafana.com/t/send-telegram-alert-and-image-in-single-message/90404
Заключение
Если кратко: для отправки grafana изображений в Telegram включите захват скриншотов ([unified_alerting.screenshots] / GF_UNIFIED_ALERTING_SCREENSHOTS_…), пробросьте и дайте права на data‑том в Docker, настройте контактный пункт Telegram и привяжите правило к панели. Если встроенная загрузка не срабатывает — надёжный обходной путь — webhook/скрипт, который скачивает render‑link и отправляет фото через Telegram Bot API. Успехов в настройке — при затруднениях пришлите логи и пример docker-compose, помогу детальнее.