Использование Google Stackdriver Debug, Trace, Logging и Logpoints

В этом учебном пособии вы познакомитесь с Google Stackdriver , который позволяет выполнять следующие действия с приложениями Google Cloud Platform:

  • Сделайте моментальный снимок отладки в своих приложениях, работающих на App Engine, Compute Engine и Container Engine.
  • Просмотр журналов приложений .
  • Настройте метрики, отслеживайте их и получайте оповещения .
  • Отслеживайте вызовы API и получайте данные о времени отклика и потенциальных узких местах в коде.
  • Добавляйте точки журнала в работающее приложение без необходимости его развертывания. Это действительно уникальная (и, надеюсь, полезная) функция.

В этом уроке мы собираемся сделать следующее с нуля:

  1. Создайте проект Google Cloud Platform (в частности, App Engine)
  2. Настройка исходного репозитория проекта Google Cloud Platform
  3. Используйте стандартный исходный код приложения Python для гостевой книги, доступный на Github.
  4. Разверните код
  5. Посмотрите, как мы можем получить моментальные снимки отладки работающего приложения.
  6. Посмотрите на ведение журнала и трассировку вызовов приложений
  7. Добавить точки журнала в текущее запущенное приложение. Эта функция изначально была описана в этой записи блога: Добавление журналов приложений в приложение без перезапуска .

Давайте начнем.

Этот контент был первоначально создан Ромином Ирани и размещен здесь .

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 10 февраля 2016 г., 12:45:26.png

Запомните идентификатор проекта, уникальное имя для всех проектов Google Cloud (имя выше уже занято и не будет работать для вас, извините!). Позже в этой кодовой лаборатории он будет упоминаться как PROJECT_ID .

Затем вам нужно включить выставление счетов в облачной консоли, чтобы использовать ресурсы Google Cloud.

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

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Облачная оболочка Google

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

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

Чтобы активировать Google Cloud Shell, в консоли разработчика просто нажмите кнопку в правом верхнем углу (подготовка и подключение к среде займет всего несколько минут):

активироватьCloudShell.png

Затем примите условия обслуживания и нажмите ссылку «Запустить Cloud Shell»:

x.png

Снимок экрана 14.06.2017, 10.13.43 PM.png

После подключения к облачной оболочке вы должны увидеть, что вы уже прошли аутентификацию и что проект уже настроен на ваш PROJECT_ID :

gcloud auth list

Вывод команды

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Вывод команды

[core]
project = <PROJECT_ID>

Если по какой-то причине проект не установлен, просто введите следующую команду:

gcloud config set project <PROJECT_ID>

Ищете свой PROJECT_ID ? Проверьте, какой идентификатор вы использовали на этапах настройки, или найдите его на панели управления консоли:

Project_ID.png

ВАЖНО: Наконец, установите зону по умолчанию и конфигурацию проекта:

gcloud config set compute/zone us-central1-f

Вы можете выбрать множество различных зон. Подробнее читайте в документации по регионам и зонам .

Ознакомьтесь с включенными API StackDriver

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

Обратите внимание на конкретные API, которые были включены для вашего проекта:

Каждый проект Google Cloud Platform предлагает частный хостинг Git, но сначала нам нужно создать репозиторий по умолчанию для работы. Перейдите к исходным репозиториям с помощью окна поиска в консоли:

Нажмите «СОЗДАТЬ РЕПОЗИТОРИЙ», чтобы создать новый репозиторий кода с именем «по умолчанию»:

Используя Cloud Shell, мы собираемся клонировать этот каталог в наш экземпляр Google Cloud Shell. Для этого давайте сначала создадим каталог в нашем экземпляре Google Cloud Shell и перейдем к нему, как показано ниже (пример вывода):

mkdir stackdriver-demo
cd stackdriver-demo/

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

gcloud source repos clone default

Это вывод консоли, который вы должны увидеть:

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

Большой! Давайте немного углубимся в настроенные пульты git. Это не обязательно, а просто что-то, чтобы вы лучше понимали, что произошло за кулисами.

Перейдите в созданный каталог по умолчанию и запустите команду git remote -v , как показано ниже.

cd default
git remote -v

Это вывод консоли, вы должны увидеть что-то похожее на это:

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

Вы можете видеть, что это правильно указывает на репозиторий Git, связанный с нашим проектом GCP.

Вытащите приложение гостевой книги с Github

Приложение, которое мы собираемся использовать, представляет собой стандартное приложение App Engine с именем Guestbook и доступно в официальном репозитории Google Cloud Platform Github. Это приложение также является частью официальной документации для начала работы. Проект Github доступен по адресу: https://github.com/GoogleCloudPlatform/appengine-guestbook-python .

Теперь мы собираемся загрузить этот код в наш экземпляр Cloud Shell. Команда и ее вывод показаны здесь:

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Это вывод консоли, который вы должны увидеть:

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

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

Отправьте текущий код с помощью Cloud Shell в репозиторий Project Git.

Теперь давайте отправим этот код в Git-репозиторий GCP Project, чтобы мы могли установить точки останова, точки журнала и многое другое для нашего кода. Обратите внимание, что это необязательный шаг, поскольку вы можете напрямую интегрироваться с Github, вашим локальным компьютером и другими способами для подключения исходного кода.

Но для наших целей мы поместим этот код в Git-репозиторий проекта GCP. Это делается с помощью стандартной команды git push, как показано ниже:

git push origin master

Это вывод консоли, который вы должны увидеть:

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

Теперь вернитесь в свою облачную консоль GCP и, в частности, в раздел «Разработка». Нажмите «Исходный код», и для репозитория по умолчанию вы сможете увидеть все файлы проекта. Пример вывода показан ниже:

Теперь все готово для развертывания нашего приложения Guestbook App Engine. Чтобы развернуть приложение, убедитесь, что вы находитесь в Google Cloud Shell и в каталоге по умолчанию, как это было всегда. Используйте команду gcloud app deploy как показано ниже:

gcloud app deploy --version 1

Когда вас попросят выбрать регион, выберите [1] us-east1 .

Это вывод консоли, который вы должны увидеть:

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

Обратите внимание, что мы предоставили параметр версии для команды развертывания приложения. Мы присвоили ему значение "1" .

Поскольку приложение гостевой книги использует Google Cloud Datastore для хранения данных, нам необходимо обновить индексы Datastore. Индексы указаны в файле index.yaml , и мы просто используем gcloud datastore create-indexes как показано ниже:

gcloud datastore create-indexes index.yaml

Это вывод консоли, который вы должны увидеть:

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

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

Мы можем проверить, развернуто ли и доступно ли наше приложение с версией 1, перейдя в Compute → App Engine, а затем щелкнув «Версии», как показано ниже:

Теперь все должно выглядеть хорошо, и вы можете взглянуть на свой проект, перейдя по адресу https://<PROJECT_ID>.appspot.com . Опять же, подготовка индексов хранилища данных может занять несколько минут, поэтому, если приложение выдает ошибку (например, «Внутренняя ошибка сервера»), повторите попытку через несколько минут.

Давайте теперь воспользуемся приложением, войдя в систему и создав несколько записей в гостевой книге, как показано ниже:

Большой! Теперь все готово для погружения в возможности Stackdriver.

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

Давайте сделаем это сейчас для приложения «Гостевая книга». Мы собираемся запросить моментальный снимок, если кто-либо запрашивает домашнюю страницу, и, в частности, мы хотим, чтобы он извлекал список приветствий, которые в настоящее время находятся в хранилище данных.

Код для этого находится в файле guestbook.py . В частности, нам интересно начать проверку кода во время выполнения после того, как он получит список приветствий из хранилища данных. Это делается на линии № 72. Таким образом, мы можем просто поставить точку останова на строке 74, чтобы мы знали, что #72 будет выполнен.

Для этого либо нажмите «Отладка» в представлении версии AppEngine, либо перейдите в Stackdriver → Debug. Это отобразит экран, показанный ниже. Что вам нужно сделать, так это выбрать файл ( guestbook.py ) слева, затем щелкнуть номер строки, как показано на рисунке.

Это покажет сообщение, выделенное в красном поле выше, о том, что он ожидает запуска моментального снимка. Теперь все, что нам нужно сделать, это зайти на нашу страницу по адресу

https://<PROJECT_ID>.appspot.com .

Как только вы это сделаете, моментальный снимок будет активирован, и вы увидите, что разделы «Переменные» и «Стек вызовов» заполняются, как показано ниже. Посмотрите, как отображаются переменные, и вы можете развернуть их, чтобы проверить значения. Это супер полезно.

Например, если вы развернете переменную приветствия, вы увидите, что в ней есть записи, соответствующие количеству записей в гостевой книге, которые вы создали.

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

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

Если вы хотите, чтобы снимок активировался только при определенном условии, вы можете использовать поле «Условие», как показано ниже. Здесь мы говорим, что снимок должен происходить только в том случае, если количество приветствий больше 1. Поэкспериментируйте с этим, если хотите.

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

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

В нашем случае мы открывали домашнюю страницу ("/") и просматривали/добавляли записи в гостевой книге. Этого достаточно, чтобы Trace рассказал нам больше о задержке. Просто перейдите к обзору трассировок Stackdriver, и мы увидим снимок экрана, как показано ниже. Обратите внимание на недавние трассировки и их задержки.

Если мы щелкнем любую трассировку, т. е. щелкнем ссылку URI, она покажет подробную трассировку, как показано ниже:

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

Вы можете просмотреть журналы приложений в любое время, перейдя к ведению журнала Stackdriver (как показано ниже). Доступно несколько фильтров, начиная с различных сервисов GCP → типы журналов → уровень журнала → дата и т. д.

На снимке экрана ниже показаны журналы для нашего приложения App Engine и версия 1 по умолчанию.

ведение журнала.png

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

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

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

По-прежнему из Cloud Shell давайте проверим текущий список точек журнала, которые мы настроили (очевидно, что он должен быть равен 0). Это делается с помощью команды gcloud , как показано ниже:

gcloud debug logpoints list

Это вывод консоли, который вы должны увидеть:

Debug target not specified. Using default target: default-1
Listed 0 items.

Теперь мы собираемся добавить точку журнала в работающее приложение. Чтобы добавить точку журнала, нам нужно сделать следующие вещи:

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

В нашем случае мы собираемся добавить точку журнала в файл guestbook.py в строке № 74 с помощью команды создания точек журнала, как показано ниже:

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

Это вывод консоли, который вы должны увидеть:

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

Мы предоставили filename:linenumber и сообщение журнала выше. Обратите внимание, что наше сообщение журнала также содержит выражение, которое выводит количество приветствий, полученных из хранилища данных.

Команда возвращается с сообщением о том, что точка журнала добавлена. Скриншот из нашей Cloud Shell показан ниже:

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

gcloud debug logpoints list

Это вывод консоли, который вы должны увидеть:

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

Чтобы увидеть это в действии, мы можем еще раз перейти на домашнюю страницу https://<PROJECT_ID>.appspot.com . Это вызовет код и, в свою очередь, нашу точку журнала. Помните, что это будет зарегистрировано по умолчанию в наших журналах приложений. Итак, все, что нам нужно сделать, это еще раз посетить Stackdriver Logging, как показано ниже:

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

Мы надеемся, что вам понравился этот урок. В нем затронуты лишь некоторые из возможностей, которые предлагает платформа Stackdriver. Есть еще много интересного. Посетите блог Ромина Ирани (первоначального автора этой лаборатории кода) по адресу https://rominirani.com/ , чтобы узнать больше руководств по Google Cloud Platform.

Вы также можете проверить другую кодовую лабораторию под названием «Использование мониторинга и ведения журнала Stackdriver для лучшего понимания состояния вашего приложения».

Если у вас есть какие-либо отзывы или вы хотите сообщить о проблемах с этой лабораторией кода, воспользуйтесь ссылкой «Пожалуйста, найдите ошибку» в левом нижнем углу этой страницы.