Мониторинг, которым управляют из скрипта
Всё, что панель управления делает с монитором, — это один curl, а остальное — адрес, который вы пингуете.
Создать, проверить, прочитать обратно
Запрос, шаг CI, который им пользуется, и JSON, который возвращается.
curl
curl -X POST https://app.tenium.app/api/v1/monitors \
-H "Authorization: Bearer $TENIUM_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"api-prod","type":"http",
"url":"https://api.example.com/health",
"intervalSec":60,"expectedStatus":["2xx"]}' GitHub Action
name: deploy
on: { push: { branches: [main] } }
jobs:
deploy:
runs-on: ubuntu-latest
env:
B: https://app.tenium.app/api/v1
ID: ${{ vars.TENIUM_MONITOR_ID }}
H: "Authorization: Bearer ${{ secrets.TENIUM_KEY }}"
steps:
- uses: actions/checkout@v4
- run: curl -fsS -X POST -H "$H" "$B/monitors/$ID/pause"
- run: ./deploy.sh
- if: always()
run: curl -fsS -X POST -H "$H" "$B/monitors/$ID/resume"
- name: Verify from outside
run: |
curl -fsS -X POST -H "$H" "$B/monitors/$ID/check"
sleep 20
curl -fsS -H "$H" "$B/monitors/$ID" | jq -e '.status == "up"' Ответ
{
"id": "a3f1c2d4-9e8b-4f6a-b7c5-1d2e3f4a5b6c",
"name": "api-prod",
"type": "http",
"url": "https://api.example.com/health",
"intervalSec": 60,
"expectedStatus": ["2xx"],
"status": "pending",
"paused": false,
"nextCheckAt": "2026-01-20T10:15:03Z",
"createdAt": "2026-01-20T10:15:00Z"
} Ключи с правом записи требуют Pro или Agency; ключи только для чтения работают на всех тарифах.
Иллюстративный макет
Три вещи, которые здесь важны
Простой REST API
JSON на входе и выходе, ключи bearer, курсоры. Ключи только для чтения — на всех тарифах, с записью — на Pro и Agency.
Подписанные webhook
События down, up, degraded, heartbeat_missed и ssl_expiry с подписью HMAC-SHA256 — с Pro. Неудачные доставки повторяются до 3 раз.
Проверки по телу ответа
Путь JSON с условием «равно», «содержит» или «больше» — с Starter. Ответ 200, в котором сказано, что очередь стоит, всё равно считается сбоем.
Оповещения приходят туда, где вы уже работаете
E-mail, Discord и Google Chat — на всех тарифах; Slack, Telegram, Teams и Mattermost — с тарифа Starter; webhook — с Pro; Zapier и PagerDuty — на Agency. SMS и голосовых звонков нет.
- Slack
- Telegram
- Discord
- PagerDuty
- Zapier
- Webhook
Сервис, описанный в репозитории
Иллюстративный сценарий, а не история клиента
- Репозиторий инфраструктуры добавляет описание монитора рядом с сервисом.
- Пайплайн отправляет его в API ключом с правом записи, сохранённым как секрет CI.
- После релиза шаг CI вызывает проверку и валит задачу, если снаружи сервис не доступен.
Монитор существует, потому что существует код. Никому не нужно помнить, что его надо добавить.
Сколько вам стоит час простоя?
Грубая честная цифра, чтобы сравнить её с ценой монитора. Считается в вашем браузере, ничего никуда не отправляется.
Для сравнения: тариф Starter стоит $7 в месяц. Выручка — это не все издержки (время поддержки, реклама, которая продолжает идти, доверие), так что считайте цифру нижней границей.
Создавайте монитор вместе с кодом сервиса
Монитор, который кто-то должен вспомнить добавить вручную, — это монитор, которого не будет в нужный день. Если инфраструктура уже лежит в репозитории, добавьте проверку туда же: один запрос с ключом с правом записи. Такие ключи доступны на Pro ($29) и Agency ($59), а ключ только для чтения, который можно отдать панели или Slack-боту, есть на всех тарифах, включая Free.
curl -X POST https://app.tenium.app/api/v1/monitors \
-H "Authorization: Bearer $TENIUM_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"api-prod","type":"http","url":"https://api.example.com/health",
"intervalSec":60,"expectedStatus":["2xx"]}'Heartbeat — это просто адрес: вызовите его curl, wget или любым HTTP-клиентом методом GET или POST. Суффиксы обозначают начало, завершение и сбой, а вместе с запросом можно отправить до 10 КБ текста.
Проверки, которые читают ответ
Health-эндпоинт, возвращающий 200, когда базы уже нет, — классическая лживая проверка. С Starter можно проверять тело: путь JSON $.status равен ok, $.queue.depth меньше 100. Несколько правил объединяются через AND. Есть подписанные webhook и значки статуса для README.
Heartbeat — одна строка в конце скрипта
Для всего, что выполняется по расписанию, поменяйте направление. Ваша задача вызывает адрес после завершения, а монитор открывает инцидент, если вызов опоздал. Ничего устанавливать не нужно:
# crontab
0 3 * * * /usr/local/bin/backup.sh \
&& curl -fsS -m 10 https://ping.tenium.app/h/abc123 >/dev/null \
|| curl -fsS -m 10 https://ping.tenium.app/h/abc123/failДобавьте /start в начале скрипта, чтобы измерять время выполнения. Под этот шаблон подходят GitHub Actions, GitLab CI, таймеры systemd и Kubernetes CronJob, потому что все они умеют запускать curl. См. мониторинг cron-заданий и справочник по heartbeat.
Webhook и поток событий
На Pro контакт webhook получает JSON об открытии, подтверждении получения и закрытии инцидентов, а также о сроке действия SSL и домена, оповещения о времени ответа и опоздавшие heartbeat. Каждая доставка подписана. Минимальная проверка на Node — это десяток строк с createHmac и timingSafeEqual, и она есть в документации. Относитесь к приёмнику как к любому публичному адресу: проверяйте подпись и метку времени, быстро отвечайте 2xx, а долгую работу выполняйте потом. Ответы не 2xx повторяются пять раз примерно за полчаса. Форматы данных: данные webhook.
Бейджи и публичный статус
Для открытых проектов и внутренних порталов бейдж аптайма — это небольшой SVG, который можно вставить в README. Сгенерируйте его инструментом бейджей аптайма и вставьте разметку. Если нужна страница для людей, страницы статуса публикуют историю компонентов на вашем домене с тарифа Starter.
Ограничения, которые стоит знать, прежде чем строить на этом
- Чтение: 600 запросов в минуту на ключ. Запись: 120 в минуту на ключ. В ответах есть заголовки
X-RateLimit-*. - Пагинация курсорная, по умолчанию 50 результатов, максимум 200.
- Каждый монитор — это один запрос; многошаговые сценарии и скрипты для браузера не поддерживаются.
- Версия API стоит в пути (
/v1); добавления без поломок версию не меняют, а несовместимые изменения действуют с перекрытием шесть месяцев.
Хотите, чтобы это сделал ассистент? Смотрите честное состояние наших планов по MCP-серверу.
Вопросы разработчиков
Какой тариф нужен для записи через API?
Читать мониторы, инциденты и проверки можно на любом тарифе. Создавать, менять и удалять — только ключом с правом записи на Pro ($29) или Agency ($59). Без него будет 403 с кодом plan_limit.
Нужен ли SDK для heartbeat?
Нет. Heartbeat — это адрес, который вы вызываете curl, wget или любым HTTP-клиентом. Суффиксы обозначают начало, завершение и сбой.
Можно ли проверять JSON-ответ?
Да, с Starter. Используйте пути с точками и скобками вроде $.data.items[0].id и условия «равно», «не равно», «содержит», «больше», «меньше» или «существует». Ответ 200, в теле которого сказано, что очередь стоит, всё равно считается сбоем.
Как аутентифицируются вызовы webhook?
Каждый запрос содержит заголовок X-Tenium-Signature с меткой времени и HMAC-SHA256 от тела по секрету контакта. Проверяйте его и отклоняйте устаревшие метки времени. Неудачные доставки повторяются с нарастающими паузами.
Есть ли SDK или MCP-сервер?
SDK нет, а MCP-сервер только запланирован. Поддерживается REST API, и простые примеры с curl в документации намеренно и есть всё, что вам нужно.
Создайте ключ только для чтения и посмотрите
Тариф Free, без карты. Настройки, затем ключи API, затем «Новый ключ».