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. - Нажмите кнопку Добавить.
- Нажмите кнопку Создать.