Использование отладки, трассировки, логирования и точек логирования Google Stackdriver

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

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

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

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

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

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

Настройка среды для самостоятельного обучения

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

Скриншот от 2016-02-10 12:45:26.png

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

Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.

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

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

Google Cloud Shell

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

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

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

activateCloudShell.png

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

x.png

Скриншот 2017-06-14 в 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-хостинг, но сначала нам нужно создать репозиторий по умолчанию для работы. Перейдите в раздел «Исходные репозитории» с помощью строки поиска в консоли:

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

Используя 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.

Загрузите приложение Guestbook с 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 в репозиторий Git проекта

Теперь давайте добавим этот код в Git-репозиторий проекта GCP, чтобы можно было установить точки останова, точки логирования и другие параметры для нашего кода. Обратите внимание, что это не обязательный шаг, так как вы можете напрямую интегрировать его с 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 Cloud, а именно в раздел «Разработка». Нажмите «Исходный код», и для репозитория по умолчанию вы увидите все файлы проекта. Пример вывода показан ниже:

Теперь всё готово к развертыванию нашего приложения 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 для сохранения данных, нам необходимо обновить индексы хранилища данных. Индексы указаны в файле 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, а затем нажав на Versions, как показано ниже:

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

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

Отлично! Теперь мы готовы погрузиться в возможности Stackdriver.

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

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

Соответствующий код находится в файле guestbook.py . Нас интересует, в частности, проверка кода во время выполнения после того, как он извлечёт список приветствий из хранилища данных. Это делается на строке 72. Поэтому мы можем просто установить точку останова на строке 74, чтобы убедиться, что код 72 был выполнен.

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

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

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

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

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

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

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

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

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

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

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

Если кликнуть на любую из трассировок, то есть кликнуть на ссылку 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 с помощью команды logpoints create, как показано ниже:

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 представлен ниже:

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

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. Однако предстоит ещё многое изучить. Другие уроки по Google Cloud Platform можно найти в блоге Ромина Ирани (автора этой практической работы) по адресу https://rominirani.com/ .

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

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