Практические методы наблюдения для приложений генеративного искусственного интеллекта на Javascript

1. Обзор

Приложения генеративного ИИ, как и любые другие, требуют наблюдаемости. Требуются ли для генеративного ИИ специальные методы наблюдения?

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

Что вы узнаете

  • Напишите приложение, использующее Vertex AI с редактором Cloud Shell.
  • Сохраняйте код своего приложения на GitHub.
  • Используйте gcloud CLI для развертывания исходного кода вашего приложения в Cloud Run.
  • Добавьте возможности мониторинга и ведения журналов в ваше приложение Gen AI.
  • Использование метрик на основе логов
  • Реализация логирования и мониторинга с помощью Open Telemetry SDK
  • Получите представление об ответственном обращении с данными в рамках искусственного интеллекта.

2. Предварительные требования

Если у вас еще нет учетной записи Google, вам необходимо создать новую .

3. Настройка проекта

  1. Войдите в консоль Google Cloud, используя свою учетную запись Google.
  2. Создайте новый проект или выберите вариант повторного использования существующего. Запишите идентификатор созданного или выбранного вами проекта.
  3. Включите выставление счетов по проекту.
    • Выполнение этой лабораторной работы должно обойтись менее чем в 5 долларов США в виде расходов на оплату.
    • В конце этой лабораторной работы вы можете выполнить действия по удалению ресурсов, чтобы избежать дальнейших списаний средств.
    • Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
  4. Подтвердите, что выставление счетов включено в разделе «Мои проекты» в Cloud Billing.
    • Если в столбце Billing account Billing is disabled :
      1. Нажмите на три точки в столбце Actions .
      2. Нажмите «Изменить оплату».
      3. Выберите платежный аккаунт, который вы хотите использовать.
    • Если вы участвуете в мероприятии в режиме реального времени, учетная запись, скорее всего, будет называться Google Cloud Platform Trial Billing Account.

4. Подготовка редактора Cloud Shell.

  1. Перейдите в редактор Cloud Shell . Если появится сообщение с запросом на авторизацию Cloud Shell для вызова gcloud с использованием ваших учетных данных, нажмите «Авторизовать» , чтобы продолжить.
    Нажмите, чтобы авторизовать Cloud Shell.
  2. Открыть окно терминала
    1. Нажмите на значок гамбургера. значок меню "гамбургер"
    2. Нажмите «Терминал»
    3. Нажмите «Новый терминал»
      Откройте новый терминал в редакторе Cloud Shell.
  3. В терминале настройте идентификатор вашего проекта:
    gcloud config set project [PROJECT_ID]
    
    Замените [PROJECT_ID] на идентификатор вашего проекта. Например, если идентификатор вашего проекта — lab-example-project , команда будет выглядеть так:
    gcloud config set project lab-project-id-example
    
    Если появится сообщение о том, что gcloud запрашивает ваши учетные данные для API GCPI, нажмите «Авторизовать» , чтобы продолжить.
    Нажмите, чтобы авторизовать Cloud Shell.
    После успешного выполнения вы должны увидеть следующее сообщение:
    Updated property [core/project].
    
    Если вы видите WARNING и вас спрашивают Do you want to continue (Y/N)? , то, скорее всего, вы неправильно ввели идентификатор проекта. Нажмите N , затем Enter и попробуйте снова запустить команду gcloud config set project после того, как найдете правильный идентификатор проекта.
  4. (Необязательно) Если у вас возникли проблемы с поиском идентификатора проекта, выполните следующую команду, чтобы увидеть идентификаторы всех ваших проектов, отсортированных по времени создания в порядке убывания:
    gcloud projects list \
         --format='value(projectId,createTime)' \
         --sort-by=~createTime
    

5. Включите API Google.

В терминале включите API Google, необходимые для выполнения этой лабораторной работы:

gcloud services enable \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     aiplatform.googleapis.com \
     logging.googleapis.com \
     monitoring.googleapis.com \
     cloudtrace.googleapis.com

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

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

Если вы получили сообщение об ошибке, начинающееся с ERROR: (gcloud.services.enable) HttpError accessing и содержащее подробности ошибки, как показано ниже, повторите команду через 1-2 минуты.

"error": {
  "code": 429,
  "message": "Quota exceeded for quota metric 'Mutate requests' and limit 'Mutate requests per minute' of service 'serviceusage.googleapis.com' ...",
  "status": "RESOURCE_EXHAUSTED",
  ...
}

6. Создайте приложение Gen AI на NodeJS.

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

  1. В терминале создайте каталог codelab-o11y :
    mkdir ~/codelab-o11y
    
  2. Перейдите в текущий каталог codelab-o11y :
    cd ~/codelab-o11y
    
  3. Инициализируйте package.json приложения NodeJS:
    npm init -y
    
  4. Установите пакет fastify :
    npm install fastify
    
  5. Установите пакеты Cloud SDK для аутентификации и работы с Vertex AI:
    npm install google-auth-library @google-cloud/vertexai
    
  6. Создайте файл index.js и откройте его в редакторе Cloud Shell:
    cloudshell edit index.js
    
    Теперь в окне редактора над терминалом должен появиться пустой файл. Ваш экран будет выглядеть примерно так:
    Отобразить редактор Cloud Shell после начала редактирования файла main.go
  7. Скопируйте следующий код и вставьте его в открытый файл index.js :
    const { VertexAI } = require('@google-cloud/vertexai');
    const { GoogleAuth } = require('google-auth-library');
    
    let generativeModel;
    const auth = new GoogleAuth();
    auth.getProjectId().then(result => {
      const vertex = new VertexAI({ project: result });
      generativeModel = vertex.getGenerativeModel({
          model: 'gemini-1.5-flash'
      });
    });
    
    const fastify = require('fastify')();
    const PORT = parseInt(process.env.PORT || '8080');
    
    fastify.get('/', async function (request, reply) {
      const animal = request.query.animal || 'dog';
      const prompt = `Give me 10 fun facts about ${animal}. Return this as html without backticks.`
      const resp = await generativeModel.generateContent(prompt);
      const html = resp.response.candidates[0].content.parts[0].text;
      reply.type('text/html').send(html);
    })
    
    fastify.listen({ host: '0.0.0.0', port: PORT }, function (err, address) {
      if (err) {
        console.error(err);
        process.exit(1);
      }
      console.log(`codelab-genai: listening on ${address}`);
    })
    
    Через несколько секунд Cloud Shell Editor автоматически сохранит ваш код.

Разверните код приложения Gen AI в Cloud Run.

  1. В окне терминала выполните команду для развертывания исходного кода приложения в Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Если вы видите сообщение, подобное приведенному ниже, указывающее на то, что команда создаст новый репозиторий, нажмите Enter .
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Процесс развертывания может занять несколько минут. После завершения процесса развертывания вы увидите примерно следующий вывод:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Скопируйте отображаемый URL-адрес службы Cloud Run в отдельную вкладку или окно браузера. В качестве альтернативы, выполните следующую команду в терминале, чтобы вывести URL-адрес службы, и щелкните по отображаемому URL-адресу, удерживая клавишу Ctrl , чтобы открыть его:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    При открытии URL-адреса может появиться ошибка 500 или сообщение:
    Sorry, this is just a placeholder...
    
    Это означает, что развертывание сервиса не завершилось. Подождите несколько минут и обновите страницу. В конце вы увидите текст, начинающийся с «Забавные факты о собаках» и содержащий 10 интересных фактов о собаках.

Попробуйте взаимодействовать с приложением, чтобы узнать интересные факты о разных животных. Для этого добавьте параметр animal к URL-адресу, например ?animal=[ANIMAL] где [ANIMAL] — название животного. Например, добавьте ?animal=cat чтобы получить 10 интересных фактов о кошках, или ?animal=sea turtle чтобы получить 10 интересных фактов о морских черепахах.

7. Проведите аудит вызовов API Vertex.

Аудит вызовов API Google позволяет получить ответы на такие вопросы, как «Кто вызывает тот или иной API, где и когда?». Аудит важен при устранении неполадок в приложении, исследовании потребления ресурсов или проведении анализа программного обеспечения.

Журналы аудита позволяют отслеживать административные и системные действия, а также регистрировать вызовы операций API «чтение данных» и «запись данных». Для аудита запросов Vertex AI к генерации контента необходимо включить журналы аудита «Чтение данных» в консоли Cloud.

  1. Нажмите на кнопку ниже, чтобы открыть страницу «Журналы аудита» в консоли Cloud.

  2. Убедитесь, что на странице выбран проект, который вы создали для этой лабораторной работы. Выбранный проект отображается в верхнем левом углу страницы, справа от меню-гамбургера:
    Выпадающее меню проекта Google Cloud Console
    При необходимости выберите нужный проект из выпадающего списка.
  3. В таблице конфигурации журналов аудита доступа к данным в столбце «Сервис» найдите сервис Vertex AI API и выберите его, установив флажок слева от имени сервиса.
    Выберите API Vertex AI
  4. В информационной панели справа выберите тип аудита «Чтение данных».
    Проверить данные. Прочитать журналы.
  5. Нажмите « Сохранить ».

Для создания журналов аудита откройте URL-адрес сервиса. Обновите страницу, изменяя значение параметра ?animal= чтобы получить другие результаты.

Изучите журналы аудита

  1. Нажмите на кнопку ниже, чтобы открыть страницу «Проводник журналов» в консоли Cloud:

  2. Вставьте следующий фильтр в панель запросов.
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND
    protoPayload.serviceName="aiplatform.googleapis.com"
    
    Панель запросов — это редактор, расположенный в верхней части страницы «Проводник журналов»:
    Запросить журналы аудита
  3. Нажмите « Выполнить запрос» .
  4. Выберите одну из записей журнала аудита и разверните поля для просмотра информации, содержащейся в журнале.
    Здесь вы можете увидеть подробную информацию о вызове API Vertex, включая использованный метод и модель. Вы также можете увидеть идентификатор вызывающего пользователя и права доступа, которые разрешили этот вызов.

8. Запись взаимодействий с Gen AI.

В журналах аудита не отображаются параметры запросов API или данные ответов. Однако эта информация может быть важна для устранения неполадок в приложении и анализа рабочих процессов. На этом этапе мы восполняем этот пробел, добавляя логирование приложения. Для логирования используется стандартный метод логирования NodeJS console.log , позволяющий записывать структурированные сообщения в стандартный вывод. Этот метод позволяет Cloud Run автоматически захватывать информацию, выводимую в стандартный вывод, и передавать её в Cloud Logging. Для корректного захвата структурированных сообщений выводимый лог должен быть соответствующим образом отформатирован. Следуйте приведенным ниже инструкциям, чтобы добавить возможности структурированного логирования в наше приложение NodeJS.

  1. Вернитесь в окно (или вкладку) «Cloud Shell» в вашем браузере.
  2. В терминале снова откройте index.js :
    cloudshell edit ~/codelab-o11y/index.js
    
  3. Для регистрации ответа модели выполните следующие действия:
    1. Найдите вызов метода await generativeModel.generateContent() (строка 20).
    2. Скопируйте и вставьте приведенный ниже код в начало следующей строки.
        console.log(JSON.stringify({
            severity: 'DEBUG',
            message: 'Content is generated',
            animal: animal,
            prompt: prompt,
            response: resp.response,
        }));
      

Функция обработчика изменена таким образом, чтобы вызывать console.log() для вывода структуры JSON, схема которой соответствует рекомендациям по структурированному форматированию . В логе фиксируется параметр animal запроса, а также подсказка и ответ модели.

Через несколько секунд Cloud Shell Editor автоматически сохранит ваши изменения.

Разверните код приложения Gen AI в Cloud Run.

  1. В окне терминала выполните команду для развертывания исходного кода приложения в Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Если вы видите сообщение, подобное приведенному ниже, указывающее на то, что команда создаст новый репозиторий, нажмите Enter .
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Процесс развертывания может занять несколько минут. После завершения процесса развертывания вы увидите примерно следующий вывод:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Скопируйте отображаемый URL-адрес службы Cloud Run в отдельную вкладку или окно браузера. В качестве альтернативы, выполните следующую команду в терминале, чтобы вывести URL-адрес службы, и щелкните по отображаемому URL-адресу, удерживая клавишу Ctrl , чтобы открыть его:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    При открытии URL-адреса может появиться ошибка 500 или сообщение:
    Sorry, this is just a placeholder...
    
    Это означает, что развертывание сервиса не завершилось. Подождите несколько минут и обновите страницу. В конце вы увидите текст, начинающийся с «Забавные факты о собаках» и содержащий 10 интересных фактов о собаках.

Для создания логов приложения откройте URL-адрес сервиса. Обновите страницу, изменяя значение параметра ?animal= чтобы получить другие результаты.
Чтобы просмотреть журналы приложения, выполните следующие действия:

  1. Нажмите на кнопку ниже, чтобы открыть страницу просмотра журналов в консоли Cloud:

  2. Вставьте следующий фильтр в панель запросов (№2 в интерфейсе обозревателя журналов ):
    LOG_ID("run.googleapis.com%2Fstdout") AND
    severity=DEBUG
    
  3. Нажмите « Выполнить запрос» .

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

9. Подсчет взаимодействий с Gen AI.

Cloud Run записывает управляемые метрики , которые можно использовать для мониторинга развернутых сервисов. Управляемые пользователем метрики мониторинга обеспечивают больший контроль над данными и частотой обновления метрик. Для реализации таких метрик требуется написать код, который собирает данные и записывает их в Cloud Monitoring . См. следующий (необязательный) шаг, чтобы узнать, как реализовать это с помощью OpenTelemetry SDK.

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

  1. Посмотрите на окно обозревателя журналов , которое мы использовали на предыдущем шаге. В панели запросов найдите выпадающее меню « Действия» и щелкните по нему, чтобы открыть. См. снимок экрана ниже, чтобы найти это меню:
    Панель инструментов с результатами запроса и выпадающим меню «Действия».
  2. В открывшемся меню выберите пункт «Создать метрику» , чтобы открыть панель «Создать метрику на основе логов» .
  3. Выполните следующие действия, чтобы настроить новую метрику счетчика на панели «Создание метрик на основе журналов» :
    1. Выберите тип метрики : выберите «Счетчик» .
    2. В разделе «Подробности» укажите следующие поля:
      • Имя метрики журнала : задайте имя model_interaction_count . Действуют некоторые ограничения на именование; подробности см. в разделе «Устранение неполадок, связанных с ограничениями на именование».
      • Описание : Введите описание метрики. Например, Number of log entries capturing successful call to model inference.
      • Единицы измерения : Оставьте это поле пустым или вставьте цифру 1 .
    3. Оставьте значения в разделе «Выбор фильтра» . Обратите внимание, что поле фильтра «Сборка» имеет тот же фильтр, который мы использовали для просмотра журналов приложения.
    4. (Необязательно) Добавьте метку, которая поможет подсчитать количество звонков для каждого животного. ПРИМЕЧАНИЕ: эта метка может значительно увеличить кардинальность метрики и не рекомендуется для использования в производстве:
      1. Нажмите «Добавить метку» .
      2. В разделе «Метки» задайте следующие поля:
        • Название метки : Задайте название animal .
        • Описание : Введите описание метки. Например, Animal parameter .
        • Тип метки : Выберите STRING .
        • Название поля : Тип jsonPayload.animal .
        • Регулярное выражение : Оставьте поле пустым.
      3. Нажмите «Готово».
    5. Нажмите «Создать метрику» , чтобы создать метрику.

Вы также можете создать метрику на основе логов на странице «Метрики на основе логов» , используя команду CLI gcloud logging metrics create или ресурс Terraform google_logging_metric .

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

Введите PromQL-запрос для поиска данных метрик, основанных на логах. Для ввода PromQL-запроса выполните следующие действия:

  1. Нажмите на кнопку ниже, чтобы открыть страницу обозревателя метрик в консоли Cloud:

  2. На панели инструментов конструктора запросов выберите кнопку с именем < > MQL или < > PromQL . Расположение кнопки показано на рисунке ниже.
    Расположение кнопки MQL в обозревателе метрик
  3. Убедитесь, что в переключателе «Язык» выбран параметр PromQL . Переключатель языка находится на той же панели инструментов, что и для форматирования запроса.
  4. Введите свой запрос в редактор запросов :
    sum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
    
    Для получения дополнительной информации об использовании PromQL см. раздел «PromQL в мониторинге облачных сервисов» .
  5. Нажмите «Выполнить запрос» . Вы увидите линейный график, похожий на этот снимок экрана:
    Показать запрошенные метрики

    Обратите внимание, что при включении параметра «Автозапуск» кнопка «Выполнить запрос» не отображается.

10. (Необязательно) Используйте Open Telemetry для мониторинга и трассировки.

Как упоминалось на предыдущем шаге, метрики можно реализовать с помощью SDK OpenTelemetry (Otel). Использование OTel в микросервисных архитектурах является рекомендуемой практикой. На этом шаге описывается следующее:

  • Инициализация компонентов OTel для поддержки трассировки и мониторинга приложения.
  • Заполнение конфигурации OTel метаданными ресурсов среды Cloud Run.
  • Инструментальное обеспечение для нанесения препарата в колбу с возможностью автоматического отслеживания.
  • Внедрение счетчика метрик для мониторинга количества успешных вызовов модели.
  • Сопоставьте данные трассировки с журналами приложений.

Рекомендуемая архитектура для сервисов уровня продукта предполагает использование сборщика OTel для сбора и обработки всех данных мониторинга для одного или нескольких сервисов. В этом шаге код не использует сборщик для простоты. Вместо этого он использует экспорт OTel, который записывает данные непосредственно в Google Cloud.

Настройка компонентов OTel для трассировки и мониторинга метрик.

  1. Вернитесь в окно (или вкладку) «Cloud Shell» в вашем браузере.
  2. Установите пакеты, необходимые для использования автоматической инструментации OpenTelemetry:
    npm install @opentelemetry/sdk-node \
      @opentelemetry/api \
      @opentelemetry/auto-instrumentations-node \
      @opentelemetry/instrumentation-express \
      @opentelemetry/instrumentation-http \
      @opentelemetry/sdk-metrics \
      @opentelemetry/sdk-trace-node \
      @google-cloud/opentelemetry-cloud-trace-exporter \
      @google-cloud/opentelemetry-cloud-monitoring-exporter \
      @google-cloud/opentelemetry-resource-util
    
  3. В терминале создайте новый файл setup.js :
    cloudshell edit ~/codelab-o11y/setup.js
    
  4. Скопируйте и вставьте приведенный ниже код в редактор, чтобы настроить трассировку и мониторинг OpenTelemetry.
    const opentelemetry = require("@opentelemetry/api");
    const { registerInstrumentations } = require('@opentelemetry/instrumentation');
    const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
    const { MeterProvider, PeriodicExportingMetricReader } = require("@opentelemetry/sdk-metrics");
    const { AlwaysOnSampler, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
    const { Resource } = require('@opentelemetry/resources');
    const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions');
    const { FastifyInstrumentation } = require('@opentelemetry/instrumentation-fastify');
    const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
    const { TraceExporter } = require("@google-cloud/opentelemetry-cloud-trace-exporter");
    const { MetricExporter } = require("@google-cloud/opentelemetry-cloud-monitoring-exporter");
    const { GcpDetectorSync } = require("@google-cloud/opentelemetry-resource-util");
    
    module.exports = { setupTelemetry };
    
    function setupTelemetry() {
      const gcpResource = new Resource({
        [ATTR_SERVICE_NAME]: process.env.K_SERVICE,
      }).merge(new GcpDetectorSync().detect())
    
      const tracerProvider = new NodeTracerProvider({
        resource: gcpResource,
        sampler: new AlwaysOnSampler(),
        spanProcessors: [new SimpleSpanProcessor(new TraceExporter({
          // will export all resource attributes that start with "service."
          resourceFilter: /^service\./
        }))],
      });
      registerInstrumentations({
        tracerProvider: tracerProvider,
        instrumentations: [
          // Express instrumentation expects HTTP layer to be instrumented
          new HttpInstrumentation(),
          new FastifyInstrumentation(),
        ],
      });
      // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
      tracerProvider.register();
    
      const meterProvider = new MeterProvider({
        resource: gcpResource,
        readers: [new PeriodicExportingMetricReader({
          // Export metrics every second (default quota is 30,000 time series ingestion requests per minute)
          exportIntervalMillis: 1_000,
          exporter: new MetricExporter(),
        })],
      });
      opentelemetry.metrics.setGlobalMeterProvider(meterProvider);
    }
    
  5. Вернитесь в терминал и снова откройте index.js :
    cloudshell edit ~/codelab-o11y/index.js
    
  6. Замените код на версию, которая инициализирует трассировку OpenTelemetry и сбор метрик, а также обновляет счетчик производительности при каждом успешном выполнении. Чтобы обновить код, удалите содержимое файла, а затем скопируйте и вставьте приведенный ниже код:
    const { VertexAI } = require('@google-cloud/vertexai');
    const { GoogleAuth } = require('google-auth-library');
    
    let generativeModel, traceIdPrefix;
    const auth = new GoogleAuth();
    auth.getProjectId().then(result => {
      const vertex = new VertexAI({ project: result });
      generativeModel = vertex.getGenerativeModel({
            model: 'gemini-1.5-flash'
      });
      traceIdPrefix = `projects/${result}/traces/`;
    });
    
    // setup tracing and monitoring OTel providers
    const { setupTelemetry }= require('./setup');
    setupTelemetry();
    
    const { trace, context } = require('@opentelemetry/api');
    function getCurrentSpan() {
      const current_span = trace.getSpan(context.active());
      return {
          trace_id: current_span.spanContext().traceId,
          span_id: current_span.spanContext().spanId,
          flags: current_span.spanContext().traceFlags
      };
    };
    
    const opentelemetry = require("@opentelemetry/api");
    const meter = opentelemetry.metrics.getMeter("genai-o11y/nodejs/workshop/example");
    const counter = meter.createCounter("model_call_counter");
    
    const fastify = require('fastify')();
    const PORT = parseInt(process.env.PORT || '8080');
    
    fastify.get('/', async function (request, reply) {
      const animal = request.query.animal || 'dog';
      const prompt = `Give me 10 fun facts about ${animal}. Return this as html without backticks.`
      const resp = await generativeModel.generateContent(prompt)
      const span = getCurrentSpan();
      console.log(JSON.stringify({
          severity: 'DEBUG',
          message: 'Content is generated',
          animal: animal,
          prompt: prompt,
          response: resp.response,
          "logging.googleapis.com/trace": traceIdPrefix + span.trace_id,
          "logging.googleapis.com/spanId": span.span_id,
      }));
      counter.add(1, { animal: animal });
      const html = resp.response.candidates[0].content.parts[0].text;
      reply.type('text/html').send(html);
    });
    
    fastify.listen({ host: '0.0.0.0', port: PORT }, function (err, address) {
      if (err) {
        console.error(err);
        process.exit(1);
      }
      console.log(`codelab-genai: listening on ${address}`);
    });
    

Теперь приложение использует SDK OpenTelemetry для мониторинга выполнения кода с помощью трассировки и для реализации подсчета количества успешных выполнений в качестве метрики. Метод main() изменен для настройки экспортеров OpenTelemetry для трассировок и метрик, чтобы они напрямую записывали данные в Google Cloud Tracing and Monitoring. Он также выполняет дополнительные настройки для заполнения собранных трассировок и метрик метаданными, связанными со средой Cloud Run. Функция Handler() обновлена ​​таким образом, чтобы увеличивать счетчик метрик каждый раз, когда вызов API Vertex AI возвращает корректные результаты.

Через несколько секунд Cloud Shell Editor автоматически сохранит ваши изменения.

Разверните код приложения Gen AI в Cloud Run.

  1. В окне терминала выполните команду для развертывания исходного кода приложения в Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Если вы видите сообщение, подобное приведенному ниже, указывающее на то, что команда создаст новый репозиторий, нажмите Enter .
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Процесс развертывания может занять несколько минут. После завершения процесса развертывания вы увидите примерно следующий вывод:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Скопируйте отображаемый URL-адрес службы Cloud Run в отдельную вкладку или окно браузера. В качестве альтернативы, выполните следующую команду в терминале, чтобы вывести URL-адрес службы, и щелкните по отображаемому URL-адресу, удерживая клавишу Ctrl , чтобы открыть его:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    При открытии URL-адреса может появиться ошибка 500 или сообщение:
    Sorry, this is just a placeholder...
    
    Это означает, что развертывание сервиса не завершилось. Подождите несколько минут и обновите страницу. В конце вы увидите текст, начинающийся с «Забавные факты о собаках» и содержащий 10 интересных фактов о собаках.

Для генерации телеметрических данных откройте URL-адрес сервиса. Обновите страницу, изменяя значение параметра ?animal= чтобы получить другие результаты.

Изучите трассировки приложения.

  1. Нажмите на кнопку ниже, чтобы открыть страницу обозревателя трассировки в консоли Cloud:

  2. Выберите один из последних треков. Вы должны увидеть 5 или 6 фрагментов, похожих на те, что показаны на скриншоте ниже.
    Отображение элемента приложения в обозревателе трассировки.
  3. Найдите фрагмент кода, отслеживающий вызов обработчика событий (метода fun_facts ). Это будет последний фрагмент кода с именем / .
  4. В панели сведений о трассировке выберите «Журналы и события» . Вы увидите журналы приложений, которые соответствуют этому конкретному сегменту. Корреляция определяется с помощью идентификаторов трассировки и сегмента в трассировке и в журнале. Вы должны увидеть журнал приложения, в котором были записаны запрос и ответ от API Vertex.

Изучите контрметрику

  1. Нажмите на кнопку ниже, чтобы открыть страницу обозревателя метрик в консоли Cloud:

  2. На панели инструментов конструктора запросов выберите кнопку с именем < > MQL или < > PromQL . Расположение кнопки показано на рисунке ниже.
    Расположение кнопки MQL в обозревателе метрик
  3. Убедитесь, что в переключателе «Язык» выбран параметр PromQL . Переключатель языка находится на той же панели инструментов, что и для форматирования запроса.
  4. Введите свой запрос в редактор запросов :
    sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
    
  5. Нажмите кнопку «Выполнить запрос» . Когда переключатель «Автозапуск» включен, кнопка «Выполнить запрос» не отображается.

11. (Необязательно) Замаскированная конфиденциальная информация из журналов.

На шаге 10 мы записали в лог информацию о взаимодействии приложения с моделью Gemini. Эта информация включала имя животного, сам запрос и ответ модели. Хотя хранение этой информации в логе должно быть безопасным, это не обязательно верно для многих других сценариев. Запрос может содержать некоторую личную или иную конфиденциальную информацию, которую пользователь не хочет сохранять. Для решения этой проблемы можно замаскировать конфиденциальные данные, записываемые в Cloud Logging. Для минимизации изменений в коде рекомендуется следующее решение.

  1. Создайте тему PubSub для хранения входящих записей журнала.
  2. Создайте приемник логов , который перенаправляет поступающие логи в топик PubSub.
  3. Создайте конвейер Dataflow , который изменяет журналы, перенаправляемые в тему PubSub, выполнив следующие шаги:
    1. Прочитайте запись в журнале из темы PubSub.
    2. Проверьте содержимое записи на наличие конфиденциальной информации с помощью API проверки DLP.
    3. Удалите конфиденциальную информацию из полезной нагрузки, используя один из методов удаления данных с помощью DLP.
    4. Запишите зашифрованную запись в журнал Cloud Logging.
  4. Разверните конвейер

12. (Необязательно) Уборка

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

  1. Чтобы удалить проект, выполните команду delete project в терминале:
    PROJECT_ID=$(gcloud config get-value project)
    gcloud projects delete ${PROJECT_ID} --quiet
    
    Удаление вашего облачного проекта прекращает выставление счетов за все ресурсы и API, используемые в этом проекте. Вы должны увидеть следующее сообщение, где PROJECT_ID будет идентификатором вашего проекта:
    Deleted [https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID].
    
    You can undo this operation for a limited period by running the command below.
        $ gcloud projects undelete PROJECT_ID
    
    See https://cloud.google.com/resource-manager/docs/creating-managing-projects for information on shutting down projects.
    
  2. (Необязательно) Если вы получили ошибку, обратитесь к шагу 5, чтобы найти идентификатор проекта, который вы использовали во время лабораторной работы. Подставьте его в команду в первой инструкции. Например, если ваш идентификатор проекта — lab-example-project , команда будет следующей:
    gcloud projects delete lab-project-id-example --quiet
    

13. Поздравляем!

В этой лабораторной работе вы создали приложение Gen AI, использующее модель Gemini для прогнозирования. Вы также оснастили приложение необходимыми функциями мониторинга и логирования. Затем вы развернули приложение и внесли изменения из исходного кода в Cloud Run . После этого вы использовали продукты Google Cloud Observability для отслеживания производительности приложения, чтобы убедиться в его надежности.

Если вас интересует участие в исследовании пользовательского опыта (UX) для улучшения продуктов, с которыми вы работаете сегодня, зарегистрируйтесь здесь .

Вот несколько вариантов для продолжения обучения: