Escritura de un script de canario de Node.js mediante el tiempo de ejecución de Playwright - Amazon CloudWatch

Escritura de un script de canario de Node.js mediante el tiempo de ejecución de Playwright

Empaquetado de los archivos de canarios de Node.js para el tiempo de ejecución de Playwright

El script de canarios incluye un archivo .js (sintaxis de CommonJS) o .mjs (sintaxis de ES) que contiene el código del controlador de Synthetics, junto con los paquetes y módulos adicionales de los que depende el código. Los scripts creados en formato ES (ECMAScript) deben usar la extensión .mjs o incluir un archivo package.json con el conjunto de campos “type”: “module”. A diferencia de otros tiempos de ejecución, como Node.js Puppeteer, no es necesario guardar los scripts en una estructura de carpetas específica. Puede empaquetar los scripts de manera directa. Utilice la utilidad de compresión de zip que prefiera para crear un archivo .zip con el archivo del controlador en la raíz. Si el script del canario depende de paquetes o módulos adicionales que no se encuentran incluidos en el tiempo de ejecución de Synthetics, puede agregar estas dependencias al archivo .zip. Para ello, puede instalar las bibliotecas necesarias de la función en el directorio node_modules mediante la ejecución del comando npm install. Los siguientes comandos de la CLI crean un archivo .zip llamado my_deployment_package.zip, que contiene el archivo index.js o index.mjs (controlador de Synthetics) y sus dependencias. En el ejemplo, las dependencias se instalan mediante el administrador de paquetes npm.

~/my_function ├── index.mjs ├── synthetics.json ├── myhelper-util.mjs └── node_modules ├── mydependency

Cree un archivo .zip con el contenido de la carpeta del proyecto en la raíz. Utilice la opción r (recursiva), como se muestra en el siguiente ejemplo, para asegurarse de que el archivo zip comprime las subcarpetas.

zip -r my_deployment_package.zip .

Agregue un archivo de configuración de Synthetics para configurar el comportamiento de CloudWatch Synthetics. Puede crear un archivo synthetics.json y guardarlo en la misma ruta que el archivo de punto de entrada o controlador.

Si lo desea, también puede almacenar el archivo de punto de entrada en la estructura de carpetas que desee. Sin embargo, asegúrese de que la ruta de la carpeta esté especificada en el nombre del controlador.

Nombre del controlador

Asegúrese de establecer el punto de entrada del script (controlador) del valor controlado como myCanaryFilename.functionName para que coincida con el nombre de archivo del punto de entrada del script. También puede almacenar el canario en una carpeta independiente, como myFolder/my_canary_filename.mjs. Si lo almacena en una carpeta independiente, especifique esa ruta en el punto de entrada del script, como myFolder/my_canary_filename.functionName.

Cambio de un script de Playwright existente para usarlo como canario de CloudWatch Synthetics

Puede editar un script existente para Node.js y Playwright para utilizarlo como canario. Para obtener más información sobre Playwight, consulte la documentación de la biblioteca de Playwight.

Puede utilizar el siguiente script de Playwright que está guardado en un archivo exampleCanary.mjs.

import { chromium } from 'playwright'; import { expect } from '@playwright/test'; const browser = await chromium.launch(); const page = await browser.newPage(); await page.goto('https://example.com', {timeout: 30000}); await page.screenshot({path: 'example-home.png'}); const title = await page.title(); expect(title).toEqual("Example Domain"); await browser.close();

Para convertir el script, haga lo siguiente:

  1. Crear y exportar una función de handler. El controlador es la función de punto de entrada para el script. Puede elegir cualquier nombre para la función de controlador, pero la función que se utilice en el script debe ser la misma que en el controlador del canario. Si el nombre de su script es exampleCanary.mjs y el nombre de la función del controlador es myhandler, el controlador del canario de llamará exampleCanary.myhandler. En el siguiente ejemplo, el nombre de la función del controlador es handler.

    exports.handler = async () => { // Your script here };
  2. Importe Synthetics Playwright module como una dependencia.

    import { synthetics } from '@amzn/synthetics-playwright';
  3. Inicie un navegador con la función Launch de Synthetics.

    const browser = await synthetics.launch();
  4. Cree una nueva página de Playwright mediante la función newPage de Synthetics.

    const page = await synthetics.newPage();

El script ya está listo para ejecutarlo como un canario de Synthetics. A continuación, se muestra el script actualizado:

Script actualizado en formato ES6

El archivo de script guardado con una extensión .mjs.

import { synthetics } from '@amzn/synthetics-playwright'; import { expect } from '@playwright/test'; export const handler = async (event, context) => { try { // Launch a browser const browser = await synthetics.launch(); // Create a new page const page = await synthetics.newPage(browser); // Navigate to a website await page.goto('https://www.example.com', {timeout: 30000}); // Take screenshot await page.screenshot({ path: '/tmp/example.png' }); // Verify the page title const title = await page.title(); expect(title).toEqual("Example Domain"); } finally { // Ensure browser is closed await synthetics.close(); } };

Script actualizado en formato CommonJS

El archivo de script guardado con una extensión .js.

const { synthetics } = require('@amzn/synthetics-playwright'); const { expect } = require('@playwright/test'); exports.handler = async (event) => { try { const browser = await synthetics.launch(); const page = await synthetics.newPage(browser); await page.goto('https://www.example.com', {timeout: 30000}); await page.screenshot({ path: '/tmp/example.png' }); const title = await page.title(); expect(title).toEqual("Example Domain"); } finally { await synthetics.close(); } };

Configuraciones de CloudWatch Synthetics

Para poder configurar el comportamiento del tiempo de ejecución de Synthetics Playwright, proporcione un archivo de configuración JSON opcional denominado synthetics.json. Este archivo debe empaquetarse en la misma ubicación que el archivo del controlador. Aunque un archivo de configuración es opcional, si no se proporciona un archivo de configuración o falta una clave de configuración, CloudWatch asume los valores predeterminados.

Empaquetado del archivo de configuración

Los siguientes son los valores de configuración admitidos y sus valores predeterminados.

{ "step": { "screenshotOnStepStart": false, "screenshotOnStepSuccess": false, "screenshotOnStepFailure": false, "stepSuccessMetric": true, "stepDurationMetric": true, "continueOnStepFailure": true, "stepsReport": true }, "report": { "includeRequestHeaders": true, "includeResponseHeaders": true, "includeUrlPassword": false, "includeRequestBody": true, "includeResponseBody": true, "restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports "restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these url parameters are redacted from logs and reports }, "logging": { "logRequest": false, "logResponse": false, "logResponseBody": false, "logRequestBody": false, "logRequestHeaders": false, "logResponseHeaders": false }, "httpMetrics": { "metric_2xx": true, "metric_4xx": true, "metric_5xx": true, "failedRequestsMetric": true, "aggregatedFailedRequestsMetric": true, "aggregated2xxMetric": true, "aggregated4xxMetric": true, "aggregated5xxMetric": true }, "canaryMetrics": { "failedCanaryMetric": true, "aggregatedFailedCanaryMetric": true }, "userAgent": "", "har": true }

Configuraciones de pasos

  • screenshotOnStepStart: determina si Synthetics debe hacer una captura de pantalla antes de que comience el paso. El valor predeterminado es true.

  • screenshotOnStepSuccess: determina si Synthetics debe hacer una captura de pantalla después de que un paso se haya completado correctamente. El valor predeterminado es true.

  • screenshotOnStepFailure: determina si Synthetics debe hacer una captura de pantalla después de que se haya producido un error en un paso. El valor predeterminado es true.

  • continueOnStepFailure: determina si un script debe continuar incluso después de que se haya producido un error en un paso. El valor predeterminado es false.

  • stepSuccessMetric: determina si se emite la métrica SuccessPercent de un paso. La métrica SuccessPercent de un paso es 100 para la ejecución del canario si el paso es correcto y 0 si se produce un error en el paso. El valor predeterminado es true.

  • stepDurationMetric: determina si se emite la métrica Duration de un paso. La métrica Duration se emite como una duración (en milisegundos) de la ejecución del paso. El valor predeterminado es true.

Configuraciones de informes

Incluye todos los informes generados por CloudWatch Synthetics, como un archivo HAR y un informe de pasos de Synthetics. Los campos de redacción de datos confidenciales restrictedHeaders y restrictedUrlParameters también se aplican a los registros generados por Synthetics.

  • includeRequestHeaders: si se deben incluir encabezados de solicitud en el informe. El valor predeterminado es false.

  • includeResponseHeaders: si se deben incluir encabezados de respuesta en el informe. El valor predeterminado es false.

  • includeUrlPassword: si se debe incluir una contraseña que aparezca en la dirección URL. De manera predeterminada, las contraseñas que aparecen en las direcciones URL se eliminan de los registros e informes para evitar la divulgación de información confidencial. El valor predeterminado es false.

  • includeRequestBody: si se debe incluir el cuerpo de la solicitud en el informe. El valor predeterminado es false.

  • includeResponseBody: si se debe incluir el cuerpo de respuesta en el informe. El valor predeterminado es false.

  • restrictedHeaders: lista de valores de encabezado que se deben ignorar si se incluyen encabezados. Esto aplica a las cabeceras de solicitud y respuesta. Por ejemplo, para poder ocultar sus credenciales, pase includeRequestHeaders como verdadero y restrictedHeaders como ['Authorization'].

  • restrictedUrlParameters: lista de la ruta URL o los parámetros de consulta que se van a editar. Esto aplica a las URL que aparecen en registros, informes y errores. El parámetro no distingue entre mayúsculas y minúsculas. Puede pasar un asterisco (*) como un valor para editar todos los valores de ruta de URL y los parámetros de consulta. El valor predeterminado es una matriz vacía.

  • har: determina si se debe generar un archivo HTTP (HAR). El valor predeterminado es true.

A continuación, se muestra un ejemplo de un archivo de configuraciones de informe.

"includeRequestHeaders": true, "includeResponseHeaders": true, "includeUrlPassword": false, "includeRequestBody": true, "includeResponseBody": true, "restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports "restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these URL parameters are redacted from logs and reports

Configuraciones de registros

Se aplica a los registros generados por CloudWatch Synthetics. Controla el nivel de detalle de los registros de solicitudes y respuestas.

  • logRequest: si se debe registrar cada solicitud en los registros de canarios. Para canaries de UI, esto registra cada solicitud que el navegador envía. El valor predeterminado es false.

  • logResponse: si se debe registrar cada respuesta en los registros de canarios. Para canaries de UI, esto registra todas las respuestas que el navegador recibe. El valor predeterminado es false.

  • logRequestBody: si se deben registrar los cuerpos de la solicitud junto con las solicitudes en los registros de canarios. Esta configuración sólo aplica si logRequest es verdadero. El valor predeterminado es false.

  • logResponseBody: si se deben registrar los cuerpos de respuesta junto con las solicitudes en los registros de canarios. Esta configuración sólo aplica si logResponse es verdadero. El valor predeterminado es false.

  • logRequestHeaders: si se deben registrar encabezados de solicitud junto con las solicitudes en registros de canarios. Esta configuración sólo aplica si logRequest es verdadero. El valor predeterminado es false.

  • logResponseHeaders: si se deben registrar encabezados de respuesta junto con las respuestas en los registros de canarios. Esta configuración sólo aplica si logResponse es verdadero. El valor predeterminado es false.

Configuraciones métricas HTTP

Configuraciones de métricas relacionadas con el recuento de solicitudes de red con distintos códigos de estado HTTP, emitidas por CloudWatch Synthetics para este canario.

  • metric_2xx: si se debe emitir la métrica 2xx (con la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • metric_4xx: si se debe emitir la métrica 4xx (con la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • metric_5xx: si se debe emitir la métrica 5xx (con la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • failedRequestsMetric: si se debe emitir la métrica failedRequests (con la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • aggregatedFailedRequestsMetric: si se debe emitir la métrica failedRequests (sin la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • aggregated2xxMetric: si se debe emitir la métrica 2xx (sin la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • aggregated4xxMetric: si se debe emitir la métrica 4xx (sin la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • aggregated5xxMetric: si se debe emitir la métrica 5xx (sin la dimensión CanaryName) para este canario. El valor predeterminado es true.

Configuraciones de métricas de canarios

Configuraciones para otras métricas emitidas por CloudWatch Synthetics.

  • failedCanaryMetric: si se debe emitir la métrica Failed (con la dimensión CanaryName) para este canario. El valor predeterminado es true.

  • aggregatedFailedCanaryMetric: si se debe emitir la métrica Failed (sin la dimensión CanaryName) para este canario. El valor predeterminado es true.

Otras configuraciones

  • userAgent: una cadena para agregarla al agente de usuario. El agente de usuario es una cadena que se incluye en el encabezado de la solicitud e identifica el navegador en los sitios web que visita cuando se utiliza el navegador sin periféricos. CloudWatch Synthetics agrega automáticamente CloudWatchSynthetics/canary-arn to the user agent. La configuración especificada se adjunta al agente de usuario generado. El valor predeterminado del agente de usuario que se debe adjuntar es una cadena vacía ("").

Variables de entorno de CloudWatch Synthetics

Configure el nivel y el formato de los registros mediante variables de entorno.

Formato de registro

El tiempo de ejecución de CloudWatch Synthetics Playwright crea registros de CloudWatch para cada ejecución de canarios. Los registros se escriben en formato JSON para facilitar la consulta. Si lo desea, puede cambiar el formato de registro a TEXT.

  • Environment variable name: CW_SYNTHETICS_LOG_FORMAT

  • Supported values: JSON, TEXT

  • Default: JSON

Niveles de registro

Si bien habilitar el modo Debug aumenta el nivel de detalle, puede resultar útil para solucionar problemas.

  • Environment variable name: CW_SYNTHETICS_LOG_LEVEL

  • Supported values: TRACE, DEBUG, INFO, WARN, ERROR, FATAL

  • Default: INFO