Оповещения: ошибки журналов в темах Pub/Sub

1. Введение

Последнее обновление: 21 июня 2023 г.

Оповещения об ошибках в журналах событий для обеспечения доступности

Оповещения на основе журналов событий позволяют определять доступность приложения путем мониторинга определенных событий или закономерностей в журналах*. Получая оповещения о сбоях или других проблемах, с которыми сталкиваются пользователи, вы можете предпринять шаги для минимизации воздействия на ваших пользователей и клиентов.

Хотя проверки доступности дают общее представление о состоянии сервиса, более точным может быть использование сообщений об ошибках, полученных из журналов, в качестве индикаторов более конкретных типов недоступности и для определения доли пользователей, испытывающих проблему.

Ошибки могут возникать по самым разным причинам, от ошибок пользователей до технического обслуживания системы, обновлений и даже факторов, не зависящих от системы, таких как плохая погода. Ключевой момент в системе оповещения заключается не в попытке предвидеть все возможные причины, а в выборе нескольких ключевых симптомов, которые могут послужить отправной точкой для устранения неполадок.

Темы публикаций/подписок как канал оповещений

Тема Pub/Sub может использоваться в качестве канала уведомлений Google Cloud Monitoring для отправки оповещений по подписке Pub/Sub. Это позволяет интегрировать оповещения Cloud Monitoring с другими системами, включая сторонние сервисы уведомлений.

Чтобы использовать тему Pub/Sub в качестве канала уведомлений, сначала необходимо создать тему Pub/Sub и подписку Pub/Sub. Затем нужно создать канал уведомлений Cloud Monitoring, который будет использовать тему Pub/Sub в качестве целевого канала.

При срабатывании оповещения система Cloud Monitoring отправляет сообщение в тему Pub/Sub. Подписчик подписки Pub/Sub может обработать сообщение и предпринять соответствующие действия.

Что вы построите

В этом практическом задании вы развернете приложение, создадите тему Pub/Sub и настроите оповещение на основе логов, которое будет проверять наличие ошибок в определенной части приложения и использовать тему Pub/Sub в качестве канала уведомлений.

Что вы узнаете

  • Как создать тему Pub/Sub
  • Как создать оповещение на основе логов

Данный практический урок посвящен созданию оповещений об ошибках. Несущественные концепции и код приложения опущены, и вы можете просто скопировать и вставить их.

Что вам понадобится

  • Учетная запись Google Cloud с правами доступа к:
  • Развертывание приложений Cloud Run
  • Создание тем для публикации/подписки
  • Создать оповещения

2. Настройка

Выберите или создайте проект Google Cloud.

Чтобы выбрать существующий проект, воспользуйтесь выпадающим списком:

b35bf95b8bf3d5d8.png

Для создания нового проекта в Google Cloud выполните следующие действия:

  1. Перейдите в консоль Google Cloud Platform .
  2. Нажмите кнопку «Создать проект» .
  3. Введите название для вашего проекта.
  4. Выберите платежный аккаунт для вашего проекта.
  5. Нажмите кнопку «Создать» .

Ваш проект будет создан, и вы перейдете на панель управления проектом. Оттуда вы сможете начать использовать сервисы Google Cloud.

Вот дополнительная информация о каждом этапе:

  • Название: Название вашего проекта должно быть уникальным в рамках вашей организации.
  • Платежный аккаунт: Вы можете использовать существующий платежный аккаунт или создать новый.
  • Создание: После ввода всей необходимой информации нажмите кнопку «Создать» , чтобы создать свой проект.

Для получения более подробной информации см. документацию Google Cloud по созданию проектов .

3. Разверните API-приложение

О чём рассказывается в примере приложения или API?

Наше приложение представляет собой простое приложение для управления запасами через API, которое предоставляет REST API-интерфейс с несколькими операциями для отображения списка товаров на складе и получения количества конкретного товара.

После развертывания API и при условии, что он размещен по адресу https://<somehost>, мы можем получить доступ к конечным точкам API следующим образом:

https://<somehost>/inventory

Это отобразит список всех товаров с указанием уровня их наличия на складе.

https://<somehost>/inventory/{productid}

Это позволит получить единую запись, содержащую идентификатор продукта и уровень запасов данного товара.

Возвращаемые данные в ответе имеют формат JSON.

Примечание : Данное API-приложение предназначено только для демонстрационных целей и не представляет собой безопасную и надежную реализацию API. Оно предназначено для быстрого ознакомления с основной целью лабораторной работы, а именно с операциями в Google Cloud.

Пример данных и запросы/ответы API

Для простоты приложение не использует базу данных в качестве бэкэнда. Оно содержит 3 примера идентификаторов товаров и информацию об уровне их наличия на складе.

Идентификатор продукта

Уровень запасов на складе

И-1

10

И-2

20

И-3

30

Ниже приведены примеры запроса и ответа API:

API-запрос

Ответ API

https://<somehost>/inventory

[ { "I-1": 10, "I-2": 20, "I-3": 30 }]

https://<somehost>/inventory/I-1

{ "productid": "I-1", "qty": 10}

https://<somehost>/inventory/I-2

{ "productid": "I-2", "qty": 20}

https://<somehost>/inventory/I-200

{ "productid": I-200, "qty": -1}

Клонируйте репозиторий

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли GCP щелкните значок Cloud Shell на панели инструментов в правом верхнем углу:

bce75f34b2c53987.png

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

f6ef2b5f13479f3a.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лаборатории можно выполнять с помощью обычного браузера.

Настройка gcloud

В Cloud Shell задайте идентификатор проекта и сохраните его в качестве переменной PROJECT_ID.

PROJECT_ID=[YOUR-PROJECT-ID]

gcloud config set project $PROJECT_ID

Теперь выполните следующую команду:

$ git clone https://github.com/rominirani/cloud-code-sample-repository.git

В результате в этой папке будет создана папка с названием cloud-code-sample-repository.

(Необязательно) Запустите приложение в Cloud Shell.

Вы можете запустить приложение локально, выполнив следующие действия:

  1. В терминале перейдите к версии API для Python, используя следующую команду:

$ cd cloud-code-sample-repository

$ cd python-flask-api

  1. В терминале введите следующую команду (на момент написания статьи Cloud Shell поставляется с предустановленным Python 3.9.x, и мы будем использовать версию по умолчанию. Если вы планируете запускать его локально на своем ноутбуке, вы можете использовать Python 3.8+):

$ python app.py

  1. Для запуска локального сервера Python можно выполнить следующую команду.

1f798fbddfdc2c8e.png46edf454cc70c5a6.png

Нажмите «Предварительный просмотр» на порту 8080. 5. Откроется окно браузера. Вы увидите ошибку 404, это нормально. Измените URL-адрес, добавив после имени хоста только /inventory.

Например, на моём компьютере это выглядит так:

https://8080-cs-557561579860-default.cs-asia-southeast1-yelo.cloudshell.dev/inventory

Это отобразит список товаров на складе, как объяснялось ранее:

709d57ee2f0137e4.png

  1. Теперь вы можете остановить сервер, перейдя в Терминал и нажав Ctrl-C.

Разверните приложение

Теперь мы развернем это API-приложение в Cloud Run. Для этого мы использовали клиент командной строки gcloud, чтобы выполнить команду развертывания кода в Cloud Run .

В терминале выполните следующую команду gcloud:

$ gcloud run deploy --source .

Вам будет задано несколько вопросов, некоторые из которых перечислены ниже:

  1. Название сервиса (python-flask-api): либо используйте это имя по умолчанию, либо выберите что-то вроде my-inventory-api.
  2. API [run.googleapis.com] не включен в проекте [613162942481]. Хотите включить и повторить попытку (это займет несколько минут)? (да/нет)? Да
  3. Пожалуйста, укажите регион: выберите 31 (us-west-1)
  4. API [artifactregistry.googleapis.com] не включен в проекте [613162942481]. Хотите включить и повторить попытку (это займет несколько минут)? (да/нет)? Да
  5. Для развертывания из исходного кода требуется репозиторий Docker в реестре артефактов для хранения собранных контейнеров. Будет создан репозиторий с именем [cloud-run-source-deploy] в регионе [us-west1].
  6. Вы хотите продолжить (Да/Нет)? Да
  7. Разрешить неаутентифицированные вызовы к [my-inventory-api] (да/нет)? Да

В конечном итоге, это запустит процесс, в ходе которого ваш исходный код будет упакован в контейнер, отправлен в реестр артефактов, а затем развернут сервис Cloud Run с указанием ревизии. Наберитесь терпения (это может занять 3-4 минуты), и вы увидите, как процесс завершается, а вам будет показан URL-адрес сервиса.

Пример выполнения показан ниже:

87ba8dbf88e8cfa4.png

Протестируйте приложение

Теперь, когда мы развернули приложение в Cloud Run, вы можете получить доступ к API-приложению следующим образом:

  1. Обратите внимание на URL-адрес сервиса из предыдущего шага. Например, в моей конфигурации он отображается как https://my-inventory-api-bt2r5243dq-uw.a.run.app . Назовем его <SERVICE_URL> .
  2. Откройте браузер и перейдите по следующим трем URL-адресам, чтобы получить доступ к конечным точкам API:
  3. <SERVICE_URL>/inventory
  4. <SERVICE_URL>/inventory/I-1
  5. <SERVICE_URL>/inventory/I-100

Оно должно соответствовать спецификациям, которые мы предоставили в предыдущем разделе, включая пример запроса и ответа API.

Получение сведений об услуге из Cloud Run

Мы развернули наш API-сервис в Cloud Run, бессерверной вычислительной среде. Мы можем в любой момент получить доступ к сервису Cloud Run через консоль Google Cloud.

В главном меню перейдите в раздел Cloud Run. Отобразится список запущенных вами служб в Cloud Run. Вы должны увидеть службу, которую только что развернули. В зависимости от выбранного вами имени, вы должны увидеть что-то подобное:

2633965c4bc957cc.png

Нажмите на название услуги, чтобы просмотреть подробную информацию. Примерные данные приведены ниже:

33042ae64322ce07.png

Обратите внимание на URL-адрес, который представляет собой URL-адрес сервиса, который вы можете ввести в браузер и получить доступ к только что развернутому API инвентаризации. Ознакомьтесь с метриками и другими подробностями.

Давайте начнём с Google Cloud Operations Suite.

4. Создайте тему Pub/Sub для получения уведомлений.

Для создания темы Pub/Sub выполните следующие действия в консоли Google Cloud :

  1. Введите Pub/Sub в поле поиска и перейдите на сайт Pub/Sub. 935028bd8f6328ef.png
  2. Если вы еще не находитесь на вкладке «Темы», нажмите на нее. 7fd8bf91386a88fd.png
  3. Нажмите кнопку «Создать тему» . cd9d197f9023c41b.png
  4. Введите узнаваемое название для вашей темы.

173f313b4a3c4934.png

  1. Нажмите кнопку «Создать» . ca9a02477da21a44.png
  2. Скопируйте название темы с помощью кнопки «Копировать». Оно понадобится вам в следующем разделе.

20848252ee83df93.png

5. Создайте политику оповещений об ошибках.

Изучение журналов ошибок

Чтобы просмотреть журналы ошибок приложения:

Перейдите на вкладку «Ведение журнала» .

Здесь отобразится интерфейс логирования, где вы сможете выбирать/отменять выбор различных ресурсов (проект, ресурс Google Cloud, названия сервисов и т. д.), а также уровни детализации логов для фильтрации сообщений в логах по мере необходимости.

6605b68395185b89.png

Смоделируйте несколько некорректных запросов к службе учета запасов, указав идентификаторы товаров, не входящие в списки I-1, I-2 и I-3. Например, некорректный запрос выглядит так:

https://<SERVICE_URL>/inventory/I-999

Теперь мы проверим все предупреждения, сгенерированные нашим API в случае предоставления некорректного идентификатора продукта в запросе.

Создание пользовательской политики оповещений на основе журналов для обработки ошибок.

Предположим, мы хотим отслеживать появление очень специфического сообщения об ошибке в части приложения. Допустим, мы замечаем большое количество ошибок при поиске идентификаторов продуктов. Эта проблема является симптомом множества возможных неполадок (неработающая ссылка, несогласованность базы данных или бот, перечисляющий наш сайт). Хотя представить все потенциальные причины сложно или невозможно, отправка этим сообщением приложения даже один раз — это проблема высокого уровня, о которой мы хотим знать. Для оповещения о ней нам необходимо создать политику на основе данных из наших журналов ошибок.

  1. В поле запроса введите следующие параметры запроса:

resource.type="cloud_run_revision"

textPayload =~ "ПРЕДУПРЕЖДЕНИЕ в приложении: Получен запрос на инвентаризацию для неверного productid"

Это должно выглядеть примерно так:

f672154cfebf0051.png

  1. Нажмите «Выполнить запрос». После этого отобразятся все поступившие запросы, в которых обнаружена эта проблема.

77c190e3a2fab6bf.png

  1. Чтобы преобразовать приведенный выше код в оповещение, нажмите кнопку « Создать оповещение» , которую вы видите в обозревателе журналов чуть ниже поля запроса, справа:

4cd3fcf142189376.png

  1. Это откроет форму для создания политики оповещений на основе журналов.

b82446854bad87fc.png

  1. Используйте исходный запрос для получения журналов, которые следует включить в оповещение:

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: Received request inventory for incorrect productid"

764227db73ec3de6.png

  1. Установите частоту уведомлений и продолжительность инцидента. В качестве примера можно использовать минимальные значения для каждого параметра:

bb3d96448ec998a1.png

  1. Наконец, в поле "Кого следует уведомить?" выберите созданный ранее канал уведомлений Pub/Sub:

3593c48c29d4b76c.png

  1. Нажмите «Сохранить». Чтобы просмотреть и управлять политикой оповещений, перейдите на страницу «Оповещения» и проверьте раздел «Политики»: ca08ea380fb37c91.png

6. Поздравляем!

Поздравляем, вы успешно настроили проверку доступности системы для отправки оповещений в Pub/Sub!