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

Вы будете использовать облачную функцию, запускаемую по HTTP-запросу, но все, что вы рассматриваете, также применимо к другим языкам программирования и к облачным функциям, запускаемым другими событиями.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)
Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .
- Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.
Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Облачная оболочка
Хотя Cloud Functions, а также его возможности ведения журналов и мониторинга, можно использовать удаленно с вашего ноутбука, вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud.
Эта виртуальная машина на базе Debian содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Это означает, что для выполнения этого практического задания вам понадобится только браузер (да, он работает и на Chromebook).
- Для активации Cloud Shell из консоли Cloud Console просто нажмите «Активировать Cloud Shell».
(На подготовку и подключение к среде должно уйти всего несколько минут).
После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и проект уже настроен на ваш 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 ? Проверьте, какой ID вы использовали на этапах настройки, или найдите его на панели управления Cloud Console:
Cloud Shell также по умолчанию устанавливает некоторые переменные среды, которые могут быть полезны при выполнении будущих команд.
echo $GOOGLE_CLOUD_PROJECT
вывод команды
<PROJECT_ID>
- Наконец, установите зону по умолчанию и конфигурацию проекта.
gcloud config set compute/zone us-central1-f
Вы можете выбрать различные зоны. Для получения дополнительной информации см. раздел «Регионы и зоны» .
3. Разверните простую облачную функцию.
Для того чтобы иметь возможность отслеживать происходящее, создайте облачную функцию "Hello, World". В левом меню консоли Google Cloud нажмите " Облачные функции" , а затем " Создать функцию" .

Введите "hello-monitor" в качестве имени вашей новой облачной функции.

Оставьте все настройки исходного кода по умолчанию. (Однако при желании вы можете выбрать другой язык/среду выполнения.)

Наконец, нажмите «Создать» .

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

4. Протестируйте облачную функцию и отправьте трафик с помощью генератора нагрузки.
Теперь, когда облачная функция успешно развернута, протестируйте её из командной строки.
Сначала, используя Cloud Shell, выполните следующую команду:
$ gcloud functions describe hello-monitor
В результате должно отобразиться описание облачной функции, включая URL-адрес httpsTrigger , который является HTTP(S)-терминалом для вызова облачной функции. Он должен выглядеть примерно так: https://<region>-<project-id>.cloudfunctions.net/hello-monitor.
Теперь запустить облачную функцию должно быть так же просто, как использовать команду curl по указанному URL-адресу.
$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor Hello World!
Теперь воспользуйтесь Vegeta — простым инструментом для нагрузочного тестирования HTTP-запросов. Для его установки из Cloud Shell просто введите следующую команду:
$ go get -u github.com/tsenart/vegeta
Чтобы направить некоторый трафик на вашу облачную функцию (пять запросов в секунду в течение нескольких минут), используйте следующую команду:
$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \ | vegeta attack -rate=5 -duration=120s \ > results.bin
5. Просмотрите журналы событий.
В разделе сведений о вашей облачной функции нажмите «Просмотреть журналы» .

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

Все запросы к вашей облачной функции должны возвращать код состояния 200.
При просмотре журналов вы можете выполнить следующие действия:
- Фильтрация по уровню детализации логов (в вашем случае все логи имеют уровень
debug). - Выберите конкретный временной промежуток (относительный или абсолютный).
- Включить потоковую передачу логов (с помощью Play)
(в верхней части экрана). - Скопируйте ссылку на запись в журнале (для обмена с членами команды).
- Отобразить запись в журнале в контексте ресурса.
- Закрепите запись в журнале (в качестве визуальной подсказки).
- Экспортируйте журналы в BigQuery, Cloud Storage или Pub/Sub (или просто загружайте их в виде файлов JSON или CSV).
6. Update the function
Используя консоль Cloud, перейдите в раздел «Подробная информация о функции» и проанализируйте всплеск количества вызовов в секунду и времени их выполнения, который вы зафиксировали с помощью нагрузочного тестирования.


Ещё один более подробный инструмент для наблюдения за задержкой и вызовами RPC — это Stackdriver Trace, но прежде чем вы сможете его использовать, вам необходимо внести несколько изменений в ваши Cloud Functions. Выполните следующие действия:
- Добавьте в качестве зависимости полезный пакет
node-emoji. - Обновите код функции, чтобы она использовала модуль node-emoji и добавила некоторую задержку.
- Добавьте переменную среды, чтобы включить трассировку Stackdriver для облачных функций.
В разделе «Подробности функции» нажмите «Редактировать» , чтобы изменить функцию.

Отредактируйте файл package.json , чтобы добавить зависимость для пакета node-emoji .
{
"name": "sample-http",
"version": "0.0.1",
"dependencies": {
"node-emoji": "^1.8.1"
}
}
Отредактируйте саму функцию, изменив содержимое файла index.js следующим образом:
const emoji = require('node-emoji');
exports.helloWorld = (req, res) => {
let message = req.query.message || req.body.message || 'Hello World!';
// add some latency, functions are too quick!
setTimeout(function() {
message += emoji.random().emoji;
res.status(200).send(message);
}, (3 * 100)); // 300ms
};
Это добавляет случайный смайлик к сообщению, возвращаемому облачной функцией после паузы в 300 миллисекунд.
Наконец, добавьте переменную среды Cloud Function с именем GOOGLE_CLOUD_TRACE_ENABLED и установите для нее значение true следующим образом:

Нажмите « Сохранить ».
Вернитесь в Cloud Shell и выполните команду для создания нагрузки на только что развернутую облачную функцию:
$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \ | vegeta attack -rate=5 -duration=120s \ > results.bin
Now you're ready to observe the list of traces produced with no other setup requirements and no specific tracing library in your code!
7. Отслеживание обновленной облачной функции.
В меню слева перейдите к списку трассировок (в разделе Stackdriver Trace ).

Вы должны увидеть что-то похожее на следующий скриншот:

Это должно ясно показать, что задержка, возникающая в вашей облачной функции, действительно составляет 300 миллисекунд.
Каждая точка на графике представляет собой запрос, для которого можно просмотреть подробную информацию, такую как метка времени, HTTP-метод и статус, его метки, ссылка на соответствующую запись в журнале и любой последующий RPC-вызов, который выполняет облачная функция.

Чтобы увеличить масштаб, просто щелкните и перетащите курсор по графику. 
Чтобы уменьшить масштаб, нажмите кнопку «Отменить масштаб» в верхней части страницы.
Поскольку вы развернули всего одну облачную функцию, на графике отображаются только GET запросы по URI hello-monitor , но вы можете фильтровать трассировки по методу HTTP (GET, POST, DELETE), по статусу HTTP (2XX, 3XX) или с помощью фильтра запросов.
Перейдите в раздел «Обзор» в меню слева:

На этой обзорной странице вы можете найти последние данные и другую информацию.

Также доступна возможность создания пользовательских отчетов на основе комбинации фильтра URI-запроса, метода HTTP, статуса HTTP и временного диапазона. Это даже позволяет сравнивать полученные значения с базовым временным интервалом.

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


Подобный настраиваемый отчет можно использовать для определения момента возникновения проблем с производительностью, а также для отслеживания показателей уровня обслуживания (SLI), таких как задержка запросов конечных пользователей.
8. Пора навести порядок в ресурсах.
На этом практическое занятие завершается!
While Cloud Functions and Stackdriver tools are serverless platforms that don't incur costs when not in use, be a good cloud citizen and delete your Cloud Function. Simply select hello-monitor in Overview under Cloud Functions and click Delete .

9. Что дальше?
Вот ещё несколько материалов для чтения:
/