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

1. Введение

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

5815064fec87444b.png

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

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

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

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

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

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

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

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

  1. Чтобы активировать Cloud Shell из Cloud Console, просто нажмите «Активировать Cloud Shell». fEbHefbrRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X 3-й квартал (подготовка и подключение к среде займет всего несколько минут).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARE01A

Снимок экрана 14.06.2017, 22.13.43.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 ? Узнайте, какой идентификатор вы использовали на этапах настройки, или найдите его на панели управления 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 Console нажмите «Облачные функции» , затем нажмите « Создать функцию» .

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.

Запуск функции Cloud теперь должен быть таким же простым, как использование команды 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. Обновите функцию

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

aaee3159bbe395d3.png7ed347101da5eca0.png

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

  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
  
};

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

Наконец, добавьте переменную среды облачной функции с именем 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

Теперь вы готовы просмотреть список трассировок, созданных без каких-либо дополнительных требований к настройке и без специальной библиотеки трассировки в вашем коде!

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. Время очистить ресурсы

На этом работа над кодом завершена!

Хотя облачные функции и инструменты Stackdriver представляют собой бессерверные платформы, которые не несут затрат, когда они не используются, будьте добросовестным гражданином облака и удалите свою облачную функцию. Просто выберите hello-monitor в разделе «Обзор» в разделе «Облачные функции» и нажмите «Удалить» .

aceb633cf70a4a27.png

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

Вот кое-что из дальнейшего чтения:

/