Webhook с использованием Cloud Functions
Для автоматической обработки инцидентов и других событий в вашем облаке вы можете вызывать в Yandex Monitoring функции Cloud Functions. В этом разделе приведен пример настройки webhook с отправкой POST-запросов при срабатывании алерта. Таким образом при срабатывании алерта вы можете вызывать методы внешнего API. Так же можно вызывать функции Cloud Functions в эскалациях.
Чтобы отправлять POST-запросы при срабатывании алерта:
-
Разверните сервис для обработки POST-запросов со следующими атрибутами:
https://my.url/route/for/alarm
— URL для обработки запроса, когда алерт переходит в статусAlarm
;https://my.url/route/for/ok
— URL для обработки запроса, когда алерт переходит в статусOk
;my_secret_token
— токен или файл с токеном для авторизации вызовов.
Вы можете проверить работу функции без развертывания сервиса обработки POST-запросов. В этом случае при отправке запроса в логах вызова функции вы увидите сообщение, что указанный URL недоступен.
-
Создайте сервисный аккаунт для вызова функции.
-
Создайте функцию, которая отправляет POST-запросы при переходе алерта в статус
Alarm
иOk
. -
Создайте канал, который будет вызывать функцию.
-
Создайте алерт, который будет отправлять уведомления в канал с функцией.
Создание сервисного аккаунта
- В консоли управления
перейдите в каталог с ресурсами, которые надо отслеживать в Monitoring. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например
sa-alert-webhook
. - Добавьте роли
functions.functionInvoker
иfunctions.viewer
. - Нажмите кнопку Создать.
Создание функции
-
В списке сервисов выберите Cloud Functions.
-
Нажмите кнопку Создать функцию.
-
Введите имя функции, например
alert-webhook
. -
Нажмите кнопку Создать.
-
Создайте версию функции:
-
Выберите среду выполнения Python, отключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить.
-
Выберите способ Редактор кода.
-
Нажмите Создать файл и введите имя файла, например
index
. -
Введите код функции, указав URL для обработки POST-запросов и токен:
import json import requests WEBHOOK_ALARM_URL = "https://my.url/route/for/alarm" WEBHOOK_OK_URL = "https://my.url/route/for/ok" WEBHOOK_AUTH_TOKEN = "my_secret_token" def webhook(url, alert_id): headers_ = { "Authorization": f"OAuth {WEBHOOK_AUTH_TOKEN}", "Content-type": "application/json" } try: response = requests.post(url, headers = headers_, json = { "alert_id" : alert_id }) if response.ok: return { "status": "OK", "url": url, "response": json.dumps(response.json)} else: return { "status": "ERROR", "url": url, "code": response.status_code, "error": response.text} except Exception as e: return { "status": "EXCEPTION", "url": url, "error": e} def handler(event, context): alert = event # сохраним event в переменную alert для удобства required_attributes = ["alertId", "status"] # массив с обязательными входными параметрами в формате JSON # если на вход функции не передан JSON или в нем отсутствуют нужные параметры, функция не выполняется if not alert or all(attr in required_attributes for attr in alert): return result = None # если функция вызвана, когда алерт в статусе ALARM, отправляем запрос на адрес WEBHOOK_ALARM_URL # если функция вызвана, когда алерт в статусе OK, отправляем запрос на адрес WEBHOOK_OK_URL # при других статусах алерта ничего не вызываем if alert["status"] == "ALARM": result = webhook(WEBHOOK_ALARM_URL, alert["alertId"]) elif alert["status"] == "OK": result = webhook(WEBHOOK_OK_URL, alert["alertId"]) else: pass if not result: return # выводим в лог результат вызова if result["status"] == "OK": print(f"Succesffully invoked {result['url']}. Response: {result['response']}") elif result["status"] == "ERROR": print(f"ERROR invoking {result['url']}. Code {result['code']}, error message: {result['error']}") else: print(f"{result['status']} when invoking {result['url']}. Error message: {result['error']}")
-
-
В блоке Параметры задайте параметры версии:
- Точка входа:
index.handler
. - Сервисный аккаунт:
sa-alert-webhook
.
- Точка входа:
-
В блоке Дополнительные настройки включите Асинхронный вызов.
-
Нажмите кнопку Сохранить изменения.
Создание канала
- Выберите сервис Monitoring.
- Выберите раздел Каналы уведомлений.
- Нажмите кнопку Создать канал.
- Введите имя канала уведомлений, например
channel-function
. - В списке Метод выберите Cloud Functions.
- В списке Сервисный аккаунт выберите аккаунт, созданный при добавлении функции.
- Нажмите Создать.
Создание алерта
- В сервисе Monitoring выберите раздел Алерты.
- Нажмите кнопку Создать.
- Введите имя алерта, например
alert-function
. - Введите запрос, по которому будут выбираться метрики для отслеживания.
- Настройте условия срабатывания.
- В блоке Уведомления нажмите Редактировать и затем кнопку Добавить.
- Выберите канал
channel-function
. - Нажмите кнопку Добавить.
- Нажмите кнопку Создать.
Проверка вызова функции
-
В списке сервисов выберите Cloud Functions.
-
Выберите функцию
alert-webhook
. -
Выберите вкладку Тестирование.
-
В качестве входных данных введите:
{ "alertId": "<идентификатор_алерта>", "alertName": "alert-function", "folderId": "<идентификатор_каталога>", "status": "OK" }
-
Нажмите кнопку Запустить тест.
-
В логах вызова функции на вкладке Тестирование или Логи посмотрите, что запрос был отправлен на URL
https://my.url/route/for/ok
.