К содержанию
Pingera

pngr 0.2: алерты, аналитика и Статус Страницы прямо из терминала

  • Опубликовано:
  • Обновлено
  • 7 мин чтения
Pingera - Блог - pngr 0.2 - алерты, аналитика и Статус Страницы прямо из терминала

Чуть больше года назад мы выпустили pngr — CLI, чтобы управлять мониторингом, не выходя из консоли. Тогда он умел в основном создавать и запускать проверки. В версии 0.2.0 CLI дотянулся до всего, ради чего раньше приходилось открывать браузер: аналитики, алертов и Статус Страниц. А ещё он стал по-настоящему удобным для скриптов и CI/CD.

Обновиться (нужен Python 3.10+):

pip install -U pingera-cli
pngr --version

Посмотрите, как это выглядит

Ниже — настоящий вывод pngr 0.2.0 на демо-данных. Переключайте вкладки, а кнопкой «Копировать команды» можно забрать команды к себе в терминал.

$ pngr checks uptime k3x9p2m7q1az --from 24h
╭───────────────────────── 📈 Uptime: k3x9p2m7q1az ──────────────────────────╮
│ │
│ Period: 2026-10-27 17:00 → 2026-10-28 16:00 UTC │
│ Uptime: 98.66% │
│ Avg response time: 184ms │
│ Checks executed: 4320 │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇
One bar per hour: ok degraded failed no data
​
$ pngr checks status-history k3x9p2m7q1az --page-size 4
Status history: k3x9p2m7q1az
┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Status ┃ Started (UTC) ┃ Ended (UTC) ┃ Duration ┃
┡━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ ok │ 2026-10-28 06:19:40 │ ongoing │ - │
│ degraded │ 2026-10-28 06:02:11 │ 2026-10-28 06:19:40 │ 17m 29s │
│ failed │ 2026-10-28 05:44:52 │ 2026-10-28 06:02:11 │ 17m 19s │
│ ok │ 2026-10-25 09:12:03 │ 2026-10-28 05:44:52 │ 2d 20h │
└──────────┴─────────────────────┴─────────────────────┴──────────┘
Showing 4 of 41 • page 1 of 11
$ pngr checks response-times k3x9p2m7q1az --from 24h
Response times: k3x9p2m7q1az
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Region ┃ Samples ┃ Avg ┃ Worst p95 ┃ Worst p99 ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━┩
│ EU, West │ 1440 │ 172ms │ 248ms │ 402ms │
│ RU, Moscow │ 1440 │ 96ms │ 182ms │ 311ms │
│ US, East coast │ 1440 │ 284ms │ 377ms │ 1180ms │
└────────────────┴─────────┴───────┴───────────┴───────────┘
💡 Add --buckets to see the per-interval breakdown
​
$ pngr checks stats --from 7d
Result stats: all checks
┏━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ Region ┃ Total ┃ Ok ┃ Failed ┃ Degraded ┃ Timeout ┃ Success rate ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ EU, West │ 60480 │ 60402 │ 41 │ 30 │ 7 │ 99.87% │
│ RU, Moscow │ 60480 │ 60431 │ 22 │ 27 │ 0 │ 99.92% │
│ US, East coast │ 20160 │ 19873 │ 115 │ 104 │ 68 │ 98.58% │
│ All regions │ 141120 │ 140706 │ 178 │ 161 │ 75 │ 99.71% │
└────────────────┴────────┴────────┴────────┴──────────┴─────────┴──────────────┘
💡 Add --buckets to see the per-interval breakdown
$ pngr alerts channels create --name Дежурные --type telegram --chat-id -1001234567890 --test
✓ Test notification delivered
╭───────────────────────── ✅ Alert channel created ─────────────────────────╮
│ │
│ ID: tg7f2k9c4m1x │
│ Name: Дежурные │
│ Type: telegram │
│ Delivers to: chat -1001234567890 │
│ Enabled: yes │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
​
$ pngr alerts rules create --name "API недоступен" --check k3x9p2m7q1az --count 3 --regions majority --severity high --channel tg7f2k9c4m1x
╭────────────────────────── ✅ Alert rule created ───────────────────────────╮
│ │
│ ID: rl5c8v1b7n3d │
│ Name: API недоступен │
│ Check: API health │
│ Fires when: 3 consecutive failures │
│ Notifies: 1 channel(s) │
│ Enabled: yes │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
​
$ pngr alerts list --status firing
Alerts
┏━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ID ┃ Status ┃ Severity ┃ Title ┃ Check ┃ Fired (UTC) ┃ Duration ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ al9d4f6h2j8k │ firing │ high │ API │ API health │ 2026-10-28 │ 13m │
│ │ │ │ недоступен │ │ 15:47 │ │
└──────────────┴────────┴──────────┴───────────────┴────────────┴───────────────┴──────────┘
​
$ pngr alerts ack al9d4f6h2j8k
╭────────────────────────── ✅ Alert acknowledged ───────────────────────────╮
│ │
│ ID: al9d4f6h2j8k │
│ Title: API недоступен │
│ Status: acknowledged │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
$ pngr pages incidents updates add in7b3n5m1q9w -p pg8r3t5y7u9i --status resolved --body "Откатили релиз, ошибки ушли"
╭───────────────────────────── ✅ Update Posted ─────────────────────────────╮
│ │
│ Incident: Ошибки 502 в API (in7b3n5m1q9w) │
│ Status: resolved │
│ Update ID: up4e6r8t2y5u │
│ Subscribers notified │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
​
$ pngr pages incidents schedule-maintenance -p pg8r3t5y7u9i --name "Обновление базы данных" --start +30h --end +32h --component-id cm4k7l9z2x5c
╭───────────────────────── ✅ Maintenance Scheduled ─────────────────────────╮
│ │
│ ID: in2s6d8f4g1h │
│ Name: Обновление базы данных │
│ Window: 2026-10-29 23:17 → 2026-10-30 01:17 UTC │
│ Components: 1 │
│ Starts automatically │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
# В режиме -o json в stdout только данные: панели и ошибки уходят в stderr
$ pngr -o json alerts list --status firing | jq -r '.alerts[] | "\(.severity) \(.check_name): \(.title)"'
high API health: API недоступен
​
$ pngr -o json checks uptime k3x9p2m7q1az --from 30d | jq '.summary.uptime'
99.94
​
# Копируем правило алерта на staging-проверку
$ pngr -o json alerts rules get rl5c8v1b7n3d > rule.json
$ pngr alerts rules create -f rule.json --name "API недоступен (staging)" --check s9t2a6g4i8n1
╭────────────────────────── ✅ Alert rule created ───────────────────────────╮
│ │
│ ID: rl2w8e4r6t0y │
│ Name: API недоступен (staging) │
│ Check: API health (staging) │
│ Fires when: 3 consecutive failures │
│ Notifies: 1 channel(s) │
│ Enabled: yes │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
Вывод pngr 0.2.0 на демо-данных

Аналитика проверок без браузера

Четыре новые команды отвечают на вопрос «а как оно работало?»:

  • pngr checks uptime — аптайм, среднее время ответа и полоска статусов по часам. С --hourly — ещё и таблица по каждому часу.
  • pngr checks status-history — когда проверка падала, деградировала и сколько это длилось.
  • pngr checks response-times — среднее, p95 и p99 по регионам. С --buckets — разбивка по интервалам.
  • pngr checks stats — сколько результатов было ok/failed/degraded/timeout и success rate по регионам. Работает для одной проверки или для всех сразу, умеет фильтровать по типу, по запускам по требованию (--result-type on_demand) и по наличию алертов.

Периоды задаются как ISO-дата или относительно: --from 30m, --from 24h, --from 7d, --from 2w.

Cron-расписание

Проверку теперь можно запускать не только раз в N секунд, но и по cron-выражению — например, только в рабочие часы:

pngr checks create --name "Отчёты в рабочие часы" --type web \
  --url https://example.com/reports --cron "*/10 9-18 * * 1-5"

# и обратно на обычный интервал
pngr checks update <check-id> --interval 300

Алерты целиком из терминала

Раньше алерты настраивались только в веб-интерфейсе. Теперь в CLI есть всё:

  • Каналы — pngr alerts channels: email, webhook, Telegram, MAX, SMS и statuspage — канал, который сам меняет статус компонента на вашей Статус Странице, пока алерт активен. Флаг --test сразу шлёт тестовое уведомление, а pngr alerts channels test проверяет даже несохранённую конфигурацию. Секреты в выводе маскируются.
  • Правила — pngr alerts rules: условие срабатывания, сколько регионов должно упасть, важность, пауза между повторными уведомлениями и автозакрытие. При обновлении меняются только переданные поля, а disable ставит правило на паузу без удаления (enable — включает обратно).
  • Сработавшие алерты — pngr alerts list/get/ack/resolve, журнал доставки уведомлений по каналам (notifications) и сводка (stats).

CLI проверяет правило так же, как бэкенд, поэтому ошибка в параметрах всплывёт до запроса к API, с понятным сообщением про конкретный флаг. Соберите своё правило:

Конструктор правила алерта

Выберите условия — команда для pngr соберётся сама.

Статус Страницы: инциденты, постмортемы и плановые работы

Группа pngr pages выросла почти до паритета с веб-интерфейсом:

  • группы компонентов, статусы компонентов и отчёты об их аптайме;
  • апдейты инцидентов — с изменением статусов компонентов и уведомлением подписчиков;
  • постмортемы: черновик из файла (postmortem set --file) и публикация (postmortem publish);
  • log-past — задним числом занести инцидент, который уже закончился;
  • schedule-maintenance — плановые работы с автостартом, автозавершением и напоминаниями подписчикам;
  • пароли страниц, свой домен для писем и шаблоны.

Самый практичный сценарий — объявлять работы прямо из пайплайна деплоя, чтобы никто не забыл:

# .github/workflows/deploy.yml (фрагмент)
- name: Объявляем плановые работы
  env:
    PINGERA_API_KEY: ${{ secrets.PINGERA_API_KEY }}
  run: |
    pip install pingera-cli
    pngr pages incidents schedule-maintenance -p "$PAGE_ID" \
      --name "Обновление базы данных" --start +15m --end +1h \
      --component-id "$DB_COMPONENT_ID" --notify

Компоненты сами перейдут в статус «на обслуживании» в начале окна и вернутся в «работает» в конце.

Удобно для скриптов

Мы прошлись по выводу во всех командах:

  • В режиме -o json или -o yaml в stdout попадают только данные, а панели, подсказки и ошибки уходят в stderr. Вывод можно смело отдавать в jq.
  • Команды create и update возвращают созданный объект целиком, вместе с id, поэтому шаги легко склеиваются:
CHANNEL_ID=$(pngr -o json alerts channels create --name "On-call" \
  --email oncall@example.com | jq -r '.id')

pngr alerts rules create --name "API down" --check "$CHECK_ID" \
  --count 3 --channel "$CHANNEL_ID"
  • Правила и каналы принимают --from-file в JSON или YAML, а флаги поверх файла переопределяют его поля. Вывод get -o json подходит как шаблон, так что настройки алертов можно хранить в репозитории рядом с кодом. Это ещё один шаг к monitoring as code.
  • Ошибки в аргументах завершаются с кодом 2, ошибки API — с кодом 1, так что скрипт в CI честно упадёт.

Под капотом

CLI переехал на Python SDK 1.2 — типизированный и сгенерированный из исправленной OpenAPI-спецификации. Заодно мы починили накопившееся: pages update больше не падает, checks assign-group учитывает настроенный base_url, а флаги -o и --verbose больше не записываются в конфиг при каждом запуске.

Попробуйте

Из крупного в CLI пока нет heartbeat-проверок — их можно настроить в веб-интерфейсе или через SDK. Полный список команд есть в документации и в репозитории на GitHub. Если чего-то не хватает или что-то сломалось — заводите issue, мы читаем всё.

Читайте также

Проверки · Новости · Статус Страницы

Большое обновление платформы - Август 2026

Узнайте о главных обновлениях платформы за август: улучшенное управление инцидентами, RSS-ленты, интеграция с мессенджером MAX и полная поддержка SSL-сертификатов Минцифры для ваших проверок.

  • Опубликовано:
  • Обновлено
  • 2 мин чтения

Новости · Статус Страницы

Переворачиваем календарь: истории инцидентов в Статус Страницах

Обновление Статус Страниц Pingera: запуск календарного вида для раздела истории инцидентов (доступен автоматически для всех страниц) и исправление отображения кастомных подписей в почтовых уведомлениях.

  • Опубликовано:
  • Обновлено
  • 1 мин чтения

Проверки · Статус Страницы · Безопасность

Что такое SSL-сертификат и зачем он нужен сайту?

Что такое SSL-сертификат простыми словами. Разновидности (DV, OV, EV), принцип работы HTTPS-шифрования и пошаговый чек-лист проверки срока действия. Полный гайд для владельцев сайтов.

  • Опубликовано:
  • Обновлено
  • 8 мин чтения