Используйте ведение журнала Stackdriver и трассировку Stackdriver для облачных функций

1. Введение

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

5815064fec87444b.png

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

2. Настройка и требования

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

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

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

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

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

  1. Для активации Cloud Shell из консоли Cloud Console просто нажмите «Активировать Cloud Shell». fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (На подготовку и подключение к среде должно уйти всего несколько минут).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

После подключения к 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:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

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

<PROJECT_ID>
  1. Наконец, установите зону по умолчанию и конфигурацию проекта.
gcloud config set compute/zone us-central1-f

Вы можете выбрать различные зоны. Для получения дополнительной информации см. раздел «Регионы и зоны» .

3. Разверните простую облачную функцию.

Для того чтобы иметь возможность отслеживать происходящее, создайте облачную функцию "Hello, World". В левом меню консоли Google Cloud нажмите " Облачные функции" , а затем " Создать функцию" .

3c13aa20af602aa7.png

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

fa6816c96d6d5b94.png

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

7aadf164450484e.png

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

dc74cd21000d6c91.png

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

5363a34eb001d5ed.png

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. Просмотрите журналы событий.

В разделе сведений о вашей облачной функции нажмите «Просмотреть журналы» .

b24157fd3376e6a8.png

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

5a36fa75d2fb0165.png

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

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

  • Фильтрация по уровню детализации логов (в вашем случае все логи имеют уровень debug ).
  • Выберите конкретный временной промежуток (относительный или абсолютный).
  • Включить потоковую передачу логов (с помощью Play) 751a4600016f34a7.png (в верхней части экрана).
  • Скопируйте ссылку на запись в журнале (для обмена с членами команды).
  • Отобразить запись в журнале в контексте ресурса.
  • Закрепите запись в журнале (в качестве визуальной подсказки).
  • Экспортируйте журналы в BigQuery, Cloud Storage или Pub/Sub (или просто загружайте их в виде файлов JSON или CSV).

6. Update the function

Используя консоль Cloud, перейдите в раздел «Подробная информация о функции» и проанализируйте всплеск количества вызовов в секунду и времени их выполнения, который вы зафиксировали с помощью нагрузочного тестирования.

aaee3159bbe395d3.png7ed347101da5eca0.png

Ещё один более подробный инструмент для наблюдения за задержкой и вызовами RPC — это Stackdriver Trace, но прежде чем вы сможете его использовать, вам необходимо внести несколько изменений в ваши Cloud Functions. Выполните следующие действия:

  1. Добавьте в качестве зависимости полезный пакет node-emoji .
  2. Обновите код функции, чтобы она использовала модуль node-emoji и добавила некоторую задержку.
  3. Добавьте переменную среды, чтобы включить трассировку Stackdriver для облачных функций.

В разделе «Подробности функции» нажмите «Редактировать» , чтобы изменить функцию.

39b0f8f98b18a6c0.png

Отредактируйте файл 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 следующим образом:

9205bd277b76aa21.png

Нажмите « Сохранить ».

Вернитесь в 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 ).

576373f38cad6f8.png

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

44a36b758b49f88f.png

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

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

5815064fec87444b.png

Чтобы увеличить масштаб, просто щелкните и перетащите курсор по графику. Выбор пользовательского временного диапазона на графике трассировки

Чтобы уменьшить масштаб, нажмите кнопку «Отменить масштаб» в верхней части страницы.

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

Перейдите в раздел «Обзор» в меню слева:

e920cfca2a50899e.png

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

ef5a45647967d275.png

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

5bd34e9d13b47fb6.png

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

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Подобный настраиваемый отчет можно использовать для определения момента возникновения проблем с производительностью, а также для отслеживания показателей уровня обслуживания (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 .

aceb633cf70a4a27.png

9. Что дальше?

Вот ещё несколько материалов для чтения:

/