Crea perfiles de aplicaciones Node.js

En esta página, se describe cómo modificar tu aplicación de Node.js para capturar datos de generación de perfiles y enviarlos a tu proyecto de Google Cloud. Para obtener información general sobre la creación de perfiles, consulta el artículo sobre conceptos de creación de perfiles.

Tipos de perfiles para Node.js:

  • Montón
  • Tiempo

Versiones de lenguaje compatibles con Node.js:

Versiones compatibles del agente de generación de perfiles:

  • Se admite la versión más reciente del agente. Por lo general, no se admiten las actualizaciones de más de un año. Te recomendamos usar la versión más reciente del agente.

Sistemas operativos compatibles:

  • Linux. La generación de perfiles de aplicaciones de Node.js es compatible con kernels de Linux, cuya biblioteca C estándar se implementa con glibc o con musl. Para obtener información sobre la configuración específica de los kernels Linux Alpine, consulta la sección sobre ejecución en Linux Alpine.

Entornos compatibles:

Habilita la API de Profiler

Antes de usar el agente de generación de perfiles, asegúrate de que la API de Profiler subyacente esté habilitada. Puedes verificar el estado de la API y habilitarla, si es necesario, con Google Cloud CLI o la consola de Google:

gcloud CLI

  1. Si aún no instalaste Google Cloud CLI en tu estación de trabajo, consulta la documentación de Google Cloud CLI.

  2. Ejecuta el siguiente comando:

    gcloud services enable cloudprofiler.googleapis.com
    

Para obtener más información, consulta gcloud services

Consola de Google Cloud

  1. En el panel de navegación de la consola de Google Cloud, selecciona API y servicios, haz clic en Habilitar API y servicios y, luego, habilita la API de Cloud Profiler:

    Ir a la configuración de la API de Profiler

  2. Si aparece API habilitada, la API ya está habilitada. De lo contrario, haz clic en el botón Habilitar.

Usa Cloud Profiler

En todos los entornos compatibles, debes usar Profiler para instalar el paquete @google-cloud/profiler, agregar una declaración require a tu aplicación y, luego, implementarla de la manera habitual.

Antes de instalar @google-cloud/profiler

El paquete @google-cloud/profiler depende de un módulo nativo. Los objetos binarios compilados previamente para este módulo nativo están disponibles en Linux y Alpine Linux para Node 14 y 16. No se requieren dependencias adicionales. @google-cloud/profiler usa node-pre-gyp para determinar qué objeto binario precompilado se debe instalar.

Cuando usas @google-cloud/profiler en otros entornos que no tienen objetos binarios compilados previamente, se usa el módulo node-gyp para compilar objetos binarios. Si quieres obtener información sobre las dependencias necesarias para compilar objetos binarios con node-gyp, consulta la documentación de instalación de node-gyp.

Instalación

Para instalar la versión más reciente de Cloud Profiler, sigue estos pasos:

    npm install --save @google-cloud/profiler

Si también usas el agente de Trace, cuando modifiques tu aplicación, importa el paquete de Profiler después del paquete del agente de Trace (@google-cloud/trace-agent).

Compute Engine

En Compute Engine, sigue estos pasos:

  1. Instala la versión más reciente de Cloud Profiler:

    npm install --save @google-cloud/profiler
    
  2. Modifica el código require de tu aplicación a fin de crear un objeto serviceContext que asigne a service el nombre del servicio para el que se genera el perfil. De manera opcional, puedes asignar a version la versión del servicio para el que se genera el perfil. Consulta Argumentos del nombre y la versión del servicio para obtener más información sobre estas opciones de configuración:

    require('@google-cloud/profiler').start({
      serviceContext: {
        service: 'your-service',
        version: '1.0.0',
      },
    });

GKE

En GKE, sigue estos pasos:

  1. Modifica tu Dockerfile para instalar el paquete de Profiler:

    FROM node:10
    ...
    RUN npm install @google-cloud/profiler
    
  2. Modifica el código require de tu aplicación a fin de crear un objeto serviceContext que asigne a service el nombre del servicio para el que se genera el perfil. De manera opcional, puedes asignar a version la versión del servicio para el que se genera el perfil. Consulta Argumentos del nombre y la versión del servicio para obtener más información sobre estas opciones de configuración:

    require('@google-cloud/profiler').start({
      serviceContext: {
        service: 'your-service',
        version: '1.0.0',
      },
    });

App Engine

En el entorno flexible de App Engine y el entorno estándar de App Engine, el código require es similar al siguiente:

require('@google-cloud/profiler').start();

En App Engine, los parámetros service y version derivan del entorno, por lo que no tienes que especificarlos. Por lo tanto, no necesitas crear un objeto serviceContext.

Analiza datos

Una vez que Profiler haya recopilado los datos, podrás verlos y analizarlos con la interfaz de Profiler.

En el panel de navegación de la consola de Google Cloud, selecciona Profiler:

Ir a Generador de perfiles

Argumentos de versión y nombre del servicio

Cuando cargas el agente de Profiler, especificas un argumento de nombre del servicio y un argumento de la versión del servicio opcional para configurarlo.

El nombre del servicio permite que Profiler recopile datos de generación de perfiles para todas las réplicas de ese servicio. El servicio del generador de perfiles garantiza una tasa promedio de recopilación de un perfil por minuto para cada nombre de servicio en cada combinación de zonas y versiones del servicio.

Por ejemplo, si tienes un servicio con dos versiones que se ejecutan en réplicas en tres zonas, el generador de perfiles creará un promedio de 6 perfiles por minuto para ese servicio.

Si usas nombres de servicio diferentes para tus réplicas, se generarán los perfiles del servicio con más frecuencia que la necesaria y con una sobrecarga más alta.

Cuando selecciones un nombre de servicio, ten en cuenta lo siguiente:

  • Elige un nombre que represente de forma clara el servicio en la arquitectura de tu aplicación. La elección del nombre del servicio es menos importante si solo ejecutas un único servicio o aplicación. Por ejemplo, es más importante si tu aplicación se ejecuta como un conjunto de microservicios.

  • Asegúrate de no usar ningún valor específico del proceso, como un ID de proceso, en la string de nombre del servicio.

  • La string de nombre del servicio debe coincidir con esta expresión regular:

    ^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$

Un buen lineamiento es usar una string estática, como imageproc-service, como nombre del servicio.

La versión del servicio es opcional. Si especificas la versión del servicio, Profiler puede agregar información de generación de perfiles de varias instancias y mostrarla correctamente. Se puede usar para marcar diferentes versiones de tus servicios a medida que se implementan. La IU de Profiler te permite filtrar los datos por versión del servicio. De esta manera, puedes comparar el rendimiento de las versiones anteriores y más recientes del código.

El valor del argumento de la versión del servicio es una string de formato libre, pero los valores de este argumento suelen verse como números de versión, por ejemplo, 1.0.0 o 2.1.2.

Registro de agente

El agente de generación de perfiles puede informar los datos de registro. Para habilitar el registro, configura la opción logLevel cuando inicies el agente. Los valores logLevel admitidos son los siguientes:

  • 0: inhabilita todos los registros del agente.
  • 1: habilita el registro de errores.
  • 2: habilita el registro de advertencias (configuración predeterminada).
  • 3: habilita el registro de información.
  • 4: habilita el registro de depuración.

Configura el valor logLevel en el mismo objeto que proporciona el contexto del servicio:

require('@google-cloud/profiler').start({
    serviceContext: { ... }
    logLevel:       3
});

Ejecuta con Linux Alpine

El agente de generación de perfiles de Node.js para Linux Alpine solo es compatible con las configuraciones de Google Kubernetes Engine.

Error de compilación

Si ejecutas npm install y la compilación falla con el siguiente error, a tu Dockerfile le faltan algunas dependencias de compilación:

ERR! stack Error: not found: make

Para resolver este problema, agrega la siguiente declaración a la etapa de compilación del Dockerfile:

RUN apk add python3 g++ make

Error de autenticación

Si usas imágenes de Docker que se ejecutan con Linux Alpine (como golang:alpine o solo alpine), es posible que veas el siguiente error de autenticación:

connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"

Ten en cuenta que, para ver el error, debes tener habilitado el registro de agente.

El error indica que las imágenes de Docker con Linux Alpine no tienen los certificados SSL raíz instalados de forma predeterminada. Esos certificados son necesarios para que el agente de creación de perfiles se comunique con la API de Profiler. Para resolver este error, agrega el siguiente comando apk a tu Dockerfile:

FROM alpine
...
RUN apk add --no-cache ca-certificates

Luego, debes volver a compilar y volver a implementar tu aplicación.

Problemas conocidos

El agente de creación de perfiles para Node.js interfiere en la salida normal del programa. El programa puede tardar hasta una hora en salir después de completar todas las tareas. Cuando emites un SIGINT, por ejemplo, mediante Ctrl-C, el proceso finaliza sin problemas.

¿Qué sigue?