Técnicas prácticas de observabilidad para la aplicación de IA generativa en JavaScript

1. Descripción general

Las aplicaciones de IA generativa requieren observabilidad como cualquier otra. ¿Existen técnicas de observabilidad especiales que se requieran para la IA generativa?

En este lab, crearás una aplicación simple de IA generativa. Implementa la app en Cloud Run. Además, debes instrumentarla con capacidades esenciales de supervisión y registro a través de los servicios y productos de observabilidad de Google Cloud.

Qué aprenderás

  • Escribe una aplicación que use Vertex AI con Cloud Shell Editor
  • Almacena el código de tu aplicación en GitHub
  • Usa la CLI de gcloud para implementar el código fuente de tu aplicación en Cloud Run
  • Agrega capacidades de supervisión y registro a tu aplicación de IA generativa
  • Uso de métricas basadas en registros
  • Implementa el registro y la supervisión con el SDK de Open Telemetry
  • Obtén estadísticas sobre el manejo de datos de la IA responsable

2. Requisitos previos

Si aún no tienes una Cuenta de Google, debes crear una nueva.

3. Configura el proyecto

  1. Accede a la consola de Google Cloud con tu Cuenta de Google.
  2. Crea un proyecto nuevo o elige reutilizar uno existente. Anota el ID del proyecto que acabas de crear o seleccionar.
  3. Habilita la facturación para el proyecto.
    • Completar este lab debería costar menos de USD 5 en costos de facturación.
    • Puedes seguir los pasos al final de este lab para borrar recursos y evitar cargos adicionales.
    • Los usuarios nuevos pueden acceder a la prueba gratuita de USD 300.
  4. Confirma que la facturación esté habilitada en Mis proyectos en Cloud Billing
      .
    • Si tu proyecto nuevo dice Billing is disabled en la columna Billing account, haz lo siguiente:
      1. Haz clic en los tres puntos de la columna Actions.
      2. Haz clic en Cambiar la facturación.
      3. Selecciona la cuenta de facturación que deseas usar
    • Si asistes a un evento en vivo, es probable que la cuenta se llame Cuenta de facturación de prueba de Google Cloud Platform.

4. Prepara el editor de Cloud Shell

  1. Navega al editor de Cloud Shell. Si se te solicita que autorices a Cloud Shell a llamar a gcloud con tus credenciales, haz clic en Autorizar para continuar.
    Haz clic para autorizar Cloud Shell
  2. Abre la ventana de terminal
    1. Haz clic en el menú de hamburguesa Ícono de menú de hamburguesa.
    2. Haz clic en Terminal.
    3. Haz clic en Terminal nueva
      Abre una terminal nueva en el editor de Cloud Shell.
  3. En la terminal, configura tu ID del proyecto:
    gcloud config set project [PROJECT_ID]
    
    Reemplaza [PROJECT_ID] por el ID de tu proyecto. Por ejemplo, si el ID de tu proyecto es lab-example-project, el comando será el siguiente:
    gcloud config set project lab-project-id-example
    
    Si ves el siguiente mensaje que indica que gcloud solicita tus credenciales para la API de GCPI, haz clic en Autorizar para continuar.
    Haz clic para autorizar Cloud Shell
    Si la ejecución se realiza correctamente, deberías ver el siguiente mensaje:
    Updated property [core/project].
    
    Si ves un WARNING y se te pregunta Do you want to continue (Y/N)?, es probable que hayas ingresado el ID del proyecto de forma incorrecta. Presiona N, presiona Enter y vuelve a intentar ejecutar el comando gcloud config set project después de encontrar el ID del proyecto correcto.
  4. (Opcional) Si tienes problemas para encontrar el ID del proyecto, ejecuta el siguiente comando para ver los IDs de todos tus proyectos ordenados por hora de creación en orden descendente:
    gcloud projects list \
         --format='value(projectId,createTime)' \
         --sort-by=~createTime
    

5. Habilita las APIs de Google

En la terminal, habilita las APIs de Google que se requieren para este lab:

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

Este comando tardará un tiempo en completarse. Finalmente, se mostrará un mensaje de éxito similar a este:

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

Si recibes un mensaje de error que comienza con ERROR: (gcloud.services.enable) HttpError accessing y contiene detalles del error como los que se muestran a continuación, vuelve a intentar ejecutar el comando después de una demora de 1 o 2 minutos.

"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. Crea una aplicación de IA generativa en Node.js

En este paso, escribirás el código de una aplicación simple basada en solicitudes que usa el modelo de Gemini para mostrar 10 datos curiosos sobre el animal que elijas. Sigue estos pasos para crear el código de la aplicación.

  1. En la terminal, crea el directorio codelab-o11y:
    mkdir ~/codelab-o11y
    
  2. Cambia el directorio actual a codelab-o11y:
    cd ~/codelab-o11y
    
  3. Inicializa package.json de la aplicación de Node.js:
    npm init -y
    
  4. Instala el paquete fastify:
    npm install fastify
    
  5. Instala los paquetes del SDK de Cloud para la autenticación y trabaja con Vertex AI:
    npm install google-auth-library @google-cloud/vertexai
    
  6. Crea un archivo index.js y ábrelo en el editor de Cloud Shell:
    cloudshell edit index.js
    
    Ahora debería aparecer un archivo vacío en la ventana del editor sobre la terminal. Tu pantalla se verá similar a la siguiente:
    Mostrar el editor de Cloud Shell después de comenzar a editar main.go
  7. Copia el siguiente código y pégalo en el archivo index.js abierto:
    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}`);
    })
    
    Después de unos segundos, el editor de Cloud Shell guardará tu código automáticamente.

Implementa el código de la aplicación de IA generativa en Cloud Run

  1. En la ventana de la terminal, ejecuta el comando para implementar el código fuente de la aplicación en Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Si ves la siguiente instrucción, que te informa que el comando creará un repositorio nuevo. Haz clic en 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)?
    
    El proceso de implementación puede tardar unos minutos. Una vez que se complete el proceso de implementación, verás un resultado como el siguiente:
    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. Copia la URL del servicio de Cloud Run que se muestra en una pestaña o ventana independiente del navegador. También puedes ejecutar el siguiente comando en la terminal para imprimir la URL del servicio y hacer clic en la URL que se muestra mientras mantienes presionada la tecla Ctrl para abrir la URL:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Cuando se abre la URL, es posible que recibas un error 500 o veas el siguiente mensaje:
    Sorry, this is just a placeholder...
    
    Significa que los servicios no terminaron su implementación. Espera unos momentos y actualiza la página. Al final, verás un texto que comienza con Datos curiosos sobre perros y que contiene 10 datos curiosos sobre perros.

Intenta interactuar con la aplicación para obtener datos curiosos sobre diferentes animales. Para hacerlo, agrega el parámetro animal a la URL, como ?animal=[ANIMAL], donde [ANIMAL] es el nombre de un animal. Por ejemplo, agrega ?animal=cat para obtener 10 datos curiosos sobre los gatos o ?animal=sea turtle para obtener 10 datos curiosos sobre las tortugas marinas.

7. Audita tus llamadas a la API de Vertex

La auditoría de las llamadas a las APIs de Google proporciona respuestas a preguntas como "¿Quién llamó a una API en particular, dónde y cuándo?". La auditoría es importante cuando solucionas problemas de tu aplicación, investigas el consumo de recursos o realizas análisis forenses de software.

Los registros de auditoría te permiten hacer un seguimiento de las actividades administrativas y del sistema, así como registrar llamadas a las operaciones de la API de "lectura de datos" y "escritura de datos". Para auditar las solicitudes de Vertex AI para generar contenido, debes habilitar los registros de auditoría de "Lectura de datos" en la consola de Cloud.

  1. Haz clic en el siguiente botón para abrir la página Registros de auditoría en la consola de Cloud

  2. Asegúrate de que la página tenga seleccionado el proyecto que creaste para este lab. El proyecto seleccionado se muestra en la esquina superior izquierda de la página, justo a la derecha del menú de hamburguesas:
    Menú desplegable del proyecto de la consola de Google Cloud
    Si es necesario, selecciona el proyecto correcto en el cuadro combinado.
  3. En la tabla Configuración de los registros de auditoría de acceso a los datos, busca el servicio Vertex AI API en la columna Servicio y selecciónalo marcando la casilla de verificación ubicada a la izquierda del nombre del servicio.
    Selecciona la API de Vertex AI
  4. En el panel de información de la derecha, selecciona el tipo de auditoría "Lectura de datos".
    Verifica los registros de Data Read
  5. Haz clic en Guardar.

Para generar registros de auditoría, abre la URL del servicio. Actualiza la página mientras cambias el valor del parámetro ?animal= para obtener resultados diferentes.

Explorar registros de auditoría

  1. Haz clic en el siguiente botón para abrir la página del Explorador de registros en la consola de Cloud:

  2. Pega el siguiente filtro en el panel Consulta.
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND
    protoPayload.serviceName="aiplatform.googleapis.com"
    
    El panel Consulta es un editor que se encuentra cerca de la parte superior de la página Explorador de registros:
    Cómo consultar registros de auditoría
  3. Haz clic en Ejecutar consulta.
  4. Selecciona una de las entradas del registro de auditoría y expande los campos para inspeccionar la información capturada en el registro.
    Puedes ver detalles sobre la llamada a la API de Vertex, incluidos el método y el modelo que se usaron. También puedes ver la identidad del invocador y qué permisos autorizaron la llamada.

8. Registra las interacciones con la IA generativa

No encontrarás parámetros de solicitud de API ni datos de respuesta en los registros de auditoría. Sin embargo, esta información puede ser importante para solucionar problemas de análisis de aplicaciones y flujos de trabajo. En este paso, completaremos esta brecha agregando el registro de la aplicación. El registro usa el método de registro estándar de console.log de NodeJS para escribir registros estructurados en la salida estándar. Este método incluye la capacidad de Cloud Run para capturar la información impresa en la salida estándar y, luego, transferirla automáticamente a Cloud Logging. Para capturar correctamente los registros estructurados, el registro impreso debe tener el formato adecuado. Sigue las instrucciones que se indican a continuación para agregar capacidades de registro estructurado a nuestra aplicación de Node.js.

  1. Regresa a la ventana (o pestaña) de "Cloud Shell" en tu navegador.
  2. En la terminal, vuelve a abrir index.js:
    cloudshell edit ~/codelab-o11y/index.js
    
  3. Sigue estos pasos para registrar la respuesta del modelo:
    1. Busca la llamada a await generativeModel.generateContent() (en la línea 20).
    2. Copia y pega el siguiente código al comienzo de la siguiente línea.
        console.log(JSON.stringify({
            severity: 'DEBUG',
            message: 'Content is generated',
            animal: animal,
            prompt: prompt,
            response: resp.response,
        }));
      

La función de controlador se modifica para llamar a console.log() para imprimir la estructura JSON que sigue el esquema de lineamientos de formato estructurado. El registro captura el parámetro animal de la solicitud, la instrucción y la respuesta del modelo.

Después de unos segundos, Cloud Shell Editor guardará los cambios automáticamente.

Implementa el código de la aplicación de IA generativa en Cloud Run

  1. En la ventana de la terminal, ejecuta el comando para implementar el código fuente de la aplicación en Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Si ves la siguiente instrucción, que te informa que el comando creará un repositorio nuevo. Haz clic en 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)?
    
    El proceso de implementación puede tardar unos minutos. Una vez que se complete el proceso de implementación, verás un resultado como el siguiente:
    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. Copia la URL del servicio de Cloud Run que se muestra en una pestaña o ventana independiente del navegador. También puedes ejecutar el siguiente comando en la terminal para imprimir la URL del servicio y hacer clic en la URL que se muestra mientras mantienes presionada la tecla Ctrl para abrir la URL:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Cuando se abre la URL, es posible que recibas un error 500 o veas el siguiente mensaje:
    Sorry, this is just a placeholder...
    
    Significa que los servicios no terminaron su implementación. Espera unos momentos y actualiza la página. Al final, verás un texto que comienza con Datos curiosos sobre perros y que contiene 10 datos curiosos sobre perros.

Para generar registros de la aplicación, abre la URL del servicio. Actualiza la página mientras cambias el valor del parámetro ?animal= para obtener resultados diferentes.
Para ver los registros de la aplicación, haz lo siguiente:

  1. Haz clic en el siguiente botón para abrir la página del Explorador de registros en la consola de Cloud:

  2. Pega el siguiente filtro en el panel Consulta (nº 2 en la interfaz del Explorador de registros):
    LOG_ID("run.googleapis.com%2Fstdout") AND
    severity=DEBUG
    
  3. Haz clic en Ejecutar consulta.

El resultado de la búsqueda muestra registros con la instrucción y la respuesta de Vertex AI, incluidas las calificaciones de seguridad.

9. Cómo contar las interacciones con la IA generativa

Cloud Run escribe métricas administradas que se pueden usar para supervisar los servicios implementados. Las métricas de supervisión administradas por el usuario brindan más control sobre los datos y la frecuencia de actualización de la métrica. Para implementar esa métrica, se requiere escribir un código que recopile datos y los escriba en Cloud Monitoring. Consulta el siguiente paso (opcional) para saber cómo implementarlo con el SDK de OpenTelemetry.

En este paso, se muestra una alternativa para implementar la métrica del usuario en el código: las métricas basadas en registros. Las métricas basadas en registros te permiten generar métricas de supervisión a partir de las entradas de registro que tu aplicación escribe en Cloud Logging. Usaremos los registros de la aplicación que implementamos en el paso anterior para definir una métrica basada en registros del contador de tipo. La métrica contará la cantidad de llamadas exitosas a la API de Vertex.

  1. Observa la ventana del Explorador de registros que usamos en el paso anterior. En el panel Query, busca el menú desplegable Actions y haz clic en él para abrirlo. Consulta la captura de pantalla a continuación para encontrar el menú:
    Barra de herramientas de resultados de la consulta con el menú desplegable Actions
  2. En el menú que se abrió, selecciona Crear métrica para abrir el panel Crear métrica basada en registros.
  3. Sigue estos pasos para configurar una nueva métrica de contador en el panel Crear métrica basada en registros:
    1. Para el Tipo de métrica, selecciona Contador.
    2. Configura los siguientes campos en la sección Detalles:
      • Nombre de la métrica de registro: Establece el nombre como model_interaction_count. Se aplican algunas restricciones de denominación. Para obtener más detalles, consulta la sección Solución de problemas.
      • Descripción: ingresa una descripción para la métrica. Por ejemplo, Number of log entries capturing successful call to model inference.
      • Unidades: Deja este campo en blanco o inserta el dígito 1.
    3. Deja los valores en la sección Selección de filtro. Ten en cuenta que el campo Compilación de filtro tiene el mismo filtro que usamos para ver los registros de la aplicación.
    4. (Opcional) Agrega una etiqueta que ayude a contar la cantidad de llamadas para cada animal. NOTA: Esta etiqueta tiene el potencial de aumentar en gran medida la cardinalidad de la métrica y no se recomienda su uso en producción:
      1. Haz clic en Agregar etiqueta.
      2. Configura los siguientes campos en la sección Etiquetas:
        • Nombre de la etiqueta: Establece el nombre como animal.
        • Descripción: Ingresa la descripción de la etiqueta. Por ejemplo, Animal parameter
        • Tipo de etiqueta: Selecciona STRING.
        • Nombre del campo: Escribe jsonPayload.animal.
        • Expresión regular: Déjalo vacío.
      3. Haga clic en Listo
    5. Haz clic en Crear métrica a fin de crear la métrica.

También puedes crear una métrica basada en registros desde la página Métricas basadas en registros con el gcloud logging metrics create comando de la CLI o con el google_logging_metric recurso de Terraform.

Para generar datos de métricas, abre la URL del servicio. Actualiza la página abierta varias veces para realizar varias llamadas al modelo. Al igual que antes, intenta usar diferentes animales en el parámetro.

Ingresa la consulta de PromQL para buscar los datos de la métrica basada en registros. Para ingresar una consulta de PromQL, haz lo siguiente:

  1. Haz clic en el siguiente botón para abrir la página Explorador de métricas en la consola de Cloud:

  2. En la barra de herramientas del panel del compilador de consultas, selecciona el botón cuyo nombre sea < > MQL o < > PromQL. Consulta la siguiente imagen para ver la ubicación del botón.
    Ubicación del botón de MQL en el Explorador de métricas
  3. Verifica que PromQL esté seleccionado en el botón de activación Lenguaje. El botón de activación de lenguaje se encuentra en la misma barra de herramientas que te permite dar formato a tu consulta.
  4. Ingresa tu consulta en el editor de Consultas:
    sum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
    
    Para obtener más información sobre el uso de PromQL, consulta PromQL en Cloud Monitoring.
  5. Haga clic en Ejecutar consulta. Verás un gráfico de líneas similar a esta captura de pantalla:
    Mostrar las métricas consultadas

    Ten en cuenta que, cuando el botón de activación Ejecutar automáticamente está habilitado, no se muestra el botón Ejecutar consulta.

10. (Opcional) Usa OpenTelemetry para la supervisión y el seguimiento

Como se mencionó en el paso anterior, es posible implementar métricas con el SDK de OpenTelemetry (Otel). Se recomienda usar OTel en arquitecturas de microservicios. En este paso, se describe lo siguiente:

  • Inicializar componentes de OTel para admitir el registro y la supervisión de la aplicación
  • Cómo completar la configuración de OTel con los metadatos de recursos del entorno de Cloud Run
  • Instrumenta la aplicación Flask con capacidades de seguimiento automático
  • Implementar una métrica de contador para supervisar la cantidad de llamadas exitosas al modelo
  • Correlaciona el registro de seguimiento con los registros de la aplicación

La arquitectura recomendada para los servicios a nivel del producto es usar el colector de OTel para recopilar y transferir todos los datos de observabilidad de uno o más servicios. El código de este paso no usa el recopilador para simplificar las cosas. En cambio, usa exportaciones de OTel que escriben datos directamente en Google Cloud.

Configura los componentes de OTel para el registro de seguimiento y la supervisión de métricas

  1. Regresa a la ventana (o pestaña) de "Cloud Shell" en tu navegador.
  2. Instala los paquetes necesarios para usar la instrumentación automática de 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. En la terminal, crea un archivo setup.js nuevo:
    cloudshell edit ~/codelab-o11y/setup.js
    
  4. Copia y pega el siguiente código en el editor para configurar el registro y la supervisión de 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. Vuelve a la terminal y vuelve a abrir index.js:
    cloudshell edit ~/codelab-o11y/index.js
    
  6. Reemplaza el código por la versión que inicializa el seguimiento de OpenTelemetry y la recopilación de métricas, y que también actualiza el contador de rendimiento en cada ejecución exitosa. Para actualizar el código, borra el contenido del archivo y, luego, copia y pega el siguiente código:
    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}`);
    });
    

Ahora, la aplicación usa el SDK de OpenTelemetry para instrumentar la ejecución del código con el seguimiento y para implementar el recuento de la cantidad de ejecuciones exitosas como una métrica. Se modificó el método main() para configurar los exportadores de OpenTelemetry para los registros y las métricas que se escribirán directamente en Google Cloud Tracing y Monitoring. También realiza configuraciones adicionales para completar los registros y las métricas recopilados con metadatos relacionados con el entorno de Cloud Run. La función Handler() se actualiza para incrementar el contador de métricas cada vez que la llamada a la API de Vertex AI devuelve resultados válidos.

Después de unos segundos, Cloud Shell Editor guardará los cambios automáticamente.

Implementa el código de la aplicación de IA generativa en Cloud Run

  1. En la ventana de la terminal, ejecuta el comando para implementar el código fuente de la aplicación en Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Si ves la siguiente instrucción, que te informa que el comando creará un repositorio nuevo. Haz clic en 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)?
    
    El proceso de implementación puede tardar unos minutos. Una vez que se complete el proceso de implementación, verás un resultado como el siguiente:
    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. Copia la URL del servicio de Cloud Run que se muestra en una pestaña o ventana independiente del navegador. También puedes ejecutar el siguiente comando en la terminal para imprimir la URL del servicio y hacer clic en la URL que se muestra mientras mantienes presionada la tecla Ctrl para abrir la URL:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Cuando se abre la URL, es posible que recibas un error 500 o veas el siguiente mensaje:
    Sorry, this is just a placeholder...
    
    Significa que los servicios no terminaron su implementación. Espera unos momentos y actualiza la página. Al final, verás un texto que comienza con Datos curiosos sobre perros y que contiene 10 datos curiosos sobre perros.

Para generar datos de telemetría, abre la URL del servicio. Actualiza la página mientras cambias el valor del parámetro ?animal= para obtener resultados diferentes.

Explora los registros de seguimiento de la aplicación

  1. Haz clic en el siguiente botón para abrir la página Explorador de seguimiento en Cloud Console:

  2. Selecciona uno de los registros más recientes. Deberías ver entre 5 y 6 tramos que se parezcan a los de la siguiente captura de pantalla.
    Vista del intervalo de la app en el Explorador de Trace
  3. Busca el tramo que rastrea la llamada al controlador de eventos (el método fun_facts). Será el último intervalo con el nombre /.
  4. En el panel Detalles de seguimiento, selecciona Registros y eventos. Verás los registros de aplicación que se correlacionan con este intervalo en particular. La correlación se detecta con los IDs de seguimiento y de intervalo en el registro y en el seguimiento. Deberías ver el registro de la aplicación que escribió la instrucción y la respuesta de la API de Vertex.

Explora la métrica de contador

  1. Haz clic en el siguiente botón para abrir la página Explorador de métricas en la consola de Cloud:

  2. En la barra de herramientas del panel del compilador de consultas, selecciona el botón cuyo nombre sea < > MQL o < > PromQL. Consulta la siguiente imagen para ver la ubicación del botón.
    Ubicación del botón de MQL en el Explorador de métricas
  3. Verifica que PromQL esté seleccionado en el botón de activación Lenguaje. El botón de activación de lenguaje se encuentra en la misma barra de herramientas que te permite dar formato a tu consulta.
  4. Ingresa tu consulta en el editor de Consultas:
    sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
    
  5. Haz clic en Ejecutar consulta.Cuando el botón de activación Ejecutar automáticamente está habilitado, no se muestra el botón Ejecutar consulta.

11. (Opcional) Información sensible ofuscada de los registros

En el paso 10, registramos información sobre la interacción de la aplicación con el modelo de Gemini. Esta información incluía el nombre del animal, la instrucción real y la respuesta del modelo. Si bien almacenar esta información en el registro debería ser seguro, no es necesariamente cierto para muchos otros casos. La instrucción puede incluir información personal o sensible que el usuario no quiere que se almacene. Para solucionar este problema, puedes ofuscar los datos sensibles que se escriben en Cloud Logging. Para minimizar las modificaciones del código, se recomienda la siguiente solución.

  1. Crea un tema de Pub/Sub para almacenar las entradas de registro entrantes
  2. Crea un receptor de registros que redireccione los registros transferidos a un tema de Pub/Sub.
  3. Crea una canalización de Dataflow que modifique los registros redireccionados al tema de Pub/Sub siguiendo estos pasos:
    1. Leer una entrada de registro del tema de Pub/Sub
    2. Inspecciona la carga útil de la entrada en busca de información sensible con la API de inspección de DLP
    3. Oculta la información sensible en la carga útil con uno de los métodos de ocultamiento de DLP.
    4. Escribe la entrada de registro ofuscada en Cloud Logging
  4. Implementa la canalización

12. (Opcional) Limpieza

Para evitar el riesgo de que se apliquen cargos por los recursos y las APIs que se usan en el codelab, se recomienda limpiar todo después de finalizar el lab. La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el codelab.

  1. Para borrar el proyecto, ejecuta el comando delete project en la terminal:
    PROJECT_ID=$(gcloud config get-value project)
    gcloud projects delete ${PROJECT_ID} --quiet
    
    Si borras tu proyecto de Cloud, se detendrá la facturación de todos los recursos y las APIs que se usen en ese proyecto. Deberías ver este mensaje, en el que PROJECT_ID será el ID de tu proyecto:
    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. (Opcional) Si recibes un error, consulta el paso 5 para encontrar el ID del proyecto que usaste durante el lab. Sustitúyelo en el comando de la primera instrucción. Por ejemplo, si el ID de tu proyecto es lab-example-project, el comando será el siguiente:
    gcloud projects delete lab-project-id-example --quiet
    

13. Felicitaciones

En este lab, creaste una aplicación de IA generativa que usa el modelo de Gemini para realizar predicciones. Además, instrumentamos la aplicación con capacidades esenciales de supervisión y registro. Implementaste la aplicación y los cambios del código fuente en Cloud Run. Luego, usarás los productos de Google Cloud Observability para hacer un seguimiento del rendimiento de la aplicación y, así, garantizar su confiabilidad.

Si te interesa participar en un estudio de investigación de experiencia del usuario (UX) para mejorar los productos con los que trabajaste hoy, regístrate aquí.

Estas son algunas opciones para continuar tu aprendizaje: