1. Обзор
Приложения генеративного ИИ, как и любые другие, требуют наблюдаемости. Требуются ли для генеративного ИИ специальные методы наблюдения?
В этой лабораторной работе вы создадите простое приложение для генерации искусственного интеллекта. Развернете его в Cloud Run . И оснастите его необходимыми функциями мониторинга и логирования, используя сервисы и продукты Google Cloud для обеспечения наблюдаемости.
Что вы узнаете
- Напишите приложение, использующее Vertex AI с редактором Cloud Shell.
- Сохраняйте код своего приложения на GitHub.
- Используйте gcloud CLI для развертывания исходного кода вашего приложения в Cloud Run.
- Добавьте возможности мониторинга и ведения журналов в ваше приложение Gen AI.
- Использование метрик на основе логов
- Реализация логирования и мониторинга с помощью Open Telemetry SDK
- Получите представление об ответственном обращении с данными в рамках искусственного интеллекта.
2. Предварительные требования
Если у вас еще нет учетной записи Google, вам необходимо создать новую .
3. Настройка проекта
- Войдите в консоль Google Cloud, используя свою учетную запись Google.
- Создайте новый проект или выберите вариант повторного использования существующего. Запишите идентификатор созданного или выбранного вами проекта.
- Включите выставление счетов по проекту.
- Выполнение этой лабораторной работы должно обойтись менее чем в 5 долларов США в виде расходов на оплату.
- В конце этой лабораторной работы вы можете выполнить действия по удалению ресурсов, чтобы избежать дальнейших списаний средств.
- Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
- Подтвердите, что выставление счетов включено в разделе «Мои проекты» в Cloud Billing.
- Если в столбце
Billing accountBilling is disabled:- Нажмите на три точки в столбце
Actions. - Нажмите «Изменить оплату».
- Выберите платежный аккаунт, который вы хотите использовать.
- Нажмите на три точки в столбце
- Если вы участвуете в мероприятии в режиме реального времени, учетная запись, скорее всего, будет называться Google Cloud Platform Trial Billing Account.
- Если в столбце
4. Подготовка редактора Cloud Shell.
- Перейдите в редактор Cloud Shell . Если появится сообщение с запросом на авторизацию Cloud Shell для вызова gcloud с использованием ваших учетных данных, нажмите «Авторизовать» , чтобы продолжить.

- Открыть окно терминала
- Нажмите на значок гамбургера.

- Нажмите «Терминал»
- Нажмите «Новый терминал»

- Нажмите на значок гамбургера.
- В терминале настройте идентификатор вашего проекта:
Заменитеgcloud config set project [PROJECT_ID][PROJECT_ID]на идентификатор вашего проекта. Например, если идентификатор вашего проекта —lab-example-project, команда будет выглядеть так: Если появится сообщение о том, что gcloud запрашивает ваши учетные данные для API GCPI, нажмите «Авторизовать» , чтобы продолжить.gcloud config set project lab-project-id-example

После успешного выполнения вы должны увидеть следующее сообщение: Если вы видитеUpdated property [core/project].
WARNINGи вас спрашиваютDo you want to continue (Y/N)?, то, скорее всего, вы неправильно ввели идентификатор проекта. НажмитеN, затемEnterи попробуйте снова запустить командуgcloud config set projectпосле того, как найдете правильный идентификатор проекта. - (Необязательно) Если у вас возникли проблемы с поиском идентификатора проекта, выполните следующую команду, чтобы увидеть идентификаторы всех ваших проектов, отсортированных по времени создания в порядке убывания:
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 интересных фактов о выбранном вами животном. Выполните следующие действия, чтобы создать код приложения.
- В терминале создайте каталог
codelab-o11y:mkdir ~/codelab-o11y - Перейдите в текущий каталог
codelab-o11y:cd ~/codelab-o11y - Инициализируйте
package.jsonприложения NodeJS:npm init -y - Установите пакет
fastify:npm install fastify - Установите пакеты Cloud SDK для аутентификации и работы с Vertex AI:
npm install google-auth-library @google-cloud/vertexai - Создайте файл
index.jsи откройте его в редакторе Cloud Shell: Теперь в окне редактора над терминалом должен появиться пустой файл. Ваш экран будет выглядеть примерно так:cloudshell edit index.js
- Скопируйте следующий код и вставьте его в открытый файл
index.js: Через несколько секунд Cloud Shell Editor автоматически сохранит ваш код.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}`); })
Разверните код приложения Gen AI в Cloud Run.
- В окне терминала выполните команду для развертывания исходного кода приложения в Cloud Run.
Если вы видите сообщение, подобное приведенному ниже, указывающее на то, что команда создаст новый репозиторий, нажмитеgcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticatedEnter. Процесс развертывания может занять несколько минут. После завершения процесса развертывания вы увидите примерно следующий вывод: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
- Скопируйте отображаемый URL-адрес службы Cloud Run в отдельную вкладку или окно браузера. В качестве альтернативы, выполните следующую команду в терминале, чтобы вывести URL-адрес службы, и щелкните по отображаемому URL-адресу, удерживая клавишу Ctrl , чтобы открыть его:
При открытии URL-адреса может появиться ошибка 500 или сообщение:gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"' Это означает, что развертывание сервиса не завершилось. Подождите несколько минут и обновите страницу. В конце вы увидите текст, начинающийся с «Забавные факты о собаках» и содержащий 10 интересных фактов о собаках.Sorry, this is just a placeholder...
Попробуйте взаимодействовать с приложением, чтобы узнать интересные факты о разных животных. Для этого добавьте параметр animal к URL-адресу, например ?animal=[ANIMAL] где [ANIMAL] — название животного. Например, добавьте ?animal=cat чтобы получить 10 интересных фактов о кошках, или ?animal=sea turtle чтобы получить 10 интересных фактов о морских черепахах.
7. Проведите аудит вызовов API Vertex.
Аудит вызовов API Google позволяет получить ответы на такие вопросы, как «Кто вызывает тот или иной API, где и когда?». Аудит важен при устранении неполадок в приложении, исследовании потребления ресурсов или проведении анализа программного обеспечения.
Журналы аудита позволяют отслеживать административные и системные действия, а также регистрировать вызовы операций API «чтение данных» и «запись данных». Для аудита запросов Vertex AI к генерации контента необходимо включить журналы аудита «Чтение данных» в консоли Cloud.
- Нажмите на кнопку ниже, чтобы открыть страницу «Журналы аудита» в консоли Cloud.
- Убедитесь, что на странице выбран проект, который вы создали для этой лабораторной работы. Выбранный проект отображается в верхнем левом углу страницы, справа от меню-гамбургера:

При необходимости выберите нужный проект из выпадающего списка. - В таблице конфигурации журналов аудита доступа к данным в столбце «Сервис» найдите сервис
Vertex AI APIи выберите его, установив флажок слева от имени сервиса.
- В информационной панели справа выберите тип аудита «Чтение данных».

- Нажмите « Сохранить ».
Для создания журналов аудита откройте URL-адрес сервиса. Обновите страницу, изменяя значение параметра ?animal= чтобы получить другие результаты.
Изучите журналы аудита
- Нажмите на кнопку ниже, чтобы открыть страницу «Проводник журналов» в консоли Cloud:
- Вставьте следующий фильтр в панель запросов.
Панель запросов — это редактор, расположенный в верхней части страницы «Проводник журналов»:LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND protoPayload.serviceName="aiplatform.googleapis.com"
- Нажмите « Выполнить запрос» .
- Выберите одну из записей журнала аудита и разверните поля для просмотра информации, содержащейся в журнале.
Здесь вы можете увидеть подробную информацию о вызове API Vertex, включая использованный метод и модель. Вы также можете увидеть идентификатор вызывающего пользователя и права доступа, которые разрешили этот вызов.
8. Запись взаимодействий с Gen AI.
В журналах аудита не отображаются параметры запросов API или данные ответов. Однако эта информация может быть важна для устранения неполадок в приложении и анализа рабочих процессов. На этом этапе мы восполняем этот пробел, добавляя логирование приложения. Для логирования используется стандартный метод логирования NodeJS console.log , позволяющий записывать структурированные сообщения в стандартный вывод. Этот метод позволяет Cloud Run автоматически захватывать информацию, выводимую в стандартный вывод, и передавать её в Cloud Logging. Для корректного захвата структурированных сообщений выводимый лог должен быть соответствующим образом отформатирован. Следуйте приведенным ниже инструкциям, чтобы добавить возможности структурированного логирования в наше приложение NodeJS.
- Вернитесь в окно (или вкладку) «Cloud Shell» в вашем браузере.
- В терминале снова откройте
index.js:cloudshell edit ~/codelab-o11y/index.js - Для регистрации ответа модели выполните следующие действия:
- Найдите вызов метода
await generativeModel.generateContent()(строка 20). - Скопируйте и вставьте приведенный ниже код в начало следующей строки.
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.
- В окне терминала выполните команду для развертывания исходного кода приложения в Cloud Run.
Если вы видите сообщение, подобное приведенному ниже, указывающее на то, что команда создаст новый репозиторий, нажмитеgcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticatedEnter. Процесс развертывания может занять несколько минут. После завершения процесса развертывания вы увидите примерно следующий вывод: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
- Скопируйте отображаемый URL-адрес службы Cloud Run в отдельную вкладку или окно браузера. В качестве альтернативы, выполните следующую команду в терминале, чтобы вывести URL-адрес службы, и щелкните по отображаемому URL-адресу, удерживая клавишу Ctrl , чтобы открыть его:
При открытии URL-адреса может появиться ошибка 500 или сообщение:gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"' Это означает, что развертывание сервиса не завершилось. Подождите несколько минут и обновите страницу. В конце вы увидите текст, начинающийся с «Забавные факты о собаках» и содержащий 10 интересных фактов о собаках.Sorry, this is just a placeholder...
Для создания логов приложения откройте URL-адрес сервиса. Обновите страницу, изменяя значение параметра ?animal= чтобы получить другие результаты.
Чтобы просмотреть журналы приложения, выполните следующие действия:
- Нажмите на кнопку ниже, чтобы открыть страницу просмотра журналов в консоли Cloud:
- Вставьте следующий фильтр в панель запросов (№2 в интерфейсе обозревателя журналов ):
LOG_ID("run.googleapis.com%2Fstdout") AND severity=DEBUG - Нажмите « Выполнить запрос» .
В результате запроса отображаются журналы с запросом и ответом от Vertex AI, включая оценки безопасности .
9. Подсчет взаимодействий с Gen AI.
Cloud Run записывает управляемые метрики , которые можно использовать для мониторинга развернутых сервисов. Управляемые пользователем метрики мониторинга обеспечивают больший контроль над данными и частотой обновления метрик. Для реализации таких метрик требуется написать код, который собирает данные и записывает их в Cloud Monitoring . См. следующий (необязательный) шаг, чтобы узнать, как реализовать это с помощью OpenTelemetry SDK.
На этом шаге показана альтернатива реализации пользовательских метрик в коде — метрики на основе логов . Метрики на основе логов позволяют генерировать метрики мониторинга из записей логов, которые ваше приложение записывает в Cloud Logging. Мы будем использовать логи приложения, которые мы реализовали на предыдущем шаге, чтобы определить метрику на основе логов типа счетчик . Метрика будет подсчитывать количество успешных вызовов API Vertex.
- Посмотрите на окно обозревателя журналов , которое мы использовали на предыдущем шаге. В панели запросов найдите выпадающее меню « Действия» и щелкните по нему, чтобы открыть. См. снимок экрана ниже, чтобы найти это меню:

- В открывшемся меню выберите пункт «Создать метрику» , чтобы открыть панель «Создать метрику на основе логов» .
- Выполните следующие действия, чтобы настроить новую метрику счетчика на панели «Создание метрик на основе журналов» :
- Выберите тип метрики : выберите «Счетчик» .
- В разделе «Подробности» укажите следующие поля:
- Имя метрики журнала : задайте имя
model_interaction_count. Действуют некоторые ограничения на именование; подробности см. в разделе «Устранение неполадок, связанных с ограничениями на именование». - Описание : Введите описание метрики. Например,
Number of log entries capturing successful call to model inference. - Единицы измерения : Оставьте это поле пустым или вставьте цифру
1.
- Имя метрики журнала : задайте имя
- Оставьте значения в разделе «Выбор фильтра» . Обратите внимание, что поле фильтра «Сборка» имеет тот же фильтр, который мы использовали для просмотра журналов приложения.
- (Необязательно) Добавьте метку, которая поможет подсчитать количество звонков для каждого животного. ПРИМЕЧАНИЕ: эта метка может значительно увеличить кардинальность метрики и не рекомендуется для использования в производстве:
- Нажмите «Добавить метку» .
- В разделе «Метки» задайте следующие поля:
- Название метки : Задайте название
animal. - Описание : Введите описание метки. Например,
Animal parameter. - Тип метки : Выберите
STRING. - Название поля : Тип
jsonPayload.animal. - Регулярное выражение : Оставьте поле пустым.
- Название метки : Задайте название
- Нажмите «Готово».
- Нажмите «Создать метрику» , чтобы создать метрику.
Вы также можете создать метрику на основе логов на странице «Метрики на основе логов» , используя команду CLI gcloud logging metrics create или ресурс Terraform google_logging_metric .
Для генерации метрических данных откройте URL-адрес сервиса. Обновите открытую страницу несколько раз, чтобы выполнить несколько вызовов к модели. Как и раньше, попробуйте использовать разных животных в качестве параметров.
Введите PromQL-запрос для поиска данных метрик, основанных на логах. Для ввода PromQL-запроса выполните следующие действия:
- Нажмите на кнопку ниже, чтобы открыть страницу обозревателя метрик в консоли Cloud:
- На панели инструментов конструктора запросов выберите кнопку с именем < > MQL или < > PromQL . Расположение кнопки показано на рисунке ниже.

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

Обратите внимание, что при включении параметра «Автозапуск» кнопка «Выполнить запрос» не отображается.
10. (Необязательно) Используйте Open Telemetry для мониторинга и трассировки.
Как упоминалось на предыдущем шаге, метрики можно реализовать с помощью SDK OpenTelemetry (Otel). Использование OTel в микросервисных архитектурах является рекомендуемой практикой. На этом шаге описывается следующее:
- Инициализация компонентов OTel для поддержки трассировки и мониторинга приложения.
- Заполнение конфигурации OTel метаданными ресурсов среды Cloud Run.
- Инструментальное обеспечение для нанесения препарата в колбу с возможностью автоматического отслеживания.
- Внедрение счетчика метрик для мониторинга количества успешных вызовов модели.
- Сопоставьте данные трассировки с журналами приложений.
Рекомендуемая архитектура для сервисов уровня продукта предполагает использование сборщика OTel для сбора и обработки всех данных мониторинга для одного или нескольких сервисов. В этом шаге код не использует сборщик для простоты. Вместо этого он использует экспорт OTel, который записывает данные непосредственно в Google Cloud.
Настройка компонентов OTel для трассировки и мониторинга метрик.
- Вернитесь в окно (или вкладку) «Cloud Shell» в вашем браузере.
- Установите пакеты, необходимые для использования автоматической инструментации 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 - В терминале создайте новый файл
setup.js:cloudshell edit ~/codelab-o11y/setup.js - Скопируйте и вставьте приведенный ниже код в редактор, чтобы настроить трассировку и мониторинг 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); } - Вернитесь в терминал и снова откройте
index.js:cloudshell edit ~/codelab-o11y/index.js - Замените код на версию, которая инициализирует трассировку 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.
- В окне терминала выполните команду для развертывания исходного кода приложения в Cloud Run.
Если вы видите сообщение, подобное приведенному ниже, указывающее на то, что команда создаст новый репозиторий, нажмитеgcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticatedEnter. Процесс развертывания может занять несколько минут. После завершения процесса развертывания вы увидите примерно следующий вывод: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
- Скопируйте отображаемый URL-адрес службы Cloud Run в отдельную вкладку или окно браузера. В качестве альтернативы, выполните следующую команду в терминале, чтобы вывести URL-адрес службы, и щелкните по отображаемому URL-адресу, удерживая клавишу Ctrl , чтобы открыть его:
При открытии URL-адреса может появиться ошибка 500 или сообщение:gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"' Это означает, что развертывание сервиса не завершилось. Подождите несколько минут и обновите страницу. В конце вы увидите текст, начинающийся с «Забавные факты о собаках» и содержащий 10 интересных фактов о собаках.Sorry, this is just a placeholder...
Для генерации телеметрических данных откройте URL-адрес сервиса. Обновите страницу, изменяя значение параметра ?animal= чтобы получить другие результаты.
Изучите трассировки приложения.
- Нажмите на кнопку ниже, чтобы открыть страницу обозревателя трассировки в консоли Cloud:
- Выберите один из последних треков. Вы должны увидеть 5 или 6 фрагментов, похожих на те, что показаны на скриншоте ниже.

- Найдите фрагмент кода, отслеживающий вызов обработчика событий (метода
fun_facts). Это будет последний фрагмент кода с именем/. - В панели сведений о трассировке выберите «Журналы и события» . Вы увидите журналы приложений, которые соответствуют этому конкретному сегменту. Корреляция определяется с помощью идентификаторов трассировки и сегмента в трассировке и в журнале. Вы должны увидеть журнал приложения, в котором были записаны запрос и ответ от API Vertex.
Изучите контрметрику
- Нажмите на кнопку ниже, чтобы открыть страницу обозревателя метрик в консоли Cloud:
- На панели инструментов конструктора запросов выберите кнопку с именем < > MQL или < > PromQL . Расположение кнопки показано на рисунке ниже.

- Убедитесь, что в переключателе «Язык» выбран параметр PromQL . Переключатель языка находится на той же панели инструментов, что и для форматирования запроса.
- Введите свой запрос в редактор запросов :
sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}])) - Нажмите кнопку «Выполнить запрос» . Когда переключатель «Автозапуск» включен, кнопка «Выполнить запрос» не отображается.
11. (Необязательно) Замаскированная конфиденциальная информация из журналов.
На шаге 10 мы записали в лог информацию о взаимодействии приложения с моделью Gemini. Эта информация включала имя животного, сам запрос и ответ модели. Хотя хранение этой информации в логе должно быть безопасным, это не обязательно верно для многих других сценариев. Запрос может содержать некоторую личную или иную конфиденциальную информацию, которую пользователь не хочет сохранять. Для решения этой проблемы можно замаскировать конфиденциальные данные, записываемые в Cloud Logging. Для минимизации изменений в коде рекомендуется следующее решение.
- Создайте тему PubSub для хранения входящих записей журнала.
- Создайте приемник логов , который перенаправляет поступающие логи в топик PubSub.
- Создайте конвейер Dataflow , который изменяет журналы, перенаправляемые в тему PubSub, выполнив следующие шаги:
- Прочитайте запись в журнале из темы PubSub.
- Проверьте содержимое записи на наличие конфиденциальной информации с помощью API проверки DLP.
- Удалите конфиденциальную информацию из полезной нагрузки, используя один из методов удаления данных с помощью DLP.
- Запишите зашифрованную запись в журнал Cloud Logging.
- Разверните конвейер
12. (Необязательно) Уборка
Чтобы избежать риска взимания платы за ресурсы и API, используемые в практическом задании, рекомендуется выполнить очистку после его завершения. Самый простой способ избежать выставления счетов — удалить проект, созданный для этого задания.
- Чтобы удалить проект, выполните команду delete project в терминале:
Удаление вашего облачного проекта прекращает выставление счетов за все ресурсы и API, используемые в этом проекте. Вы должны увидеть следующее сообщение, гдеPROJECT_ID=$(gcloud config get-value project) gcloud projects delete ${PROJECT_ID} --quietPROJECT_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. - (Необязательно) Если вы получили ошибку, обратитесь к шагу 5, чтобы найти идентификатор проекта, который вы использовали во время лабораторной работы. Подставьте его в команду в первой инструкции. Например, если ваш идентификатор проекта —
lab-example-project, команда будет следующей:gcloud projects delete lab-project-id-example --quiet
13. Поздравляем!
В этой лабораторной работе вы создали приложение Gen AI, использующее модель Gemini для прогнозирования. Вы также оснастили приложение необходимыми функциями мониторинга и логирования. Затем вы развернули приложение и внесли изменения из исходного кода в Cloud Run . После этого вы использовали продукты Google Cloud Observability для отслеживания производительности приложения, чтобы убедиться в его надежности.
Если вас интересует участие в исследовании пользовательского опыта (UX) для улучшения продуктов, с которыми вы работаете сегодня, зарегистрируйтесь здесь .
Вот несколько вариантов для продолжения обучения:
- Codelab: Как развернуть чат-приложение на базе Gemini в Cloud Run
- Codelab: Как использовать вызов функций Gemini с помощью Cloud Run
- Как использовать API Cloud Run Jobs Video Intelligence для покадровой обработки видео.
- По запросу: мастер-класс по Google Kubernetes Engine Onboard
- Узнайте больше о настройке счетчиков и метрик распространения с помощью журналов приложений.
- Записывайте метрики OTLP, используя вспомогательный модуль OpenTelemetry.
- Ссылка на использование Open Telemetry в Google Cloud
- Запись мастер-класса: Создание и развертывание приложений искусственного интеллекта в Google Cloud с использованием Genkit и Node.js.
- Codelab: Создание и развертывание приложений искусственного интеллекта в Google Cloud с помощью Genkit и Node.js
- Генерируйте трассировки и метрики Open Telemetry с помощью Go.