

# Creación de un valor controlado
<a name="CloudWatch_Synthetics_Canaries_Create"></a>

**importante**  
Asegúrese de utilizar canaries de Synthetics para supervisar solo aquellos puntos de enlace y API en los que tenga propiedad o permisos. En función de la configuración de frecuencia de los valores controlados, estos puntos de conexión pueden experimentar un aumento del tráfico.

Cuando utiliza la consola de CloudWatch para crear un valor controlado, puede utilizar un esquema que CloudWatch proporciona para crear un valor controlado o escribir su propio script. Para obtener más información, consulte [Uso de esquemas de valores controlados](CloudWatch_Synthetics_Canaries_Blueprints.md).

También puede crear un valor controlado mediante la CloudFormation si está utilizando su propio script para el valor controlado. Para obtener más información, consulte [AWS::Synthetics::Canary](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html) en la *Guía del usuario de AWS CloudFormation*.

Si está escribiendo su propio script, puede utilizar varias funciones que CloudWatch Synthetics ha integrado en una biblioteca. Para obtener más información, consulte [Versiones de tiempo de ejecución de Synthetics](CloudWatch_Synthetics_Canaries_Library.md).

**nota**  
Cuando crea un valor controlado, una de las capas que se crean es una capa de Synthetics a la que se le antepone ` Synthetics`. Esta capa es propiedad de la cuenta del servicio Synthetics y contiene el código del tiempo de ejecución.

**Cómo crear un valor controlado**

1. Abra la consola de CloudWatch en [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. En el panel de navegación, elija **Señales de aplicación**, **Valores controlados de Synthetics**.

   

1. Elija **Crear valor controlado**.

1. Elija una de las opciones siguientes:
   + Para basar su valor controlado en un script de proyecto, elija **Usar un esquema**, y, a continuación, elija el tipo de valor controlado que desea crear. Para obtener más información acerca de lo que hace cada tipo de proyecto, consulte [Uso de esquemas de valores controlados](CloudWatch_Synthetics_Canaries_Blueprints.md).
   + Para cargar su propio script de Node.js y crear un valor controlado personalizado, elija **Cargar un script**.

     A continuación, puede arrastrar su script al área **Script** o elegir **Browse files (Examinar archivos)** para desplazarse hasta el script en su sistema de archivos.
   + Para importar el script desde un bucket de S3, elija **Import from S3 (Importar de S3)**. En **Ubicación de origen**, escriba la ruta completa al valor controlado o elija **Examinar S3**.

     Debe tener permisos `s3:GetObject` y `s3:GetObjectVersion` para el bucket de S3 que utilice. El bucket debe estar en la misma Región de AWS en la que está creando el valor controlado.

1. En **Nombre**, escriba un nombre para su valor controlado. El nombre se utiliza en muchas páginas, por lo que le recomendamos que le asigne un nombre descriptivo que lo diferencie de otros canaries.

1. En **URL del punto de conexión o aplicación**, escriba la dirección URL que desea que pruebe el valor controlado. Esta URL debe incluir el protocolo (como https://).

   Si desea que el valor controlado pruebe un punto de conexión en una VPC, también debe escribir información sobre la VPC más adelante en este procedimiento. 

1. Si utiliza su propio script para el valor controlado, en **Controlador de Lambda**, escriba el punto de entrada donde desea que comience el valor controlado. Para obtener información sobre el formato del controlador de Lambda, consulte [Versiones de tiempo de ejecución de Synthetics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).

1. En el **Editor de scripts**, **Versión del tiempo de ejecución**, seleccione una versión de tiempo de ejecución de Synthetics para ejecutar el canario. Para obtener información sobre las versiones del tiempo de ejecución de Synthetics, consulte [Versiones de tiempo de ejecución de Synthetics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).

   En **Configuración del navegador**, puede habilitar el navegador para probar el canario. Debe seleccionar al menos un navegador.

1. Si está utilizando variables de entorno en el script, elija **Environment variables** (Variables de entorno) y, a continuación, especifique un valor para cada variable de entorno definida en el script. Para obtener más información, consulte [Variables de entorno](CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup.md#CloudWatch_Synthetics_Environment_Variables).

1. Bajo el título **Programa**, elija si desea ejecutar el valor controlado solo una vez, ejecutarlo continuamente con una expresión de frecuencia o programarlo con una expresión cron.
   + Cuando utilice la consola de CloudWatch para crear un valor controlado que funcione continuamente, puede elegir un índice entre una vez al minuto y una vez por hora.
   + Para obtener más información sobre cómo escribir una expresión cron para la programación de valores controlados, consulte [Programación de las ejecuciones de valores controlados con cron](CloudWatch_Synthetics_Canaries_cron.md).

1. (Opcional) Para establecer un tiempo de espera para el valor controlado, elija **Configuración adicional** y, a continuación, especifique el valor de tiempo de espera. Haga que no sea inferior a 15 segundos para permitir arranques en frío de Lambda y el tiempo que tarda en arrancar la instrumentación del valor controlado.

1. En **Retención de datos**, especifique cuánto tiempo se retiene la información sobre las ejecuciones de valores controlados fallidas y correctas. El intervalo abarca de 1 a 455 días.

   Esta configuración afecta al rango de información que devuelven las operaciones [GetCanaryRuns](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_GetCanaryRuns.html), así como al rango de información que se muestra en la consola Synthetics.

   No afecta a los datos almacenados en los buckets de Amazon S3, ni a los registros o métricas publicados por el valor controlado.

   Independientemente del período de retención de datos del canario, el rango de información que se muestra en la consola tiene ciertos límites. En la vista de inicio de la consola de Synthetics, el rango de tiempo relativo y absoluto está limitado a siete días. En la vista de consola de Synthetics para un canario específico, el rango de tiempo relativo está limitado a siete días, mientras que el rango de tiempo absoluto está limitado a 30 días.

1. En **Almacenamiento de datos**, seleccione el bucket de Amazon S3 que desea utilizar para almacenar los datos de las ejecuciones de canario. El nombre del bucket no puede contener un punto (.). Si deja este valor en blanco, se utilizará un bucket de Amazon S3 predeterminado o se creará uno nuevo.

1. (Opcional) De forma predeterminada, los canaries almacenan sus artefactos en Amazon S3 y los artefactos se cifran en reposo mediante una clave de AWS KMS administrada por AWS. Puede utilizar una opción de cifrado diferente si selecciona **Additional configuration** (Configuración adicional) en la sección **Data Storage** (Almacenamiento de datos). Luego, puede elegir el tipo de clave que desea utilizar para el cifrado. Para obtener más información, consulte [Cifrado de artefactos de un valor controlado](CloudWatch_Synthetics_artifact_encryption.md). 

1. En **Permisos de acceso**, elija si desea crear un nuevo rol de IAM para ejecutar el valor controlado o utilizar uno existente.

   Si hace que CloudWatch Synthetics cree el rol, este incluirá automáticamente todos los permisos necesarios. Si desea crear el rol, consulte [Roles y permisos necesarios para los valores controlados](CloudWatch_Synthetics_Canaries_CanaryPermissions.md) para obtener información acerca de los permisos necesarios.

   Si utiliza la consola de CloudWatch para crear un rol para un valor controlado, al crear el valor controlado no podrá volver a utilizar el rol para otros valores controlados, ya que estos roles son específicos de un solo valor controlado. Si ha creado manualmente un rol que funcione para varios canaries, puede utilizar ese rol existente.

   Para utilizar un rol existente, debe tener el permiso `iam:PassRole` para pasar ese rol a Synthetics y Lambda. También debe tener el permiso `iam:GetRole`.

1. (Opcional) Bajo el título **Alarmas**, elija si desea que se creen alarmas predeterminadas de CloudWatch para este valor controlado. Si decide crear alarmas, se crean con la siguiente convención de nombres: :`Synthetics-Alarm-canaryName -index `

   `index` es un número que representa cada alarma que se crea para este valor controlado. La primera alarma tiene un índice de 1, la segunda alarma tiene un índice de 2, y así sucesivamente.

1. (Opcional) Para que este valor controlado pruebe un punto de conexión que está en una VPC, elija **Configuración de VPC** y, a continuación, haga lo siguiente:

   1. Seleccione la VPC que aloja el punto de enlace.

   1. Seleccione una o más subredes en la VPC. Debe seleccionar una subred privada, ya que la instancia de Lambda no se puede configurar para ejecutarse en una subred pública cuando no se puede asignar una dirección IP a la instancia de Lambda durante la ejecución. Para obtener más información, consulte [Configuración de una función de Lambda para obtener acceso a los recursos en una VPC](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html).

   1. Seleccione uno o varios grupos de seguridad en la VPC.

   1. Para permitir el tráfico IPv6 saliente para este canario, seleccione **Permitir tráfico IPv6 para subredes de doble pila**. Esto permite al canario monitorear los puntos de conexión habilitados solo para IPv6 y para doble pila a través de IPv6.

      Puede monitorear los puntos de conexión externos a su VPC proporcionando al canario acceso a Internet y configurando las subredes de la VPC de forma correcta. Para obtener más información, consulte [Ejecución de un valor controlado en una VPC](CloudWatch_Synthetics_Canaries_VPC.md).

   Si el punto de conexión está en una VPC, debe habilitar el valor controlado para enviar información a CloudWatch y a Amazon S3. Para obtener más información, consulte [Ejecución de un valor controlado en una VPC](CloudWatch_Synthetics_Canaries_VPC.md).

1. (Opcional) En **Etiquetas**, agregue uno o más pares de clave-valor como etiquetas para este valor controlado. Las etiquetas pueden ayudarlo a identificar y organizar sus recursos de AWS y a realizar un seguimiento de sus costes de AWS. Para obtener más información, consulte [Etiquetado de los recursos de Amazon CloudWatch](CloudWatch-Tagging.md).

   Si desea que las etiquetas que aplique al canario también se apliquen a la función de Lambda que utiliza el canario, elija **Función de Lambda** en **Replicación de etiquetas**. Si elige esta opción, CloudWatch Synthetics mantendrá sincronizadas las etiquetas de canarios y de la función de Lambda:
   + Synthetics aplicará las mismas etiquetas que especifique aquí tanto al canario como a la función de Lambda.
   + Si, posteriormente, actualiza las etiquetas del canario y mantiene esta opción seleccionada, Synthetics modifica las etiquetas de la función de Lambda para que permanezcan sincronizadas con el canario. 

1. (Opcional) Bajo el título **Rastreo activo**, elija si desea habilitar el rastreo activo de X-Ray para este valor controlado. El seguimiento activo solo está disponible para los tiempos de ejecución de Puppeteer y Java. Para obtener más información, consulte [Canaries y rastreo X-Ray](CloudWatch_Synthetics_Canaries_tracing.md).

## Recursos que se crean para canaries
<a name="CloudWatch_Synthetics_Canaries_Resources_Created"></a>

Al crear un valor controlado, se crean los siguientes recursos para el mismo:
+ Un rol de IAM con el nombre `CloudWatchSyntheticsRole-canary-name -uuid` (si utiliza la consola de CloudWatch para crear el valor controlado y especifica que se cree un nuevo rol para el valor controlado)
+ Una política de IAM con el nombre `CloudWatchSyntheticsPolicy- canary-name-uuid`.
+ Un bucket de S3 con el nombre `cw-syn-results-accountID -region`.
+ Alarmas con el nombre `Synthetics-Alarm-MyCanaryName`, si desea que se creen alarmas para el valor controlado.
+ Capas y funciones de Lambda, si utiliza un esquema para crear el valor controlado. Estos recursos tienen el prefijo `cwsyn-MyCanaryName`.
+ Grupos de registro de CloudWatch Logs con el nombre `/aws/lambda/cwsyn-MyCanaryName -randomId`.

# Uso de esquemas de valores controlados
<a name="CloudWatch_Synthetics_Canaries_Blueprints"></a>

Esta sección proporciona detalles sobre cada uno de los esquemas de valor controlado y las tareas para las que cada esquema es más adecuado. Se proporcionan esquemas para los siguientes tipos de valor controlado: 

**Topics**
+ [Supervisión de latidos](#CloudWatch_Synthetics_Canaries_Blueprints_Heartbeat)
+ [Valor controlado de la API](#CloudWatch_Synthetics_Canaries_Blueprints_API)
+ [Verificador de enlaces que no funcionan](#CloudWatch_Synthetics_Canaries_Blueprints_Broken_Links)
+ [Proyecto de supervisión visual](#CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting)
+ [Registrador de valores controlados](#CloudWatch_Synthetics_Canaries_Blueprints_Recorder)
+ [Generador de flujo de trabajo de la GUI](#CloudWatch_Synthetics_Canaries_Blueprints_GUI_Workflow)
+ [Esquema de comprobaciones múltiples](#CloudWatch_Synthetics_Canaries_Blueprints_Multichecks_Blueprint)
+ [Creación de canarios de esquemas de comprobaciones múltiples](CloudWatch_Synthetics_Canaries_MultiCheck_Blueprint.md)

Cuando se utiliza un esquema para crear un valor controlado, mientras rellena los campos en la consola de CloudWatch, el área de la página **Editor de scripts** muestra el valor controlado que se está creando como script Node.js. También puede editar su valor controlado en esta área para personalizarlo aún más.

## Supervisión de latidos
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Heartbeat"></a>

Los scripts de latidos cargan la URL especificada y almacenan una captura de pantalla de la página y un archivo HTTP (archivo HAR). También almacenan registros de direcciones URL a las que se accede. 

Puede utilizar los archivos HAR para ver datos de rendimiento detallados sobre las páginas web. Puede analizar la lista de solicitudes web y detectar problemas de rendimiento, como el tiempo de carga de un elemento.

Si el valor controlado utiliza `syn-nodejs-puppeteer-3.1` o una versión posterior en el tiempo de ejecución, puede utilizar el esquema de supervisión de latidos para supervisar varias direcciones URL y ver el estado, la duración, las capturas de pantalla asociadas y el motivo del error para cada URL en el resumen de pasos del informe de ejecución del valor controlado.

## Valor controlado de la API
<a name="CloudWatch_Synthetics_Canaries_Blueprints_API"></a>

Los canaries de API pueden probar las funciones básicas de lectura y escritura de una API REST. REST significa *transferencia de estado representacional* y es un conjunto de reglas que siguen los desarrolladores al crear una API. Una de estas reglas establece que un enlace a una URL específica debe devolver un fragmento de datos.

Los canaries pueden trabajar con cualquier API y probar todo tipo de funcionalidades. Cada valor controlado puede hacer varias llamadas a la API.

En los canarios que usan la versión de tiempo de ejecución `syn-nodejs-2.2` o posterior, el esquema de canario de API admite canarios de varios pasos que supervisan las API como pasos HTTP. Puede probar varias API en un único valor controlado. Cada paso es una solicitud independiente que puede acceder a una URL diferente, usar cabeceras diferentes y utilizar diferentes reglas para la captura de cabeceras y de cuerpos de respuesta. Al no capturar cabeceras y cuerpo de respuesta, puede evitar que se registre información confidencial. 

Cada solicitud en un valor controlado de API consta de la siguiente información:
+ El *punto de enlace*, que es la URL que solicita.
+ El *método*, que es el tipo de solicitud que se envía al servidor. Las API REST admiten operaciones GET (lectura), POST (escritura), PUT (actualización), PATCH (actualización) y DELETE (eliminación).
+ Los *encabezados*, que proporcionan información tanto al cliente como al servidor. Se utilizan para la autenticación y para proporcionar información sobre el contenido del cuerpo. Para obtener una lista de cabeceras válidas, consulte [HTTP Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) (Cabeceras HTTP).
+ Los *datos* (o el *cuerpo*), contienen información que se enviará al servidor. Esto se utiliza solo para solicitudes POST, PUT, PATCH o DELETE.

**nota**  
Los esquemas de canarios de API no son compatibles con los tiempos de ejecución de Playwright.

El esquema de valor controlado de API admite los métodos GET y POST. Cuando utilice este valor controlado, debe especificar los encabezados. Por ejemplo, puede especificar **Authorization** como **Clave** y especificar los datos de autorización necesarios como **Valor** para esa clave.

Si está probando una solicitud POST, especifique también el contenido que se va a publicar en el campo **Datos**.

 **Integración con la API Gateway** 

El proyecto de la API está integrado con Amazon API Gateway. Esto le permite seleccionar una API de API Gateway y un escenario desde la misma cuenta y región de AWS que el valor controlado, o cargar una plantilla de Swagger desde API Gateway para la supervisión de la API entre cuentas y entre regiones. A continuación, puede elegir el resto de los detalles en la consola para crear el valor controlado, en lugar de introducirlos desde cero. Para obtener más información sobre API Gateway, consulte [What is Amazon API Gateway?](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) (¿Qué es Amazon API Gateway?) 

 **Uso de una API privada** 

Puede crear un valor controlado que utilice una API privada en Amazon API Gateway. Para obtener más información, consulte [Creación de una API privada en Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html).

## Verificador de enlaces que no funcionan
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Broken_Links"></a>

El verificador de enlaces que no funcionan recopila todos los enlaces dentro de la dirección URL que está probando mediante `document.getElementsByTagName('a')`. Solo prueba el número de enlaces que especifique; la dirección URL en sí se cuenta como primer enlace. Por ejemplo, si desea comprobar todos los enlaces de una página que contiene cinco enlaces, debe especificar que el valor controlado siga seis enlaces.

Los valores controlados de verificadores de enlaces que no funcionan que se han creado con el tiempo de ejecución `syn-nodejs-2.0-beta` o posterior admiten las siguientes características adicionales:
+ Proporciona un informe que incluye los enlaces que se han verificado, el código de estado, el motivo del error (si los hay) y las capturas de pantalla de la página fuente y de destino.
+ Al ver los resultados del valor controlado, puede utilizar el filtro para ver solo los enlaces que no funcionan y, a continuación, corregir el enlace en función del motivo del error.
+ Esta versión toma capturas de pantalla de la página fuente anotadas para cada enlace y resalta el anclaje donde se encontró el enlace. Los componentes ocultos no se anotan.
+ Puede configurar esta versión para tomar capturas de pantalla de páginas fuente y de destino, pero solo páginas fuente o páginas de destino.
+ Esta versión corrige un problema de la versión anterior en el que el script del valor controlado se detiene después del primer enlace roto, incluso cuando se raspan más enlaces desde la primera página.

**nota**  
Los esquemas de verificador de enlaces que no funcionan no son compatibles con los tiempos de ejecución de Playwright.

Para actualizar un canario existente con `syn-1.0` para utilizar el nuevo tiempo de ejecución, debe eliminar y volver a crear el canario. Actualizar un valor controlado existente al nuevo tiempo de ejecución no hace que estas características estén disponibles.

Un valor controlado de verificadores de enlaces que no funcionan detecta los siguientes tipos de errores en un enlace:
+ 404 Página no encontrada
+ Nombre de host no válido
+ URL incorrecta. Por ejemplo, a la URL le falta un corchete, tiene barras diagonales adicionales o utiliza el protocolo incorrecto.
+ Código de respuesta HTTP no válido
+ El servidor host devuelve respuestas vacías sin contenido ni código de respuesta.
+ Las solicitudes HTTP agotan constantemente el tiempo de espera durante la ejecución del valor controlado.
+ El host interrumpe constantemente las conexiones porque está mal configurado o está demasiado ocupado.

## Proyecto de supervisión visual
<a name="CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting"></a>

El esquema de supervisión visual incluye un código para comparar capturas de pantalla que se toman durante una ejecución de valor controlado con capturas de pantalla que se toman durante una ejecución de valor controlado de línea de base. Si la discrepancia entre las dos capturas de pantalla está más allá de un porcentaje umbral, el valor controlado falla. La supervisión visual es compatible con canaries que ejecutan **syn-puppeteer-node-3.2** y versiones posteriores. Actualmente, no es compatible con canarios que ejecutan Python y Selenium o utiliza tiempos de ejecución de Playwright.

El esquema de supervisión visual incluye la siguiente línea de código en el script de valor controlado de esquema predeterminado, que permite la supervisión visual.

```
syntheticsConfiguration.withVisualCompareWithBaseRun(true);
```

La primera vez que el valor controlado se ejecuta correctamente después de agregar esta línea al script, utiliza las capturas de pantalla que se toman durante esa ejecución como línea de base para la comparación. Después de la primera ejecución del valor controlado, se puede usar la consola de CloudWatch para editar el valor controlado para realizar cualquiera de las siguientes acciones:
+ Establecer la siguiente ejecución del valor controlado como la nueva línea de base.
+ Establecer límites en la captura de pantalla de línea de base actual para designar áreas de la captura de pantalla que se ignorarán durante las comparaciones visuales.
+ Eliminar una captura de pantalla de ser utilizada para la supervisión visual.

Para obtener más información sobre cómo usar la consola de CloudWatch para editar un valor controlado, consulte [Edición o eliminación de un valor controlado](synthetics_canaries_deletion.md).

También puede cambiar la ejecución del valor controlado que se utiliza como línea de base mediante los parámetros ` nextrun` o `lastrun` o mediante la especificación de un ID de ejecución de valor controlado en la API [UpdateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_UpdateCanary.html).

Cuando utilice el proyecto de supervisión visual, ingrese la dirección URL donde desea que se tome la captura de pantalla y especifique un umbral de diferencia como porcentaje. Después de la ejecución de la línea de base, las futuras ejecuciones del valor controlado que detectan una diferencia visual mayor que ese umbral desencadenan un fallo del valor controlado. Después de la ejecución de la línea de base, también puede editar el valor controlado para “dibujar” límites en la captura de pantalla de línea de base que desea omitir durante la supervisión visual.

La característica de supervisión visual está impulsada por el conjunto de herramientas de software de código abierto ImageMagick. Para obtener más información, consulte [ImageMagick](https://imagemagick.org/index.php).

## Registrador de valores controlados
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Recorder"></a>

Con el esquema del registrador de valores controlados, puede utilizar CloudWatch Synthetics Recorder para registrar las acciones de cliqueo y tipeo en un sitio web y generar automáticamente un script Node.js que se puede utilizar para crear un valor controlado que siga los mismos pasos. Recorder CloudWatch Synthetics es una extensión de Amazon para Google Chrome. El registrador de canarios no es compatible con los canarios que utilizan el tiempo de ejecución de Playwright.

**Créditos**: el registrador CloudWatch Synthetics se basa en el [Registrador sin procesador](https://github.com/checkly/headless-recorder).

Para obtener más información, consulte [Uso del registrador de CloudWatch Synthetics para Google Chrome](CloudWatch_Synthetics_Canaries_Recorder.md).

## Generador de flujo de trabajo de la GUI
<a name="CloudWatch_Synthetics_Canaries_Blueprints_GUI_Workflow"></a>

El proyecto del generador de flujo de trabajo de la GUI verifica que se pueden realizar acciones en la página web. Por ejemplo, si tiene una página web con un formulario de inicio de sesión, el valor controlado puede rellenar los campos de usuario y contraseña y enviar el formulario para verificar que la página web funciona correctamente.

Cuando utiliza un esquema para crear este tipo de valor controlado, especifique las acciones que desea que el valor controlado realice en la página web. Las acciones que puede utilizar son las siguientes:
+ **Clic**: selecciona el elemento especificado y simula un usuario al hacer clic o al elegir el elemento.

  Para especificar el elemento en un script Node.js, utilice `[id=]` o ` a[class=]`.

  Para especificar el elemento en un script Python, utilice `xpath //*[@id=]` o ` //*[@class=]`.
+ **Verificación del selector**: verifica que el elemento especificado existe en la página web. Esta prueba es útil para comprobar que una acción anterior hace que los elementos correctos rellenen la página.

  Para especificar el elemento que se va a verificar en un script Node.js, utilice `[id=]` o ` a[class=]`.

  Para especificar el elemento que se va a verificar en un script Python, utilice `xpath //*[@id=]` o `//*[class=]`.
+ **Verificación de texto**: verifica que la cadena especificada está contenida en el elemento de destino. Esta prueba es útil para verificar que una acción anterior ha causado que se muestre el texto correcto.

  Para especificar el elemento en un script Node.js, utilice un formato como ` div[@id=]//h1`, ya que esta acción utiliza la función `waitForXPath` en Puppeteer.

  Para especificar el elemento en un script Python, utilice el formato xpath como ` //*[@id=] ` o //\$1 [@class =] porque esta acción utiliza la función `implicitly_wait` en Selenium.
+ **Ingresar texto**: ingresa el texto especificado en el elemento de destino.

  Para especificar el elemento que se va a verificar en un script Node.js, utilice `[id=]` o ` a[class=]`.

  Para especificar el elemento que se va a verificar en un script Python, utilice `xpath //*[@id=]` o `//*[@class=]`.
+ **Clic con navegación**: espera a que toda la página se cargue después de elegir el elemento especificado. Esto es más útil cuando necesita volver a cargar la página.

  Para especificar el elemento en un script Node.js, utilice `[id=]` o ` a[class=]`.

  Para especificar el elemento en un script Python, utilice `xpath //*[@id=]` o ` //*[@class=]`.

Por ejemplo, el siguiente blueprint utiliza Node.js. Hace clic en **firstButton** en la URL especificada, comprueba que aparece el selector esperado con el texto esperado, ingresa el nombre `Test_Customer` en el campo **Nombre**, hace clic en el botón **Inicio de sesión** y, luego, comprueba que el inicio de sesión sea complete correctamente mediante la verificación del texto **Le damos la bienvenida** en la página siguiente.

![\[La página de creación de valor controlado en la consola, con campos completados para el esquema de flujo de trabajo de la GUI.\]](http://docs.aws.amazon.com/es_es/AmazonCloudWatch/latest/monitoring/images/canary_create_gui_workflow.PNG)


Los valores controlados de flujo de trabajo de la GUI que utilizan los siguientes tiempos de ejecución también proporcionan un resumen de los pasos ejecutados para cada ejecución de un valor controlado. Puede utilizar las capturas de pantalla y el mensaje de error asociados con cada paso para encontrar la causa raíz del error.
+ `syn-nodejs-2.0` o posterior.
+ `syn-python-selenium-1.0` o posterior.

## Esquema de comprobaciones múltiples
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Multichecks_Blueprint"></a>

El esquema de comprobaciones múltiples simplifica la creación de canarios. Reduce los costos porque utiliza una configuración JSON sencilla que proporciona una funcionalidad lista para usar a fin de llevar a cabo comprobaciones de HTTP, DNS, SSL y TCP. Puede configurar hasta 10 comprobaciones. Configure cada comprobación como un paso numérico que se ejecute de forma secuencial, lo que permitirá comprender claramente el flujo de canarios.

Los esquemas de comprobaciones múltiples admiten lo siguiente:
+ Solicitudes HTTP básicas, solicitudes TCP, validación de registros de DNS y supervisión de certificados SSL
+ Métodos de autenticación HTTP como básica, clave de API, OAuth y Sigv4 integrados con Secrets Manager
+ Aserciones para cada comprobación

Para obtener más información, consulte [Creación de un valor controlado](CloudWatch_Synthetics_Canaries_Create.md).

# Creación de canarios de esquemas de comprobaciones múltiples
<a name="CloudWatch_Synthetics_Canaries_MultiCheck_Blueprint"></a>

El esquema de comprobaciones múltiples de Amazon CloudWatch Synthetics le permite crear un canario de Synthetics al proporcionar una configuración JSON sencilla. Para ahorrar costos, puede agrupar hasta 10 tipos diferentes de comprobaciones de HTTP, DNS, SSL y TCP de forma secuencial por pasos. Cada comprobación incluye aserciones que proporcionan una verificación básica con respecto al resultado de una comprobación.

Los canarios de comprobaciones múltiples están diseñados para casos de uso sencillos que solo requieren comprobaciones básicas sin la necesidad de usar un navegador sin periféricos. Para casos de uso más complejos, consulte los otros tipos de canarios que proporciona Amazon CloudWatch Synthetics.

**Topics**
+ [Requisitos previos](#CloudWatch_Synthetics_MultiCheck_Prerequisites)
+ [Limitaciones](#CloudWatch_Synthetics_MultiCheck_Limitations)
+ [Estructura de empaquetado, esquema JSON y ajustes de configuración](#CloudWatch_Synthetics_MultiCheck_Packaging)
+ [Creación de un canario de comprobaciones múltiples en la Consola de administración de AWS](#CloudWatch_Synthetics_MultiCheck_Console)
+ [Creación de un canario de comprobaciones múltiples con las API de AWS Synthetics](#CloudWatch_Synthetics_MultiCheck_API)
+ [Creación de un canario de comprobaciones múltiples en la CloudFormation](#CloudWatch_Synthetics_MultiCheck_CloudFormation)
+ [Configuración de la autenticación](#CloudWatch_Synthetics_MultiCheck_Authentication)
+ [Solución de problemas](#CloudWatch_Synthetics_MultiCheck_Troubleshooting)

## Requisitos previos
<a name="CloudWatch_Synthetics_MultiCheck_Prerequisites"></a>
+ Debe usar syn-nodejs-3.0\$1 para crear un canario de comprobaciones múltiples.
+ Al utilizar la configuración de Authentication y Secrets Manager, debe asegurarse de que el canario [ExecutionRoleArn](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html) conceda los permisos para acceder a estos secretos.
+ Al utilizar la configuración de Authentication para Sigv4, debe asegurarse de que el canario [ExecutionRoleArn](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html) conceda los permisos para acceder al rol relacionado.

## Limitaciones
<a name="CloudWatch_Synthetics_MultiCheck_Limitations"></a>
+ El tamaño de la respuesta HTTP no puede ser superior a 1 MB.
+ Máximo de 10 variables definidas.
+ Cuando se utiliza la RFC JSON, el JSON de comprobaciones puede tener campos duplicados, pero solo se utilizará el último campo secuencial.
+ En la Consola de administración de AWS, un canario de comprobaciones múltiples mostrará de forma predeterminada las métricas de los pasos de comprobaciones múltiples para identificar fácilmente la disponibilidad de cada comprobación. Cuando se eliminan las comprobaciones, es posible que este gráfico siga mostrando las comprobaciones en el gráfico de disponibilidad hasta que la métrica deje de estar activa durante al menos 3 horas.

## Estructura de empaquetado, esquema JSON y ajustes de configuración
<a name="CloudWatch_Synthetics_MultiCheck_Packaging"></a>

Se debe asignar el nombre a la configuración de comprobaciones de JSON que se utilizará para el canario ` blueprint-config.json`. La configuración debe seguir el [esquema](https://github.com/aws-samples/synthetics-canary-local-debugging-sample/tree/main) y las instrucciones de [Escritura de una configuración JSON para un esquema de comprobaciones múltiples de Node.js](CloudWatch_Synthetics_WritingCanary_Multichecks.md).

Comprima `blueprint-config.json` en un archivo ZIP y proporciónelo en uno de los siguientes flujos de trabajo de creación. Cuando haya una configuración `synthetics.json`, también se comprime en el archivo ZIP. A continuación, se muestra un archivo ZIP de ejemplo denominado `multi-checks.zip`.

```
multi-checks.zip
├── blueprint-config.json
└── synthetics.json
```

## Creación de un canario de comprobaciones múltiples en la Consola de administración de AWS
<a name="CloudWatch_Synthetics_MultiCheck_Console"></a>

1. Abra la consola de Amazon CloudWatch Synthetics.

1. Elija **Crear valor controlado**.

1. En **Usar un esquema**, elija **Comprobaciones múltiples**.

   En **Configurar comprobaciones**, verá dos pestañas, **Comprobaciones** y **Configuración canario**.

1. Seleccione la versión de tiempo de ejecución **syn-nodejs-3.0** o posterior.

1. Siga el procedimiento de [Escritura de una configuración JSON para un esquema de comprobaciones múltiples de Node.js](CloudWatch_Synthetics_WritingCanary_Multichecks.md) para describir la comprobación que desea llevar a cabo. Como alternativa, la consola le proporciona una configuración JSON predeterminada sobre la que puede crear.

1. Elija **Crear valor controlado**.

## Creación de un canario de comprobaciones múltiples con las API de AWS Synthetics
<a name="CloudWatch_Synthetics_MultiCheck_API"></a>

Utilice la API de `CreateCanary` y, en el parámetro `Code`, proporcione el valor de campo `BlueprintTypes="multi-checks"` en lugar de ` Handler`. Cuando se especifican `BlueprintTypes` y `Handler`, se muestra `ValidationException`. La versión de tiempo de ejecución proporcionada debe ser `syn-nodejs-3.0` o superior.

```
aws synthetics create-canary \
    --name my-multi-check-canary \
    --code ZipFile="ZIP_BLOB",BlueprintTypes="multi-checks" \
    --runtime-version syn-nodejs-3.0 \
    ...

// Or if you wanted to use S3 to provide your code.

aws synthetics create-canary \
    --name my-multi-check-canary \
    --code S3Bucket="my-code-bucket",S3Key="my-zip-code-key",BlueprintTypes="multi-checks" \
    ...
```

## Creación de un canario de comprobaciones múltiples en la CloudFormation
<a name="CloudWatch_Synthetics_MultiCheck_CloudFormation"></a>

En la plantilla CloudFormation de un canario de comprobaciones múltiples, en el parámetro `Code`, proporcione el valor de campo `BlueprintTypes="multi-checks"` en lugar de ` Handler`. Cuando se especifican `BlueprintTypes` y `Handler`, se muestra `ValidationException`. La versión de tiempo de ejecución proporcionada debe ser `syn-nodejs-3.0 or later`. 

Plantilla de ejemplo:

```
SyntheticsCanary:
    Type: 'AWS::Synthetics::Canary'
    Properties:
      Name: MyCanary
      RuntimeVersion: syn-nodejs-3.0
      Schedule: {Expression: 'rate(5 minutes)', DurationInSeconds: 3600}
      ...
      Code:
        S3Bucket: "my-code-bucket"
        S3Key: "my-zip-code-key"
        BlueprintTypes: ["multi-checks"]
      ...
```

## Configuración de la autenticación
<a name="CloudWatch_Synthetics_MultiCheck_Authentication"></a>

Cuando el canario hace solicitudes HTTP a un punto de conexión autenticado, puede configurar los pasos del canario del esquema para utilizar uno de los cuatro tipos de autenticación: básica, clave de API, credenciales de cliente de OAuth y SigV4. En lugar de configurar los encabezados de las solicitudes, puede especificar un tipo de autenticación en la definición del esquema y Synthetics seguirá el tipo de autenticación especificado para rellenar los componentes de la solicitud HTTP con la información de autenticación proporcionada.

El tipo de autenticación se especifica en el paso del esquema de la sección Autenticación. Se especifica el esquema de autenticación que desea usar, las propiedades obligatorias para el esquema de autenticación elegido y Synthetics usa la información proporcionada para crear un encabezado de autenticación para la solicitud HTTP.

Como almacenar secretos (como contraseñas o claves de API) en texto sin formato es un problema de seguridad, Synthetics admite la integración con AWS Secrets Manager. Cuando desee autenticar una solicitud HTTP en un canario de esquema de Synthetics, puede consultar el secreto que almacena la información de autenticación y Synthetics se encarga de recuperar el secreto y almacenarlo en caché en el canario. Este enfoque proporciona secretos a Synthetics y, al mismo tiempo, los mantiene almacenados de forma segura, sin especificarlos en texto sin formato en la configuración del esquema.

Para obtener más información acerca del AWS Secrets Manager, consulte [¿Qué es el AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)

### Autenticación básica
<a name="CloudWatch_Synthetics_MultiCheck_BasicAuth"></a>

Synthetics implementa el esquema de autenticación HTTP básico definido en la RFC 7617. El proceso funciona de la siguiente manera:
+ La configuración del esquema proporciona un par de nombre de usuario y contraseña.
+ Para crear el par de usuario y contraseña, se concatena el nombre de usuario, un solo carácter de dos puntos (“:”) y la contraseña.
+ El par de usuario y contraseña se codifica en UTF-8 y se convierte en una cadena codificada en base64.
+ Este par de usuario y contraseña codificado en base64 se proporciona en el encabezado “Authorization” con el siguiente formato: Authorization: Basic \$1base64-encoded-user-pass\$1

Por ejemplo, si el agente de usuario quiere enviar el ID de usuario “Aladdin” y la contraseña “open sesame”, utiliza el siguiente campo de encabezado: Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Ejemplo de configuración:

```
"Authentication": {
    "type": "BASIC",
    "username": MY_USERNAME, // Required
    "password": MY_PASSWORD // Required
}
```

### Autenticación de la clave de API
<a name="CloudWatch_Synthetics_MultiCheck_APIKeyAuth"></a>

Puede proporcionar una clave de API para autenticar solicitudes HTTP. Al utilizar la autenticación mediante clave de API, la clave de API proporcionada se coloca en el encabezado HTTP “X-API-Key”. Si tiene un recurso personalizado que busca encabezados de claves de API en un encabezado que no sea este, tiene la opción de especificar un nombre de encabezado diferente para que Synthetics coloque la clave de API.

Ejemplo de configuración:

```
"Authentication": {
    "type": "API_KEY",
    "apiKey": S0A1M2P3L4E5, // Required
    "header": X-Specific-Header // Optional, defaults to "X-API-Key"
}
```

### Autenticación de SigV4
<a name="CloudWatch_Synthetics_MultiCheck_SigV4Auth"></a>

AWS SigV4 (Signature Version 4) es el protocolo de firma de AWS para agregar información de autenticación a solicitudes de API de AWS. Para hacer una solicitud autenticada por SigV4, debe especificar la región y el servicio a los que hace las solicitudes, así como un ARN (nombre de recurso de AWS) que identifique un rol de IAM que desea que el canario asuma al hacer esta solicitud de SigV4. Synthetics asume el rol de IAM proporcionado en el roleArn y lo utiliza para autenticar la solicitud de API de AWS.

Ejemplo de configuración:

```
"Authentication": {
    "type": "SIGV4",
    "region": us-west-2, // Required
    "service": s3, // Required
    "roleArn": arn:AWS:iam:12345678912:role/SampleRole // Required
}
```

#### Consideraciones sobre SigV4
<a name="CloudWatch_Synthetics_MultiCheck_SigV4Considerations"></a>

Para que Synthetics asuma el rol que proporcionó en la sección de autenticación de SigV4, la política de confianza adjunta al rol debe configurarse para permitir que el canario asuma el roleArn proporcionado. La entidad principal de AWS principal en la que debe confiar es el rol que asumió el canario a través de AWS STS. Tiene el formato ` aws:sts::{account_running_the_canary}:assumed-role/<canary_name>/<assumed_role_name>` arn:.

Por ejemplo, si tiene un canario en ejecución en la cuenta 0123456789012, denominado test-canary, y el rol que asumió se denominó canary-assume-role, la política de confianza debe incluir esta instrucción para que el canario asuma correctamente el roleArn para SigV4:

```
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:AWS:sts::123456789012:assumed-role/test-canary/"
    },
    "Action": "sts:AssumeRole"
}
```

### Credenciales del cliente OAuth
<a name="CloudWatch_Synthetics_MultiCheck_OAuthAuth"></a>

Synthetics implementa el tipo de concesión de credenciales de cliente de OAuth tal como se define en la sección 4.4 de la RFC 6479. Si desea hacer una solicitud HTTP a un punto de conexión autenticado con un token de portador emitido por un punto de conexión de token de OAuth, Synthetics puede solicitar y administrar un token de portador en tu nombre. Cuando se utiliza el esquema de OAuth, Synthetics lleva a cabo los siguientes pasos:
+ Utiliza el esquema de autenticación básico con clientId y clientSecret para autenticar una solicitud en tokenUrl, el punto de conexión que emite los tokens de portadores.
+ Si proporciona los parámetros de recurso, audiencia y ámbito opcionales, se incluyen en la solicitud del token.
+ Utiliza el token de acceso que devuelve el tokenUrl para autenticar la solicitud HTTP.
+ Almacena de forma segura el token de actualización que devuelve el tokenUrl para futuras solicitudes de token

Ejemplo de configuración:

```
"Authentication": {
    "type": "OAUTH_CLIENT_CREDENTIALS",
    "tokenUrl": ..., // Required
    "clientId": ..., // Required
    "clientSecret": ..., // Required
    "scope": ..., // Optional
    "audience": ..., // Optional
    "resource": ..., // Optional
}
```

#### Consideraciones sobre OAuth
<a name="CloudWatch_Synthetics_MultiCheck_OAuthConsiderations"></a>

Synthetics actualiza los tokens de OAuth cuando se devuelve una respuesta 401 o 407.

### AWS Secrets ManagerIntegración de
<a name="CloudWatch_Synthetics_MultiCheck_SecretsManager"></a>

Para evitar el almacenamiento de valores de secretos (como contraseñas o claves de API) en texto sin formato, Synthetics proporciona una integración con AWS Secrets Manager. Puede hacer referencia a un valor de secreto completo en la configuración del esquema con el formato ` ${aws_SECRET:<secret_name>}` o hacer referencia a una clave concreta ` ${aws_SECRET:<secret_name>:<secret_key>}`.

Por ejemplo, si tiene un secreto denominado login/basic-auth-credentials, almacene un nombre de usuario y una contraseña con la siguiente estructura de JSON:

```
{
    "username": "Aladdin",
    "password": "open sesame"
}
```

Puede hacer referencia al nombre de usuario y la contraseña en la configuración del esquema de la siguiente manera, y Synthetics se encarga de recuperar el valor del secreto y usar sus claves para autenticar la solicitud:

```
"Authentication": {
    "type": "BASIC",
    "username": ${AWS_SECRET:login/basic-auth-credentials:username},
    "password": ${AWS_SECRET:login/basic-auth-credentials:password}
}
```

Para permitir que Synthetics recupere el secreto especificado, el ARN de rol que asume el canario debe tener los permisos secretsManager:GetSecretValue. Si el secreto está cifrado con una clave administrada por el cliente en lugar de la clave administrada de AWS AWS/secretsmanager, también necesita los permisos kms:Decrypt para la clave.

Ejemplo de permisos:

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:AWS:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
        },
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:AWS:kms:us-east-1:123456789012:key/key-id"
        }
    ]
}
```

## Solución de problemas
<a name="CloudWatch_Synthetics_MultiCheck_Troubleshooting"></a>

### Errores comunes de solución de problemas
<a name="CloudWatch_Synthetics_MultiCheck_Common_Failures"></a>

El código subyacente del esquema de comprobaciones múltiples está escrito en Typescript. Consulte la página de solución de problemas de canarios para ver los errores más comunes: [Solución de problemas de un valor controlado](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Troubleshoot.html).

### Errores de sintaxis de la configuración de comprobaciones de JSON
<a name="CloudWatch_Synthetics_MultiCheck_JSON_Errors"></a>

Si hay algún error sintáctico relacionado con la configuración de comprobaciones de JSON del canario, Consola de administración de AWS le indicará el motivo del error cuando intente crear el canario. Si está creando un canario mediante una API o CloudFormation, verá el error cuando se ejecute el canario por primera vez. Se recomienda utilizar el flujo de trabajo de actualizaciones seguras de canarios para el canario de comprobaciones múltiples. Para obtener más información, consulte [Actualizaciones seguras del canario](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/performing-safe-canary-upgrades.html).

### Errores de red o de tiempo de espera
<a name="CloudWatch_Synthetics_MultiCheck_Network_Failures"></a>

En caso de errores intermitentes o coherentes relacionados con los tiempos de espera, los errores de conexión de red (por ejemplo, ENOTFOUND, ECONNRESET) consideran la activación de registros de ` DEBUG` para que la ejecución siguiente proporcione más detalles sobre el motivo de los errores de las comprobaciones. Para ello, proporcione la variable de entorno CW\$1SYNTHETICS\$1LOG\$1LEVEL: "DEBUG".

Si aún hay errores que no puede depurar, considere la posibilidad de contactar con AWS Support o comprobar si alguno de los otros tipos de canarios proporcionados por CloudWatch Synthetics se ajusta mejor a su caso de uso.

# Uso del registrador de CloudWatch Synthetics para Google Chrome
<a name="CloudWatch_Synthetics_Canaries_Recorder"></a>

Amazon proporciona un registrador de CloudWatch Synthetics para ayudarlo a crear canaries de manera más fácil. El registrador es una extensión de Google Chrome.

Registra las acciones de cliqueo y de tipeo en un sitio web y genera automáticamente un script Node.js que se puede utilizar para crear un valor controlado que siga los mismos pasos.

Después de iniciar el registro, CloudWatch Synthetics Recorder detecta las acciones en el navegador y las convierte en un script. Puede pausar y reanudar el registro según sea necesario. Cuando deja de registrar, el registrador produce un script Node.js de las acciones, que puede copiar fácilmente con el comando **Copy to Clipboard** (Copiar al portapapeles). A continuación, puede utilizar el script para crear un valor controlado en CloudWatch Synthetics. 

**Créditos**: el registrador CloudWatch Synthetics se basa en el [Registrador sin procesador](https://github.com/checkly/headless-recorder).

## Instalación de la extensión CloudWatch Synthetics Recorder para Google Chrome
<a name="CloudWatch_Synthetics_Canaries_Recorder-install"></a>

Si desea utilizar CloudWatch Synthetics Recorder, puede empezar a crear un valor controlado y elegir el esquema **Registrador de valores controlados**. Si lo hace cuando aún no ha descargado el registrador, la consola de CloudWatch Synthetics proporciona un enlace para descargarlo.

Alternativamente, puede seguir estos pasos para descargar e instalar el registrador directamente.

**Para instalar el registrador de CloudWatch Synthetics**

1. Con Google Chrome, ingrese a este sitio web: [ https://chrome.google.com/webstore/detail/cloudwatch-synthetics-rec/bhdnlmmgiplmbcdmkkdfplenecpegfno](https://chrome.google.com/webstore/detail/cloudwatch-synthetics-rec/bhdnlmmgiplmbcdmkkdfplenecpegfno)

1. Seleccione **Add to Chrome** (Añadir a Chrome) y, después, **Add extension** (Agregar extensión).

## Uso del registrador de CloudWatch Synthetics para Google Chrome
<a name="CloudWatch_Synthetics_Canaries_Recorder-using"></a>

Si desea utilizar CloudWatch Synthetics Recorder para obtener ayuda para crear un valor controlado, puede elegir **Crear valor controlado** en la consola de CloudWatch y luego, **Usar un esquema**, **Registrador de valores controlados**. Para obtener más información, consulte [Creación de un valor controlado](CloudWatch_Synthetics_Canaries_Create.md). 

Alternativamente, puede usar el registrador para registrar pasos sin usarlos de manera inmediata para crear un valor controlado.

**Para utilizar CloudWatch Synthetics Recorder a fin de registrar las acciones en un sitio web**

1. Desplácese hasta la página que desea supervisar.

1. Elija el icono de extensiones de Chrome y, a continuación, elija **CloudWatch Synthetics Recorder**.

1. Seleccione **Start Recording** (Comenzar a registrar).

1. Realice los pasos que desea registrar. Para pausar el registro, elija **Pausar**.

1. Cuando termine de registrar el flujo de trabajo, elija **Stop recording** (Detener registro).

1. Seleccione **Copy to clipboard** (Copiar al portapapeles) para copiar el script generado al portapapeles. O bien, si desea comenzar de nuevo, elija **New recording** (Registro nuevo).

1. Para crear un valor controlado con el script copiado, puede pegar el script copiado en el editor en línea del esquema del registro o guardarlo en un bucket de Amazon S3 e importarlo desde allí.

1. Si no está creando un valor controlado inmediatamente, puede guardar el script registrado en un archivo.

## Limitaciones conocidas CloudWatch Synthetics Recorder
<a name="CloudWatch_Synthetics_Canaries_Recorder-limitations"></a>

CloudWatch Synthetics Recorder para Google Chrome tiene las siguientes limitaciones por el momento. 
+ Los elementos HTML que no tienen ID usarán selectores CSS. Esto puede dañar los canaries si la estructura de la página web cambia más adelante. Se planea proporcionar algunas opciones de configuración (como el uso del atributo data-id) en torno a esto en una versión futura del registrador. 
+ El registrador no admite acciones, como hacer doble clic o copiar o pegar, y no admite combinaciones de teclas como CMD\$10. 
+ Para verificar la presencia de un elemento o texto en la página, los usuarios deben agregar aserciones después de generar el script. El registrador no admite la verificación de un elemento sin realizar ninguna acción sobre ese elemento. Esto es similar a las opciones “Verificar texto” o “Verificar elemento” en el generador de flujo de trabajo de valores controlados. Se planea agregar compatibilidad con aserciones en una versión futura del registrador. 
+ El registrador graba todas las acciones en la pestaña donde se inicia el registro. No registra ventanas emergentes (por ejemplo, para permitir el seguimiento de ubicación) ni la navegación a páginas diferentes desde ventanas emergentes. 

# Versiones de tiempo de ejecución de Synthetics
<a name="CloudWatch_Synthetics_Canaries_Library"></a>

Al crear o actualizar un valor controlado, se elige una versión de tiempo de ejecución de Synthetics para este. Un tiempo de ejecución de Synthetics es una combinación del código de Synthetics que llama al controlador de scripts y de las capas Lambda de las dependencias agrupadas.

Actualmente, CloudWatch Synthetics admite tiempos de ejecución que usan los lenguajes Node.js, Python o Java. Los marcos compatibles son Puppeteer, Playwright y Selenium.

Recomendamos utilizar siempre la versión de tiempo de ejecución más reciente para sus valores controlados a fin de poder usar las últimas características y actualizaciones realizadas en la biblioteca de Synthetics.

**Nota**: Siempre que ponga en marcha un canario para utilizar la nueva versión del tiempo de ejecución de Synthetics, todas las funciones de la biblioteca de Synthetics que utilice el canario también se moverán automáticamente a la misma versión de NodeJS que admita el tiempo de ejecución de Synthetics.

**Topics**
+ [Versiones de tiempo de ejecución que utilizan Java](CloudWatch_Synthetics_Library_Java.md)
+ [Versiones en tiempo de ejecución con Node.js y Playwright](CloudWatch_Synthetics_Library_nodejs_playwright.md)
+ [Versiones en tiempo de ejecución con Node.js y Puppeteer](CloudWatch_Synthetics_Library_nodejs_puppeteer.md)
+ [Versiones en tiempo de ejecución con Python y Selenium Webdriver](CloudWatch_Synthetics_Library_python_selenium.md)
+ [Versiones de tiempo de ejecución con Node.js](CloudWatch_Synthetics_Library_Nodejs.md)
+ [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md)
+ [Actualización de las versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Version_Update.md)

# Versiones de tiempo de ejecución que utilizan Java
<a name="CloudWatch_Synthetics_Library_Java"></a>

La siguiente sección contiene información acerca de las versiones de tiempo de ejecución de CloudWatch Synthetics para Java. Este tiempo de ejecución no incluye ningún navegador ni marco.

La convención de nomenclatura de estas versiones de tiempo de ejecución es `syn-language -majorversion.minorversion`. 

## syn-java-1.0
<a name="Synthetics_runtimeversion-syn-java-1.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda Java 21

 **Características** 
+ *Integración con CloudWatch Logs*: puede consultar y filtrar los registros a través de la consola de CloudWatch Synthetics. Cada mensaje de los registros contiene un elemento ` canaryRunId` único, lo que facilita la búsqueda de los registros de una ejecución de canario concreta.
+ *Métricas*: puede supervisar el porcentaje de éxito y la duración de las ejecuciones del canario mediante las métricas de CloudWatch. También puede configurar alarmas que le adviertan cuando los canarios detecten problemas.
+ *Artefactos de canarios*: con cada ejecución de un canario, se carga un informe detallado correspondiente a la ejecución y a los pasos de la ejecución, al que se puede acceder a través de Amazon S3.
+ *Compatibilidad con seguimientos*: puede emitir seguimientos para todas las solicitudes hechas por el canario a través de X-Ray. Cada ejecución del canario está asociada a un ID de rastro.

# Versiones en tiempo de ejecución con Node.js y Playwright
<a name="CloudWatch_Synthetics_Library_nodejs_playwright"></a>

Las siguientes secciones contienen información acerca de las versiones de tiempo de ejecución de CloudWatch Synthetics para Node.js y Playwright. Playwright es una biblioteca de automatización de código abierto para pruebas de navegadores. Para obtener más información sobre Playwright, consulte [https://playwright.dev/](https://playwright.dev). 

La convención de nomenclatura de estas versiones de tiempo de ejecución es `syn-language -framework-majorversion. minorversion`. 

## syn-nodejs-playwright-6.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-6.0"></a>

**importante**  
Al iniciar Synthetics `syn-nodejs-playwright-5.1` y versiones posteriores, el tiempo de ejecución de Synthetics usará el nuevo espacio de nombres. Migre el script de canario para usar el nuevo espacio de nombres. El espacio de nombres heredado quedará obsoleto en un futuro lanzamiento.  
@amzn/synthetics-playwright → @aws/synthetics-playwright

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 22.x
+ Versión 1.58.2 de Playwright
+ Versión 1.58.2 de prueba de Playwright
+ Chromium versión 145.0.7632.77
+ Firefox, versión 146.0.1

 **Cambios en syn-nodejs-playwright-6.0** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Playwright y del navegador. 

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Playwright ](https://playwright.dev/docs/release-notes) 
+  [Referencia de la API de Playwright](https://playwright.dev/docs/api/class-playwright) 

## Versiones de tiempo de ejecución anteriores para Node.js y Playwright
<a name="Previousversions-nodejs-playwright"></a>

Las siguientes versiones anteriores de tiempo de ejecución para Node.js y Playwright aún se admiten. 

### syn-nodejs-playwright-5.1
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-5.1"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 22.x
+ Playwright, versión 1.57.0
+ Playwright, versión 1.57.0 de prueba
+ Chromium versión 143.0.7499.169
+ Firefox, versión 142.0.1

 **Cambios en syn-nodejs-playwright-5.1** 
+ Migración del espacio de nombres del tiempo de ejecución de Synthetics. 
+ La definición de tipo está disponible en [npm Registry](https://www.npmjs.com/package/@aws/synthetics-playwright). Asegúrese de que la versión del paquete de definición de tipos coincida con la versión de tiempo de ejecución de su canario.

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Playwright ](https://playwright.dev/docs/release-notes) 
+  [Referencia de la API de Playwright](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-5.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-5.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 22.x
+ Playwright, versión 1.57.0
+ Playwright, versión 1.57.0 de prueba
+ Chromium versión 143.0.7499.4
+ Firefox, versión 142.0.1

 **Cambios en syn-nodejs-playwright-5.0** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Playwright y del navegador. 

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Playwright ](https://playwright.dev/docs/release-notes) 
+  [Referencia de la API de Playwright](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-4.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-4.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 22.x
+ Playwright, versión 1.55.0
+ Playwright, versión 1.55.0 de prueba
+ Chromium versión 140.0.7339.16
+ Firefox, versión 141.0

 **Cambios en syn-nodejs-playwright-4.0** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Playwright y del navegador. 

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Playwright ](https://playwright.dev/docs/release-notes) 
+  [Referencia de la API de Playwright](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-3.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-3.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 20.x
+ Playwright, versión 1.53.0
+ Playwright, versión 1.53.0 de prueba
+ Chromium, versión 138.0.7204.168

 **Cambios en syn-nodejs-playwright-3.0** 
+ Compatibilidad con varios navegadores: ahora puede ejecutar los canarios de Node.js de Puppeteer en Firefox o Chrome
+ Compatibilidad con supervisión visual

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Playwright ](https://playwright.dev/docs/release-notes) 
+  [Referencia de la API de Playwright](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-2.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-2.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 20.x
+ Versión 1.49.1 de Playwright
+ Versión 1.49.1 de prueba de Playwright
+ Versión 131.0.6778.264 de Chromium

 **Cambios en syn-nodejs-playwright-2.0** 
+ Se ha corregido el desajuste entre la duración total y la suma de los tiempos de una solicitud determinada en un archivo HAR.
+ Admite simulacros para el canario, lo que permite realizar ejecuciones ad hoc o realizar una actualización segura del canario.

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Playwright ](https://playwright.dev/docs/release-notes) 
+  [Referencia de la API de Playwright](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-1.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-1.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 20.x
+ Versión 1.44.1 de Playwright
+ Versión 1.44.1 de prueba de Playwright
+ Versión 126.0.6478.126 de Chromium

**Características**:
+ **Compatibilidad con PlayWright**: puede escribir scripts de canarios mediante el marco de automatización de Playwright. Puede hacer que los scripts de Playwright existentes se ejecuten como canarios y mejorarlos con funcionalidades de supervisión de AWS. 
+ **Integración con CloudWatch Logs**: puede consultar y filtrar los registros a través de la consola de CloudWatch Synthetics. Cada mensaje de los registros contiene un elemento `canaryRunId` único, lo que facilita la búsqueda de los registros de una ejecución de canario concreta. 
+ **Métricas y artefactos de canario**: puede supervisar el índice de aprobación de ejecución de canario a través de las métricas de CloudWatch y configurar alarmas para que le avisen cuando los canarios detecten problemas. 
+ **Capturas de pantalla y asociación de pasos**: puede hacer capturas de pantalla con la funcionalidad nativa de Playwright para visualizar las etapas de un script de canario en cada ejecución. Las capturas de pantalla se asocian automáticamente a los pasos de canarios y se cargan en los buckets de Amazon S3. 
+ **Varias pestañas**: puede crear canarios que abran varias pestañas del navegador y acceder a las capturas de pantalla de cada pestaña. Puede crear flujos de trabajo de usuario con varias pestañas y varios pasos en Synthetics. 

# Versiones en tiempo de ejecución con Node.js y Puppeteer
<a name="CloudWatch_Synthetics_Library_nodejs_puppeteer"></a>

La primera versión en tiempo de ejecución para Node.js y Puppeteer se ha denominado `syn-1.0`. Las versiones posteriores en tiempo de ejecución tienen la convención de nomenclatura `syn-language -majorversion.minorversion`. A partir de `syn-nodejs-puppeteer-3.0`, la convención de nomenclatura es `syn- language-framework-majorversion .minorversion` 

Un sufijo adicional `-beta` muestra que la versión en tiempo de ejecución se encuentra actualmente en una versión preliminar beta.

Las versiones de tiempo de ejecución con el mismo número de versión principal son compatibles con las versiones anteriores. 

El código de Lambda de un valor controlado está configurado para tener una memoria máxima de 1 GB. El tiempo de espera de cada ejecución de un valor controlado se agota transcurrido el valor correspondiente configurado. Si no se especifica ningún valor de tiempo de espera para un valor controlado, CloudWatch elige uno en función de la frecuencia de dicho valor controlado. Si configura un valor de tiempo de espera, haga que no sea inferior a 15 segundos para permitir arranques en frío de Lambda y el tiempo que tarda en arrancar la instrumentación de valor controlado.

## syn-nodejs-puppeteer-15.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-15.0"></a>

`syn-nodejs-puppeteer-15.0` es el tiempo de ejecución más reciente de Synthetics para Node.js y Puppeteer. 

**importante**  
Al iniciar Synthetics `syn-nodejs-puppeteer-13.1` y versiones posteriores, el tiempo de ejecución de Synthetics usará el nuevo espacio de nombres. Migre el script de canario para usar nuevos espacio de nombres. Los espacios de nombres heredados quedarán obsoletos en un futuro lanzamiento.  
Synthetics → @aws/synthetics-puppeteer
SyntheticsLink → @aws/synthetics-link
SyntheticsLogger → @aws/synthetics-logger
SyntheticsLogHelper → @aws/synthetics-log-helper
BrokenLinkCheckerReport → @aws/synthetics-broken-link-checker-report

**importante**  
El tiempo de ejecución de Synthetics `syn-nodejs-puppeteer-11.0` y las versiones posteriores solo admiten las siguientes anulaciones de configuración para cada paso:  
 `screenshotOnStepStart` 
 `screenshotOnStepSuccess` 
 `screenshotOnStepFailure` 
 `stepSuccessMetric` 
 `stepDurationMetric` 
 `continueOnStepFailure/continueOnHttpStepFailure` 
 `stepsReport` 

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Puppeteer](https://pptr.dev/CHANGELOG#24375-2026-02-19) 
+  [Referencia de la API de Puppeteer](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.37.5/docs/api/index.md) 

**Dependencias principales**:
+ Tiempo de ejecución Node.js 22.x de Lambda
+ Puppeteer-core versión 24.37.5
+ Chromium versión 145.0.7632.77
+ Firefox, versión 147.0.4

 **Cambios en syn-nodejs-puppeteer-15.0** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Puppeteer y del navegador.
+ Se corrigió un error por el que no se respetaba continueOnHttpStepFailure, lo que provocaba que las puestas en marcha de canarios se marcaran incorrectamente como correctas a pesar de que se producían errores en los pasos HTTP.

## Versiones de tiempo de ejecución anteriores para Node.js y Puppeteer
<a name="Previousversions-nodejs-puppeteer"></a>

Las siguientes versiones anteriores de tiempo de ejecución para Node.js y Puppeteer aún se admiten. 

### syn-nodejs-puppeteer-14.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-14.0"></a>

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Puppeteer](https://pptr.dev/CHANGELOG#24340-2025-12-19) 
+  [Referencia de la API de Puppeteer](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.34.0/docs/api/index.md) 

**Dependencias principales**:
+ Tiempo de ejecución Node.js 22.x de Lambda
+ Puppeteer-core versión 24.34.0
+ Chromium versión 143.0.7499.169
+ Firefox, versión 146.x

 **Cambios en syn-nodejs-puppeteer-14.0** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Puppeteer y del navegador.

### syn-nodejs-puppeteer-13.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-13.1"></a>

`syn-nodejs-puppeteer-13.1` es el tiempo de ejecución más reciente de Synthetics para Node.js y Puppeteer. 

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Puppeteer](https://pptr.dev/CHANGELOG#24250-2025-10-15) 
+  [Referencia de la API de Puppeteer](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**Dependencias principales**:
+ Tiempo de ejecución Node.js 22.x de Lambda
+ Puppeteer-core versión 24.25.0
+ Chromium versión 142.0.7444.175
+ Firefox, versión 145.x

 **Cambios en syn-nodejs-puppeteer-13.1** 
+ Migración del espacio de nombres del tiempo de ejecución de Synthetics.
+ Las definiciones de tipos están disponibles en npm Registry. Asegúrese de que la versión del paquete de definición de tipos coincida con la versión de tiempo de ejecución de su canario.
  +  [ @aws/synthetics-puppeteer](https://www.npmjs.com/package/@aws/synthetics-puppeteer) 
  +  [ @aws/synthetics-link](https://www.npmjs.com/package/@aws/synthetics-link) 
  +  [ @aws/synthetics-broken-link-checker-report](https://www.npmjs.com/package/@aws/synthetics-broken-link-checker-report) 
  +  [ @aws/synthetics-log-helper](https://www.npmjs.com/package/@aws/synthetics-log-helper) 
  +  [ @aws/synthetics-logger](https://www.npmjs.com/package/@aws/synthetics-logger) 

### syn-nodejs-puppeteer-13.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-13.0"></a>

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Puppeteer](https://pptr.dev/CHANGELOG#24250-2025-10-15) 
+  [Referencia de la API de Puppeteer](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**Dependencias principales**:
+ Tiempo de ejecución Node.js 22.x de Lambda
+ Puppeteer-core versión 24.25.0
+ Chromium versión 142.0.7444.175
+ Firefox, versión 145.x

 **Cambios en syn-nodejs-puppeteer-13.0** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Puppeteer y del navegador.
+ Corrección de errores: se corrigió un problema de bloqueo de la extensión en tiempo de ejecución intermitente causado por el acceso simultáneo a la asignación

### syn-nodejs-puppeteer-12.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-12.0"></a>

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Puppeteer](https://pptr.dev/CHANGELOG#24221-2025-09-23) 
+  [Referencia de la API de Puppeteer](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.22.1/docs/api/index.md) 

**Dependencias principales**:
+ Tiempo de ejecución Node.js 22.x de Lambda
+ Versión 24.22.1 de Puppeteer-core
+ Chromium versión 140.0.7339.185
+ Firefox, versión 143.0.1

 **Cambios en syn-nodejs-puppeteer-12.0** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Puppeteer y del navegador.
+ Corrección de errores para la redacción de encabezados restringidos: se corrigió un problema en el que los encabezados restringidos no se redactaban en executeHttpStep() en determinadas situaciones. El comportamiento ahora es coherente con Puppeteer 10.0.
+ Corrección de errores en la configuración de includeResponseBody: se corrigió un problema en el que la generación de archivos HAR podía aplicar incorrectamente el ajuste de configuración de includeResponseBody en determinadas situaciones. HAR ahora garantiza que los cuerpos de respuesta se excluyan al ajustar la configuración.
+ Corrección del ciclo de vida de captura de solicitudes: se corrigió un problema en el que el capturador de solicitudes HTTP podía provocar una agregación continua de solicitudes en determinadas solicitudes. La grabación ahora finaliza correctamente después de la ejecución de cada paso.

### syn-nodejs-puppeteer-11.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-11.0"></a>

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Puppeteer](https://pptr.dev/CHANGELOG) 
+  [Referencia de la API de Puppeteer](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 20.x
+ Puppeteer-core versión 24.15.0
+ Chromium, versión 138.0.7204.168

 **Cambios en syn-nodejs-puppeteer-11.0** 
+ Compatibilidad con varios navegadores: ahora puede ejecutar los canarios de Node.js de Puppeteer en Firefox o Chrome
+ Empaquetado simplificado: empaquete los scripts directamente bajo la raíz sin utilizar la estructura de directorios Node.js/node\$1modules
+ Integración de capturas de pantalla: haga capturas de pantalla con las funciones nativas de Puppeteer para visualizar las etapas del script de los canarios. Synthetics asocia automáticamente las capturas de pantalla con los pasos del canario y las carga en Amazon S3.
+ Consulta de registros mejorada: consulte y filtre los registros a través de la consola de Información de CloudWatch. Cada mensaje del registro incluye un `canaryRunId` único para facilitar la búsqueda.
+ Compatibilidad con archivos de configuración: defina y actualice la configuración de Synthetics mediante un archivo synthetics.json. Esta separación de la configuración de la lógica del script mejora el mantenimiento y la reutilización.
+ Compatibilidad con varias pestañas: puede crear canarios que abran varias pestañas de un navegador y acceder a las capturas de pantalla de cada pestaña. Cree flujos de trabajo de usuario con varias pestañas y varios pasos en Synthetics.
+ Correcciones de seguridad:
+ Corrección de errores en el monitoreo visual.
+ Se agregó compatibilidad con el registro JSON estructurado con niveles de registro configurables: los registros ahora se emiten en formato JSON para facilitar el análisis y las consultas en CloudWatch. El nivel de registro se puede configurar (por ejemplo, DEBUG, INFO, TRACE) mediante variables de entorno, lo que permite a los usuarios controlar el detalle según sus necesidades.
+ Compatibilidad con la sintaxis de ES

### syn-nodejs-puppeteer-10.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-10.0"></a>

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Puppeteer](https://pptr.dev/CHANGELOG) 
+  [Referencia de la API de Puppeteer](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 20.x
+ Puppeteer-core versión 24.2.0
+ Versión 131.0.6778.264 de Chromium

 **Cambios en syn-nodejs-puppeteer-10.0** 
+ Se ha corregido el error relacionado con el cierre del navegador que tardaba demasiado.
+ Admite simulacros para el canario, lo que permite realizar ejecuciones ad hoc o realizar una actualización segura del canario.

### syn-nodejs-puppeteer-9.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.1"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 20.x
+ Versión 22.12.1 de Puppeteer-core
+ Versión 126.0.6478.126 de Chromium

**Cambios en syn-nodejs-puppeteer-9.1**: se han corregido errores relacionados con intervalos de fechas y solicitudes pendientes en archivos HAR.

### syn-nodejs-puppeteer-9.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 20.x
+ Versión 22.12.1 de Puppeteer-core
+ Versión 126.0.6478.126 de Chromium

**Cambios en syn-nodejs-puppeteer-9.0**: se ha corregido el error para habilitar las capacidades de monitoreo visual.

### syn-nodejs-puppeteer-8.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-8.0"></a>

**aviso**  
Debido a un error, el tiempo de ejecución `syn-nodejs-puppeteer-8.0` no admite la supervisión visual en los valores controlados. Actualice a [syn-nodejs-puppeteer-9.0](#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.0) para corregir los errores de la supervisión visual.

**importante**  
Los tiempos de ejecución de Lambda Node.js 18 y versiones posteriores utilizan AWS SDK para JavaScript V3. Si necesita migrar un canario desde un tiempo de ejecución anterior, siga el [taller de migración de aws-sdk-js-v3](https://github.com/aws-samples/aws-sdk-js-v3-workshop) en GitHub. Para obtener más información sobre la versión 3 del AWS SDK para JavaScript, consulte [este blog](https://aws.amazon.com/blogs/developer/modular-aws-sdk-for-javascript-is-now-generally-available/).

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 20.x
+ Puppeteer-core versión 22.10.0
+ Chromium versión 125.0.6422.112

**Actualizaciones en syn-nodejs-puppeteer-8.0**:
+  **Compatibilidad con la autenticación multifactor** 
+ Se **corrigieron errores** relacionados con la pérdida de datos de algunos clientes del servicio en las respuestas de la versión 3 del SDK de Node.js.

## Versiones de tiempo de ejecución obsoletas para Node.js y Puppeteer.
<a name="CloudWatch_Synthetics_nodejs-puppeteer-Deprecated"></a>

Los siguientes tiempos de ejecución para Node.js y Puppeteer han quedado obsoletos. Para obtener información sobre las fechas de obsolescencia de los tiempos de ejecución, consulte [Fechas de obsolescencia del tiempo de ejecución de CloudWatch Synthetics](CloudWatch_Synthetics_Runtime_Support_Policy.md#runtime_deprecation_dates).

### syn-nodejs-puppeteer-7.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-7.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 18.x
+ Puppeteer-core versión 21.9.0
+ Chromium versión 121.0.6167.139

**Tamaño del código**:

El tamaño del código y las dependencias que puede empaquetar en este tiempo de ejecución es de 80 MB.

**Actualizaciones en syn-nodejs-puppeteer-7.0**:
+ **Versiones actualizadas de las bibliotecas agrupadas incluidas en Chromium**: las dependencias de Chromium y Puppeteer se actualizan a versiones nuevas.
**importante**  
La migración de Puppeteer 19.7.0 a Puppeteer 21.9.0 introduce cambios importantes en relación con las pruebas y los filtros. Para obtener más información, consulte las secciones de **CAMBIOS IMPORTANTES** en [puppeteer: v20.0.0](https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-v20.0.0) y [puppeteer-core: v21.0.0](https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-core-v21.0.0).

 **Actualización recomendada al SDK v3 de AWS** 

El tiempo de ejecución de Lambda nodejs18.x no es compatible con el SDK v2 de AWS. Se recomienda que migre al SDK v3 de AWS.

### syn-nodejs-puppeteer-6.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.2"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 18.x
+ Puppeteer-core de versión 19.7.0
+ Chromium versión 111.0.5563.146

**Cambios en syn-nodejs-puppeteer-6.2**:
+  **Versiones actualizadas de las bibliotecas agrupadas incluidas en Chromium** 
+ **Supervisión del almacenamiento efímero**: este tiempo de ejecución agrega la supervisión del almacenamiento efímero en las cuentas de los clientes.
+  **Correcciones de errores** 

### syn-nodejs-puppeteer-6.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.1"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 18.x
+ Puppeteer-core de versión 19.7.0
+ Chromium versión 111.0.5563.146

**Actualizaciones en syn-nodejs-puppeteer-6.1**:
+ **Mejoras de estabilidad**: se añadió una lógica de reintento automático para administrar los errores de lanzamiento intermitentes de Puppeteer.
+ **Actualizaciones de dependencias**: actualizaciones para algunos paquetes de dependencias de terceros.
+ **Valores controlados sin permisos de Amazon S3**: se han corregido errores para que puedan seguir funcionando los valores controlados que no tengan ningún permiso de Amazon S3. Estos valores controlados que no tengan permisos de Amazon S3 no podrán subir capturas de pantalla u otros artefactos a Amazon S3. Para obtener más información sobre permisos de valores controlados, consulte [Roles y permisos necesarios para los valores controlados](CloudWatch_Synthetics_Canaries_CanaryPermissions.md).

**importante**  
IMPORTANTE: La dependencia incluida de AWS SDK para JavaScript v2 se eliminará y se actualizará para utilizar AWS SDK para JavaScript v3 en una futura versión del tiempo de ejecución. Cuando eso ocurra, podrá actualizar las referencias de su código de valor controlado. Como alternativa, puede seguir haciendo referencia a la dependencia incluida de AWS SDK para JavaScript v2 y utilizarla agregándola como una dependencia a su archivo zip de código fuente.

### syn-nodejs-puppeteer-6.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 18.x
+ Puppeteer-core de versión 19.7.0
+ Chromium versión 111.0.5563.146

**Actualizaciones en syn-nodejs-puppeteer-6.0**:
+ **Actualización de la dependencia**: la dependencia de Node.js se ha actualizado a la versión 18.x.
+ **Compatibilidad con el modo de intercepción**: se agregó la compatibilidad con el modo de intercepción cooperativa de Puppeteer a la biblioteca de tiempos de ejecución con valores controlados de Synthetics.
+ **Cambio en el comportamiento de rastreo**: se modificó el comportamiento de rastreo predeterminado para rastrear solo las solicitudes de recuperación y xhr, y no las solicitudes de recursos. Puede habilitar el seguimiento de las solicitudes de recursos configurando la opción `traceResourceRequests`.
+ **Métrica de duración mejorada**: la métrica ` Duration` ahora excluye el tiempo de operación que utiliza el valor controlado para cargar artefactos, hacer capturas de pantalla y generar métricas de CloudWatch. Los valores de las métricas de `Duration` se notifican a CloudWatch y también se pueden ver en la consola Synthetics.
+ **Corrección de errores**: limpia el núcleo volcado que se genera cuando Chromium se bloquea durante una ejecución de valor controlado.

**importante**  
IMPORTANTE: La dependencia incluida de AWS SDK para JavaScript v2 se eliminará y se actualizará para utilizar AWS SDK para JavaScript v3 en una futura versión del tiempo de ejecución. Cuando eso ocurra, podrá actualizar las referencias de su código de valor controlado. Como alternativa, puede seguir haciendo referencia a la dependencia incluida de AWS SDK para JavaScript v2 y utilizarla agregándola como una dependencia a su archivo zip de código fuente.

### syn-nodejs-puppeteer-5.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.2"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 16.x
+ Puppeteer-core de versión 19.7.0
+ Chromium versión 111.0.5563.146

**Actualizaciones en syn-nodejs-puppeteer-5.2**:
+  **Versiones actualizadas de las bibliotecas agrupadas incluidas en Chromium** 
+  **Correcciones de errores** 

### syn-nodejs-puppeteer-5.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 16.x
+ Puppeteer-core de versión 19.7.0
+ Chromium versión 111.0.5563.146

**Correcciones de errores en syn-nodejs-puppeteer-5.1**:
+ **Corrección de errores**: este tiempo de ejecución corrige un error en ` syn-nodejs-puppeteer-5.0` por el que a los archivos HAR creados por los valores controlados les faltaban encabezados de solicitud.

### syn-nodejs-puppeteer-5.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 16.x
+ Puppeteer-core de versión 19.7.0
+ Chromium versión 111.0.5563.146

**Actualizaciones en syn-nodejs-puppeteer-5.0**:
+ **Actualización de dependencias**: la versión básica de Puppeteer-core se ha actualizado a la 19.7.0. La versión de Chromium se ha actualizado a la 111.0.5563.146.

**importante**  
La nueva versión básica de Puppeteer no es totalmente compatible con las versiones anteriores de Puppeteer. Algunos de los cambios de esta versión pueden provocar que los valores controlados existentes que utilizan funciones obsoletas de Puppeteer fallen. Para obtener más información, consulte los cambios importantes en los registros de cambios de las versiones 19.7.0 a 6.0 de Puppeteer-core, en los [registros de cambios de Puppeteer](https://github.com/puppeteer/puppeteer/releases?q=breaking&expanded=true).

### syn-nodejs-puppeteer-4.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de Lambda Node.js 16.x
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 92.0.4512

**Actualizaciones en syn-nodejs-puppeteer-4.0**:
+ **Actualización de la dependencia**: la dependencia de Node.js se ha actualizado a la versión 16.x.

### syn-nodejs-puppeteer-3.9
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 8 de enero de 2024. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.js 14.x de Lambda
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 92.0.4512

**Actualizaciones en syn-nodejs-puppeteer-3.9**:
+ **Actualizaciones de dependencias**: actualiza algunos paquetes de dependencias de terceros.

### syn-nodejs-puppeteer-3.8
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 8 de enero de 2024. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.js 14.x de Lambda
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 92.0.4512

**Actualizaciones en syn-nodejs-puppeteer-3.8**:
+ **Limpieza de perfiles**: los perfiles de Chromium ahora se limpian después de cada ejecución de un valor controlado.

**Correcciones de errores en syn-nodejs-puppeteer-3.8**:
+ **Correcciones de errores**: anteriormente, los valores controlados de supervisión visual a veces dejaban de funcionar correctamente después de una ejecución sin capturas de pantalla. Esto ya está resuelto.

### syn-nodejs-puppeteer-3.7
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 8 de enero de 2024. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.js 14.x de Lambda
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 92.0.4512

**Actualizaciones en syn-nodejs-puppeteer-3.7**:
+ **Mejoras del registro**: el valor controlado cargará los registros en Amazon S3 incluso si se agota el tiempo de espera o se bloquea.
+ **Reducción del tamaño de la capa de Lambda**: el tamaño de la capa de Lambda utilizada para los valores controlados se reduce en un 34 %.

**Correcciones de errores en syn-nodejs-puppeteer-3.7**:
+ **Correcciones de errores**: las fuentes en japonés, chino simplificado y chino tradicional se representarán correctamente.

### syn-nodejs-puppeteer-3.6
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 8 de enero de 2024. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.js 14.x de Lambda
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 92.0.4512

**Actualizaciones en syn-nodejs-puppeteer-3.6**:
+ **Marcas de tiempo más precisas**: la hora de inicio y la hora de parada de las ejecuciones de valores controlados ahora tienen una precisión de milisegundos.

### syn-nodejs-puppeteer-3.5
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 8 de enero de 2024. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.js 14.x de Lambda
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 92.0.4512

**Actualizaciones en syn-nodejs-puppeteer-3.5**:
+ **Dependencias actualizadas**: las únicas características nuevas de este tiempo de ejecución son las dependencias actualizadas.

### syn-nodejs-puppeteer-3.4
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 13 de noviembre de 2022. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Dependencias principales**:
+ Tiempo de ejecución Node.js 12.x de Lambda 
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 88.0.4298.0

**Actualizaciones en syn-nodejs-puppeteer-3.4**:
+ **Función de controlador personalizada**: ahora puede utilizar una función de controlador personalizada para los scripts de los valores controlados. Los tiempos de ejecución anteriores requerían que el punto de entrada del script incluyera `.handler`. 

  También puede colocar scripts de valores controlados en cualquier carpeta y pasar el nombre de la carpeta como parte del controlador. Por ejemplo, `MyFolder/MyScriptFile.functionname` se puede utilizar como punto de entrada.
+ **Información ampliada de archivos HAR**: ahora puede ver las solicitudes con fallas, pendientes e incompletas en los archivos HAR producidos por los valores controlados.

### syn-nodejs-puppeteer-3.3
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 13 de noviembre de 2022. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Dependencias principales**:
+ Tiempo de ejecución Node.js 12.x de Lambda 
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 88.0.4298.0

**Actualizaciones en syn-nodejs-puppeteer-3.3**:
+ **Más opciones de cifrado de artefactos**: para los valores controlados que utilicen este tiempo de ejecución o posterior, en lugar de utilizar una clave administrada de AWS para cifrar artefactos que el valor controlado almacena en Amazon S3, puede optar por utilizar una clave administrada por el cliente de AWS KMS o una clave administrada por Amazon S3. Para obtener más información, consulte [Cifrado de artefactos de un valor controlado](CloudWatch_Synthetics_artifact_encryption.md). 

### syn-nodejs-puppeteer-3.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 13 de noviembre de 2022. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Dependencias principales**:
+ Tiempo de ejecución Node.js 12.x de Lambda 
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 88.0.4298.0

**Actualizaciones en syn-nodejs-puppeteer-3.2**:
+ **supervisión visual con capturas de pantalla**: los valores controlados que utilizan este tiempo de ejecución o uno posterior pueden comparar una captura de pantalla que se ha tomado durante una ejecución con una versión de línea de base de la misma captura de pantalla. Si las capturas de pantalla son más diferentes que un umbral de porcentaje especificado, el valor controlado falla. Para obtener más información, consulte [Supervisión visual](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting) o [Proyecto de supervisión visual](CloudWatch_Synthetics_Canaries_Blueprints.md#CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting). 
+ **Nuevas funciones relacionadas con información confidencial** Se puede evitar que la información confidencial aparezca en los registros de valores controlados e informes. Para obtener más información, consulte [Clase de SyntheticSloghelper](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsLogHelper).
+ **Función obsoleta** La clase ` RequestResponseLogHelper` ha quedado obsoleta en favor de otras opciones de configuración nuevas. Para obtener más información, consulte [RequestResponseLogHelper class](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_RequestResponseLogHelper).

### syn-nodejs-puppeteer-3.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 13 de noviembre de 2022. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Dependencias principales**:
+ Tiempo de ejecución Node.js 12.x de Lambda 
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 88.0.4298.0

**Actualizaciones en syn-nodejs-puppeteer-3.1**:
+ **Capacidad para configurar métricas de CloudWatch**: con este tiempo de ejecución, puede desactivar las métricas que no se necesitan. De lo contrario, los valores controlados publican varias métricas de CloudWatch para cada ejecución de valores controlados.
+ **Vinculación de captura de pantalla**: se puede vincular una captura de pantalla a un paso de valor controlado una vez finalizado el paso. Para ello, tome la captura de pantalla mediante el comando **takeScreenshot**, con el nombre del paso al que desea asociar la captura de pantalla. Por ejemplo, puede que desee realizar un paso, agregar un tiempo de espera y, a continuación, tomar la captura de pantalla.
+ **El esquema de supervisión de latidos puede supervisar varias URL**: se puede utilizar el esquema de supervisión de latidos en la consola de CloudWatch para supervisar varias URL y ver el estado, la duración, las capturas de pantalla asociadas y el motivo del error de cada URL en el resumen de pasos del informe de ejecución del canario.

### syn-nodejs-puppeteer-3.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 13 de noviembre de 2022. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Dependencias principales**:
+ Tiempo de ejecución Node.js 12.x de Lambda 
+ Puppeteer-core de versión 5.5.0
+ Chromium versión 88.0.4298.0

**Actualizaciones en syn-nodejs-puppeteer-3.0**:
+ **Relaciones actualizadas**: esta versión utiliza Puppeteer versión 5.5.0, Node.js 12.x y Chromium 88.0.4298.0.
+ **Acceso a buckets entre regiones**: ahora puede especificar un bucket de S3 en otra región como el bucket donde el valor controlado almacena los archivos de registro, capturas de pantalla y archivos HAR.
+ **Nuevas funciones disponibles**: esta versión añade funciones de biblioteca para recuperar el nombre del valor controlado y la versión de tiempo de ejecución de Synthetics.

  Para obtener más información, consulte [Clase de Synthetics](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_Synthetics_Class_all).

### syn-nodejs-2.2
<a name="CloudWatch_Synthetics_runtimeversion-2.2"></a>

Esta sección contiene información sobre la versión de tiempo de ejecución `syn-nodejs-2.2`.

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 28 de mayo de 2021. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.JS 10.x de Lambda 
+ Puppeteer-core de versión 3.3.0
+ Chromium versión 83.0.4103.0

**Cambios en syn-nodejs-puppeteer-2.2**:
+ **Supervise los valores controlados como pasos HTTP**: ahora puede probar varias API en un único valor controlado. Cada API se prueba como un paso HTTP independiente, y CloudWatch Synthetics supervisa el estado de cada paso mediante métricas de pasos y el informe de pasos de CloudWatch Synthetics. CloudWatch Synthetics crea métricas de ` SuccessPercent` y `Duration` para cada paso HTTP.

  Esta funcionalidad la implementa la función **executeHttpStep(stepName, requestOptions, callback, stepConfig)**. Para obtener más información, consulte [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_executeHttpStep).

  El esquema del valor controlado de API se actualiza para utilizar esta nueva característica.
+ **Informes de solicitudes HTTP**: ahora se pueden ver informes detallados de solicitudes HTTP que capturan detalles como las cabeceras de solicitud y de respuesta, cuerpos de respuesta, códigos de estado, tiempos de error y rendimiento, tiempos de conexión TCP, tiempos de enlace TLS, la hora del primer byte y el tiempo de transferencia de contenido. Todas las solicitudes HTTP que utilizan el módulo HTTP o HTTPS que no se ven a simple vista se capturan aquí. Las cabeceras y el cuerpo de respuesta no se capturan de forma predeterminada, pero se pueden habilitar si se establecen opciones de configuración.
+ **Configuración global y a nivel de paso**: se pueden establecer configuraciones de CloudWatch Synthetics globales, que se aplican a todos los pasos de los canarios. También se pueden anular estas configuraciones en el nivel de paso al pasar los pares clave-valor de configuración para habilitar o desactivar determinadas opciones.

  Para obtener más información, consulte [Clase SyntheticsConfiguration](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration).
+ **Continúe con la configuración del error del paso**: puede optar por continuar la ejecución del valor controlado cuando un paso falla . Para la función ` executeHttpStep`, esta opción está activada de forma predeterminada. Puede establecer esta opción una vez a nivel global o definirla de manera diferente por paso. 

### syn-nodejs-2.1
<a name="CloudWatch_Synthetics_runtimeversion-2.1"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 28 de mayo de 2021. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.JS 10.x de Lambda 
+ Puppeteer-core de versión 3.3.0
+ Chromium versión 83.0.4103.0

**Actualizaciones en syn-nodejs-2.1**:
+ **Capturas de pantalla de comportamiento configurable**: proporciona la opción de desactivar las capturas de pantalla a través de canaries de UI. En canaries que utilizan versiones anteriores de los tiempos de ejecución, los canaries de UI siempre toman capturas de pantalla antes y después de cada paso. Con `syn-nodejs-2.1`, esto es configurable. La desactivación de las capturas de pantalla puede reducir los costes de almacenamiento de Amazon S3 y puede ayudarlo a cumplir con las normas HIPAA. Para obtener más información, consulte [Clase SyntheticsConfiguration](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration).
+ **Personalice los parámetros de inicio de Google Chrome** Ahora puede configurar los argumentos utilizados cuando un valor controlado inicia una ventana del navegador Google Chrome. Para obtener más información, consulte [Lanzamiento (opciones)](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_LaunchOptions).

Puede haber un pequeño aumento en la duración del valor controlado al usar syn-nodejs-2.0 o uno posterior, en comparación con versiones anteriores de los tiempos de ejecución de valores controlados.

### syn-nodejs-2.0
<a name="CloudWatch_Synthetics_runtimeversion-2.0"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 28 de mayo de 2021. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.JS 10.x de Lambda 
+ Puppeteer-core de versión 3.3.0
+ Chromium versión 83.0.4103.0

**Actualizaciones en syn-nodejs-2.0**:
+ **Relaciones actualizadas**: esta versión de tiempo de ejecución utiliza Puppeteer-core versión 3.3.0 y Chromium versión 83.0.4103.0
+ **Soporte para el rastreo activo de X-Ray.** Cuando un canario tiene habilitado el seguimiento, se envían los seguimientos de X-Ray para todas las llamadas que canario ha hecho que utilizan el navegador, el SDK de AWS, o módulos HTTP o HTTPS. Los valores controlados con seguimiento activado aparecen en el mapa de seguimiento de X-Ray, incluso cuando no envían solicitudes a otros servicios o aplicaciones que tienen habilitado el rastreo. Para obtener más información, consulte [Canaries y rastreo X-Ray](CloudWatch_Synthetics_Canaries_tracing.md).
+ **Informes de Synthetics**: para cada ejecución del valor controlado, CloudWatch Synthetics crea un informe llamado ` SyntheticsReport-PASSED.json` o ` SyntheticsReport-FAILED.json` que registra datos, como la hora de inicio, la hora de finalización, el estado y los errores. También registra los estados SUPERADO o NO SUPERADO de cada paso del script de valor controlado, así como los fallos y las capturas de pantalla tomadas para cada paso.
+ **Informe del verificador de enlaces que no funcionan**: la nueva versión del verificador de enlaces que no funcionan que está incluido en este tiempo de ejecución crea un informe que incluye los enlaces que se han verificado, el código de estado, el motivo del error (si existe) y las capturas de pantalla de la página fuente y la de destino.
+ **Nuevas métricas de CloudWatch**: Synthetics publica métricas denominadas `2xx`, `4xx`, `5xx`, y `RequestFailed` en el espacio de nombres de `CloudWatchSynthetics`. Estas métricas muestran el número de 200, 400, 500 y los errores de solicitud en las ejecuciones de los valores controlados. Con esta versión de tiempo de ejecución, estas métricas se notifican solo para canaries de la UI y no para canaries de la API. También se reportan para los canaries de la API que comienzan con la versión de tiempo de ejecución ` syn-nodejs-puppeteeer-2.2`.
+ **Archivos HAR ordenables**: ahora puede ordenar los archivos HAR por código de estado, tamaño de solicitud y duración.
+ **Marca de tiempo de las métricas**: las métricas de CloudWatch ahora se informan según el tiempo de invocación de Lambda en lugar de la hora de finalización de la ejecución del valor controlado.

**Corrección de errores en syn-nodejs-2.0**:
+ Se ha corregido el problema de errores de carga de artefactos de valores controlados que no se notificaban. Ahora aparecen como errores de ejecución.
+ Se ha corregido el problema con respecto a las solicitudes redirigidas (3xx) que se registraban incorrectamente como errores.
+ Se ha corregido el problema con respecto a las capturas de pantalla que se enumeraban a partir de 0. Ahora deben comenzar con 1.
+ Se ha corregido el problema con respecto a las capturas de pantalla que eran ilegibles para caracteres chinos y japoneses.

Puede haber un pequeño aumento en la duración del valor controlado al usar syn-nodejs-2.0 o uno posterior, en comparación con versiones anteriores de los tiempos de ejecución de valores controlados.

### syn-nodejs-2.0-beta
<a name="CloudWatch_Synthetics_runtimeversion-2.0-beta"></a>

**importante**  
Esta versión de tiempo de ejecución quedó obsoleta el 8 de febrero de 2021. Para obtener más información, consulte [Política de soporte de versiones del tiempo de ejecución](CloudWatch_Synthetics_Runtime_Support_Policy.md).

**Relaciones principales**:
+ Tiempo de ejecución Node.JS 10.x de Lambda 
+ Puppeteer-core de versión 3.3.0
+ Chromium versión 83.0.4103.0

**Cambios en syn-nodejs-2.0-beta**:
+ **Relaciones actualizadas**: esta versión de tiempo de ejecución utiliza Puppeteer-core versión 3.3.0 y Chromium versión 83.0.4103.0
+ **Informes de Synthetics**: para cada ejecución del valor controlado, CloudWatch Synthetics crea un informe llamado ` SyntheticsReport-PASSED.json` o ` SyntheticsReport-FAILED.json` que registra datos, como la hora de inicio, la hora de finalización, el estado y los errores. También registra los estados SUPERADO o NO SUPERADO de cada paso del script de valor controlado, así como los fallos y las capturas de pantalla tomadas para cada paso.
+ **Informe del verificador de enlaces que no funcionan**: la nueva versión del verificador de enlaces que no funcionan que está incluido en este tiempo de ejecución crea un informe que incluye los enlaces que se han verificado, el código de estado, el motivo del error (si existe) y las capturas de pantalla de la página fuente y la de destino.
+ **Nuevas métricas de CloudWatch**: Synthetics publica métricas denominadas `2xx`, `4xx`, `5xx`, y `RequestFailed` en el espacio de nombres de `CloudWatchSynthetics`. Estas métricas muestran el número de 200, 400, 500 y los errores de solicitud en las ejecuciones de los valores controlados. Estas métricas se notifican solo para los canaries de la UI y no para los canarios de la API.
+ **Archivos HAR ordenables**: ahora puede ordenar los archivos HAR por código de estado, tamaño de solicitud y duración.
+ **Marca de tiempo de las métricas**: las métricas de CloudWatch ahora se informan según el tiempo de invocación de Lambda en lugar de la hora de finalización de la ejecución del valor controlado.

**Corrección de errores en syn-nodejs-2.0-beta**:
+ Se ha corregido el problema de errores de carga de artefactos de valores controlados que no se notificaban. Ahora aparecen como errores de ejecución.
+ Se ha corregido el problema con respecto a las solicitudes redirigidas (3xx) que se registraban incorrectamente como errores.
+ Se ha corregido el problema con respecto a las capturas de pantalla que se enumeraban a partir de 0. Ahora deben comenzar con 1.
+ Se ha corregido el problema con respecto a las capturas de pantalla que eran ilegibles para caracteres chinos y japoneses.

### syn-1.0
<a name="CloudWatch_Synthetics_runtimeversion-1.0"></a>

La primera versión de tiempo de ejecución de Synthetics es `syn-1.0`.

**Relaciones principales**:
+ Tiempo de ejecución Node.JS 10.x de Lambda
+ Puppeteer-core versión 1.14.0
+ La versión de Chromium que coincide con Puppeteer-core 1.14.0

# Versiones en tiempo de ejecución con Python y Selenium Webdriver
<a name="CloudWatch_Synthetics_Library_python_selenium"></a>

Las siguientes secciones contienen información acerca de las versiones de tiempo de ejecución de CloudWatch Synthetics para Python y Selenium Webdriver. Selenium es una herramienta de automatización de navegadores de código abierto. Para obtener más información acerca de Selenium, consulte [www.selenium.dev/](https://www.selenium.dev)

Para conocer las características y los métodos compatibles con el tiempo de ejecución de Synthetics en el marco Selenium, consulte las [clases y funciones de las bibliotecas Python y Selenium que se aplican únicamente a los canarios de la IU](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_UIcanaries) y la [referencia de la API de Selenium](https://www.selenium.dev/selenium/docs/api/py/api.html).

La convención de nomenclatura de estas versiones de tiempo de ejecución es `syn-language -framework-majorversion. minorversion`.

## Syn-python-selenium-10.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-10.0"></a>

La versión 10.0 es el tiempo de ejecución más reciente de CloudWatch Synthetics para Python y Selenium.

**Dependencias principales**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium versión 145.0.7632.77

**Cambios en syn-python-selenium-10.0 ** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones del navegador.

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Selenium](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Documentación de Selenium](https://www.selenium.dev/selenium/docs/api/py/api.html) 

## Versiones de tiempo de ejecución anteriores para Python y Selenium
<a name="Previousversions-python-selenium"></a>

Las siguientes versiones anteriores de tiempo de ejecución para Python y Selenium aún se admiten. 

### Syn-python-selenium-9.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-9.0"></a>

**Dependencias principales**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium versión 143.0.7499.169

**Cambios en syn-python-selenium-9.0 ** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones del navegador.

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Selenium](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Documentación de Selenium](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### Syn-python-selenium-8.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-8.0"></a>

La versión 8.0 es el tiempo de ejecución más reciente de CloudWatch Synthetics para Python y Selenium.

**Dependencias principales**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium versión 142.0.7444.175

**Cambios en syn-python-selenium-8.0 ** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Selenium y del navegador.
+ Se modificó el nivel de registro de solicitudes de red HAR con errores de ERROR a INFO.

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Selenium](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Documentación de Selenium](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-7.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-7.0"></a>

**Dependencias principales**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium, versión 138.0.7204.168

 **Cambios en syn-python-selenium-7.0 ** 
+ Se aplicaron parches de seguridad y se actualizaron las versiones de Selenium y del navegador.

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Selenium](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Documentación de Selenium](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-6.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-6.0"></a>

**Dependencias principales**:
+ Python 3.11
+ Selenium 4.21.0
+ Versión 131.0.6778.264 de Chromium

 **Cambios en syn-python-selenium-6.0** 
+ Actualice de Python 3.9 a Python 3.11.

Para obtener más información, consulte los siguientes temas:
+  [Registro de cambios de Selenium](https://www.selenium.dev/blog/2024/selenium-4-21-released/) 
+  [Documentación de Selenium](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-5.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-5.1"></a>

**Dependencias principales**:
+ Python 3.9
+ Selenium 4.21.0
+ Versión 131.0.6778.264 de Chromium

 **Cambios en syn-python-selenium-5.1** 
+ Actualizaciones menores en la emisión de métricas.
+ Admite simulacros para el canario, lo que permite realizar ejecuciones ad hoc o realizar una actualización segura del canario.

### syn-python-selenium-5.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-5.0"></a>

**Dependencias principales**:
+ Python 3.9
+ Selenium 4.21.0
+ Versión 131.0.6778.264 de Chromium

**Cambios en syn-python-selenium-5.0**:
+ Reintento automático si el navegador no se inicia.

### syn-python-selenium-4.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-4.1"></a>

**Dependencias principales**:
+ Python 3.9
+ Selenium 4.15.1
+ Versión 126.0.6478.126 de Chromium

**Cambios en syn-python-selenium-4.1**:
+ **Soluciona una vulnerabilidad de seguridad**: este tiempo de ejecución incluye una actualización para corregir la vulnerabilidad [CVE-2024-39689](https://nvd.nist.gov/vuln/detail/CVE-2024-39689).

### syn-python-selenium-4.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-4.0"></a>

**Dependencias principales**:
+ Python 3.9
+ Selenium 4.15.1
+ Versión 126.0.6478.126 de Chromium

**Cambios en syn-python-selenium-4.0**:
+ **Se corrigieron** errores en el registro del analizador HAR.

## Versiones de tiempo de ejecución obsoletas para Python y Selenium
<a name="Deprecated-python-selenium"></a>

Las siguientes versiones anteriores de tiempo de ejecución para Python y Selenium han quedado obsoletas. Para obtener información sobre las fechas de obsolescencia de los tiempos de ejecución, consulte [Fechas de obsolescencia del tiempo de ejecución de CloudWatch Synthetics](CloudWatch_Synthetics_Runtime_Support_Policy.md#runtime_deprecation_dates).

### syn-python-selenium-3.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-3.0"></a>

**Relaciones principales**:
+ Python 3.8
+ Selenium 4.15.1
+ Chromium versión 121.0.6167.139

**Cambios en syn-python-selenium-3.0**:
+ **Versiones actualizadas de las bibliotecas agrupadas incluidas en Chromium**: la dependencia de Chromium se actualiza a una versión nueva.

### syn-python-selenium-2.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-2.1"></a>

**Relaciones principales**:
+ Python 3.8
+ Selenium 4.15.1
+ Chromium versión 111.0.5563.146

**Cambios en syn-python-selenium-2.1**:
+ **Versiones actualizadas de las bibliotecas agrupadas incluidas en Chromium**: las dependencias de Chromium y Selenium se actualizan a versiones nuevas.

### syn-python-selenium-2.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-2.0"></a>

**Relaciones principales**:
+ Python 3.8
+ Selenium 4.10.0
+ Chromium versión 111.0.5563.146

**Cambios en syn-python-selenium-2.0**:
+ **Dependencias actualizadas**: las dependencias de Chromium y Selenium se actualizan a las nuevas versiones.

**Correcciones de errores en syn-python-selenium-2.0**:
+ **Marca de tiempo agregada**: se ha agregado una marca de tiempo los registros de valores controlados.
+ **Reutilización de la sesión**: se ha corregido un error que impedía a los valores controlados reutilizar la sesión de su anterior ejecución.

### syn-python-selenium-1.3
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3"></a>

**Relaciones principales**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium versión 92.0.4512.0

**Cambios en syn-python-selenium-1.3**:
+ **Marcas de tiempo más precisas**: la hora de inicio y la hora de parada de las ejecuciones de valores controlados ahora tienen una precisión de milisegundos.

### syn-python-selenium-1.2
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2"></a>

**Relaciones principales**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium versión 92.0.4512.0
+ **Dependencias actualizadas**: las únicas características nuevas de este tiempo de ejecución son las dependencias actualizadas.

### syn-python-selenium-1.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1"></a>

**Relaciones principales**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium versión 83.0.4103.0

**Características**:
+ **Función de controlador personalizada**: ahora puede utilizar una función de controlador personalizada para los scripts de los valores controlados. Los tiempos de ejecución anteriores requerían que el punto de entrada del script incluyera `.handler`. 

  También puede colocar scripts de valores controlados en cualquier carpeta y pasar el nombre de la carpeta como parte del controlador. Por ejemplo, `MyFolder/MyScriptFile.functionname` se puede utilizar como punto de entrada.
+ **Opciones de configuración para agregar métricas y configuraciones de error de pasos**: estas opciones ya estaban disponibles en los tiempos de ejecución para los valores controlados de Node.js. Para obtener más información, consulte  [Clase SyntheticsConfiguration](CloudWatch_Synthetics_Canaries_Library_Python.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python) .
+ **Argumentos personalizados en Chrome**: ahora puede abrir un navegador en el modo de incógnito o pasar con la configuración del servidor proxy. Para obtener más información, consulte [Chrome()](CloudWatch_Synthetics_Canaries_Library_Python.md#CloudWatch_Synthetics_Library_Python_Chrome).
+ **Buckets de artefactos de varias regiones**: un valor controlado puede almacenar sus artefactos en un bucket de Amazon S3 de una región diferente.
+ **Correcciones de errores, incluida una corrección para el problema `index.py`**: con los tiempos de ejecución anteriores, un archivo de valor controlado denominado ` index.py` causaba excepciones porque entraba en conflicto con el nombre del archivo de la biblioteca. Este problema ya está resuelto.

### Syn-python-selenium-1.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0"></a>

**Relaciones principales**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium versión 83.0.4103.0

**Características**:
+ **Compatibilidad con Selenium**: puede escribir scripts de valores controlados mediante el marco de prueba de Selenium. Puede llevar los scripts de Selenium desde otro lugar a CloudWatch Synthetics con cambios mínimos, y funcionarán con servicios de AWS.

# Versiones de tiempo de ejecución con Node.js
<a name="CloudWatch_Synthetics_Library_Nodejs"></a>

La siguiente sección contiene información acerca de las versiones de tiempo de ejecución de CloudWatch Synthetics para Node.js. Este tiempo de ejecución no incluye ningún navegador ni marco.

La convención de nomenclatura de estas versiones de tiempo de ejecución es `syn-language -majorversion.minorversion`.

## syn-nodejs-4.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-4.1"></a>

**importante**  
Al iniciar Synthetics `syn-nodejs-3.1` y versiones posteriores, el tiempo de ejecución de Synthetics usará el nuevo espacio de nombres. Migre el script de canario para usar el nuevo espacio de nombres. El espacio de nombres heredado quedará obsoleto en un futuro lanzamiento.  
q@amzn/synthetics-core → @aws/synthetics-core

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 22.x

 **Cambios en syn-nodejs-4.1** 
+ Actualice `fast-xml-parser` a la versión 5.5.7 para corregir las siguientes CVE:
  + CVE-2026-25128
  + CVE-2026-25896
  + CVE-2026-26278
  + CVE-2026-27942
  + CVE-2026-33036

## Versiones de tiempo de ejecución anteriores para Node.js
<a name="Previousversions-nodejs"></a>

Las siguientes versiones de tiempo de ejecución anteriores para Node.js aún se admiten. 

### syn-nodejs-4.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-4.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 22.x

 **Cambios en syn-nodejs-4.0** 
+ Parches de seguridad aplicados. 

### syn-nodejs-3.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-3.1"></a>

**importante**  
Al iniciar Synthetics `syn-nodejs-3.1` y versiones posteriores, el tiempo de ejecución de Synthetics usará el nuevo espacio de nombres. Migre el script de canario para usar el nuevo espacio de nombres. El espacio de nombres heredado quedará obsoleto en un futuro lanzamiento.  
q@amzn/synthetics-core → @aws/synthetics-core

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 20.x

 **Cambios en syn-nodejs-3.1** 
+ Migración del espacio de nombres del tiempo de ejecución de Synthetics. 
+ La definición de tipo está disponible en [npm Registry](https://www.npmjs.com/package/@aws/synthetics-core). Asegúrese de que la versión del paquete de definición de tipos coincida con la versión de tiempo de ejecución de su canario.

### syn-nodejs-3.0
<a name="Synthetics_runtimeversion-syn-nodejs-3.0"></a>

**Dependencias principales**:
+ Tiempo de ejecución de AWS Lambda: Node.js 20.x

 **Cambios en syn-nodejs-3.0** 
+ Compatibilidad con un esquema de varias comprobaciones. 

# Política de soporte de versiones del tiempo de ejecución
<a name="CloudWatch_Synthetics_Runtime_Support_Policy"></a>

Las versiones de tiempo de ejecución de Synthetics están sujetas a operaciones de mantenimiento y actualizaciones de seguridad. Cuando cualquier componente de una versión de tiempo de ejecución deja de ser compatible, dicha versión de tiempo de ejecución de Synthetics queda obsoleta.

No puede crear canaries nuevos con versiones de tiempo de ejecución obsoletas. Los Canaries que utilizan tiempos de ejecución obsoletos siguen ejecutándose. Puede detener, iniciar y eliminar estos canaries. Para actualizar un valor controlado existente que utiliza versiones de tiempo de ejecución obsoletas, actualícelo de forma que utilice una versión de tiempo de ejecución compatible.

CloudWatch Synthetics le notifica por email si tiene canaries que utilizan tiempos de ejecución programados para quedar obsoletos en los próximos 60 días. Se recomienda que migre los canaries a una versión de tiempo de ejecución compatible para beneficiarse de las nuevas mejoras de funcionalidad, seguridad y de rendimiento que se incluyen en las versiones más recientes. 

## Fechas de obsolescencia del tiempo de ejecución de CloudWatch Synthetics
<a name="runtime_deprecation_dates"></a>

La siguiente tabla enumera la fecha de obsolescencia de cada tiempo de ejecución de CloudWatch Synthetics que se encuentra obsoleto.


| Versión de tiempo de ejecución | Fecha de caducidad | 
| --- | --- | 
|   `syn-python-selenium-5.1`   |  3 de febrero de 2026  | 
|   `syn-python-selenium-5.0`   |  3 de febrero de 2026  | 
|   `syn-python-selenium-4.1`   |  3 de febrero de 2026  | 
|   `syn-python-selenium-4.0`   |  3 de febrero de 2026  | 
|   `syn-nodejs-puppeteer-7.0`   |  22 de enero de 2026  | 
|   `syn-nodejs-puppeteer-6.2`   |  22 de enero de 2026  | 
|   `syn-nodejs-puppeteer-5.2`   |  22 de enero de 2026  | 
|   `syn-python-selenium-3.0`   |  22 de enero de 2026  | 
|   `syn-python-selenium-2.1`   |  22 de enero de 2026  | 
|   `syn-nodejs-puppeteer-6.1`   |  8 de marzo de 2024  | 
|   `syn-nodejs-puppeteer-6.0`   |  8 de marzo de 2024  | 
|   `syn-nodejs-puppeteer-5.1`   |  8 de marzo de 2024  | 
|   `syn-nodejs-puppeteer-5.0`   |  8 de marzo de 2024  | 
|   `syn-nodejs-puppeteer-4.0`   |  8 de marzo de 2024  | 
|   `syn-nodejs-puppeteer-3.9`   |  8 de enero de 2024  | 
|   `syn-nodejs-puppeteer-3.8`   |  8 de enero de 2024  | 
|   `syn-python-selenium-2.0`   |  8 de marzo de 2024  | 
|   `syn-python-selenium-1.3`   |  8 de marzo de 2024  | 
|   `syn-python-selenium-1.2`   |  8 de marzo de 2024  | 
|   `syn-python-selenium-1.1`   |  8 de marzo de 2024  | 
|   `syn-python-selenium-1.0`   |  8 de marzo de 2024  | 
|   `syn-nodejs-puppeteer-3.7`   |  8 de enero de 2024  | 
|   `syn-nodejs-puppeteer-3.6`   |  8 de enero de 2024  | 
|   `syn-nodejs-puppeteer-3.5`   |  8 de enero de 2024  | 
|   `syn-nodejs-puppeteer-3.4`   |  13 de noviembre de 2022  | 
|   `syn-nodejs-puppeteer-3.3`   |  13 de noviembre de 2022  | 
|   `syn-nodejs-puppeteer-3.2`   |  13 de noviembre de 2022  | 
|   `syn-nodejs-puppeteer-3.1`   |  13 de noviembre de 2022  | 
|   `syn-nodejs-puppeteer-3.0`   |  13 de noviembre de 2022  | 
|   `syn-nodejs-2.2`   |  28 de mayo de 2021  | 
|   `syn-nodejs-2.1`   |  28 de mayo de 2021  | 
|   `syn-nodejs-2.0`   |  28 de mayo de 2021  | 
|   `syn-nodejs-2.0-beta`   |  8 de febrero de 2021  | 
|   `syn-1.0`   |  28 de mayo de 2021  | 

# Actualización de las versiones del tiempo de ejecución
<a name="CloudWatch_Synthetics_Runtime_Version_Update"></a>

Se puede actualizar la versión en tiempo de ejecución de un valor controlado mediante la consola de CloudWatch, AWS CloudFormation, AWS CLI o el SDK de AWS. Cuando utilice la consola de CloudWatch, puede actualizar hasta cinco canarios a la vez si los selecciona en la página de la lista de canarios y, a continuación, elige **Acciones**, **Actualizar tiempo de ejecución**.

Puede verificar la actualización del tiempo de ejecución probándola antes de confirmarla. Al actualizar las versiones de tiempo de ejecución, elija las opciones **Iniciar simulacro** o **Validar y guardar más tarde** en la consola de CloudWatch para crear un simulacro del canario original junto con los cambios que haya realizado en la configuración. El simulacro actualizará y ejecutará el canario para validar si la actualización del tiempo de ejecución es segura para este. Una vez que haya verificado el canario con la nueva versión de tiempo de ejecución, puede actualizar su versión del tiempo de ejecución. Para obtener más información, consulte [Actualizaciones seguras del canario](performing-safe-canary-upgrades.md).

De otro modo, puede verificar la actualización clonando primero el canario mediante la consola de CloudWatch y actualizando la versión de tiempo de ejecución. Esto crea otro valor controlado que es un clon del valor controlado original. Una vez que haya verificado el valor controlado con la nueva versión de tiempo de ejecución, puede actualizar la versión de tiempo de ejecución del valor controlado original y eliminar el valor controlado clon.

 También puede actualizar varios canaries si se utiliza un script de actualización. Para obtener más información, consulte [Script de actualización en tiempo de ejecución de valores controlados](#CloudWatch_Synthetics_Canaries_upgrade_script).

Si se actualiza un valor controlado y falla, consulte [Solución de problemas de un valor controlado](CloudWatch_Synthetics_Canaries_Troubleshoot.md).

## Script de actualización en tiempo de ejecución de valores controlados
<a name="CloudWatch_Synthetics_Canaries_upgrade_script"></a>

Para actualizar un script de valor controlado a una versión compatible de tiempo de ejecución, utilice el siguiente script.

```
const AWS = require('aws-sdk');

// You need to configure your AWS credentials and Region.
//   https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
//   https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-region.html

const synthetics = new AWS.Synthetics();

const DEFAULT_OPTIONS = {
  /**
   * The number of canaries to upgrade during a single run of this script.
   */
  count: 10,
  /**
   * No canaries are upgraded unless force is specified.
   */
  force: false
};

/**
 * The number of milliseconds to sleep between GetCanary calls when
 * verifying that an update succeeded.
 */
const SLEEP_TIME = 5000;

(async () => {
  try {
    const options = getOptions();

    const versions = await getRuntimeVersions();
    const canaries = await getAllCanaries();
    const upgrades = canaries
      .filter(canary => !versions.isLatestVersion(canary.RuntimeVersion))
      .map(canary => {
        return {
          Name: canary.Name,
          FromVersion: canary.RuntimeVersion,
          ToVersion: versions.getLatestVersion(canary.RuntimeVersion)
        };
      });

    if (options.force) {
      const promises = [];

      for (const upgrade of upgrades.slice(0, options.count)) {
        const promise = upgradeCanary(upgrade);
        promises.push(promise);
        // Sleep for 100 milliseconds to avoid throttling.
        await usleep(100);
      }

      const succeeded = [];
      const failed = [];
      for (let i = 0; i < upgrades.slice(0, options.count).length; i++) {
        const upgrade = upgrades[i];
        const promise = promises[i];
        try {
          await promise;
          console.log(`The update of ${upgrade.Name} succeeded.`);
          succeeded.push(upgrade.Name);
        } catch (e) {
          console.log(`The update of ${upgrade.Name} failed with error: ${e}`);
          failed.push({
            Name: upgrade.Name,
            Reason: e
          });
        }
      }

      if (succeeded.length) {
        console.group('The following canaries were upgraded successfully.');
        for (const name of succeeded) {
          console.log(name);
        }
        console.groupEnd()
      } else {
        console.log('No canaries were upgraded successfully.');
      }

      if (failed.length) {
        console.group('The following canaries were not upgraded successfully.');
        for (const failure of failed) {
          console.log('\x1b[31m', `${failure.Name}: ${failure.Reason}`, '\x1b[0m');
        }
        console.groupEnd();
      }
    } else {
      console.log('Run with --force [--count <count>] to perform the first <count> upgrades shown. The default value of <count> is 10.')
      console.table(upgrades);
    }
  } catch (e) {
    console.error(e);
  }
})();

function getOptions() {
  const force = getFlag('--force', DEFAULT_OPTIONS.force);
  const count = getOption('--count', DEFAULT_OPTIONS.count);
  return { force, count };

  function getFlag(key, defaultValue) {
    return process.argv.includes(key) || defaultValue;
  }
  function getOption(key, defaultValue) {
    const index = process.argv.indexOf(key);
    if (index < 0) {
      return defaultValue;
    }
    const value = process.argv[index + 1];
    if (typeof value === 'undefined' || value.startsWith('-')) {
      throw `The ${key} option requires a value.`;
    }
    return value;
  }
}

function getAllCanaries() {
  return new Promise((resolve, reject) => {
    const canaries = [];

    synthetics.describeCanaries().eachPage((err, data) => {
      if (err) {
        reject(err);
      } else {
        if (data === null) {
          resolve(canaries);
        } else {
          canaries.push(...data.Canaries);
        }
      }
    });
  });
}

function getRuntimeVersions() {
  return new Promise((resolve, reject) => {
    const jsVersions = [];
    const pythonVersions = [];
    synthetics.describeRuntimeVersions().eachPage((err, data) => {
      if (err) {
        reject(err);
      } else {
        if (data === null) {
          jsVersions.sort((a, b) => a.ReleaseDate - b.ReleaseDate);
          pythonVersions.sort((a, b) => a.ReleaseDate - b.ReleaseDate);
          resolve({
            isLatestVersion(version) {
              const latest = this.getLatestVersion(version);
              return latest === version;
            },
            getLatestVersion(version) {
              if (jsVersions.some(v => v.VersionName === version)) {
                return jsVersions[jsVersions.length - 1].VersionName;
              } else if (pythonVersions.some(v => v.VersionName === version)) {
                return pythonVersions[pythonVersions.length - 1].VersionName;
              } else {
                throw Error(`Unknown version ${version}`);
              }
            }
          });
        } else {
          for (const version of data.RuntimeVersions) {
            if (version.VersionName === 'syn-1.0') {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-nodejs-2.')) {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-nodejs-puppeteer-')) {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-python-selenium-')) {
              pythonVersions.push(version);
            } else {
              throw Error(`Unknown version ${version.VersionName}`);
            }
          }
        }
      }
    });
  });
}

async function upgradeCanary(upgrade) {
  console.log(`Upgrading canary ${upgrade.Name} from ${upgrade.FromVersion} to ${upgrade.ToVersion}`);
  await synthetics.updateCanary({ Name: upgrade.Name, RuntimeVersion: upgrade.ToVersion }).promise();
  while (true) {
    await usleep(SLEEP_TIME);
    console.log(`Getting the state of canary ${upgrade.Name}`);
    const response = await synthetics.getCanary({ Name: upgrade.Name }).promise();
    const state = response.Canary.Status.State;
    console.log(`The state of canary ${upgrade.Name} is ${state}`);
    if (state === 'ERROR' || response.Canary.Status.StateReason) {
      throw response.Canary.Status.StateReason;
    }
    if (state !== 'UPDATING') {
      return;
    }
  }
}

function usleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
```

# Escritura de un script de valor controlado
<a name="CloudWatch_Synthetics_Canaries_WritingCanary"></a>

En las siguientes secciones, se explica cómo escribir un script de canario y cómo integrar un canario con otros servicios de AWS y con bibliotecas y dependencias externas.

**Topics**
+ [Escritura de un script de canario mediante el tiempo de ejecución de Java](Synthetics_WritingCanary_Java.md)
+ [Escritura de un script de canario de Node.js mediante el tiempo de ejecución de Playwright](Synthetics_WritingCanary_Nodejs_Playwright.md)
+ [Escritura de un script de canario de Node.js mediante el tiempo de ejecución de Puppeteer](CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup.md)
+ [Escritura de un script de valor controlado Python](CloudWatch_Synthetics_Canaries_WritingCanary_Python.md)
+ [Escritura de una configuración JSON para un esquema de comprobaciones múltiples de Node.js](CloudWatch_Synthetics_WritingCanary_Multichecks.md)

# Escritura de un script de canario mediante el tiempo de ejecución de Java
<a name="Synthetics_WritingCanary_Java"></a>

**Topics**
+ [Estructura de proyecto Java para un canario](#Synthetics_canary_Java_package)
+ [Empaquetado del proyecto para un canario](#Synthetics_canary_Java_package_canary)
+ [Nombre del controlador](#Synthetics_canary_Java_handler)
+ [Configuraciones de CloudWatch Synthetics](#Synthetics_canary_Java_config)
+ [Variables de entorno de CloudWatch Synthetics](#Synthetics_canary_Java_variables)

## Estructura de proyecto Java para un canario
<a name="Synthetics_canary_Java_package"></a>

Para crear un canario en Java, debe escribir el código, compilarlo e implementar los artefactos compilados en Synthetics. Puede inicializar un proyecto de Lambda en Java de varias maneras. Por ejemplo, puede usar una configuración de proyecto Java estándar en su IDE preferido, como IntelliJ IDEA o Visual Studio Code. Si lo prefiere, puede crear la estructura de archivos necesaria de forma manual.

Un proyecto de Synthetics Java contiene la siguiente estructura general:

```
/project-root
    └ src
        └ main
            └ java
                └ canarypackage // name of package
                |    └ ExampleCanary.java // Canary code file
                |    └ other_supporting_classes
                - resources
                     └ synthetics.json // Synthetics configuration file    
     └ build.gradle OR pom.xml
```

Puede usar Maven o Gradle para crear su proyecto y administrar las dependencias.

En la estructura anterior, la clase `ExampleCanary` es el punto de entrada o el controlador del canario.

 **Ejemplo de clase de canario de Java** 

Este ejemplo es para un canario que realiza una solicitud GET a una URL almacenada en la variable de entorno *TESTING\$1URL* de Lambda. El canario no utiliza ninguno de los métodos proporcionados por el tiempo de ejecución de Synthetics.

```
package canarypackage;

import java.net.HttpURLConnection;
import java.net.URL;

// Handler value: canary.ExampleCanary::canaryCode
public class ExampleCanary { 
  public void canaryCode() throws Exception{ 
      URL url = new URL(System.getenv("TESTING_URL"));
      HttpURLConnection con=(HttpURLConnection)url.openConnection();
      con.setRequestMethod("GET");
      con.setConnectTimeout(5000);
      con.setReadTimeout(5000);
      int status=con.getResponseCode();
      if(status!=200){
        throw new Exception("Failed to load " + url + ", status code: " + status);
      }
  }
}
```

Se recomienda encarecidamente modularizar sus canarios utilizando la función `executeStep` de biblioteca proporcionada por Synthetics. El canario realiza llamadas `get` a dos URL independientes obtenidas de las variables de entorno URL1 y URL2.

**nota**  
Para utilizar la funcionalidad `executeStep`, el método de manejo del canario debe incluir un parámetro del tipo Synthetics, como se muestra a continuación. 

```
package canarypackage;

import com.amazonaws.synthetics.Synthetics;
import java.net.HttpURLConnection;
import java.net.URL;

// Handler value: canary.ExampleCanary::canaryCode
public class ExampleCanary {
  public void canaryCode(Synthetics synthetics) throws Exception {
    createStep("Step1", synthetics, System.getenv("URL1"));
    createStep("Step2", synthetics, System.getenv("URL2"));
    return;
  }
  
  private void createStep(String stepName, Synthetics synthetics, String url) throws Exception{
    synthetics.executeStep(stepName,()->{
      URL obj=new URL(url);
      HttpURLConnection con=(HttpURLConnection)obj.openConnection();
      con.setRequestMethod("GET");
      con.setConnectTimeout(5000);
      con.setReadTimeout(5000);
      int status=con.getResponseCode();
      if(status!=200){
        throw new Exception("Failed to load" + url + "status code:" + status);
      }
      return null;
    }).get();
  }
}
```

## Empaquetado del proyecto para un canario
<a name="Synthetics_canary_Java_package_canary"></a>

Synthetics acepta el código de un canario de Java en formato *zip*. El zip consta de los archivos de clases para el código del canario, los jars para cualquier dependencia de terceros y el archivo de configuración de Synthetics.

Un zip de Synthetics Java contiene la siguiente estructura general.

```
example-canary
    └ lib
    |  └ //third party dependency jars
       └ java-canary.jar
    └ synthetics.json
```

Para crear este zip a partir de la estructura de proyecto anterior, puede usar gradle (build.gradle) o maven (pom.xml). A continuación se muestra un ejemplo.

Para obtener información sobre las dependencias o interfaces en tiempo de compilación de la biblioteca de Synthetics, consulte el README en [aws-cloudwatch-synthetics-sdk-java](https://github.com/aws/aws-cloudwatch-synthetics-sdk-java/tree/main).

```
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    // Third party dependencies 
    // example: implementation 'software.amazon.awssdk:s3:2.31.9'
    
    // Declares dependency on Synthetics interfaces for compiling only
    // Refer https://github.com/aws/aws-cloudwatch-synthetics-sdk-java for building from source.
    compileOnly 'software.amazon.synthetics:aws-cloudwatch-synthetics-sdk-java:1.0.0'}

test {
    useJUnitPlatform()
}

// Build the zip to be used as Canary code.
task buildZip(type: Zip) {

    archiveFileName.set("example-canary.zip")
    destinationDirectory.set(file("$buildDir"))
    
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
        from(tasks.named("jar"))
    }
    from "src/main/java/resources/synthetics.json"
    
    doLast {
        println "Artifact written to: ${archiveFile.get().asFile.absolutePath}"
    }
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

tasks.named("build") {
    dependsOn "buildZip"
}
```

## Nombre del controlador
<a name="Synthetics_canary_Java_handler"></a>

El nombre del controlador es el punto de entrada para el canario. Para el tiempo de ejecución de Java, el controlador tiene el siguiente formato.

```
<<full qualified name for canary class>>::<<name of the method to start the execution from>>
// for above code: canarypackage.ExampleCanary::canaryCode
```

## Configuraciones de CloudWatch Synthetics
<a name="Synthetics_canary_Java_config"></a>

Para poder configurar el comportamiento del tiempo de ejecución de Synthetics Java, proporcione un archivo de configuración JSON opcional denominado `synthetics.json`. Este archivo debe empaquetarse en el directorio raíz del zip del paquete. Aunque un archivo de configuración es opcional, si no se proporciona uno o falta una clave de configuración, CloudWatch asume los valores predeterminados.

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

```
{
    "step": {
        "stepSuccessMetric": true,
        "stepDurationMetric": true,
        "continueOnStepFailure": false,
        "stepsReport": true
    },
    "logging": {
        "logRequest": false,
        "logResponse": false
    },
    "httpMetrics": {
        "metric_2xx": true,
        "metric_4xx": true,
        "metric_5xx": true,
        "aggregated2xxMetric": true,
        "aggregated4xxMetric": true,
        "aggregated5xxMetric": true
    },
    "canaryMetrics": {
        "failedCanaryMetric": true,
        "aggregatedFailedCanaryMetric": true
    }
}
```

 **Configuraciones de pasos** 
+ *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 puesta en marcha de canarios 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 registros** 

Se aplica a los registros generados por CloudWatch Synthetics. Controla el nivel de detalle de los registros de solicitudes y respuestas.
+ *logRequest*: especifica si se debe registrar cada solicitud en los registros de canarios. El valor predeterminado es false.
+ *logResponse*: especifica si se debe registrar cada respuesta en los registros de canarios. 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\$12xx*: especifica si se debe emitir la métrica *2xx* (con la dimensión CanaryName) para este canario. El valor predeterminado es *true*.
+ *metric\$14xx*: especifica si se debe emitir la métrica *4xx* (con la dimensión CanaryName) para este canario. El valor predeterminado es *true*.
+ *metric\$15xx*: especifica si se debe emitir la métrica *5xx* (con la dimensión CanaryName) para este canario. El valor predeterminado es *true*.
+ *aggregated2xxMetric*: especifica si se debe emitir la métrica *2xx* (sin la dimensión CanaryName) para este canario. El valor predeterminado es *true*.
+ *aggregated4xxMetric*: especifica si se debe emitir la métrica *4xx* (sin la dimensión CanaryName) para este canario. El valor predeterminado es *true*.
+ *aggregated5xxMetric*: especifica 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*: Analizador de acceso a la red especifica si se debe emitir la métrica *Failed* (con la dimensión CanaryName) para este canario. El valor predeterminado es *true*.
+ *aggregatedFailedCanaryMetric*: especifica si se debe emitir la métrica *Failed* (sin la dimensión CanaryName) para este canario. El valor predeterminado es *true*.

## Variables de entorno de CloudWatch Synthetics
<a name="Synthetics_canary_Java_variables"></a>

Puede configurar el nivel y el formato de los registros mediante variables de entorno.

 **Formato de registro** 

El tiempo de ejecución de CloudWatch Synthetics Java 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*.
+ *Nombre de variable de entorno*: CW\$1SYNTHETICS\$1LOG\$1FORMAT
+ *Valores admitidos*: JSON, TEXT
+ *Predeterminado*: JSON

 **Niveles de registro** 
+ *Nombre de variable de entorno*: CW\$1SYNTHETICS\$1LOG\$1LEVEL
+ *Valores admitidos*: TRACE, DEBUG, INFO, WARN, ERROR, FATAL
+ *Predeterminado*: INFO

Además de las variables de entorno anteriores, se añade una variable de entorno predeterminada para el tiempo de ejecución de Java. Añada la variable de entorno `AWS_LAMBDA-EXEC_WRAPPER` a su función y establezca su valor en `/opt/synthetics-otel-instrument`. Esta variable de entorno modifica el comportamiento de inicio de la función para la telemetría. Si esta variable de entorno ya existe, asegúrese de que esté establecida en el valor requerido.

# Escritura de un script de canario de Node.js mediante el tiempo de ejecución de Playwright
<a name="Synthetics_WritingCanary_Nodejs_Playwright"></a>

**Topics**
+ [Empaquetado de los archivos de canarios de Node.js para el tiempo de ejecución de Playwright](#Synthetics_canary_Nodejs_Playwright_package)
+ [Cambio de un script de Playwright existente para usarlo como canario de CloudWatch Synthetics](#CloudWatch_Synthetics_canary_edit_Playwright_script)
+ [Configuraciones de CloudWatch Synthetics](#Synthetics_canary_configure_Playwright_script)

## Empaquetado de los archivos de canarios de Node.js para el tiempo de ejecución de Playwright
<a name="Synthetics_canary_Nodejs_Playwright_package"></a>

 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
<a name="CloudWatch_Synthetics_canary_edit_Playwright_script"></a>

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](https://playwright.dev/docs/api/class-playwright). 

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
     };
   ```

1. Importe `Synthetics Playwright module` como una dependencia.

   ```
   import { synthetics } from '@aws/synthetics-playwright';
   ```

1. Inicie un navegador con la función `Launch` de Synthetics.

   ```
   const browser = await synthetics.launch();
   ```

1. 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 '@aws/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('@aws/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
<a name="Synthetics_canary_configure_Playwright_script"></a>

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
<a name="Synthetics_canary_Nodejs_Playwright_script"></a>

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\$1SYNTHETICS\$1LOG\$1FORMAT 
+ `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\$1SYNTHETICS\$1LOG\$1LEVEL
+ `Supported values`: TRACE, DEBUG, INFO, WARN, ERROR, FATAL 
+ `Default`: INFO

# Escritura de un script de canario de Node.js mediante el tiempo de ejecución de Puppeteer
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup"></a>

**Topics**
+ [Creación de un valor controlado de CloudWatch Synthetics desde cero](#CloudWatch_Synthetics_Canaries_write_from_scratch)
+ [Empaquetado de los archivos de valores controlados de Node.js](#CloudWatch_Synthetics_Canaries_package)
+ [Cambio de un script de Puppeteer existente para usarlo como valor controlado de Synthetics](#CloudWatch_Synthetics_Canaries_modify_puppeteer_script)
+ [Variables de entorno](#CloudWatch_Synthetics_Environment_Variables)
+ [Integración del valor controlado con otros servicios de AWS](#CloudWatch_Synthetics_Canaries_AWS_integrate)
+ [Forzar al valor controlado para que utilice una dirección IP estática](#CloudWatch_Synthetics_Canaries_staticIP)

## Creación de un valor controlado de CloudWatch Synthetics desde cero
<a name="CloudWatch_Synthetics_Canaries_write_from_scratch"></a>

Aquí hay un ejemplo de script mínimo de valor controlado de Synthetics. Este script pasa como una ejecución correcta y devuelve una cadena. Para ver el aspecto de un valor controlado erróneo, cambie `let fail = false;` a `let fail = true;`. 

Debe definir una función de punto de entrada para el script de valor controlado. Para ver cómo se cargan los archivos en la ubicación de Amazon S3 especificada como `ArtifactS3Location` del canario, cree estos archivos en la carpeta `/tmp`. Todos los artefactos de canarios deben almacenarse en el directorio `/tmp`, ya que es el único en el que se puede escribir. Asegúrese de que la ruta de la captura de pantalla esté establecida en `/tmp` para todas las capturas de pantalla u otros archivos creados por el script. Synthetics carga los archivos automáticamente de ` /tmp` en un bucket de S3.

```
/tmp/<name>
```

Después de que el script se ejecuta, el estado superado o no superado y las métricas de duración se ejecutan en CloudWatch y los archivos bajo `/tmp` se cargan en un bucket de S3.

```
const basicCustomEntryPoint = async function () {

    // Insert your code here

    // Perform multi-step pass/fail check

    // Log decisions made and results to /tmp

    // Be sure to wait for all your code paths to complete 
    // before returning control back to Synthetics.
    // In that way, your canary will not finish and report success
    // before your code has finished executing

    // Throw to fail, return to succeed
    let fail = false;
    if (fail) {
        throw "Failed basicCanary check.";
    }

    return "Successfully completed basicCanary checks.";
};

exports.handler = async () => {
    return await basicCustomEntryPoint();
};
```

A continuación, expandiremos el script para usar el registro de Synthetics y realizar una llamada usando el SDK de AWS. A modo de demostración, este script creará un cliente de Amazon DynamoDB y realizará una llamada a las listTables DynamoDB de la API. Registra la respuesta a la solicitud y los registros se superan o no en función de si la solicitud se realizó correctamente.

```
const log = require('@aws/synthetics-logger');
const AWS = require('aws-sdk');
// Require any dependencies that your script needs
// Bundle additional files and dependencies into a .zip file with folder structure
// nodejs/node_modules/additional files and folders

const basicCustomEntryPoint = async function () {

    log.info("Starting DynamoDB:listTables canary.");
    
    let dynamodb = new AWS.DynamoDB();
    var params = {};
    let request = await dynamodb.listTables(params);
    try {
        let response = await request.promise();
        log.info("listTables response: " + JSON.stringify(response));
    } catch (err) {
        log.error("listTables error: " + JSON.stringify(err), err.stack);
        throw err;
    }

    return "Successfully completed DynamoDB:listTables canary.";
};

exports.handler = async () => {
    return await basicCustomEntryPoint();
};
```

## Empaquetado de los archivos de valores controlados de Node.js
<a name="CloudWatch_Synthetics_Canaries_package"></a>

 **Para syn-nodejs-puppeteer-11.0 y versiones posteriores** 

 La estructura de empaquetado anterior (para syn-nodejs-puppeteer-10.0 y versiones anteriores) sigue siendo compatible con las versiones más recientes.

Cree un script utilizando una de las siguientes opciones:
+ Archivo .js (sintaxis de CommonJS)
+ Archivo .mjs (sintaxis de los módulos de ES)

Para los módulos de ES, utilice una de las siguientes opciones:
+ Archivo .js (sintaxis de CommonJS)
+ Archivo .mjs (sintaxis de los módulos de ES)

La estructura de los paquetes se define a continuación:
+ Archivo de controlador a nivel raíz (index.js/index.mjs)
+ Archivo de configuración opcional (synthetics.json)
+ Dependencias adicionales en node\$1modules (de ser necesarias)

Ejemplo de estructura de empaquetado:

```
  my_function/
├── index.mjs
├── synthetics.json
├── helper-utils.mjs
└── node_modules/
    └── dependencies
```

Para empaquetar, siga los pasos que se indican a continuación:

1. Instale las dependencias (si las hay).

   ```
   npm install
   ```

1. Cree un paquete .zip.

   ```
   zip -r my_deployment_package.zip
   ```

 **Para syn-nodejs-puppeteer-11.0 y versiones anteriores** 

Cuando se usa Amazon S3, se requiere la siguiente estructura:

```
  nodejs/
└── node_modules/
    └── myCanaryFilename.js
```

 **Para añadir compatibilidad opcional para subcarpetas en syn-nodejs-puppeteer-3.4\$1:** 

```
nodejs/
└── node_modules/
    └── myFolder/
        └── myCanaryFilename.js
```

**nota**  
La ruta del controlador en la configuración debe coincidir con la ubicación del archivo.

 **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. Si utiliza un tiempo de ejecución anterior a `syn-nodejs-puppeteer-3.4`, el `functionName` debe ser `handler`. Si utiliza ` syn-nodejs-puppeteer-3.4` o uno posterior, puede elegir cualquier nombre de función como el controlador. Si utiliza `syn-nodejs-puppeteer-3.4` o uno posterior, también puede almacenar el valor controlado en una carpeta independiente, como ` nodejs/node_modules/myFolder/my_canary_filename`. 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 Puppeteer existente para usarlo como valor controlado de Synthetics
<a name="CloudWatch_Synthetics_Canaries_modify_puppeteer_script"></a>

En esta sección se explica cómo tomar scripts de Puppeteer y modificarlos para que se ejecuten como scripts de valor controlado de Synthetics. Para obtener más información acerca de Puppeteer, consulte [Puppeteer API v1.14.0](https://github.com/puppeteer/puppeteer/blob/v1.14.0/docs/api.md). 

Comenzaremos con este ejemplo de script de Puppeteer:

```
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();
```

Los pasos de conversión son los siguientes:
+ Crear y exportar una función de `handler`. El controlador es la función de punto de entrada para el script. Si utiliza un tiempo de ejecución anterior a ` syn-nodejs-puppeteer-3.4`, la función del controlador debe denominarse `handler`. Si utiliza `syn-nodejs-puppeteer-3.4` o uno posterior, la función puede tener cualquier nombre, pero debe ser el mismo nombre que se usa en el script. Además, si utiliza `syn-nodejs-puppeteer-3.4` o uno posterior, puede almacenar los scripts en cualquier carpeta y especificar dicha carpeta como parte del nombre del controlador.

  ```
  const basicPuppeteerExample = async function () {};
  
  exports.handler = async () => {
      return await basicPuppeteerExample();
  };
  ```
+ Use la dependencia de `Synthetics`.

  ```
  var synthetics = require('@aws/synthetics-puppeteer');
  ```
+ Utilice la función de `Synthetics.getPage` para obtener un objeto `Page` de Puppeteer.

  ```
  const page = await synthetics.getPage();
  ```

  El objeto de página devuelto por la función Synthetics.getPage tiene instrumentados para el registro los eventos `request`, `response` y ` requestfailed` de **page.on**. Synthetics también configura la generación de archivos HAR para las solicitudes y respuestas en la página y agrega el ARN del valor controlado a los encabezados del agente de usuario de las solicitudes salientes en la página.

El script ya está listo para ser ejecutado como un valor controlado de Synthetics. Aquí está el script actualizado:

```
var synthetics = require('@aws/synthetics-puppeteer');  // Synthetics dependency

const basicPuppeteerExample = async function () {
    const page = await synthetics.getPage(); // Get instrumented page from Synthetics
    await page.goto('https://example.com');
    await page.screenshot({path: '/tmp/example.png'}); // Write screenshot to /tmp folder
};

exports.handler = async () => {  // Exported handler function 
    return await basicPuppeteerExample();
};
```

## Variables de entorno
<a name="CloudWatch_Synthetics_Environment_Variables"></a>

Puede utilizar variables de entorno al crear canaries. Esto le permite escribir un único script de valor controlado y luego usar ese script con diferentes valores para crear rápidamente varios valores controlados que tengan una tarea similar.

Suponga, por ejemplo, que su organización tiene puntos de enlaces como `prod`, ` dev`, y `pre-release` para las diferentes etapas del desarrollo del software, y que necesita crear canaries para probar cada uno de estos puntos de enlace. Puede escribir un único script de valor controlado que pruebe el software y, a continuación, especificar los valores diferentes para la variable de entorno de punto de conexión cuando cree cada uno de los tres valores controlados. A continuación, cuando se crea un valor controlado, se especifica el script y los valores que se van a utilizar para las variables de entorno.

Los nombres de las variables de entorno pueden contener letras, números y guiones bajos. Deben comenzar con una letra y tener al menos dos caracteres. El tamaño total de las variables de entorno no puede superar los 4 KB. No es posible especificar variables de entorno reservadas de Lambda como claves para sus variables de entorno. Para obtener más información acerca de las variables de entorno reservadas, consulte [Runtime environment variables](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime) (Variables de entorno en tiempo de ejecución).

**importante**  
Las claves y valores de las variables de entorno se cifran en reposo utilizando claves AWS KMS propiedad de AWS. Sin embargo, las variables de entorno no se cifran del lado del cliente. No guarde información confidencial en ellos.

En el siguiente ejemplo el script utiliza dos variables de entorno. Este script es para un valor controlado que verifica si hay una página web disponible. Utiliza variables de entorno para parametrizar tanto la URL que verifica como el nivel de registro de CloudWatch Synthetics que utiliza. 

La siguiente función establece `LogLevel` al valor de la variable de entorno ` LOG_LEVEL`.

```
 synthetics.setLogLevel(process.env.LOG_LEVEL);
```

La función establece `URL` al valor de la variable de entorno `URL`.

```
const URL = process.env.URL;
```

Este es el script completo. Cuando se crea un valor controlado con este script, se especifican los valores para las variables de entorno `LOG_LEVEL` y `URL`.

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');

const pageLoadEnvironmentVariable = async function () {

    // Setting the log level (0-3)
    synthetics.setLogLevel(process.env.LOG_LEVEL);
    // INSERT URL here
    const URL = process.env.URL;

    let page = await synthetics.getPage();
    //You can customize the wait condition here. For instance,
    //using 'networkidle2' may be less restrictive.
    const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
    if (!response) {
        throw "Failed to load page!";
    }
    //Wait for page to render.
    //Increase or decrease wait time based on endpoint being monitored.
    await page.waitFor(15000);
    await synthetics.takeScreenshot('loaded', 'loaded');
    let pageTitle = await page.title();
    log.info('Page title: ' + pageTitle);
    log.debug('Environment variable:' + process.env.URL);

    //If the response status code is not a 2xx success code
    if (response.status() < 200 || response.status() > 299) {
        throw "Failed to load page!";
    }
};

exports.handler = async () => {
    return await pageLoadEnvironmentVariable();
};
```

### Traspaso de las variables de entorno al script
<a name="CloudWatch_Synthetics_Canaries_pass_variables"></a>

Para pasar variables de entorno al script cuando cree un valor controlado en la consola, especifique las claves y los valores de las variables de entorno en la sección **Variables de entorno** en la consola. Para obtener más información, consulte [Creación de un valor controlado](CloudWatch_Synthetics_Canaries_Create.md).

Para pasar variables de entorno a través de la API o AWS CLI, utilice el parámetro ` EnvironmentVariables` en la sección `RunConfig`. A continuación, se observa un ejemplo del comando de AWS CLI que crea un valor controlado que utiliza dos variables de entorno con claves de `Environment` y `Region`.

```
aws synthetics create-canary --cli-input-json '{
   "Name":"nameofCanary",
   "ExecutionRoleArn":"roleArn",
   "ArtifactS3Location":"s3://amzn-s3-demo-bucket-123456789012-us-west-2",
   "Schedule":{
      "Expression":"rate(0 minute)",
      "DurationInSeconds":604800
   },
   "Code":{
      "S3Bucket": "canarycreation",
      "S3Key": "cwsyn-mycanaryheartbeat-12345678-d1bd-1234-abcd-123456789012-12345678-6a1f-47c3-b291-123456789012.zip",
      "Handler":"pageLoadBlueprint.handler"
   },
   "RunConfig": {
      "TimeoutInSeconds":60,
      "EnvironmentVariables": {
         "Environment":"Production",
         "Region": "us-west-1"
      }
   },
   "SuccessRetentionPeriodInDays":13,
   "FailureRetentionPeriodInDays":13,
   "RuntimeVersion":"syn-nodejs-2.0"
}'
```

## Integración del valor controlado con otros servicios de AWS
<a name="CloudWatch_Synthetics_Canaries_AWS_integrate"></a>

Todos los canaries pueden utilizar la biblioteca de AWS SDK. Puede utilizar esta biblioteca cuando escriba su valor controlado para integrarlo con otros servicios de AWS.

Para ello, debe agregar el siguiente código al valor controlado. Para estos ejemplos, AWS Secrets Manager se utiliza como servicio para la integración del valor controlado.
+ Importar el SDK de AWS.

  ```
  const AWS = require('aws-sdk');
  ```
+ Cree un cliente para el servicio de AWS con el que se está integrando.

  ```
  const secretsManager = new AWS.SecretsManager();
  ```
+ Use el cliente para realizar llamadas a la API a ese servicio.

  ```
  var params = {
    SecretId: secretName
  };
  return await secretsManager.getSecretValue(params).promise();
  ```

El siguiente fragmento de código de script de valor controlado muestra un ejemplo de integración con Secrets Manager con más detalle.

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');
 
const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();
 
const getSecrets = async (secretName) => {
    var params = {
        SecretId: secretName
    };
    return await secretsManager.getSecretValue(params).promise();
}
 
const secretsExample = async function () {
    let URL = "<URL>";
    let page = await synthetics.getPage();
    
    log.info(`Navigating to URL: ${URL}`);
    const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
    
    // Fetch secrets
    let secrets = await getSecrets("secretname")
   
    /**
    * Use secrets to login. 
    *
    * Assuming secrets are stored in a JSON format like:
    * {
    *   "username": "<USERNAME>",
    *   "password": "<PASSWORD>"
    * }
    **/
    let secretsObj = JSON.parse(secrets.SecretString);
    await synthetics.executeStep('login', async function () {
        await page.type(">USERNAME-INPUT-SELECTOR<", secretsObj.username);
        await page.type(">PASSWORD-INPUT-SELECTOR<", secretsObj.password);
        
        await Promise.all([
          page.waitForNavigation({ timeout: 30000 }),
          await page.click(">SUBMIT-BUTTON-SELECTOR<")
        ]);
    });
   
    // Verify login was successful
    await synthetics.executeStep('verify', async function () {
        await page.waitForXPath(">SELECTOR<", { timeout: 30000 });
    });
};

exports.handler = async () => {
    return await secretsExample();
};
```

## Forzar al valor controlado para que utilice una dirección IP estática
<a name="CloudWatch_Synthetics_Canaries_staticIP"></a>

Se puede configurar un valor controlado para que utilice una dirección IP estática.

**Para forzar a un valor controlado a utilizar una dirección IP estática**

1. Cree una nueva VPC Para obtener más información, consulte [Utilización de DNS con su VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html).

1. Cree una gateway de Internet. Para obtener más información, consulte [Adding an internet gateway to your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#working-with-igw) (Cómo añadir una gateway de Internet a la VPC).

1. Cree una subred pública en la nueva VPC.

1. Agregue una nueva tabla de enrutamiento a la VPC.

1. Agregue una ruta en la nueva tabla de enrutamiento, que va desde `0.0.0.0/0` a la gateway de Internet.

1. Asocie la nueva tabla de enrutamiento con la subred pública.

1. Cree una dirección IP elástica Para obtener más información, consulte [Elastic IP addresses](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) (Direcciones IP elásticas).

1. Cree una nueva gateway NAT y asígnela a la subred pública y a la dirección IP elástica.

1. Cree las subredes privadas en la VPC

1. Agregue una ruta a la tabla de enrutamiento predeterminada de la VPC, que va desde `0.0.0.0/0` a la gateway NAT

1. Cree el valor controlado. 

# Escritura de un script de valor controlado Python
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python"></a>

Este script pasa como una ejecución correcta y devuelve una cadena. Cómo ver el aspecto de un valor controlado erróneo, cambie error = Falso a error = verdadero

```
def basic_custom_script():
    # Insert your code here
    # Perform multi-step pass/fail check
    # Log decisions made and results to /tmp
    # Be sure to wait for all your code paths to complete 
    # before returning control back to Synthetics.
    # In that way, your canary will not finish and report success
    # before your code has finished executing
    fail = False
    if fail:
        raise Exception("Failed basicCanary check.")
    return "Successfully completed basicCanary checks."
def handler(event, context):
    return basic_custom_script()
```

## Empaquetado de los archivos de valores controlados de Python
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_package"></a>

Si tiene más de un archivo .py o el script tiene una dependencia, puede agruparlos todos en un único archivo ZIP. Si utiliza el tiempo de ejecución `syn-python-selenium-1.1`, el archivo ZIP debe contener el archivo .py principal del valor controlado dentro de una carpeta `python`, como `python/my_canary_filename.py`. Si utiliza ` syn-python-selenium-1.1` o uno posterior, puede utilizar una carpeta diferente, como `python/myFolder/my_canary_filename.py`.

Este archivo ZIP debe contener todas las carpetas y archivos necesarios, pero los demás archivos no necesitan estar en la carpeta `python`.

Asegúrese de establecer el punto de entrada del script del valor controlado como ` my_canary_filename.functionName` para que coincida con el nombre del archivo y el nombre de la función del punto de entrada de su script. Si utiliza el tiempo de ejecución `syn-python-selenium-1.0`, el `functionName` debe ser `handler`. Si utiliza ` syn-python-selenium-1.1` o uno posterior, no se aplica esta restricción para el nombre del controlador y, además, usted puede optar por almacenar el valor controlado en una carpeta independiente, como ` python/myFolder/my_canary_filename.py`. 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 Puppeteer existente para usarlo como un valor controlado de Synthetics
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_Selenium"></a>

Se puede modificar rápidamente un script existente para Python y Selenium para ser utilizado como un valor controlado. Para obtener más información acerca de Selenium, consulte [www.selenium.dev/](https://www.selenium.dev/).

Para este ejemplo comenzaremos con el siguiente script de Selenium:

```
from selenium import webdriver

def basic_selenium_script():
    browser = webdriver.Chrome()
    browser.get('https://example.com')
    browser.save_screenshot('loaded.png')

basic_selenium_script()
```

Los pasos de conversión son los siguientes:

**Para convertir un script de Selenio para ser utilizado como un valor controlado**

1. Cambie la instrucción `import` para usar Selenium del módulo ` aws_synthetics`:

   ```
   from aws_synthetics.selenium import synthetics_webdriver as webdriver
   ```

   El módulo Selenium de `aws_synthetics` garantiza que el valor controlado pueda emitir métricas y registros, generar un archivo HAR y trabajar con otras características de CloudWatch Synthetics.

1. Cree una función de controlador y llame al método de Selenium. El controlador es la función de punto de entrada para el script.

   Si utiliza `syn-python-selenium-1.0`, la función del controlador debe denominarse `handler`. Si utiliza `syn-python-selenium-1.1` o uno posterior, la función puede tener cualquier nombre, pero debe ser el mismo nombre que se usa en el script. Además, si utiliza `syn-python-selenium-1.1` o uno posterior, puede almacenar los scripts en cualquier carpeta y especificar dicha carpeta como parte del nombre del controlador.

   ```
   def handler(event, context):
       basic_selenium_script()
   ```

El script ahora se ha actualizado para ser un valor controlado de CloudWatch Synthetics. Aquí está el script actualizado:

El `webdriver` es una instancia de la clase [SyntheticsWebDriver](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver), y el navegador devuelto por `webdriver.Chrome()` es una instancia de [SyntheticsBrowser](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsBrowser).

```
from aws_synthetics.selenium import synthetics_webdriver as webdriver

def basic_selenium_script():
    browser = webdriver.Chrome()
    browser.get('https://example.com')
    browser.save_screenshot('loaded.png')

def handler(event, context):
    basic_selenium_script()
```

## Cambio de un script existente de Puppeteer Synthetics para autenticar certificados no estándar
<a name="Canaries_Non-Standard_Certificates"></a>

Un caso de uso importante de canarios de Synthetics es poder supervisar sus propios puntos de conexión. Si quiere supervisar un punto de conexión que no está preparado para el tráfico externo, esta supervisión puede significar a veces que no dispone de un certificado adecuado firmado por una autoridad de certificación externa de confianza.

Dos posibles soluciones para este escenario son las siguientes:
+ Para autenticar un certificado de cliente, consulte [How to validate authentication using Amazon CloudWatch Synthetics – Part 2](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-using-amazon-cloudwatch-synthetics-part-2/).
+ Para autenticar un certificado autofirmado, consulte [How to validate authentication with self-signed certificates in Amazon CloudWatch Synthetics](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-with-self-signed-certificates-in-amazon-cloudwatch-synthetics/).

No solo tiene estas dos opciones cuando utiliza canarios de CloudWatch Synthetics. Puede ampliar estas características y agregar su lógica empresarial mediante la ampliación del código del canario.

**nota**  
Los canarios de Synthetics que se ejecutan en tiempos de ejecución de Python tienen la marca ` --ignore-certificate-errors` habilitada de forma innata, por lo que esos canarios no deberían tener problemas para llegar a sitios con configuraciones de certificados no estándar.

# Escritura de una configuración JSON para un esquema de comprobaciones múltiples de Node.js
<a name="CloudWatch_Synthetics_WritingCanary_Multichecks"></a>

El esquema de comprobaciones múltiples de Node.js le permite crear canarios que lleven a cabo múltiples comprobaciones de validación en una sola ejecución de canario. Este esquema resulta útil cuando se desean probar varios puntos de conexión, validar diferentes aspectos de la aplicación o llevar a cabo una serie de comprobaciones relacionadas de forma secuencial. 

**Topics**
+ [Estructura de configuración raíz](#root-configuration-structure)
+ [Configuración global](#global-settings)
+ [Administración de datos y variables](#variables-data-management)
+ [Definiciones de pasos](#step-definitions)
+ [Tipos de comprobación](#check-types)
+ [Métodos de autenticación](#authentication-methods)
+ [Aserciones y validación](#assertions-validation)
+ [Extracción de datos](#data-extraction)

## Estructura de configuración raíz
<a name="root-configuration-structure"></a>

La configuración raíz define la estructura general del canario de esquema avanzado de la API.


**Propiedades del esquema**  

| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  globalSettings  | Objeto | No | Configuraciones predeterminadas aplicadas a todos los pasos | 
|  variables  | Objeto | No | Valores reutilizables en todos los pasos (máximo 10) | 
|  steps  | Objeto |  Sí  | Recopilación de pasos de supervisión (de 1 a 10 pasos) | 

 **Ejemplo** 

```
{
  "globalSettings": {
    "stepTimeout": 30000,
    "userAgent": "CloudWatch-Synthetics-Advanced/1.0"
  },
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiVersion": "v1"
  },
  "steps": {
    "1": {
      "stepName": "healthCheck",
      "checkerType": "HTTP",
      "url": "${baseUrl}/health",
      "httpMethod": "GET"
    }
  }
}
```

 **Reglas de validación** 
+ Debe contener un paso como mínimo.
+ Se permiten 10 pasos como máximo.
+ No se permiten propiedades adicionales que no sean `globalSettings`, ` variables` y `steps`.

## Configuración global
<a name="global-settings"></a>

La configuración global proporciona configuraciones predeterminadas que se aplican a todos los pasos, a menos que se anulen por paso.

 **Propiedades de** 


**Propiedades de la configuración global**  

| Propiedad | Tipo | Predeterminado | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  stepTimeout  | entero | 30000 | 5000-300000 | Tiempo de espera predeterminado para todos los pasos (milisegundos) | 

 **Ejemplo** 

```
{
  "globalSettings": {
    "stepTimeout": 60000,
            
  }
}
```

## Administración de datos y variables
<a name="variables-data-management"></a>

Las variables le permiten definir valores reutilizables a los que se puede hacer referencia en toda la configuración mediante la sintaxis `${variableName}`.

 **Propiedades de variables** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
| Nombres de variable | cadena | Debe coincidir con el patrón ^[a-zA-Z][a-zA-Z0-9\$1]\$1\$1 | 
| Valores de variable | cadena | Cualquier valor de cadena | 

 **Limitaciones** 
+ Se permiten 10 variables por configuración como máximo.
+ Los nombres de variable deben comenzar por una letra.
+ Los nombres de variable solo pueden contener letras, números y guiones bajos.
+ La longitud máxima no se especifica en el esquema.

 **Ejemplo** 

```
{
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiKey": "${AWS_SECRET:my-api-key}",
    "timeout": "30000",
    "userEmail": "test@example.com"
  }
}
```

 **Uso de la configuración** 

```
{
  "steps": {
    "1": {
      "url": "${baseUrl}/users",
      "timeout": "${timeout}",
      "headers": {
        "Authorization": "Bearer ${apiKey}"
      }
    }
  }
}
```

## Definiciones de pasos
<a name="step-definitions"></a>

Los pasos definen las operaciones de supervisión individuales. Cada paso está numerado del 1 al 10 y contiene un tipo específico de comprobación.

 *Propiedades comunes de los pasos* 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  stepName  | string |  Sí  | Identificador único del paso | 
|  checkerType  | cadena |  Sí  | Tipo de comprobación: HTTP, DNS, SSL,  TCP | 
|  extractors  | matriz | No | Configuración de la extracción de datos | 

 *Validación del nombre del paso* 
+ Patrón: ^[a-zA-Z][a-zA-Z0-9\$1-]\$1\$1
+ Longitud máxima: 64 caracteres
+ Letra como carácter inicial

 *Numeración de los pasos* 
+ Los pasos se numeran como claves de cadena: “1”, “2”,..., “10”
+ Patrón: ^([1-9]\$110)\$1
+ Se requiere 1 paso como mínimo.
+ Se permiten 10 pasos como máximo.

 *Ejemplo* 

```
{
  "steps": {
    "1": {
      "stepName": "loginAPI",
      "checkerType": "HTTP",
      "url": "https://api.example.com/login",
      "httpMethod": "POST"
    },
    "2": {
      "stepName": "dnsCheck",
      "checkerType": "DNS",
      "domain": "example.com"
    }
  }
}
```

## Tipos de comprobación
<a name="check-types"></a>

### Comprobaciones HTTP
<a name="http-types"></a>

Supervise los puntos de conexión y las API web con una validación exhaustiva de las solicitudes y las respuestas.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  url  | cadena | URL de destino (debe tener un formato de URI válido) | 
|  httpMethod  | cadena | Método HTTP: GET, POST, PUT,  PATCH, DELETE, HEAD, OPTIONS | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  timeout  | entero | 30000 | 5000-300000 | Tiempo de espera de la solicitud (milisegundos) | 
|  waitTime  | entero | 0 | 0-60 | Retraso antes de la solicitud (segundos) | 
|  headers  | objeto | - | - | Encabezados HTTP personalizados | 
|  body  | cadena | - | - | Cuerpo de la solicitud para operaciones POST y PUT | 
|  authentication  | objeto | - | - | Configuración de la autenticación | 
|  assertions  | matriz | - | - | Reglas de validación de respuestas | 

 **Ejemplo** 

```
{
  "stepName": "createUser",
  "checkerType": "HTTP",
  "url": "https://api.example.com/users",
  "httpMethod": "POST",
  "timeout": 15000,
  "headers": {
    "Content-Type": "application/json",
    "X-API-Version": "v1"
  },
  "body": "{\"name\":\"John Doe\",\"email\":\"john@example.com\"}",
  "authentication": {
    "type": "API_KEY",
    "apiKey": "${AWS_SECRET:api-credentials}",
    "headerName": "X-API-Key"
  },
  "assertions": [
    {
      "type": "STATUS_CODE",
      "operator": "EQUALS",
      "value": 201
    }
  ]
}
```

### Comprobaciones de DNS
<a name="dns-types"></a>

Valide la resolución de DNS y registre la información.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  domain  | cadena | Nombre del dominio que se consultará (formato de nombre de host) | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Descripción | 
| --- | --- | --- | --- | 
|  recordType  | cadena | “A” | Tipo de registro de DNS: A, CNAME, MX,  TXT, NS | 
|  nameserver  | cadena | - | Servidor de DNS específico que se consultará | 
|  timeout  | entero | 30000 | Tiempo de espera de la consulta (5000-300000 ms) | 
|  port  | entero | 53 | Puerto de servidor de DNS (1-65535) | 
|  protocol  | cadena | “UDP” | Protocolo: UDP o TCP | 
|  assertions  | matriz | - | Reglas de validación de respuestas de DNS | 

 **Ejemplo** 

```
{
  "stepName": "dnsResolution",
  "checkerType": "DNS",
  "domain": "example.com",
  "recordType": "A",
  "nameserver": "8.8.8.8",
  "timeout": 10000,
  "assertions": [
    {
      "type": "RECORD_VALUE",
      "operator": "CONTAINS",
      "value": "192.168"
    }
  ]
}
```

### Comprobaciones de SSL
<a name="ssl-types"></a>

Supervise el estado y la configuración de los certificados SSL.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  hostname  | cadena | Nombre de host de destino (formato de nombre de host) | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Descripción | 
| --- | --- | --- | --- | 
|  port  | entero | 443 | Puerto SSL (1-65535) | 
|  timeout  | entero | 30000 | Tiempo de espera de conexión (5000-300000 ms) | 
|  sni  | booleano | TRUE | Indicación del nombre del servidor | 
|  verifyHostname  | booleano | TRUE | Verificación de nombres de host | 
|  allowSelfSigned  | valor booleano | FALSO | Aceptación de certificados autofirmados | 
|  assertions  | matriz | - | Reglas de validación de certificados | 

 **Ejemplo** 

```
{
  "stepName": "sslCertCheck",
  "checkerType": "SSL",
  "hostname": "secure.example.com",
  "port": 443,
  "sni": true,
  "verifyHostname": true,
  "assertions": [
    {
      "type": "CERTIFICATE_EXPIRY",
      "operator": "GREATER_THAN",
      "value": 30,
      "unit": "DAYS"
    }
  ]
}
```

### Comprobaciones de TCP
<a name="tcp-types"></a>

Pruebe la conectividad de los puertos TCP y la validación de respuestas.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  hostname  | cadena | Nombre de host de destino (formato de nombre de host) | 
|  port  | entero | Puerto de destino (1-65535) | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Descripción | 
| --- | --- | --- | --- | 
|  timeout  | entero | 30000 | Tiempo de espera general (5000-300000 ms) | 
|  connectionTimeout  | entero | 3 000 | Tiempo de espera de conexión (5000-300000 ms) | 
|  readTimeout  | entero | 2000 | Tiempo de espera de lectura de datos (5000-300000 ms) | 
|  sendData  | cadena | - | Datos que se enviarán después de la conexión | 
|  expectedResponse  | cadena | - | Datos de respuesta esperados | 
|  encoding  | cadena | “UTF-8” | Codificación de datos: UTF-8, ASCII, HEX | 
|  assertions  | matriz | - | Validación de respuestas y conexiones | 

 **Ejemplo** 

```
{
  "stepName": "databaseConnection",
  "checkerType": "TCP",
  "hostname": "db.example.com",
  "port": 3306,
  "connectionTimeout": 5000,
  "sendData": "SELECT 1",
  "expectedResponse": "1",
  "assertions": [
    {
      "type": "CONNECTION_SUCCESSFUL",
      "value": true
    }
  ]
}
```

## Métodos de autenticación
<a name="authentication-methods"></a>

 **Sin autenticación** 

```
{
  "type": "NONE"
}
```

 **Autenticación básica** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "BASIC" | 
|  username  | cadena |  Sí  | Nombre de usuario para la autenticación | 
|  password  | cadena |  Sí  | Contraseña para la autenticación | 

 **Ejemplo** 

```
{
  "type": "BASIC",
  "username": "admin",
  "password": "${AWS_SECRET:basic-auth:password}"
}
```

 **Autenticación de la clave de API** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "API\$1KEY" | 
|  apiKey  | cadena |  Sí  | - | Valor de la clave de API | 
|  headerName  | cadena | No | “X-API-Key” | Nombre del encabezado para la clave de API | 

 **Ejemplo** 

```
{
  "type": "API_KEY",
  "apiKey": "${AWS_SECRET:api-credentials}",
  "headerName": "Authorization"
}
```

 **Credenciales del cliente OAuth** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "OAUTH\$1CLIENT\$1CREDENTIALS" | 
|  tokenUrl  | cadena |  Sí  | - | URL del punto de conexión del token de OAuth | 
|  clientId  | cadena |  Sí  | - | ID de cliente de OAuth | 
|  clientSecret  | cadena |  Sí  | - | Secreto de cliente de OAuth | 
|  scope  | cadena | No | - | Ámbito de OAuth | 
|  audience  | cadena | No | - | Audiencia de OAuth | 
|  resource  | cadena | No | - | Recurso de OAuth | 
|  tokenApiAuth  | matriz | No | - | Métodos de autenticación de la API del token: BASIC\$1AUTH\$1HEADER, REQUEST\$1BODY | 
|  tokenCacheTtl  | entero | No | 3600 | TTL de caché de token (mínimo 60 segundos) | 

 **Ejemplo** 

```
{
  "type": "OAUTH_CLIENT_CREDENTIALS",
  "tokenUrl": "https://auth.example.com/oauth/token",
  "clientId": "${AWS_SECRET:oauth-creds:client_id}",
  "clientSecret": "${AWS_SECRET:oauth-creds:client_secret}",
  "scope": "read write",
  "tokenCacheTtl": 7200
}
```

 **AWS Signature (Versión 4)** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "SIGV4" | 
|  service  | cadena |  Sí  | Nombre del servicio de AWS (por ejemplo, “execute-api”») | 
|  region  | cadena |  Sí  | AWS región | 
|  roleArn  | cadena |  Sí  | ARN del rol de IAM para la firma | 

 **Ejemplo** 

```
{
  "type": "SIGV4",
  "service": "execute-api",
  "region": "us-east-1",
  "roleArn": "arn:aws:iam::123456789012:role/SyntheticsRole"
}
```

## Aserciones y validación
<a name="assertions-validation"></a>

### Aserciones HTTP
<a name="http-assertions"></a>

 **Aserciones de código de estado** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "STATUS\$1CODE" | 
|  operator  | cadena |  Sí  | EQUALS, NOT\$1EQUALS, GREATER\$1THAN,  LESS\$1THAN, IN\$1RANGE | 
|  value  | entero | Condicional | Código de estado HTTP (100-599) | 
|  rangeMin  | entero | Condicional | Valor de intervalo mínimo (para IN\$1RANGE) | 
|  rangeMax  | entero | Condicional | Valor de intervalo máximo (para IN\$1RANGE) | 

```
{
  "type": "STATUS_CODE",
  "operator": "EQUALS",
  "value": 200
}
```

 **Aserciones de tiempo de respuesta** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RESPONSE\$1TIME" | 
|  operator  | cadena |  Sí  | - | LESS\$1THAN, GREATER\$1THAN, EQUALS | 
|  value  | número |  Sí  | - | Valor de tiempo (mínimo 0) | 
|  unit  | cadena | No | “MILLISECONDS” | Debe ser "MILLISECONDS" | 

```
{
  "type": "RESPONSE_TIME",
  "operator": "LESS_THAN",
  "value": 500,
  "unit": "MILLISECONDS"
}
```

 **Aserciones de encabezado** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "HEADER" | 
|  headerName  | cadena |  Sí  | Nombre del encabezado que se validará | 
|  operator  | cadena |  Sí  | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH, EXIST | 
|  value  | Cadena o booleano | Condicional | Valor esperado (booleano para el operador EXIST) | 

```
{
  "type": "HEADER",
  "headerName": "Content-Type",
  "operator": "CONTAINS",
  "value": "application/json"
}
```

 **Aserciones de cuerpo** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "BODY" | 
|  target  | cadena | No | “JSON” | JSON o TEXT | 
|  path  | cadena | Condicional | - | JSONPath (obligatorio para el destino JSON) | 
|  operator  | cadena |  Sí  | - | CONTAINS, NOT\$1CONTAINS, EQUALS,  NOT\$1EQUALS, EXISTS | 
|  value  | Cadena o booleano |  Sí  | - | Valor esperado (booleano para el operador EXISTS) | 

```
{
  "type": "BODY",
  "target": "JSON",
  "path": "$.users[0].name",
  "operator": "EQUALS",
  "value": "John Doe"
}
```

### Aserciones de DNS
<a name="dns-assertions"></a>

 **Aserciones de valor de registro** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RECORD\$1VALUE" | 
|  operator  | cadena |  Sí  | - | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH | 
|  value  | cadena |  Sí  | - | Valor de registro esperado | 

 **Aserciones de recuento de registros** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RECORD\$1COUNT" | 
|  operator  | cadena |  Sí  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | entero |  Sí  | ≥ 0 | Recuento esperado (mínimo 0) | 

 **Aserciones autoritarias** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "AUTHORITATIVE" | 
|  value  | booleano |  Sí  | - | Estado autoritario esperado | 

 **Aserciones TTL** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "TTL" | 
|  operator  | cadena |  Sí  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | entero |  Sí  | ≥ 0 | TTL esperado (mínimo 0) | 

### Aserciones SSL
<a name="ssl-assertions"></a>

 **Aserciones de expiración de certificados** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CERTIFICATE\$1EXPIRY" | 
|  operator  | cadena |  Sí  | - | GREATER\$1THAN, LESS\$1THAN | 
|  value  | entero |  Sí  | - | Valor de tiempo (mínimo 0) | 
|  unit  | cadena | No | “DAYS” | DAYS, HOURS | 

 **Aserciones de asunto de certificado** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CERTIFICATE\$1SUBJECT" | 
|  field  | cadena |  Sí  | - | Campo de asunto: CN, O, OU, C, ST, L | 
|  operator  | cadena |  Sí  | - | CONTAINS, EQUALS, REGEX\$1MATCH | 
|  value  | cadena |  Sí  | - | Valor de campo esperado | 

 **Aserciones de emisor de certificado** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CERTIFICATE\$1ISSUER" | 
|  field  | cadena |  Sí  | - | Campo emisor: CN, O | 
|  operator  | cadena |  Sí  | - | CONTAINS, EQUALS | 
|  value  | cadena |  Sí  | - | Valor de campo esperado | 

### Aserciones TCP
<a name="tcp-assertions"></a>

 **Aserciones de éxito de conexión** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CONNECTION\$1SUCCESSFUL" | 
|  value  | booleano |  Sí  | - | Estado de conexión esperado | 

 **Aserciones de datos de respuesta** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RESPONSE\$1DATA" | 
|  operator  | cadena |  Sí  | - | CONTAINS, EQUALS, NOT\$1CONTAINS,  REGEX\$1MATCH, STARTS\$1WITH, ENDS\$1WITH | 
|  value  | cadena |  Sí  | - | Datos de respuesta esperados | 
|  encoding  | cadena | No | “UTF-8” | UTF-8, ASCII, HEX | 

## Extracción de datos
<a name="data-extraction"></a>

Los extractores permiten capturar datos de las respuestas para usarlos en pasos posteriores o con fines de elaboración de informes.

 **Propiedades de extracción** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  name  | string |  Sí  | - | Nombre de variable para datos extraídos | 
|  type  | cadena |  Sí  | - | Tipo de extracción: BODY | 
|  path  | cadena | No | - | JSONPath para la extracción de cuerpo | 
|  regex  | cadena | No | - | Patrón de expresión regular | 
|  regexGroup  | entero | No | 0 | Grupo de captura de expresión regular (mínimo 0) | 

 **Validación de nombre de extracción** 
+ Patrón: `^[a-zA-Z][a-zA-Z0-9_]*$`
+ Letra como carácter inicial
+ Pueden contener letras, números y guiones bajos.

**Limitación**: la sustitución no se aplica a los campos del esquema que tengan valores ENUM específicos.

 **Tipos de extracción** 

```
{
  "name": "userId",
  "type": "BODY",
  "path": "$.user.id"
}
```

```
{
  "stepName": "loginAndExtract",
  "checkerType": "HTTP",
  "url": "https://api.example.com/login",
  "httpMethod": "POST",
  "body": "{\"username\":\"test\",\"password\":\"pass\"}",
  "extractors": [
    {
      "name": "textVariable",
      "type": "BODY",
      "path": "$.myvalue"
    }
  ]
},
{
  "stepName": "substituteVariable",
  "checkerType": "HTTP",
  "url": "https://api.example.com/get/${textVariable}",
  "httpMethod": "GET",
  "assertions": [
    {
    "type": "BODY",
    "target": "JSON",
    "path": "$.users[0].name",
    "operator": "EQUALS",
    "value": "${textVariable}"
    }
  ]
}
```

# Funciones de la biblioteca disponibles para los scripts de valor controlado
<a name="CloudWatch_Synthetics_Canaries_Function_Library"></a>

CloudWatch Synthetics incluye varias funciones y clases integradas a las que puede llamar cuando escriba scripts de Node.js para su uso como canaries.

Algunas aplican a los canaries de la UI y a la API. Otras se aplican únicamente a los canaries de la interfaz de usuario. Un valor controlado de interfaz de usuario es aquel que utiliza la función `getPage()` y que usa Puppeteer como controlador web para navegar e interactuar con páginas web.

**nota**  
Siempre que actualice un valor controlado para utilizar una nueva versión del tiempo de ejecución de Synthetics, todas las funciones de la biblioteca Synthetics que utilice su valor controlado también se actualizarán automáticamente a la misma versión de NodeJS que admita el tiempo de ejecución de Synthetics.

**Topics**
+ [Funciones de biblioteca disponibles para el canario de Node.js](Library_function_Nodejs.md)
+ [Funciones de la biblioteca disponibles para el canario Java](CloudWatch_Synthetics_Canaries_Java.md)
+ [Funciones de la biblioteca disponibles para los scripts de canarios de Node.js con Playwright](CloudWatch_Synthetics_Canaries_Nodejs_Playwright.md)
+ [Funciones de la biblioteca disponibles para los scripts de canarios de Node.js mediante Puppeteer](CloudWatch_Synthetics_Canaries_Library_Nodejs.md)
+ [Funciones de la biblioteca disponibles para los scripts de valores controlados de Python que usan Selenium](CloudWatch_Synthetics_Canaries_Library_Python.md)

# Funciones de biblioteca disponibles para el canario de Node.js
<a name="Library_function_Nodejs"></a>

En esta sección, se describen las funciones de biblioteca disponibles para los scripts de canarios que utilizan el tiempo de ejecución de Node.js.

**Topics**
+ [addExecutionError(errorMessage, ex);](#Library_function_Nodejs_addExecutionError_Nodecanary)
+ [getCanaryName();](#Library_function_Nodejs_getCanaryName)
+ [getCanaryArn();](#Library_function_Nodejs_Nodecanary)
+ [getCanaryUserAgentString();](#Library_function_Nodejs_getCanaryUserAgentString_Nodecanary)
+ [getRuntimeVersion();](#Library_function_Nodejs_getRuntimeVersion_Nodecanary)
+ [getLogLevel();](#Library_function_Nodejs_getLogLevel_Nodecanary)
+ [setLogLevel();](#Library_function_Nodejs_setLogLevel_Nodecanary)
+ [executeStep(stepName, functionToExecute, [stepConfig])](#Library_function_Nodejs_executestep_Nodecanary)
+ [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#Library_function_Nodejs_executeHttpStep)

## addExecutionError(errorMessage, ex);
<a name="Library_function_Nodejs_addExecutionError_Nodecanary"></a>

`errorMessage` describe el error y `ex` es la excepción que se ha encontrado

`addExecutionError` puede usarse para establecer errores de ejecución para el valor controlado. Se produce un error en el valor controlado sin interrumpir la ejecución del script. Tampoco afecta a las métricas de `successPercent`.

Debe realizar un seguimiento de los errores como errores de ejecución sólo si no son importantes para indicar el éxito o el error del script valor controlado.

A continuación, se muestra un ejemplo del uso de un `addExecutionError`. Está supervisando la disponibilidad de su punto de conexión y tomando capturas de pantalla después de que la página se haya cargado. Debido a que el hecho de no tomar una captura de pantalla no determina la disponibilidad del punto de enlace, puede detectar cualquier error que encuentre al tomar capturas de pantalla y agregarlos como errores de ejecución. Las métricas de disponibilidad seguirán indicando que el punto de conexión está activo y en ejecución, pero el estado del valor controlado se marcará como fallido. El siguiente bloque de código de muestra detecta dicho error y lo agrega como un error de ejecución.

```
try {await synthetics.executeStep(stepName, callbackFunc);} catch(ex) {synthetics.addExecutionError('Unable to take screenshot ', ex);}
```

## getCanaryName();
<a name="Library_function_Nodejs_getCanaryName"></a>

Devuelve el nombre del valor controlado.

## getCanaryArn();
<a name="Library_function_Nodejs_Nodecanary"></a>

Devuelve el ARN del valor controlado.

## getCanaryUserAgentString();
<a name="Library_function_Nodejs_getCanaryUserAgentString_Nodecanary"></a>

Devuelve el agente de usuario personalizado del valor controlado.

## getRuntimeVersion();
<a name="Library_function_Nodejs_getRuntimeVersion_Nodecanary"></a>

Esta función está disponible en la versión de tiempo de ejecución `syn-nodejs-3.0` y posteriores. Devuelve la versión de tiempo de ejecución de Synthetics del valor controlado. Por ejemplo, el valor de devuelto podría ser `syn-nodejs-3.0`.

## getLogLevel();
<a name="Library_function_Nodejs_getLogLevel_Nodecanary"></a>

Recupera el nivel de registro actual para la biblioteca de Synthetics. Los valores posibles son los siguientes:
+ `0`: depuración
+ `1`: información
+ `2`: advertencia
+ `3`: error

Ejemplo:

```
let logLevel = synthetics.getLogLevel();
```

## setLogLevel();
<a name="Library_function_Nodejs_setLogLevel_Nodecanary"></a>

Establece el nivel de registro de la biblioteca de Synthetics. Los valores posibles son los siguientes:
+ `0`: depuración
+ `1`: información
+ `2`: advertencia
+ `3`: error

Ejemplo:

```
synthetics.setLogLevel(0);
```

## executeStep(stepName, functionToExecute, [stepConfig])
<a name="Library_function_Nodejs_executestep_Nodecanary"></a>

Ejecuta el paso proporcionado y lo integra con iniciar/superar/fallar el registro, superar/fallar y métricas de duración.

La función `executeStep` también hace lo siguiente:
+ Registra que el paso se haya iniciado.
+ Inicia un temporizador.
+ Ejecuta la función proporcionada.
+ Cuando la función devuelve resultados normalmente, cuenta como superada. Si la función falla, cuenta como error.
+ Finaliza el temporizador.
+ Registra si el paso se ha superado o no.
+ Emite la métrica `stepName SuccessPercent`, 100 para superado o 0 para no superado.
+ Emite la `stepName Duration metric`, con un valor basado en las horas de inicio y de finalización del paso.
+ Devuelve lo que devolvió functionToExecute o vuelve a lanzar lo que lanzó ` functionToExecute`.
+ Agrega un resumen de ejecución de pasos al informe del canario.

 **Ejemplo** 

```
await synthetics.executeStep(stepName, async function () {
    return new Promise((resolve, reject) => {
        const req = https.request(url, (res) => {
            console.log(`Status: ${res.statusCode}`);
            if (res.statusCode >= 400) {
                reject(new Error(`Request failed with status ${res.statusCode} for ${url}`));
            } else {
                resolve();
            }
        });

        req.on('error', (err) => {
            reject(new Error(`Request failed for ${url}: ${err.message}`));
        });

        req.end();
    });
});
```

## executeHttpStep(stepName, requestOptions, [callback], [stepConfig])
<a name="Library_function_Nodejs_executeHttpStep"></a>

Ejecuta la solicitud HTTP proporcionada como un paso y publica `SuccessPercent` (aprobar o no aprobar) y las métricas `Duration`.

**executeHttpStep** utiliza funciones nativas HTTP o HTTPS que no son visibles a simple vista de acuerdo al protocolo que se ha especificado en la solicitud.

Esta función también agrega un resumen de ejecución de pasos al informe del valor controlado. El resumen incluye detalles sobre cada solicitud HTTP, como los siguientes:
+ Hora de inicio
+ Hora de finalización
+ Estado (APROBADO o NO APROBADO)
+ Razón del error, si hubo
+ Detalles de llamada HTTP como cabeceras de solicitud o respuesta, cuerpo, código de estado, mensaje de estado y tiempos de rendimiento. 

**Topics**
+ [Parameters](#Library_function_Nodejs_executeHttpStep_parameters_Nodecanary)
+ [Ejemplos de uso de executeHttpStep](#Library_function_Nodejs_executeHttpStep_examples_Nodecanary)

### Parameters
<a name="Library_function_Nodejs_executeHttpStep_parameters_Nodecanary"></a>

 **stepName(*String*)** 

Especifica el nombre del paso. Este nombre también se utiliza para publicar métricas de CloudWatch para este paso.

 **requestOptions(*Object or String*)** 

El valor de este parámetro puede ser una URL, una cadena URL o un objeto. Si es un objeto, entonces debe ser un conjunto de opciones configurables para realizar una solicitud HTTP. Es compatible con todas las opciones en [http.request(options[, callback])](https://nodejs.org/api/http.html#http_http_request_options_callback) en el documento de Node.js.

Además de estas opciones de Node.js, **requestOptions** admite el parámetro adicional `body`. Puede utilizar el parámetro `body` para pasar datos como un cuerpo de la solicitud.

 **callback(*response*)** 

(Opcional) Esta es una función de usuario que se invoca con la respuesta HTTP. La respuesta es del tipo [Clase: http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage).

 **stepConfig(*object*)** 

(Opcional) Utilice este parámetro para anular configuraciones globales de Synthetics con una configuración diferente para este paso.

### Ejemplos de uso de executeHttpStep
<a name="Library_function_Nodejs_executeHttpStep_examples_Nodecanary"></a>

La siguiente serie de ejemplos se crean entre sí para ilustrar los diversos usos de esta opción.

Este primer ejemplo configura los parámetros de solicitud. Puede pasar una URL como **requestOptions**:

```
let requestOptions = 'https://www.amazon.com';
```

O puede pasar un conjunto de opciones:

```
let requestOptions = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/product/validProductName',
        'port': 443,
        'protocol': 'https:'
    };
```

El siguiente ejemplo crea una función de devolución de llamada que acepta una respuesta. De forma predeterminada, si no se especifica **callback** (devolución de llamada), CloudWatch Synthetics valida que el estado esté entre 200 y 299 inclusive.

```
// Handle validation for positive scenario
    const callback = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 200 || res.statusCode > 299) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
     
            let responseBody = '';
            res.on('data', (d) => {
                responseBody += d;
            });
     
            res.on('end', () => {
                // Add validation on 'responseBody' here if required. For ex, your status code is 200 but data might be empty
                resolve();
            });
        });
    };
```

El siguiente ejemplo crea una configuración para este paso que reemplaza la configuración global de CloudWatch Synthetics. La configuración de pasos de este ejemplo permite las cabeceras de solicitud, las cabeceras de respuesta, el cuerpo de la solicitud (datos posteriores) y el cuerpo de la respuesta en el informe y restringe los valores de las cabeceras de ‘X-Amz-Security-Token’ y de ‘Autorización’. De forma predeterminada, estos valores no se incluyen en el informe por motivos de seguridad. Si elige incluirlos, los datos solo se almacenan en su bucket de S3.

```
// By default headers, post data, and response body are not included in the report for security reasons. 
// Change the configuration at global level or add as step configuration for individual steps
let stepConfig = {
    includeRequestHeaders: true, 
    includeResponseHeaders: true,
    restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
    includeRequestBody: true,
    includeResponseBody: true
};
```

Este último ejemplo pasa su solicitud a **executeHttpStep** y nombra el paso.

```
await synthetics.executeHttpStep('Verify GET products API', requestOptions, callback, stepConfig);
```

Con este conjunto de ejemplos, CloudWatch Synthetics agrega los detalles de cada paso al informe y genera métricas para cada paso mediante **stepName**.

 Se podrán ver `successPercent` y métricas `duration` para el paso `Verify GET products API`. Puede supervisar el rendimiento de la API si supervisa las métricas de los pasos de llamadas a la API. 

Para obtener un script completo de ejemplo que utilice estas funciones, consulte [Valor controlado de la API de varios pasos](CloudWatch_Synthetics_Canaries_Samples.md#CloudWatch_Synthetics_Canaries_Samples_APIsteps).

# Funciones de la biblioteca disponibles para el canario Java
<a name="CloudWatch_Synthetics_Canaries_Java"></a>

La función `executeStep` se usa para modularizar el código del canario y ejecutarlo por pasos. En CloudWatch Synthetics, un paso de Synthetics es una forma de dividir el script de canario en una serie de acciones claramente definidas, lo que le permite supervisar distintas partes del recorrido de la aplicación por separado. Para cada paso, CloudWatch Synthetics hace lo siguiente:
+ Para cada ejecución de canarios, se crea un informe que incluye un resumen de los detalles de la ejecución de los pasos, como la duración de un paso, el estado *pass* o *fail*, entre otras cosas. Al elegir una ejecución en la consola de CloudWatch Synthetics, puede ver los detalles de ejecución de cada paso en la pestaña **Paso**.
+ Las métricas de CloudWatch *SuccessPercent* y *Duration* se emiten para cada paso, lo que permite a los usuarios supervisar la disponibilidad y la latencia de cada paso.

   **Uso** 

  ```
  synthetics.executeStep(stepName,()->{
      try {
          //step code to be executed
          return null;
      } catch (Exception e) {
          throw e;
      }
  }).get();
  ```

   **Parameters** 
  + *stepName*, String (obligatorio): nombre descriptivo del paso de Synthetics
  + *function to execute*, Callable<T> (obligatorio): representa las tareas que se ejecutarán
  + *stepOptions*, `com.amazonaws.synthetics.StepOptions (optional)`: objeto StepOptions que se puede utilizar para configurar la ejecución del paso. 

    *stepConfiguration*, ` com.amazonaws.synthetics.StepConfiguration` (obligatorio como parte de stepOptions)

 **Devuelve** 

El valor devuelto es *CompletableFuture<T>*.

**nota**  
Synthetics solo admite pasos secuenciales. Asegúrese de llamar al método `.get()` como se muestra en el ejemplo para asegurarse de que el paso se complete antes de continuar con el paso siguiente.

# Funciones de la biblioteca disponibles para los scripts de canarios de Node.js con Playwright
<a name="CloudWatch_Synthetics_Canaries_Nodejs_Playwright"></a>

En esta sección se describen las funciones de biblioteca disponibles para los scripts de canarios que utilizan el tiempo de ejecución de Playwright para Node.js.

**Topics**
+ [lanzamiento](#Synthetics_Library_Nodejs_Playwright_functions)
+ [newPage](#Synthetics_Library_Nodejs_Playwright_function_newPage)
+ [close](#Synthetics_Library_Nodejs_Playwright_function_close)
+ [getDefaultLaunchOptions](#Synthetics_Library_Nodejs_Playwright_function_getDefaultLaunchOptions)
+ [executeStep](#Synthetics_Library_Nodejs_Playwright_function_executeStep)

## lanzamiento
<a name="Synthetics_Library_Nodejs_Playwright_functions"></a>

Esta función inicia un navegador Chromium mediante una función de lanzamiento de Playwright y devuelve el objeto del navegador. Descomprime los archivos binarios del navegador y lanza el navegador Chromium mediante las opciones predeterminadas adecuadas para un navegador sin periféricos. Para obtener más información sobre la función `launch`, consulte [https://playwright.dev/docs/api/class-browsertype#browser-type-launch](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) en la documentación de Playwright.

 **Uso** 

```
const browser = await synthetics.launch();
```

 **Argumentos** 

`options` [opciones](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) (opcional) es un conjunto configurable de opciones para el navegador.

 **Devuelve** 

La promesa `<Browser>` en la que [Browser](https://playwright.dev/docs/api/class-browser) es una instancia de navegador de Playwright.

Si se vuelve a llamar a esta función, se cierra un navegador abierto anteriormente antes de iniciar un navegador nuevo. Se pueden anular los parámetros de lanzamiento que utiliza CloudWatch Synthetics y pasar parámetros adicionales al lanzar el navegador. Por ejemplo, el siguiente fragmento de código lanza un navegador con argumentos predeterminados y una ruta ejecutable predeterminada, pero con una ventana gráfica de 800 x 600 píxeles. Para obtener más información, consulte las [opciones de lanzamiento de Playwright](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) en la documentación de Playwright.

```
const browser = await synthetics.launch({
  defaultViewport: { 
      "deviceScaleFactor": 1, 
      "width": 800,
      "height": 600 
}});
```

 También puede agregar o anular los marcadores de Chromium que se envían de forma predeterminada al navegador. Por ejemplo, puede deshabilitar la seguridad web si agrega un indicador `--disable-web-security` a los argumentos en los parámetros de lanzamiento de CloudWatch Synthetics: 

```
// This function adds the --disable-web-security flag to the launch parameters
const defaultOptions = await synthetics.getDefaultLaunchOptions();
const launchArgs = [...defaultOptions.args, '--disable-web-security'];
const browser = await synthetics.launch({
    args: launchArgs
  });
```

## newPage
<a name="Synthetics_Library_Nodejs_Playwright_function_newPage"></a>

La función `newPage()` crea y devuelve una nueva página de Playwright. Synthetics configura automáticamente una conexión de Chrome DevTools Protocol (CDP) para permitir las capturas de red para la generación de archivos (HAR) HTTP.

 **Uso** 

Utilice `newPage()` en cualquiera de las siguientes maneras:

 **1. Crear una página nueva en un nuevo contexto de navegador:** 

```
const page = await synthetics.newPage(browser);
```

 **2. Crear una página nueva en un contexto de navegador especificado:** 

```
// Create a new browser context
const browserContext = await browser.newContext();

// Create a new page in the specified browser context
const page = await synthetics.newPage(browserContext)
```

 **Argumentos** 

Acepta la instancia de [Browser](https://playwright.dev/docs/api/class-browser) o [BrowserContext](https://playwright.dev/docs/api/class-browsercontext) de Playwright. 

 **Devuelve** 

La promesa <Page> en la que Page es una instancia de [Page](https://playwright.dev/docs/api/class-page) de Playwright.

## close
<a name="Synthetics_Library_Nodejs_Playwright_function_close"></a>

Cierra el navegador actualmente abierto.

 **Uso** 

```
await synthetics.close();
```

Se recomienda cerrar el navegador en un bloque `finally` del script.

 **Argumentos** 

Ninguno 

 **Devuelve** 

Devuelve la promesa <void> que se utiliza en la función de lanzamiento de Synthetics para lanzar el navegador.

## getDefaultLaunchOptions
<a name="Synthetics_Library_Nodejs_Playwright_function_getDefaultLaunchOptions"></a>

La función `getDefaultLaunchOptions()` muestra los resultados de las opciones de lanzamiento del navegador que CloudWatch Synthetics utiliza.

 **Uso** 

```
const defaultOptions = await synthetics.getDefaultLaunchOptions();
```

 **Argumentos** 

Ninguno 

 **Devuelve** 

Devuelve las [opciones de lanzamiento](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) de Playwright que se utilizan en la función `launch` de Synthetics para lanzar el navegador.

## executeStep
<a name="Synthetics_Library_Nodejs_Playwright_function_executeStep"></a>

La función `executeStep` se usa para ejecutar un paso en un script de Synthetics. En CloudWatch Synthetics, un paso de Synthetics es una forma de dividir el script de canario en una serie de acciones claramente definidas, lo que le permite supervisar distintas partes del recorrido de la aplicación por separado. Para cada paso, CloudWatch Synthetics hace lo siguiente:
+ Hace automáticamente una captura de pantalla antes de iniciar y completar el paso. También puede hacer capturas de pantalla dentro de un paso. Las capturas de pantalla se hacen de forma predeterminada, pero se pueden desactivar mediante las configuraciones de Synthetics.
+ Para cada ejecución de canarios, se crea un informe que incluye un resumen de los detalles de la ejecución de los pasos, como la duración de un paso, el estado `pass` o `fail`, las URL de las páginas de origen y destino, las capturas de pantalla asociadas, etc. Al elegir una ejecución en la consola de CloudWatch Synthetics, puede ver los detalles de ejecución de cada paso en la pestaña **Paso**.
+ Las métricas de CloudWatch `SuccessPercent` y `Duration` se emiten para cada paso, lo que permite a los usuarios supervisar la disponibilidad y la latencia de cada paso.

 **Uso** 

```
await synthetics.executeStep("mystepname", async function () {
  await page.goto(url, { waitUntil: 'load', timeout: 30000 });
}
```

**nota**  
Los pasos deben ejecutarse de forma secuencial. Asegúrese de usar `await` en las promesas.

 **Argumentos** 
+ Cadena `stepName` (obligatoria) (booleano): nombre del paso de Synthetics. 
+ Función asíncrona `functionToExecute` (obligatoria): la función que quiere que ejecute Synthetics. Esta función debe contener la lógica del paso.
+ Objeto `stepConfig` (opcional): la configuración del paso anula la configuración global de Synthetics para este paso.
  + Booleano `continueOnStepFailure` (opcional): indica si se debe continuar ejecutando el script de canarios después de que se produzca un error en este paso. 
  + Booleano `screenshotOnStepStart` (opcional): si se toma una captura de pantalla al inicio de este paso. 
  + Booleano `screenshotOnStepSuccess` (opcional): si se toma una captura de pantalla si este paso es correcto. 
  + Booleano `screenshotOnStepFailure` (opcional): si se toma una captura de pantalla si se produce un error en este paso. 
+ `page`: objeto de página de Playwright (opcional)

  Objeto de página de Playwright. Synthetics usa este objeto de página para hacer capturas de pantalla y URL. De forma predeterminada, Synthetics usa la página de Playwright que se crea cuando se llama a la función `synthetics.newPage()` para capturar detalles de la página, como capturas de pantalla y URL.

 **Devuelve** 

Devuelve una promesa que se resuelve con el valor que devuelve la función ` functionToExecute`. Para ver un script de ejemplo, consulte [Código de muestra para scripts de valores controlados](CloudWatch_Synthetics_Canaries_Samples.md) en esta guía.

# Funciones de la biblioteca disponibles para los scripts de canarios de Node.js mediante Puppeteer
<a name="CloudWatch_Synthetics_Canaries_Library_Nodejs"></a>

En esta sección se describen las funciones de biblioteca disponibles para los scripts de canarios de Node.js.

**Topics**
+ [Funciones y clases de biblioteca aplicables a todos los canaries](#CloudWatch_Synthetics_Library_allcanaries)
+ [Funciones y clases de biblioteca Node.js que solo se aplican a los canaries de la UI](#CloudWatch_Synthetics_Library_UIcanaries)
+ [Clases y funciones de biblioteca Node.js que se aplican sólo a los canaries de la API](#CloudWatch_Synthetics_Library_APIcanaries)

## Funciones y clases de biblioteca aplicables a todos los canaries
<a name="CloudWatch_Synthetics_Library_allcanaries"></a>

Las siguientes funciones de biblioteca de CloudWatch Synthetics para Node.js son útiles para todos los canaries.

**Topics**
+ [Clase de Synthetics](#CloudWatch_Synthetics_Library_Synthetics_Class_all)
+ [Clase SyntheticsConfiguration](#CloudWatch_Synthetics_Library_SyntheticsConfiguration)
+ [Registrador de Synthetics](#CloudWatch_Synthetics_Library_SyntheticsLogger)
+ [Clase de SyntheticSloghelper](#CloudWatch_Synthetics_Library_SyntheticsLogHelper)

### Clase de Synthetics
<a name="CloudWatch_Synthetics_Library_Synthetics_Class_all"></a>

Las siguientes funciones para todos los canaries están en la clase de Synthetics.

**Topics**
+ [addExecutionError(errorMessage, ex);](#CloudWatch_Synthetics_Library_addExecutionError)
+ [getCanaryName();](#CloudWatch_Synthetics_Library_getCanaryName)
+ [getCanaryArn();](#CloudWatch_Synthetics_Library_getCanaryARN)
+ [getCanaryUserAgentString();](#CloudWatch_Synthetics_Library_getCanaryUserAgentString)
+ [getRuntimeVersion();](#CloudWatch_Synthetics_Library_getRuntimeVersion)
+ [getLogLevel();](#CloudWatch_Synthetics_Library_getLogLevel)
+ [setLogLevel();](#CloudWatch_Synthetics_Library_setLogLevel)

#### addExecutionError(errorMessage, ex);
<a name="CloudWatch_Synthetics_Library_addExecutionError"></a>

`errorMessage` describe el error y `ex` es la excepción que se ha encontrado

`addExecutionError` puede usarse para establecer errores de ejecución para el valor controlado. Se produce un error en el valor controlado sin interrumpir la ejecución del script. Tampoco afecta a las métricas de `successPercent`.

Debe realizar un seguimiento de los errores como errores de ejecución sólo si no son importantes para indicar el éxito o el error del script valor controlado.

A continuación, se muestra un ejemplo del uso de un `addExecutionError`. Está supervisando la disponibilidad de su punto de conexión y tomando capturas de pantalla después de que la página se haya cargado. Debido a que el hecho de no tomar una captura de pantalla no determina la disponibilidad del punto de enlace, puede detectar cualquier error que encuentre al tomar capturas de pantalla y agregarlos como errores de ejecución. Las métricas de disponibilidad seguirán indicando que el punto de conexión está activo y en ejecución, pero el estado del valor controlado se marcará como fallido. El siguiente bloque de código de muestra detecta dicho error y lo agrega como un error de ejecución.

```
try {
    await synthetics.takeScreenshot(stepName, "loaded");
} catch(ex) {
    synthetics.addExecutionError('Unable to take screenshot ', ex);
}
```

#### getCanaryName();
<a name="CloudWatch_Synthetics_Library_getCanaryName"></a>

Devuelve el nombre del valor controlado.

#### getCanaryArn();
<a name="CloudWatch_Synthetics_Library_getCanaryARN"></a>

Devuelve el ARN del valor controlado.

#### getCanaryUserAgentString();
<a name="CloudWatch_Synthetics_Library_getCanaryUserAgentString"></a>

Devuelve el agente de usuario personalizado del valor controlado.

#### getRuntimeVersion();
<a name="CloudWatch_Synthetics_Library_getRuntimeVersion"></a>

Esta función está disponible en la versión de tiempo de ejecución `syn-nodejs-puppeteer-3.0` y en posteriores. Devuelve la versión de tiempo de ejecución de Synthetics del valor controlado. Por ejemplo, el valor de devuelto podría ser `syn-nodejs-puppeteer-3.0`.

#### getLogLevel();
<a name="CloudWatch_Synthetics_Library_getLogLevel"></a>

Recupera el nivel de registro actual para la biblioteca de Synthetics. Los valores posibles son los siguientes:
+ `0`: depuración
+ `1`: información
+ `2`: advertencia
+ `3`: error

Ejemplo:

```
let logLevel = synthetics.getLogLevel();
```

#### setLogLevel();
<a name="CloudWatch_Synthetics_Library_setLogLevel"></a>

Establece el nivel de registro de la biblioteca de Synthetics. Los valores posibles son los siguientes:
+ `0`: depuración
+ `1`: información
+ `2`: advertencia
+ `3`: error

Ejemplo:

```
synthetics.setLogLevel(0);
```

### Clase SyntheticsConfiguration
<a name="CloudWatch_Synthetics_Library_SyntheticsConfiguration"></a>

Esta clase solo está disponible en la versión de tiempo de ejecución de `syn-nodejs-2.1` o en posteriores.

La clase `SyntheticsConfiguration` se puede utilizar para configurar el comportamiento de las funciones de biblioteca de Synthetics. Por ejemplo, puede utilizar esta clase para configurar la función `executeStep()` para no tomar capturas de pantalla.

Pueden establecerse configuraciones de CloudWatch Synthetics a nivel global, que se aplican a todos los pasos de canaries. También se pueden anular estas configuraciones en el nivel de paso al pasar los pares clave y valor de configuración.

Se pueden pasar opciones en el nivel de paso. Para ver ejemplos, consulte [async executeStep(stepName, functionToExecute, [stepConfig]);](#CloudWatch_Synthetics_Library_executeStep) y [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#CloudWatch_Synthetics_Library_executeHttpStep).

**Topics**
+ [setConfig(options)](#CloudWatch_Synthetics_Library_setConfig)
+ [Supervisión visual](#CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting)

#### setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfig"></a>

` options ` es un objeto, que es un conjunto de opciones configurables para el valor controlado. En las siguientes secciones se explican los posibles campos en ` options `.

##### setConfig(options) para todos los canaries
<a name="CloudWatch_Synthetics_Library_setConfigall"></a>

Para los canarios que utilizan `syn-nodejs-puppeteer-3.2` o versiones posteriores, las **(opciones)** para **setConfig** pueden incluir los siguientes parámetros:
+ `includeRequestHeaders` (booleano): si se deben incluir cabeceras de solicitud en el informe. El valor predeterminado es `false`.
+ `includeResponseHeaders` (booleano): si se deben incluir cabeceras de respuesta en el informe. El valor predeterminado es `false`.
+ `restrictedHeaders` (matriz): lista de valores de cabecera que se deben ignorar si se incluyen cabeceras. Esto aplica a las cabeceras de solicitud y respuesta. Por ejemplo, puede ocultar las credenciales al pasar **includeRequestHeaders** como `true` y **restrictedHeaders** como `['Authorization']`. 
+ `includeRequestBody` (booleano): si se debe incluir el cuerpo de la solicitud en el informe. El valor predeterminado es `false`.
+ `includeResponseBody` (booleano): si se debe incluir el cuerpo de respuesta en el informe. El valor predeterminado es `false`.
**importante**  
Si habilita `includeResponseBody` o ` logResponseBody`, el objeto de datos no se devuelve en la respuesta de algunas API, como los clientes de la versión 3 de aws-sdk. Esto se debe a una limitación de Node.js y al tipo de objeto de respuesta utilizado.

 **setConfig(options) con respecto a las métricas de CloudWatch** 

Para los canarios que utilizan `syn-nodejs-puppeteer-3.1` o versiones posteriores, las **(opciones)** para **setConfig** pueden incluir los siguientes parámetros booleanos que determinan qué métricas publica el canario. El valor predeterminado para cada una de estas opciones es `true`. Las opciones que comienzan con `aggregated` determinan si la métrica se emite sin la dimensión ` CanaryName`. Se pueden utilizar estas métricas para ver los resultados agregados de todos los canaries. Las otras opciones determinan si la métrica se emite con la dimensión `CanaryName`. Se pueden usar estas métricas para ver los resultados de cada valor controlado individualmente.

Para obtener una lista de las métricas de CloudWatch que los canaries emiten, consulte [Métricas de CloudWatch que los canaries publican](CloudWatch_Synthetics_Canaries_metrics.md).
+ `failedCanaryMetric` (booleano): si se debe emitir la métrica ` Failed` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `failedRequestsMetric` (booleano): si se debe emitir la métrica `Failed requests` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `_2xxMetric` (booleano): si se debe emitir la métrica `2xx` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `_4xxMetric` (booleano): si se debe emitir la métrica `4xx` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `_5xxMetric` (booleano): si se debe emitir la métrica `5xx` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `stepDurationMetric` (booleano): si se debe emitir la métrica `Step duration` (con las dimensiones `CanaryName` y `StepName`) para este valor controlado. El valor predeterminado es `true`.
+ `stepSuccessMetric` (booleano): si se debe emitir la métrica `Step success` (con las dimensiones `CanaryName` y `StepName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregatedFailedCanaryMetric` (booleano): si se debe emitir la métrica `Failed` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregatedFailedRequestsMetric` (booleano): si se debe emitir la métrica `Failed Requests` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated2xxMetric` (booleano): si se debe emitir la métrica ` 2xx` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated4xxMetric` (booleano): si se debe emitir la métrica ` 4xx` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated5xxMetric` (booleano): si se debe emitir la métrica ` 5xx` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `visualMonitoringSuccessPercentMetric` (booleano): si se debe emitir la métrica `visualMonitoringSuccessPercent` para este valor controlado. El valor predeterminado es `true`.
+ `visualMonitoringTotalComparisonsMetric` (booleano): si se debe emitir la métrica `visualMonitoringTotalComparisons` para este valor controlado. El valor predeterminado es `false`.
+ `includeUrlPassword` (booleano): si se debe incluir una contraseña que aparezca en la dirección URL. De forma predeterminada, las contraseñas que aparecen en las direcciones URL se eliminan de los registros e informes para evitar que se divulgue información confidencial. El valor predeterminado es `false`.
+ `restrictedUrlParameters` (matriz): 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 en errores. El parámetro no distingue entre mayúsculas y minúsculas. Puede pasar un asterisco (\$1) 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.
+ `logRequest` (booleano): si se debe registrar cada solicitud en los registros de valores controlados. Para canaries de UI, esto registra cada solicitud que el navegador envía. El valor predeterminado es `true`.
+ `logResponse` (booleano): si se debe registrar cada respuesta en los registros de valores controlados. Para canaries de UI, esto registra todas las respuestas que el navegador recibe. El valor predeterminado es `true`.
+ `logRequestBody` (booleano): si se deben registrar los cuerpos de la solicitud junto con las solicitudes en los registros de valores controlados. Esta configuración sólo aplica si `logRequest` es `true`. El valor predeterminado es `false` .
+ `logResponseBody` (booleano): si se deben registrar los cuerpos de respuesta junto con las respuestas en los registros de valores controlados. Esta configuración sólo aplica si `logResponse` es `true`. El valor predeterminado es ` false`.
**importante**  
Si habilita `includeResponseBody` o ` logResponseBody`, el objeto de datos no se devuelve en la respuesta de algunas API, como los clientes de la versión 3 de aws-sdk. Esto se debe a una limitación de Node.js y al tipo de objeto de respuesta utilizado.
+ `logRequestHeaders` (booleano): si se deben registrar cabeceras de solicitud junto con las solicitudes en registros de valores controlados. Esta configuración sólo aplica si `logRequest` es `true`. El valor predeterminado es ` false`.

  Debe tener en cuenta que `includeRequestHeaders` habilita cabeceras en artefactos.
+ `logResponseHeaders` (booleano): si se deben registrar cabeceras de respuesta junto con las respuestas en los registros de valores controlados. Esta configuración sólo aplica si `logResponse` es `true`. El valor predeterminado es ` false`.

  Debe tener en cuenta que `includeResponseHeaders` habilita cabeceras en artefactos.

**nota**  
Las métricas de `Duration` y de `SuccessPercent` se emiten siempre para cada valor controlado con la métrica `CanaryName` y sin ella.

##### Métodos para habilitar o desactivar métricas
<a name="CloudWatch_Synthetics_Library_setConfig_metrics"></a>

 **disableAggregatedRequestMetrics()** 

Desactiva que el valor controlado emita todas las métricas de solicitud que se emiten sin dimensión `CanaryName`.

 **disableRequestMetrics()** 

Deshabilita todas las métricas de solicitud, incluidas las métricas por valor controlado y las métricas agregadas en todos los valores controlados.

 **disableStepMetrics()** 

Desactiva todas las métricas de pasos, incluidas las métricas de éxito y de duración de los pasos.

 **enableAggregatedRequestMetrics()** 

Permite que el valor controlado emita todas las métricas de solicitud que se emiten sin dimensión ` CanaryName`.

 **enableRequestMetrics()** 

Habilita todas las métricas de solicitud, incluidas las métricas por valor controlado y las métricas agregadas en todos los valores controlados.

 **enableStepMetrics()** 

Habilita todas las métricas de pasos, incluidas las métricas de éxito y de duración de los pasos.

 **get2xxMetric()** 

Muestra si el valor controlado emite una métrica `2xx` con la dimensión ` CanaryName`.

 **get4xxMetric()** 

Muestra si el valor controlado emite una métrica `4xx` con la dimensión ` CanaryName`.

 **get5xxMetric()** 

Muestra si el valor controlado emite una métrica `5xx` con la dimensión ` CanaryName`.

 **getAggregated2xxMetric()** 

Muestra si el valor controlado emite una métrica `2xx` sin dimensión.

 **getAggregated4xxMetric()** 

Muestra si el valor controlado emite una métrica `4xx` sin dimensión.

 **getAggregatedFailedCanaryMetric()** 

Muestra si el valor controlado emite una métrica `Failed` sin dimensión.

 **getAggregatedFailedRequestsMetric()** 

Muestra si el valor controlado emite una métrica `Failed requests` sin dimensión.

 **getAggregated5xxMetric()** 

Muestra si el valor controlado emite una métrica `5xx` sin dimensión.

 **getFailedCanaryMetric()** 

Muestra si el valor controlado emite una métrica `Failed` con la dimensión ` CanaryName`.

 **getFailedRequestsMetric()** 

Muestra si el valor controlado emite una métrica `Failed requests` con la dimensión `CanaryName`.

 **getStepDurationMetric()** 

Muestra si el valor controlado emite una métrica `Duration` con la dimensión ` CanaryName` para este valor controlado.

 **getStepSuccessMetric()** 

Muestra si el valor controlado emite una métrica `StepSuccess` con la dimensión ` CanaryName` para este valor controlado.

 **with2xxMetric(\$12xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `2xx` con la dimensión `CanaryName` para este valor controlado.

 **with4xxMetric(\$14xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `4xx` con la dimensión `CanaryName` para este valor controlado.

 **with5xxMetric(\$15xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `5xx` con la dimensión `CanaryName` para este valor controlado.

 **withAggregated2xxMetric(aggregated2xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `2xx` sin dimensión para este valor controlado.

 **withAggregated4xxMetric(aggregated4xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `4xx` sin dimensión para este valor controlado.

 **withAggregated5xxMetric(aggregated5xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `5xx` sin dimensión para este valor controlado.

 ** withAggregatedFailedCanaryMetric(aggregatedFailedCanaryMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed` sin dimensión para este valor controlado.

 ** withAggregatedFailedRequestsMetric(aggregatedFailedRequestsMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed requests` sin dimensión para este valor controlado.

 **withFailedCanaryMetric(failedCanaryMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed` con la dimensión `CanaryName` para este valor controlado.

 **withFailedRequestsMetric(failedRequestsMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed requests` con la dimensión `CanaryName` para este valor controlado.

 **withStepDurationMetric(stepDurationMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Duration` con la dimensión `CanaryName` para este valor controlado.

 **withStepSuccessMetric(stepSuccessMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica ` StepSuccess` con la dimensión `CanaryName` para este valor controlado.

##### Métodos para habilitar o desactivar otras características
<a name="CloudWatch_Synthetics_Library_setConfig_methods"></a>

 **withHarFile()** 

Acepta un argumento booleano, que especifica si se debe crear un archivo HAR para este valor controlado.

 **withStepsReport()** 

Acepta un argumento booleano, que especifica si se debe informar de un resumen de ejecución de pasos para este valor controlado.

 **withIncludeUrlPassword()** 

Acepta un argumento booleano, que especifica si se deben incluir las contraseñas que aparecen en las URL de los registros e informes.

 **withRestrictedUrlParameters()** 

Acepta una matriz de ruta de URL o parámetros de consulta para editar. Esto aplica a las URL que aparecen en registros, informes y en errores. Se puede pasar un asterisco (\$1) como un valor para redactar todos los valores de ruta de URL y los parámetros de consulta

 **withLogRequest()** 

Acepta un argumento booleano, que especifica si se debe registrar cada solicitud en los registros del valor controlado.

 **withLogResponse()** 

Acepta un argumento booleano, que especifica si se debe registrar cada respuesta en los registros del valor controlado.

 **withLogRequestBody()** 

Acepta un argumento booleano, que especifica si se debe registrar cada cuerpo de la solicitud en los registros del valor controlado.

 **withLogResponseBody()** 

Acepta un argumento booleano, que especifica si se debe registrar cada cuerpo de respuesta en los registros del valor controlado.

 **withLogRequestHeaders()** 

Acepta un argumento booleano, que especifica si se debe registrar cada cabecera de solicitud en los registros del valor controlado.

 **withLogResponseHeaders()** 

Acepta un argumento booleano, que especifica si se debe registrar cada cabecera de respuesta en los registros del valor controlado.

 **getHarFile()** 

Muestra si el valor controlado crea un archivo HAR.

 **getStepsReport()** 

Muestra si el valor controlado informa un resumen de ejecución de pasos.

 **getIncludeUrlPassword()** 

Muestra si el valor controlado incluye contraseñas que aparecen en las URL en los registros e informes.

 **getRestrictedUrlParameters()** 

Muestra si el valor controlado redacta la ruta de URL o los parámetros de consulta.

 **getLogRequest()** 

Muestra si el valor controlado registra cada solicitud en los registros del valor controlado.

 **getLogResponse()** 

Muestra si el valor controlado registra cada respuesta en los registros del valor controlado.

 **getLogRequestBody()** 

Muestra si el valor controlado registra cada cuerpo de la solicitud en los registros del valor controlado.

 **getLogResponseBody()** 

Muestra si el valor controlado registra cada cuerpo de respuesta en los registros del valor controlado.

 **getLogRequestHeaders()** 

Muestra si el valor controlado registra cada cabecera de solicitud en los registros del valor controlado.

 **getLogResponseHeaders()** 

Muestra si el valor controlado registra cada cabecera de respuesta en los registros del valor controlado.

 **Funciones para todos los valores controlados** 
+ `withIncludeRequestHeaders`(includeRequestHeaders)
+ `withIncludeResponseHeaders`(includeResponseHeaders)
+ `withRestrictedHeaders`(restrictedHeaders)
+ `withIncludeRequestBody`(includeRequestBody)
+ `withIncludeResponseBody`(includeResponseBody)
+ `enableReportingOptions`(): activa todas las opciones de informes-- **includeRequestHeaders**, **includeResponseHeaders**, **includeRequestBody** e **includeResponseBody**.
+ `disableReportingOptions`(): desactiva todas las opciones de informes-- **includeRequestHeaders**, **includeResponseHeaders**, **includeRequestBody** e **includeResponseBody**.

##### setConfig(options) para canaries de la UI
<a name="CloudWatch_Synthetics_Library_setConfigUI"></a>

Para canaries de la UI, **setConfig** puede incluir los siguientes parámetros booleanos:
+ `continueOnStepFailure` (booleano): si se debe continuar con la ejecución del script canario después de que un paso falle (este parámetro hace referencia a la función **executeStep**). Si algún paso falla, la ejecución del valor controlado seguirá marcándose como fallida. El valor predeterminado es `false`.
+ `harFile` (booleano): si se crea un archivo HAR. El valor predeterminado es `True`.
+ `screenshotOnStepStart` (booleano): si se debe tomar una captura de pantalla antes de comenzar un paso.
+ `screenshotOnStepSuccess` (booleano): si se debe tomar una captura de pantalla después de completar un paso correctamente.
+ `screenshotOnStepFailure` (booleano): si se debe tomar una captura de pantalla después de que un paso falla.

##### Métodos para habilitar o desactivar las capturas de pantalla
<a name="CloudWatch_Synthetics_Library_setConfig_screenshots"></a>

 **disableStepScreenshots()** 

Deshabilita todas las opciones de captura de pantalla (screenshotOnStepStart, screenshotOnStepSuccess, y screenshotOnStepFailure).

 **enableStepScreenshots()** 

Habilita todas las opciones de captura de pantalla (screenshotOnStepStart, screenshotOnStepSuccess, y screenshotOnStepFailure). Estos métodos no están habilitados de forma predeterminada.

 **getScreenshotOnStepFailure()** 

Muestra si el valor controlado toma una captura de pantalla después de que un paso falla.

 **getScreenshotOnStepStart()** 

Muestra si el valor controlado toma una captura de pantalla antes de iniciar un paso.

 **getScreenshotOnStepSuccess()** 

Muestra si el valor controlado toma una captura de pantalla después de completar un paso correctamente.

 **withScreenshotOnStepStart(screenshotOnStepStart)** 

Acepta un argumento booleano, que indica si se debe tomar una captura de pantalla antes de iniciar un paso.

 **withScreenshotOnStepSuccess(screenshotOnStepSuccess)** 

Acepta un argumento booleano, que indica si se debe tomar una captura de pantalla después de completar un paso correctamente.

 **withScreenshotOnStepFailure(screenshotOnStepFailure)** 

Acepta un argumento booleano, que indica si se debe tomar una captura de pantalla después de que un paso falla.

 **Uso en valores controlados de la IU** 

Primero, importe la relación de Synthetics y obtenga la configuración.

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();
```

A continuación, establezca la configuración para cada opción mediante llamadas al método SetConfig con una de las siguientes opciones.

```
// Set configuration values
    synConfig.setConfig({
        screenshotOnStepStart: true, 
        screenshotOnStepSuccess: false,
        screenshotOnStepFailure: false
    });
```

O

```
synConfig.withScreenshotOnStepStart(false).withScreenshotOnStepSuccess(true).withScreenshotOnStepFailure(true)
```

Para deshabilitar todas las capturas de pantalla, utilice la función `disableStepScreenshots()` como en este ejemplo.

```
synConfig.disableStepScreenshots();
```

Puede habilitar y desactivar las capturas de pantalla en cualquier punto del código. Por ejemplo, para desactivar las capturas de pantalla solo para un paso, se deben desactivar antes de ejecutar ese paso y habilitarlas después del paso.

##### setConfig(options) para canaries de la API
<a name="CloudWatch_Synthetics_Library_setConfigAPI"></a>

Para los canaries de la API, **setConfig** puede incluir los siguientes parámetros booleanos:
+ `continueOnHttpStepFailure` (booleano): si se continúa con la ejecución del script valor controlado después de que se produce un error en un paso HTTP (esto se refiere a la función **executeHttpStep**). Si algún paso falla, la ejecución del valor controlado seguirá marcándose como fallida. El valor predeterminado es `true`.

#### Supervisión visual
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting"></a>

La supervisión visual compara las capturas de pantalla que se toman durante una ejecución de un valor controlado con las capturas de pantalla que se toman durante una ejecución de un valor controlado de línea de base. Si la discrepancia entre las dos capturas de pantalla está más allá de un porcentaje umbral, el valor controlado falla y se podrán ver las áreas con diferencias resaltadas en color en el informe de ejecución del valor controlado. La supervisión visual es compatible con canaries que ejecutan **syn-puppeteer-node-3.2** y versiones posteriores. Por el momento no es compatible con canaries que ejecutan Python y Selenium.

Para habilitar la supervisión visual, agregue la siguiente línea de código al script valor controlado. Para obtener más información, consulte [Clase SyntheticsConfiguration](#CloudWatch_Synthetics_Library_SyntheticsConfiguration).

```
syntheticsConfiguration.withVisualCompareWithBaseRun(true);
```

La primera vez que el valor controlado se ejecuta correctamente después de agregar esta línea al script, utiliza las capturas de pantalla que se toman durante esa ejecución como línea de base para la comparación. Después de la primera ejecución del valor controlado, se puede usar la consola de CloudWatch para editar el valor controlado para realizar cualquiera de las siguientes acciones:
+ Establecer la siguiente ejecución del valor controlado como la nueva línea de base.
+ Establecer límites en la captura de pantalla de línea de base actual para designar áreas de la captura de pantalla que se ignorarán durante las comparaciones visuales.
+ Eliminar una captura de pantalla de ser utilizada para la supervisión visual.

Para obtener más información sobre cómo usar la consola de CloudWatch para editar un valor controlado, consulte [Edición o eliminación de un valor controlado](synthetics_canaries_deletion.md).

 **Otras opciones para la supervisión visual** 

 ** syntheticsConfiguration.withVisualVarianceThresholdPercentage(desiredPercentage)** 

Establezca el porcentaje aceptable para la desviación de captura de pantalla en las comparaciones visuales.

 ** syntheticsConfiguration.withVisualVarianceHighlightHexColor(“\$1fafa00")** 

Establezca el color de resaltado que designa las áreas de desviación cuando vea los informes de ejecución del valor controlado que utilizan supervisión visual.

 ** syntheticsConfiguration.withFailCanaryRunOnVisualVariance(failCanary)** 

Establezca si el valor controlado falla o no cuando hay una diferencia visual superior al umbral. El valor predeterminado es que el valor controlado falle.

### Registrador de Synthetics
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger"></a>

SyntheticsLogger escribe registros tanto en la consola como en un archivo de registro local, en el mismo nivel de registro. Este archivo de registro se escribe en ambas ubicaciones solo si el nivel de registro coincide con el deseado para la función de registro a la que se llamó o está por debajo de este.

Los valores “DEBUG:“, “INFO:“, etc. se anteponen a las instrucciones de registro del archivo de registro local para que coincidan con el nivel de registro de la función a la que se llamó.

Puede utilizar SyntheticsLogger si desea ejecutar la biblioteca de Synthetics en el mismo nivel de registro que el registro de valores controlados de Synthetics.

No es necesario que se utilice SyntheticsLogger para crear un archivo de registros que se carga en la ubicación de resultados de S3. En su lugar, puede crear un archivo de registro distinto en la carpeta ` /tmp`. Los archivos creados en la carpeta `/tmp` se cargan en la ubicación de resultados de S3 como artefactos. 

Para utilizar el registrador de la biblioteca de Synthetics:

```
const log = require('@aws/synthetics-logger');
```

Definiciones de funciones útiles:

 **log.debug(*message*, *ex* );** 

Parámetros: *message* es el mensaje que se va a registrar. *ex* es la excepción que se registra, si la hay

Ejemplo:

```
log.debug("Starting step - login.");
```

 **log.error(*message*, *ex* );** 

Parámetros: *message* es el mensaje que se va a registrar. *ex* es la excepción que se registra, si la hay

Ejemplo:

```
try {
  await login();
catch (ex) {
  log.error("Error encountered in step - login.", ex);
}
```

 **log.info(*message*, *ex* );** 

Parámetros: *message* es el mensaje que se va a registrar. *ex* es la excepción que se registra, si la hay

Ejemplo:

```
log.info("Successfully completed step - login.");
```

 **log.log(*message*, *ex* );** 

Este es un alias para `log.info`. 

Parámetros: *message* es el mensaje que se va a registrar. *ex* es la excepción que se registra, si la hay

Ejemplo:

```
 log.log("Successfully completed step - login.");
```

 **log.warn(*message*, *ex* );** 

Parámetros: *message* es el mensaje que se va a registrar. *ex* es la excepción que se registra, si la hay

Ejemplo:

```
log.warn("Exception encountered trying to publish CloudWatch Metric.", ex);
```

### Clase de SyntheticSloghelper
<a name="CloudWatch_Synthetics_Library_SyntheticsLogHelper"></a>

La clase `SyntheticsLogHelper` está disponible en el tiempo de ejecución ` syn-nodejs-puppeteer-3.2` y en tiempos de ejecución posteriores. Ya está inicializado en la biblioteca CloudWatch Synthetics y está configurado con la configuración de Synthetics. Puede agregar esto como una relación en el script. Esta clase le permite borrar las URL, encabezados y mensajes de error para redactar información confidencial.

**nota**  
Synthetics sanitiza todas las URL y los mensajes de error que registra antes de incluirlos en los registros, informes, archivos HAR y errores de ejecución de los valores controlados basados en la configuración `restrictedUrlParameters` de Synthetics. Tiene que usar ` getSanitizedUrl` o `getSanitizedErrorMessage` solo si está registrando direcciones URL o errores en el script. Synthetics no almacena ningún artefacto de valores controlados excepto los errores de valores controlados que el script lanza. Los artefactos de ejecución de valores controlados se almacenan en la cuenta del cliente. Para obtener más información, consulte [Consideraciones de seguridad para los canaries de Synthetics](servicelens_canaries_security.md).

**Topics**
+ [getSanitizedUrl(url, stepConfig = null)](#CloudWatch_Synthetics_Library_getSanitizedUrl)
+ [getSanitizedErrorMessage](#CloudWatch_Synthetics_Library_getSanitizedErrorMessage)
+ [getSanitizedHeaders(headers, stepConfig=null)](#CloudWatch_Synthetics_Library_getSanitizedHeaders)

#### getSanitizedUrl(url, stepConfig = null)
<a name="CloudWatch_Synthetics_Library_getSanitizedUrl"></a>

Esta función está disponible en `syn-nodejs-puppeteer-3.2` y en posteriores. Devuelve cadenas de url sanitizadas basadas en la configuración. Puede optar por eliminar los parámetros de las URL confidenciales como la contraseña y el access\$1token al establecer la propiedad `restrictedUrlParameters`. De forma predeterminada, las contraseñas de las URL se eliminan. Si es necesario, puede habilitar las contraseñas de las URL si configura `includeUrlPassword` a verdadero. 

Esta función arroja un error si la URL pasada no es una URL válida.

 **Parámetros ** 
+ Una *url* es una cadena y es la URL para sanitizar.
+  *stepConfig* (Opcional) anula la configuración global de Synthetics para esta función. Si `stepConfig` no se especifica, la configuración global se utiliza para sanitizar la URL.

 **Ejemplo ** 

En este ejemplo se usa la siguiente URL de ejemplo: ` https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200`. En este ejemplo, `access_token` contiene su información confidencial que no debe registrarse. Debe tener en cuenta que los servicios de Synthetics no almacenan ningún artefacto de ejecución de valores controlados. Los artefactos como registros, capturas de pantalla e informes se almacenan en un bucket de Amazon S3 de la cuenta de cliente.

El primer paso es configurar la configuración de Synthetics.

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Import Synthetics logger for logging url
const log = require('@aws/synthetics-logger');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();

// Set restricted parameters
synConfig.setConfig({
   restrictedUrlParameters: ['access_token'];
});
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('URL');



const urlConfig = {
   restrictedUrlParameters = ['*']
};
const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('URL', urlConfig);
logger.info('My example url is: ' + sanitizedUrl);
```

A continuación, sanitice y registre la URL

```
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200');
```

Esto registra lo siguiente en el registro del valor controlado.

```
My example url is: https://example.com/learn/home?access_token=REDACTED&token_type=Bearer&expires_in=1200
```

Puede anular la configuración de Synthetics para una URL si especifica un parámetro opcional que contenga las opciones de configuración de Synthetics, como en el siguiente ejemplo .

```
const urlConfig = {
   restrictedUrlParameters = ['*']
};
const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200', urlConfig);
logger.info('My example url is: ' + sanitizedUrl);
```

El ejemplo anterior elimina todos los parámetros de consulta y se registra de la siguiente manera:

```
My example url is: https://example.com/learn/home?access_token=REDACTED&token_type=REDACTED&expires_in=REDACTED
```

#### getSanitizedErrorMessage
<a name="CloudWatch_Synthetics_Library_getSanitizedErrorMessage"></a>

Esta función está disponible en `syn-nodejs-puppeteer-3.2` y en posteriores. Devuelve cadenas de error sanitizadas al sanitizar cualquier URL presente en función de la configuración de Synthetics. Puede optar por anular la configuración global de Synthetics cuando llame a esta función mediante la especificación de un parámetro `stepConfig`. 

 **Parámetros ** 
+ *error* es el error para sanitizar. Puede ser un objeto Error o una cadena.
+  *stepConfig* (Opcional) anula la configuración global de Synthetics para esta función. Si `stepConfig` no se especifica, la configuración global se utiliza para sanitizar la URL.

 **Ejemplo ** 

En este ejemplo se utiliza el siguiente error: ` Failed to load url: https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200`

El primer paso es configurar la configuración de Synthetics.

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Import Synthetics logger for logging url
const log = require('@aws/synthetics-logger');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();

// Set restricted parameters
synConfig.setConfig({
   restrictedUrlParameters: ['access_token'];
});
```

A continuación, sanitice y registre el mensaje de error

```
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

try {
   // Your code which can throw an error containing url which your script logs
} catch (error) {
    const sanitizedErrorMessage = syntheticsLogHelper.getSanitizedErrorMessage(errorMessage);
    logger.info(sanitizedErrorMessage);
}
```

Esto registra lo siguiente en el registro del valor controlado.

```
Failed to load url: https://example.com/learn/home?access_token=REDACTED&token_type=Bearer&expires_in=1200
```

#### getSanitizedHeaders(headers, stepConfig=null)
<a name="CloudWatch_Synthetics_Library_getSanitizedHeaders"></a>

Esta función está disponible en `syn-nodejs-puppeteer-3.2` y en posteriores. Devuelve encabezados sanitizados basados en la propiedad `restrictedHeaders` de ` syntheticsConfiguration`. Los encabezados especificados en la propiedad `restrictedHeaders` se editan a partir de registros, archivos HAR e informes. 

 **Parámetros ** 
+ *headers* (cabeceras) es un objeto que contiene las cabeceras para desinfectar.
+ *stepConfig* (Opcional) anula la configuración global de Synthetics para esta función. Si `stepConfig` no se especifica, la configuración global se utiliza para desinfectar las cabeceras.

## Funciones y clases de biblioteca Node.js que solo se aplican a los canaries de la UI
<a name="CloudWatch_Synthetics_Library_UIcanaries"></a>

Las siguientes funciones de la biblioteca de CloudWatch Synthetics solo son útiles para los canaries de la UI.

**Topics**
+ [Clase de Synthetics](#CloudWatch_Synthetics_Library_Synthetics_Class)
+ [Clase BrokenLinkCheckerReport](#CloudWatch_Synthetics_Library_BrokenLinkCheckerReport)
+ [Clase SyntheticsLink](#CloudWatch_Synthetics_Library_SyntheticsLink)

### Clase de Synthetics
<a name="CloudWatch_Synthetics_Library_Synthetics_Class"></a>

Las siguientes funciones están en la clase de Synthetics.

**Topics**
+ [async addUserAgent(page, userAgentString);](#CloudWatch_Synthetics_Library_addUserAgent)
+ [async executeStep(stepName, functionToExecute, [stepConfig]);](#CloudWatch_Synthetics_Library_executeStep)
+ [getDefaultLaunchOptions();](#CloudWatch_Synthetics_Library_getDefaultLaunchOptions)
+ [getPage();](#CloudWatch_Synthetics_Library_getPage)
+ [getRequestResponseLogHelper();](#CloudWatch_Synthetics_Library_getRequestResponseLogHelper)
+ [Lanzamiento (opciones)](#CloudWatch_Synthetics_Library_LaunchOptions)
+ [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper)
+ [setRequestResponseLogHelper();](#CloudWatch_Synthetics_Library_setRequestResponseLogHelper)
+ [async takeScreenshot(name, suffix);](#CloudWatch_Synthetics_Library_takeScreenshot)

#### async addUserAgent(page, userAgentString);
<a name="CloudWatch_Synthetics_Library_addUserAgent"></a>

Esta función añade *userAgentString* al encabezado de agente de usuario de la página especificada.

Ejemplo:

```
await synthetics.addUserAgent(page, "MyApp-1.0");
```

Los resultados del encabezado del agente de usuario de la página se establecen en ` browsers-user-agent-header-valueMyApp-1.0`

#### async executeStep(stepName, functionToExecute, [stepConfig]);
<a name="CloudWatch_Synthetics_Library_executeStep"></a>

Ejecuta el paso proporcionado y lo integra con iniciar/superar/fallar el registro, iniciar/superar/fallar capturas de pantalla, superar/fallar y métricas de duración.

**nota**  
Si utiliza el `syn-nodejs-2.1` o una versión posterior de tiempo de ejecución, puede configurar si se toman capturas de pantalla y cuándo. Para obtener más información, consulte [Clase SyntheticsConfiguration](#CloudWatch_Synthetics_Library_SyntheticsConfiguration).

La función `executeStep` también hace lo siguiente:
+ Registra que el paso se ha iniciado.
+ Toma una captura de pantalla denominada `<stepName>-starting`.
+ Inicia un temporizador.
+ Ejecuta la función proporcionada.
+ Si la función devuelve resultados normalmente, cuenta como superada. Si la función falla, cuenta como error.
+ Finaliza el temporizador.
+ Registra si el paso se ha superado o no.
+ Toma una captura de pantalla denominada `<stepName>-succeeded` o ` <stepName>-failed`.
+ Emite la métrica `stepName` `SuccessPercent`, 100 para superado o 0 para no superado.
+ Emite la métrica `stepName` `Duration`, con un valor basado en las horas de inicio y de finalización del paso.
+ Por último, devuelve el mismo resultado que `functionToExecute` o vuelve a arrojar el mismo error que `functionToExecute`.

Si el valor controlado utiliza el tiempo de ejecución `syn-nodejs-2.0` o uno posterior, esta función también agrega un resumen de ejecución de pasos al informe del valor controlado. El resumen incluye detalles acerca de cada paso, como la hora de inicio, la hora de finalización, el estado (SUPERADO o NO SUPERADO), el motivo del error (si hubo) y las capturas de pantalla que se tomaron durante la ejecución de cada paso.

Ejemplo:

```
await synthetics.executeStep('navigateToUrl', async function (timeoutInMillis = 30000) {
           await page.goto(url, {waitUntil: ['load', 'networkidle0'], timeout: timeoutInMillis});});
```

Respuesta:

Devuelve el mismo resultado que `functionToExecute`.

 **Actualizaciones con syn-nodejs-2.2** 

A partir de `syn-nodejs-2.2`, se pueden pasar opcionalmente configuraciones de pasos para anular las configuraciones de CloudWatch Synthetics en el nivel de pasos. Para obtener una lista de opciones que puede pasar a `executeStep`, consulte [Clase SyntheticsConfiguration](#CloudWatch_Synthetics_Library_SyntheticsConfiguration).

En el siguiente ejemplo se anula la configuración predeterminada `false` para ` continueOnStepFailure` a `true` y se especifica cuándo tomar capturas de pantalla.

```
var stepConfig = {
    'continueOnStepFailure': true,
    'screenshotOnStepStart': false,
    'screenshotOnStepSuccess': true,
    'screenshotOnStepFailure': false
}

await executeStep('Navigate to amazon', async function (timeoutInMillis = 30000) {
      await page.goto(url, {waitUntil: ['load', 'networkidle0'], timeout: timeoutInMillis});
 }, stepConfig);
```

#### getDefaultLaunchOptions();
<a name="CloudWatch_Synthetics_Library_getDefaultLaunchOptions"></a>

La función `getDefaultLaunchOptions()` muestra los resultados de las opciones de lanzamiento del navegador que CloudWatch Synthetics utiliza. Para más información, consulte [Tipo de opciones de lanzamiento](https://pptr.dev/browsers-api/browsers.launchoptions/) 

```
// This function returns default launch options used by Synthetics.
const defaultOptions = await synthetics.getDefaultLaunchOptions();
```

#### getPage();
<a name="CloudWatch_Synthetics_Library_getPage"></a>

Devuelve la página abierta actual como objeto de Puppeteer. Para obtener más información, consulte [Puppeteer API v1.14.0](https://github.com/puppeteer/puppeteer/blob/v1.14.0/docs/api.md).

Ejemplo:

```
let page = await synthetics.getPage();
```

Respuesta:

La página (objeto de Puppeteer) que está abierta en la sesión del explorador actual.

#### getRequestResponseLogHelper();
<a name="CloudWatch_Synthetics_Library_getRequestResponseLogHelper"></a>

**importante**  
En los canaries que utilizan el tiempo de ejecución `syn-nodejs-puppeteer-3.2` o posteriores, esta función está obsoleta junto con la clase `RequestResponseLogHelper`. El uso de esta función hace que aparezca una advertencia en los registros de los valores controlados. Esta función se eliminará en versiones futuras de tiempo de ejecución. Si está utilizando esta función, utilice en su lugar [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper). 

Utilice esta función como patrón generador para modificar las marcas de registro de solicitudes y respuestas.

Ejemplo:

```
synthetics.setRequestResponseLogHelper(getRequestResponseLogHelper().withLogRequestHeaders(false));;
```

Respuesta:

```
{RequestResponseLogHelper}
```

#### Lanzamiento (opciones)
<a name="CloudWatch_Synthetics_Library_LaunchOptions"></a>

Las opciones para esta función sólo están disponibles en la versión de tiempo de ejecución `syn-nodejs-2.1` o en posteriores.

Esta función solo se usa para los canaries de la UI. Cierra el navegador existente y lanza uno nuevo.

**nota**  
CloudWatch Synthetics siempre lanza un navegador antes de comenzar a ejecutar el script. No es necesario que llame un lanzamiento() a menos que desee lanzar un navegador nuevo con opciones personalizadas.

(opciones) es un conjunto configurable de opciones para configurar en el navegador. Para obtener más información, consulte [Tipo de opciones de lanzamiento](https://pptr.dev/browsers-api/browsers.launchoptions/).

Si llama a esta función sin opciones, Synthetics lanza un navegador con argumentos predeterminados, `executablePath` y `defaultViewport`. La ventana gráfica predeterminada en CloudWatch Synthetics es 1920 x 1080.

Se pueden anular los parámetros de lanzamiento que CloudWatch Synthetics utiliza y pasar parámetros adicionales al lanzar el navegador. Por ejemplo, el siguiente fragmento de código inicia un navegador con argumentos predeterminados y una ruta ejecutable predeterminada, pero con una ventana gráfica de 800 x 600.

```
await synthetics.launch({
        defaultViewport: { 
            "deviceScaleFactor": 1, 
            "width": 800,
            "height": 600 
    }});
```

En el siguiente código de muestra se agrega un nuevo parámetro `ignoreHTTPSErrors` a los parámetros de lanzamiento de CloudWatch Synthetics:

```
await synthetics.launch({
        ignoreHTTPSErrors: true
 });
```

Puede desactivar la seguridad web si agrega un indicador `--disable-web-security` a los argumentos en los parámetros de lanzamiento de CloudWatch Synthetics:

```
// This function adds the --disable-web-security flag to the launch parameters
const defaultOptions = await synthetics.getDefaultLaunchOptions();
const launchArgs = [...defaultOptions.args, '--disable-web-security'];
await synthetics.launch({
     args: launchArgs
  });
```

#### RequestResponseLogHelper class
<a name="CloudWatch_Synthetics_Library_RequestResponseLogHelper"></a>

**importante**  
En los canaries que utilizan el tiempo de ejecución `syn-nodejs-puppeteer-3.2` o posteriores, esta clase está obsoleta. El uso de esta clase hace que aparezca una advertencia en los registros de los valores controlados. Esta función se eliminará en versiones futuras de tiempo de ejecución. Si está utilizando esta función, utilice en su lugar [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper).

Controla la configuración y la creación en detalle de las representaciones de cadena de cargas de solicitud y respuesta. 

```
class RequestResponseLogHelper {
 
    constructor () {
        this.request = {url: true, resourceType: false, method: false, headers: false, postData: false};
        this.response = {status: true, statusText: true, url: true, remoteAddress: false, headers: false};
    }
 
    withLogRequestUrl(logRequestUrl);
    
    withLogRequestResourceType(logRequestResourceType);
    
    withLogRequestMethod(logRequestMethod);
    
    withLogRequestHeaders(logRequestHeaders);
    
    withLogRequestPostData(logRequestPostData);

        
    withLogResponseStatus(logResponseStatus);
    
    withLogResponseStatusText(logResponseStatusText);
   
    withLogResponseUrl(logResponseUrl);
 
    withLogResponseRemoteAddress(logResponseRemoteAddress);
    
    withLogResponseHeaders(logResponseHeaders);
```

Ejemplo:

```
synthetics.setRequestResponseLogHelper(getRequestResponseLogHelper()
.withLogRequestPostData(true)
.withLogRequestHeaders(true)
.withLogResponseHeaders(true));
```

Respuesta:

```
{RequestResponseLogHelper}
```

#### setRequestResponseLogHelper();
<a name="CloudWatch_Synthetics_Library_setRequestResponseLogHelper"></a>

**importante**  
En los canaries que utilizan el tiempo de ejecución `syn-nodejs-puppeteer-3.2` o posteriores, esta función está obsoleta junto con la clase `RequestResponseLogHelper`. El uso de esta función hace que aparezca una advertencia en los registros de los valores controlados. Esta función se eliminará en versiones futuras de tiempo de ejecución. Si está utilizando esta función, utilice en su lugar [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper). 

Utilice esta función como patrón generador para establecer las marcas de registro de solicitudes y respuestas.

Ejemplo:

```
synthetics.setRequestResponseLogHelper().withLogRequestHeaders(true).withLogResponseHeaders(true);
```

Respuesta:

```
{RequestResponseLogHelper}
```

#### async takeScreenshot(name, suffix);
<a name="CloudWatch_Synthetics_Library_takeScreenshot"></a>

Toma una captura de pantalla (.PNG) de la página actual con nombre y un sufijo (opcional).

Ejemplo:

```
await synthetics.takeScreenshot("navigateToUrl", "loaded")
```

Este ejemplo captura y carga una captura de pantalla denominada ` 01-navigateToUrl-loaded.png` al bucket de S3 del valor controlado.

Puede tomar una captura de pantalla para un paso del valor controlado en particular al pasar ` stepName` como primer parámetro. Las capturas de pantalla están vinculadas al paso del valor controlado en los informes, para ayudarlo a realizar un rastreo de cada paso durante la depuración.

Los valores controlados de CloudWatch Synthetics toman capturas de pantalla automáticamente antes de comenzar un paso (la función `executeStep`) y después de la finalización del paso (a menos que configure el valor controlado para desactivar las capturas de pantalla). Puede tomar más capturas de pantalla si pasa el nombre del paso en la función `takeScreenshot`.

El siguiente ejemplo toma una captura de pantalla con `signupForm` como el valor de `stepName`. La captura de pantalla se denominará ` 02-signupForm-address` y se vinculará al paso denominado ` signupForm` en el informe del valor controlado.

```
await synthetics.takeScreenshot('signupForm', 'address')
```

### Clase BrokenLinkCheckerReport
<a name="CloudWatch_Synthetics_Library_BrokenLinkCheckerReport"></a>

Esta clase proporciona métodos para agregar un enlace Synthetics. Solo se admite en canaries que utilizan la versión `syn-nodejs-2.0-beta` de tiempo de ejecución o posteriores. 

Para utilizar `BrokenLinkCheckerReport`, incluya las siguientes líneas en el script:

```
const BrokenLinkCheckerReport = require('@aws/synthetics-broken-link-checker-report');
            
const brokenLinkCheckerReport = new BrokenLinkCheckerReport();
```

Definiciones de funciones útiles:

 **addLink(*syntheticsLink*, isBroken)** 

` syntheticsLink ` es un objeto ` SyntheticsLink` que representa un enlace. Esta función agrega el enlace de acuerdo con el código de estado. De forma predeterminada, considera que un enlace se rompe si el código de estado no está disponible o si el código de estado es 400 o superior. Puede anular este comportamiento predeterminado si pasa el parámetro opcional `isBrokenLink` con un valor de `true` o `false`.

Esta función no tiene un valor de retorno.

 **getLinks()** 

Esta función muestra los resultados de una matriz de los objetos `SyntheticsLink` que se incluyen en el informe del verificador de enlaces que no funcionan.

 **getTotalBrokenLinks()** 

Esta función muestra los resultados de un número que representa el número total de enlaces que no funcionan.

 **getTotalLinksChecked()** 

Esta función muestra los resultados de un número que representa el número total de enlaces incluidos en el informe.

 **Cómo utilizar BrokenLinkCheckerReport** 

El siguiente fragmento de código de script valor controlado muestra un ejemplo de navegación a un enlace que se agrega al informe del verificador de enlaces que no funcionan.

1. Importe `SyntheticsLink`, `BrokenLinkCheckerReport`, y ` Synthetics`.

   ```
   const BrokenLinkCheckerReport = require('@aws/synthetics-broken-link-checker-report');
   const SyntheticsLink = require('@aws/synthetics-link');
   
   // Synthetics dependency
   const synthetics = require('@aws/synthetics-puppeteer');
   ```

1. Para agregar un enlace al informe, cree una instancia de ` BrokenLinkCheckerReport`.

   ```
   let brokenLinkCheckerReport = new BrokenLinkCheckerReport();
   ```

1. Desplácese hasta la URL y agréguela al informe del verificador de vínculos que no funcionan.

   ```
   let url = "https://amazon.com";
   
   let syntheticsLink = new SyntheticsLink(url);
   
   // Navigate to the url.
   let page = await synthetics.getPage();
   
   // Create a new instance of Synthetics Link
   let link = new SyntheticsLink(url)
   
   try {
       const response = await page.goto(url, {waitUntil: 'domcontentloaded', timeout: 30000});
   } catch (ex) {
       // Add failure reason if navigation fails.
       link.withFailureReason(ex);
   }
   
   if (response) {
       // Capture screenshot of destination page
       let screenshotResult = await synthetics.takeScreenshot('amazon-home', 'loaded');
      
       // Add screenshot result to synthetics link
       link.addScreenshotResult(screenshotResult);
   
       // Add status code and status description to the link
       link.withStatusCode(response.status()).withStatusText(response.statusText())
   }
   
   // Add link to broken link checker report.
   brokenLinkCheckerReport.addLink(link);
   ```

1. Agregue el informe a Synthetics. Esto crea un archivo JSON llamado ` BrokenLinkCheckerReport.json` en el bucket de S3 para cada ejecución del valor controlado. Se puede ver un informe de enlaces en la consola para cada ejecución de valores controlados junto con capturas de pantalla, registros y archivos HAR.

   ```
   await synthetics.addReport(brokenLinkCheckerReport);
   ```

### Clase SyntheticsLink
<a name="CloudWatch_Synthetics_Library_SyntheticsLink"></a>

Esta clase proporciona métodos para ajustar la información. Solo se admite en canaries que utilizan la versión `syn-nodejs-2.0-beta` de tiempo de ejecución o posteriores. 

Para utilizar `SyntheticsLink`, incluya las siguientes líneas en el script:

```
const SyntheticsLink = require('@aws/synthetics-link');

const syntheticsLink = new SyntheticsLink("https://www.amazon.com");
```

La función muestra los resultados de . `syntheticsLinkObject`

Definiciones de funciones útiles:

 **withUrl(*url*)** 

` url ` es una cadena de URL. La función muestra los resultados de `syntheticsLinkObject`.

 **withText(*text*)** 

` text ` es una cadena que representa el texto de anclaje. La función muestra los resultados de `syntheticsLinkObject`. Añade texto de anclaje correspondiente al enlace.

 **withParentUrl(*parentUrl*)** 

` parentUrl ` es una cadena que representa la URL principal (página fuente). La función muestra los resultados de . `syntheticsLink Object`

 **withStatusCode(*statusCode*)** 

` statusCode ` es una cadena que representa el código de estado. La función muestra los resultados de . `syntheticsLinkObject`

 **withFailureReason(*failureReason*)** 

` failureReason ` es una cadena que representa la causa del error. La función muestra los resultados de . `syntheticsLink Object`

 **addScreenshotResult(*screenshotResult*)** 

` screenshotResult ` es un objeto. Es una instancia de `ScreenshotResult` que la función de Synthetics `takeScreenshot` ha mostrado. El objeto incluye lo siguiente:
+ `fileName`— Una cadena que representa el ` screenshotFileName`
+ `pageUrl` (opcional)
+ `error` (opcional)

## Clases y funciones de biblioteca Node.js que se aplican sólo a los canaries de la API
<a name="CloudWatch_Synthetics_Library_APIcanaries"></a>

Las siguientes funciones de biblioteca de CloudWatch Synthetics para Node.js solo son útiles para los API canaries de la UI.

**Topics**
+ [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#CloudWatch_Synthetics_Library_executeHttpStep)

### executeHttpStep(stepName, requestOptions, [callback], [stepConfig])
<a name="CloudWatch_Synthetics_Library_executeHttpStep"></a>

Ejecuta la solicitud HTTP proporcionada como un paso y publica `SuccessPercent` (aprobar o no aprobar) y las métricas `Duration`.

**executeHttpStep** utiliza funciones nativas HTTP o HTTPS que no son visibles a simple vista de acuerdo al protocolo que se ha especificado en la solicitud.

Esta función también agrega un resumen de ejecución de pasos al informe del valor controlado. El resumen incluye detalles sobre cada solicitud HTTP, como los siguientes:
+ Hora de inicio
+ Hora de finalización
+ Estado (APROBADO o NO APROBADO)
+ Razón del error, si hubo
+ Detalles de llamada HTTP como cabeceras de solicitud o respuesta, cuerpo, código de estado, mensaje de estado y tiempos de rendimiento. 

**Topics**
+ [Parameters](#CloudWatch_Synthetics_Library_executeHttpStep_parameters)
+ [Ejemplos de uso de executeHttpStep](#CloudWatch_Synthetics_Library_executeHttpStep_examples)

#### Parameters
<a name="CloudWatch_Synthetics_Library_executeHttpStep_parameters"></a>

 **stepName(*String*)** 

Especifica el nombre del paso. Este nombre también se utiliza para publicar métricas de CloudWatch para este paso.

 **requestOptions(*Object or String*)** 

El valor de este parámetro puede ser una URL, una cadena URL o un objeto. Si es un objeto, entonces debe ser un conjunto de opciones configurables para realizar una solicitud HTTP. Es compatible con todas las opciones en [http.request(options[, callback])](https://nodejs.org/api/http.html#http_http_request_options_callback) en el documento de Node.js.

Además de estas opciones de Node.js, **requestOptions** admite el parámetro adicional `body`. Puede utilizar el parámetro `body` para pasar datos como un cuerpo de la solicitud.

 **callback(*response*)** 

(Opcional) Esta es una función de usuario que se invoca con la respuesta HTTP. La respuesta es del tipo [Clase: http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage).

 **stepConfig(*object*)** 

(Opcional) Utilice este parámetro para anular configuraciones globales de Synthetics con una configuración diferente para este paso.

#### Ejemplos de uso de executeHttpStep
<a name="CloudWatch_Synthetics_Library_executeHttpStep_examples"></a>

La siguiente serie de ejemplos se crean entre sí para ilustrar los diversos usos de esta opción.

Este primer ejemplo configura los parámetros de solicitud. Puede pasar una URL como **requestOptions**:

```
let requestOptions = 'https://www.amazon.com';
```

O puede pasar un conjunto de opciones:

```
let requestOptions = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/product/validProductName',
        'port': 443,
        'protocol': 'https:'
    };
```

El siguiente ejemplo crea una función de devolución de llamada que acepta una respuesta. De forma predeterminada, si no se especifica **callback** (devolución de llamada), CloudWatch Synthetics valida que el estado esté entre 200 y 299 inclusive.

```
// Handle validation for positive scenario
    const callback = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 200 || res.statusCode > 299) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
     
            let responseBody = '';
            res.on('data', (d) => {
                responseBody += d;
            });
     
            res.on('end', () => {
                // Add validation on 'responseBody' here if required. For ex, your status code is 200 but data might be empty
                resolve();
            });
        });
    };
```

El siguiente ejemplo crea una configuración para este paso que reemplaza la configuración global de CloudWatch Synthetics. La configuración de pasos de este ejemplo permite las cabeceras de solicitud, las cabeceras de respuesta, el cuerpo de la solicitud (datos posteriores) y el cuerpo de la respuesta en el informe y restringe los valores de las cabeceras de ‘X-Amz-Security-Token’ y de ‘Autorización’. De forma predeterminada, estos valores no se incluyen en el informe por motivos de seguridad. Si elige incluirlos, los datos solo se almacenan en su bucket de S3.

```
// By default headers, post data, and response body are not included in the report for security reasons. 
// Change the configuration at global level or add as step configuration for individual steps
let stepConfig = {
    includeRequestHeaders: true, 
    includeResponseHeaders: true,
    restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
    includeRequestBody: true,
    includeResponseBody: true
};
```

Este último ejemplo pasa su solicitud a **executeHttpStep** y nombra el paso.

```
await synthetics.executeHttpStep('Verify GET products API', requestOptions, callback, stepConfig);
```

Con este conjunto de ejemplos, CloudWatch Synthetics agrega los detalles de cada paso al informe y genera métricas para cada paso mediante **stepName**.

 Se podrán ver `successPercent` y métricas `duration` para el paso `Verify GET products API`. Puede supervisar el rendimiento de la API si supervisa las métricas de los pasos de llamadas a la API. 

Para obtener un script completo de ejemplo que utilice estas funciones, consulte [Valor controlado de la API de varios pasos](CloudWatch_Synthetics_Canaries_Samples.md#CloudWatch_Synthetics_Canaries_Samples_APIsteps).

# Funciones de la biblioteca disponibles para los scripts de valores controlados de Python que usan Selenium
<a name="CloudWatch_Synthetics_Canaries_Library_Python"></a>

Esta sección enumera las funciones de biblioteca Selenium disponibles para los scripts valores controlados de Python.

**Topics**
+ [Clases y funciones de biblioteca de Python y Selenium que se aplican a todos los canaries](#CloudWatch_Synthetics_Library_allcanaries_Python)
+ [Clases y funciones de biblioteca de Python y Selenium que se aplican solo a canaries de la UI](#CloudWatch_Synthetics_Library_Python_UIcanaries)

## Clases y funciones de biblioteca de Python y Selenium que se aplican a todos los canaries
<a name="CloudWatch_Synthetics_Library_allcanaries_Python"></a>

Las siguientes funciones de biblioteca de CloudWatch Synthetics para Python son útiles para todos los canaries.

**Topics**
+ [Clase SyntheticsConfiguration](#CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python)
+ [Clase SyntheticsLogger](#CloudWatch_Synthetics_Library_SyntheticsLogger_Python)

### Clase SyntheticsConfiguration
<a name="CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python"></a>

Se puede utilizar la clase SyntheticsConfiguration para configurar el comportamiento de las funciones de biblioteca de Synthetics. Por ejemplo, puede utilizar esta clase para configurar la función ` executeStep()` para no tomar capturas de pantalla.

Se pueden establecer las configuraciones de CloudWatch Synthetics a nivel global.

Definiciones de la función

#### set\$1config(options)
<a name="CloudWatch_Synthetics_Library_setConfig_Python"></a>

```
from aws_synthetics.common import synthetics_configuration
```

` options ` es un objeto, que es un conjunto de opciones configurables para el valor controlado. En las siguientes secciones se explican los posibles campos en ` options `.
+ `screenshot_on_step_start` (booleano): si se debe tomar una captura de pantalla antes de comenzar un paso.
+ `screenshot_on_step_success` (booleano): si se debe tomar una captura de pantalla después de completar un paso correctamente.
+ `screenshot_on_step_failure` (booleano): si se debe tomar una captura de pantalla después de que un paso falla.

 **with\$1screenshot\$1on\$1step\$1start(screenshot\$1on\$1step\$1start)** 

Acepta un argumento booleano, que indica si se debe tomar una captura de pantalla antes de iniciar un paso.

 **with\$1screenshot\$1on\$1step\$1success(screenshot\$1on\$1step\$1success)** 

Acepta un argumento booleano, que indica si se debe tomar una captura de pantalla después de completar un paso correctamente.

 **with\$1screenshot\$1on\$1step\$1failure(screenshot\$1on\$1step\$1failure)** 

Acepta un argumento booleano, que indica si se debe tomar una captura de pantalla después de que un paso falla.

 **get\$1screenshot\$1on\$1step\$1start()** 

Muestra si se debe tomar una captura de pantalla antes de iniciar un paso.

 **get\$1screenshot\$1on\$1step\$1success()** 

Muestra si se debe realizar una captura de pantalla después de completar un paso correctamente.

 **get\$1screenshot\$1on\$1step\$1failure()** 

Muestra si se debe tomar una captura de pantalla después de que un paso falla.

 **disable\$1step\$1screenshots()** 

Desactiva todas las opciones de captura de pantalla (get\$1screenshot\$1on\$1step\$1start, get\$1screenshot\$1on\$1step\$1success, y get\$1screenshot\$1on\$1step\$1failure).

 **enable\$1step\$1screenshots()** 

Habilita todas las opciones de captura de pantalla (get\$1screenshot\$1on\$1step\$1start, get\$1screenshot\$1on\$1step\$1success y get\$1screenshot\$1on\$1step\$1failure). Estos métodos no están habilitados de forma predeterminada.

 **setConfig(options) con respecto a las métricas de CloudWatch** 

Para los canarios que utilizan `syn-python-selenium-1.1` o versiones posteriores, las **(opciones)** para **setConfig** pueden incluir los siguientes parámetros booleanos que determinan qué métricas publica el canario. El valor predeterminado para cada una de estas opciones es `true`. Las opciones que comienzan con ` aggregated` determinan si la métrica se emite sin la dimensión ` CanaryName`. Se pueden utilizar estas métricas para ver los resultados agregados de todos los canaries. Las otras opciones determinan si la métrica se emite con la dimensión `CanaryName`. Se pueden usar estas métricas para ver los resultados de cada valor controlado individualmente.

Para obtener una lista de las métricas de CloudWatch que los canaries emiten, consulte [Métricas de CloudWatch que los canaries publican](CloudWatch_Synthetics_Canaries_metrics.md).
+ `failed_canary_metric` (booleano): si se debe emitir la métrica ` Failed` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `failed_requests_metric` (booleano): si se debe emitir la métrica `Failed requests` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `2xx_metric` (booleano): si se debe emitir la métrica `2xx` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `4xx_metric` (booleano): si se debe emitir la métrica `4xx` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `5xx_metric` (booleano): si se debe emitir la métrica `5xx` (con la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `step_duration_metric` (booleano): si se debe emitir la métrica `Step duration` (con las dimensiones `CanaryName` y `StepName`) para este valor controlado. El valor predeterminado es `true`.
+ `step_success_metric` (booleano): si se debe emitir la métrica `Step success` (con las dimensiones `CanaryName` y `StepName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated_failed_canary_metric` (booleano): si se debe emitir la métrica `Failed` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated_failed_requests_metric` (booleano): si se debe emitir la métrica `Failed Requests` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated_2xx_metric` (booleano): si se debe emitir la métrica ` 2xx` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated_4xx_metric` (booleano): si se debe emitir la métrica ` 4xx` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.
+ `aggregated_5xx_metric` (booleano): si se debe emitir la métrica ` 5xx` (sin la dimensión `CanaryName`) para este valor controlado. El valor predeterminado es `true`.

 **with\$12xx\$1metric(2xx\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `2xx` con la dimensión `CanaryName` para este valor controlado.

 **with\$14xx\$1metric(4xx\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `4xx` con la dimensión `CanaryName` para este valor controlado.

 **with\$15xx\$1metric(5xx\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `5xx` con la dimensión `CanaryName` para este valor controlado.

 **withAggregated2xxMetric(aggregated2xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `2xx` sin dimensión para este valor controlado.

 **withAggregated4xxMetric(aggregated4xxMetric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `4xx` sin dimensión para este valor controlado.

 **with\$1aggregated\$15xx\$1metric(aggregated\$15xx\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `5xx` sin dimensión para este valor controlado.

 ** with\$1aggregated\$1failed\$1canary\$1metric(aggregated\$1failed\$1canary\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed` sin dimensión para este valor controlado.

 ** with\$1aggregated\$1failed\$1requests\$1metric(aggregated\$1failed\$1requests\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed requests` sin dimensión para este valor controlado.

 **with\$1failed\$1canary\$1metric(failed\$1canary\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed` con la dimensión `CanaryName` para este valor controlado.

 **with\$1failed\$1requests\$1metric(failed\$1requests\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Failed requests` con la dimensión `CanaryName` para este valor controlado.

 **with\$1step\$1duration\$1metric(step\$1duration\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `Duration` con la dimensión `CanaryName` para este valor controlado.

 **with\$1step\$1success\$1metric(step\$1success\$1metric)** 

Acepta un argumento booleano, que especifica si se emitirá una métrica `StepSuccess` con la dimensión `CanaryName` para este valor controlado.

##### Métodos para habilitar o desactivar métricas
<a name="CloudWatch_Synthetics_Python_setConfig_metrics"></a>

 **disable\$1aggregated\$1request\$1metrics()** 

Desactiva que el valor controlado emita todas las métricas de solicitud que se emiten sin dimensión ` CanaryName`.

 **disable\$1request\$1metrics()** 

Deshabilita todas las métricas de solicitud, incluidas las métricas por valor controlado y las métricas agregadas en todos los valores controlados.

 **disable\$1step\$1metrics()** 

Desactiva todas las métricas de pasos, incluidas las métricas de éxito y de duración de los pasos.

 **enable\$1aggregated\$1request\$1metrics()** 

Permite que el valor controlado emita todas las métricas de solicitud que se emiten sin dimensión ` CanaryName`.

 **enable\$1request\$1metrics()** 

Habilita todas las métricas de solicitud, incluidas las métricas por valor controlado y las métricas agregadas en todos los valores controlados.

 **enable\$1step\$1metrics()** 

Habilita todas las métricas de pasos, incluidas las métricas de éxito y de duración de los pasos.

 **Uso en valores controlados de la IU** 

Primero, importe la relación de Synthetics y obtenga la configuración. A continuación, establezca la configuración para cada opción mediante llamadas al método SetConfig con una de las siguientes opciones.

```
from aws_synthetics.common import synthetics_configuration

synthetics_configuration.set_config(
     {
        "screenshot_on_step_start": False,
        "screenshot_on_step_success": False,
        "screenshot_on_step_failure": True
     }
)

or
```

O

```
synthetics_configuration.with_screenshot_on_step_start(False).with_screenshot_on_step_success(False).with_screenshot_on_step_failure(True)
```

Para desactivar todas las capturas de pantalla, utilice la función disableStepScreenshots() como en este ejemplo.

```
synthetics_configuration.disable_step_screenshots()
```

Puede habilitar y desactivar las capturas de pantalla en cualquier punto del código. Por ejemplo, para desactivar las capturas de pantalla solo para un paso, se deben desactivar antes de ejecutar ese paso y habilitarlas después del paso.

##### set\$1config(options) para los valores controlados de la interfaz de usuario
<a name="CloudWatch_Synthetics_Library_Python_UI"></a>

A partir de `syn-python-selenium-1.1`, para los valores controlados de la interfaz de usuario, ` set_config` puede incluir los siguientes parámetros booleanos:
+ `continue_on_step_failure` (booleano): si se debe continuar con la ejecución del script canario después de que un paso falle (este parámetro hace referencia a la función **executeStep**). Si algún paso falla, la ejecución del valor controlado seguirá marcándose como fallida. El valor predeterminado es `false`.

### Clase SyntheticsLogger
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger_Python"></a>

`synthetics_logger` ingresa los registros tanto en la consola como en un archivo de registros local, en el mismo nivel de registro. Este archivo de registro se escribe en ambas ubicaciones solo si el nivel de registro coincide con el deseado para la función de registro a la que se llamó o está por debajo de este.

Los valores “DEBUG:”, “INFO:”, etc. se anteponen a las instrucciones de registro del archivo de registro local para que coincidan con el nivel de registro de la función a la que se llamó.

No es necesario utilizar `synthetics_logger` para crear un archivo de registros que se carga en la ubicación de resultados de Amazon S3. En su lugar, puede crear un archivo de registro distinto en la carpeta `/tmp`. Los archivos creados en la carpeta `/tmp` se cargan en la ubicación de resultados del bucket de S3 como artefactos.

Para utilizar . `synthetics_logger`:

```
from aws_synthetics.common import synthetics_logger
```

****Definiciones de funciones útiles:

Obtenga el nivel de registro:

```
log_level = synthetics_logger.get_level()
```

Establezca el nivel de registro:

```
synthetics_logger.set_level()
```

Registre un mensaje con un nivel especificado. El nivel puede ser `DEBUG`, ` INFO`, `WARN` o `ERROR`, como en los siguientes ejemplos de sintaxis:

```
synthetics_logger.debug(message, *args, **kwargs)
```

```
synthetics_logger.info(message, *args, **kwargs)
```

```
synthetics_logger.log(message, *args, **kwargs)
```

```
synthetics_logger.warning(message, *args, **kwargs)
```

```
synthetics_logger.error(message, *args, **kwargs)
```

Para obtener información acerca de los parámetros de depuración, consulte los documentos estándar de Python en [logging.debug](https://docs.python.org/3/library/logging.html#logging.debug)

En estas funciones de registro, el `message` es la cadena del formato del mensaje. Los `args` son los argumentos que se fusionan en `msg` que usan el operador de formato de cadena.

Hay tres argumentos de palabras clave en `kwargs`:
+ `exc_info`: si no se evalúa como false, agrega información de excepción al mensaje de registro.
+ `stack_info`: el valor predeterminado es false. Si es VERDADERO, agrega información de pila al mensaje de registro, incluida la llamada de registro real.
+ `extra`: el tercer argumento opcional de palabra clave, que se puede utilizar para especificar un diccionario que se utiliza para rellenar el `__dict__` del `LogRecord` que se ha creado para el evento de registro con atributos definidos por el usuario.

Ejemplos:

Registre un mensaje con el nivel `DEBUG`:

```
synthetics_logger.debug('Starting step - login.')
```

Registre un mensaje con el nivel `INFO`. `logger.log` es sinónimo de `logger.info`:

```
synthetics_logger.info('Successfully completed step - login.')
```

o

```
synthetics_logger.log('Successfully completed step - login.')
```

Registre un mensaje con el nivel `WARN`:

```
synthetics_logger.warning('Warning encountered trying to publish %s', 'CloudWatch Metric')
```

Registre un mensaje con el nivel `ERROR`:

```
synthetics_logger.error('Error encountered trying to publish %s', 'CloudWatch Metric')
```

Registre una excepción:

```
synthetics_logger.exception(message, *args, **kwargs)
```

Registre un mensaje con nivel `ERROR`. La información de excepción se agrega al mensaje de registro. Debe llamar a esta función solo desde un controlador de excepciones.

Para obtener información acerca de los parámetros de excepción, consulte los documentos estándar de Python en [logging.exception](https://docs.python.org/3/library/logging.html#logging.exception)

El `message` es la cadena en formato de mensaje. Los `args` son los argumentos, que se fusionan en `msg` mediante el operador de formato de cadena.

Hay tres argumentos de palabras clave en `kwargs`:
+ `exc_info`: si no se evalúa como false, agrega información de excepción al mensaje de registro.
+ `stack_info`: el valor predeterminado es false. Si es VERDADERO, agrega información de pila al mensaje de registro, incluida la llamada de registro real.
+ `extra`: el tercer argumento opcional de palabra clave, que se puede utilizar para especificar un diccionario que se utiliza para rellenar el `__dict__` del `LogRecord` que se ha creado para el evento de registro con atributos definidos por el usuario.

Ejemplo:

```
synthetics_logger.exception('Error encountered trying to publish %s', 'CloudWatch Metric')
```

## Clases y funciones de biblioteca de Python y Selenium que se aplican solo a canaries de la UI
<a name="CloudWatch_Synthetics_Library_Python_UIcanaries"></a>

Las siguientes funciones de la biblioteca de Selenium de CloudWatch Synthetics para Python solo son útiles para los valores controlados de la UI.

**Topics**
+ [Clase SyntheticsBrowser](#CloudWatch_Synthetics_Library_Python_SyntheticsBrowser)
+ [Clase SyntheticsWebDriver](#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver)

### Clase SyntheticsBrowser
<a name="CloudWatch_Synthetics_Library_Python_SyntheticsBrowser"></a>

**nota**  
Chrome es el único navegador compatible con `SyntheticsBrowser`.

Cuando se crea una instancia de navegador mediante una llamada a `synthetics_webdriver.Chrome()`, la instancia del navegador devuelta es del tipo `SyntheticsBrowser`. La clase ` SyntheticsBrowser` hereda la clase WebDriver y proporciona acceso a todos los métodos expuestos por [WebDriver](https://www.selenium.dev/documentation/webdriver/). Controla el ChromeDriver y habilita el script del canario para manejar el navegador, lo que permite al WebDriver Selenium trabajar con Synthetics.

**nota**  
Synthetics anula el método [quit](https://www.selenium.dev/selenium/docs/api/py/selenium_webdriver_firefox/selenium.webdriver.firefox.webdriver.html) de WebDriver para no realizar ninguna acción. No debe preocuparse por cerrar el navegador, ya que Synthetics se encarga de ello.

Además de los métodos estándar de Selenium, también proporciona los siguientes métodos. 

**Topics**
+ [set\$1viewport\$1size(ancho, alto)](#CloudWatch_Synthetics_Library_set_viewport_size)
+ [save\$1screenshot(nombre del archivo, sufijo)](#CloudWatch_Synthetics_Library_save_screenshot)

#### set\$1viewport\$1size(ancho, alto)
<a name="CloudWatch_Synthetics_Library_set_viewport_size"></a>

Establece la ventana gráfica del navegador. Ejemplo:

```
browser.set_viewport_size(1920, 1080)
```

#### save\$1screenshot(nombre del archivo, sufijo)
<a name="CloudWatch_Synthetics_Library_save_screenshot"></a>

Guarda capturas de pantalla en el directorio de `/tmp`. Las capturas de pantalla se cargan desde allí a la carpeta de artefactos de valores controlados en el bucket de S3.

*filename* es el nombre del archivo de la captura de pantalla, y *suffix* es una cadena opcional que se utilizará para nombrar la captura de pantalla.

Ejemplo:

```
browser.save_screenshot('loaded.png', 'page1')
```

### Clase SyntheticsWebDriver
<a name="CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver"></a>

Para utilizar esta clase, utilice lo siguiente en su script:

```
from aws_synthetics.selenium import synthetics_webdriver
```

**Topics**
+ [add\$1execution\$1error(errorMessage, ex);](#CloudWatch_Synthetics_Library_Python_addExecutionError)
+ [add\$1user\$1agent(user\$1agent\$1str)](#CloudWatch_Synthetics_Library_add_user_agent)
+ [execute\$1step(step\$1name, function\$1to\$1execute)](#CloudWatch_Synthetics_Library_Python_execute_step)
+ [get\$1http\$1response(url)](#CloudWatch_Synthetics_Library_Python_get_http_response)
+ [Chrome()](#CloudWatch_Synthetics_Library_Python_Chrome)

#### add\$1execution\$1error(errorMessage, ex);
<a name="CloudWatch_Synthetics_Library_Python_addExecutionError"></a>

`errorMessage` describe el error y `ex` es la excepción que se ha encontrado

`add_execution_error` puede usarse para establecer errores de ejecución para el valor controlado. Se produce un error en el valor controlado sin interrumpir la ejecución del script. Tampoco afecta a las métricas de `successPercent`.

Debe realizar un seguimiento de los errores como errores de ejecución sólo si no son importantes para indicar el éxito o el error del script valor controlado.

A continuación, se muestra un ejemplo del uso de un `add_execution_error`. Está supervisando la disponibilidad de su punto de conexión y tomando capturas de pantalla después de que la página se haya cargado. Debido a que el hecho de no tomar una captura de pantalla no determina la disponibilidad del punto de enlace, puede detectar cualquier error que encuentre al tomar capturas de pantalla y agregarlos como errores de ejecución. Las métricas de disponibilidad seguirán indicando que el punto de conexión está activo y en ejecución, pero el estado del valor controlado se marcará como fallido. El siguiente bloque de código de muestra detecta dicho error y lo agrega como un error de ejecución.

```
try:
    browser.save_screenshot("loaded.png")  
except Exception as ex:
   self.add_execution_error("Unable to take screenshot", ex)
```

#### add\$1user\$1agent(user\$1agent\$1str)
<a name="CloudWatch_Synthetics_Library_add_user_agent"></a>

Añade el valor de `user_agent_str` a la cabecera del agente de usuario del navegador. Debe asignar `user_agent_str` antes de crear la instancia del navegador.

Ejemplo:

```
await synthetics_webdriver.add_user_agent('MyApp-1.0')
```

`add_user_agent` debe usarse dentro de una función `async`.

#### execute\$1step(step\$1name, function\$1to\$1execute)
<a name="CloudWatch_Synthetics_Library_Python_execute_step"></a>

Procesa una función. También hace lo siguiente:
+ Registra que el paso se ha iniciado.
+ Toma una captura de pantalla denominada `<stepName>-starting`.
+ Inicia un temporizador.
+ Ejecuta la función proporcionada.
+ Si la función devuelve resultados normalmente, cuenta como superada. Si la función falla, cuenta como error.
+ Finaliza el temporizador.
+ Registra si el paso se ha superado o no.
+ Toma una captura de pantalla denominada `<stepName>-succeeded` o ` <stepName>-failed`.
+ Emite la métrica `stepName` `SuccessPercent`, 100 para superado o 0 para no superado.
+ Emite la métrica `stepName` `Duration`, con un valor basado en las horas de inicio y de finalización del paso.
+ Por último, devuelve el mismo resultado que `functionToExecute` o vuelve a arrojar el mismo error que `functionToExecute`.

Ejemplo:

```
from selenium.webdriver.common.by import By

def custom_actions():
        #verify contains
        browser.find_element(By.XPATH, "//*[@id=\"id_1\"][contains(text(),'login')]")
        #click a button
        browser.find_element(By.XPATH, '//*[@id="submit"]/a').click()

    await synthetics_webdriver.execute_step("verify_click", custom_actions)
```

#### get\$1http\$1response(url)
<a name="CloudWatch_Synthetics_Library_Python_get_http_response"></a>

Realiza una solicitud HTTP a la URL proporcionada y devuelve el código de respuesta de la solicitud HTTP. Si se ha producido una excepción durante la solicitud HTTP, en su lugar se devuelve una cadena con el valor “error”.

Ejemplo:

```
response_code = syn_webdriver.get_http_response(url)
if not response_code or response_code == "error" or response_code < 200 or response_code > 299:
    raise Exception("Failed to load page!")
```

#### Chrome()
<a name="CloudWatch_Synthetics_Library_Python_Chrome"></a>

Lanza una instancia del navegador Chromium y muestra la instancia creada del navegador.

Ejemplo:

```
browser = synthetics_webdriver.Chrome()
browser.get("https://example.com/)
```

Para lanzar un navegador en modo de incógnito, utilice lo siguiente:

```
add_argument('——incognito')
```

Para agregar la configuración del proxy, utilice lo siguiente:

```
add_argument('--proxy-server=%s' % PROXY)
```

Ejemplo:

```
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("——incognito")
browser = syn_webdriver.Chrome(chrome_options=chrome_options)
```

# Programación de las ejecuciones de valores controlados con cron
<a name="CloudWatch_Synthetics_Canaries_cron"></a>

El uso de una expresión cron le da flexibilidad cuando programa un valor controlado. Las expresiones Cron contienen cinco o seis campos en el orden que se indica en la siguiente tabla. Los campos están separados por espacios. La sintaxis difiere en función de si está utilizando la consola de CloudWatch para crear el valor controlado o AWS CLI o los SDK de AWS. Cuando utilice la consola, especifique sólo los cinco primeros campos. Cuando utiliza AWS CLI o los SDK de AWS, especifique los seis campos y debe especificar `*` para el campo del `Year` (año).


|  **Campo**  |  **Valores permitidos**  |  **Caracteres especiales permitidos**  | 
| --- | --- | --- | 
|  Minutos  |  0-59  |  , - \$1 /  | 
|  Horas  |  0-23  |  , - \$1 /  | 
|  Día del mes  |  1-31  |  , - \$1 ? / L W  | 
|  Mes  |  1-12 o JAN-DEC  |  , - \$1 /  | 
|  Día de la semana  |  1-7 o SUN-SAT  |  , - \$1 ? L \$1  | 
|  Año  |  \$1  |    | 

**Caracteres especiales**
+ La **,** (coma) incluye varios valores en la expresión de un campo. Por ejemplo, en el campo Month (mes), ENERO, FEBRERO, MARZO incluirían enero, febrero y marzo.
+ El **-** (guion) es un carácter especial que especifica intervalos. En el campo Day, 1-15 incluiría los días del 1 al 15 del mes especificado.
+ El **\$1** (asterisco) es un carácter especial que incluye todos los valores del campo. En el campo (Hours) horas, **\$1** incluye cada hora. No puede utilizar **\$1** en los campos Day-of-month (Día del mes) y Day-of-week (Día de la semana) en la misma expresión. Si lo utiliza en uno, debe utilizar **?** en el otro.
+ La **/** (barra inclinada) especifica incrementos. En el campo Minutes (minutos), puede escribir 1/10 para especificar cada diez minutos, si empieza desde el primer minuto de la hora (por ejemplo, los minutos once, veintiuno y treinta y uno, etc.).
+ El **?** (signo de interrogación) especifica uno u otro. Si ingresa el número **7** en el campo Day-of-month y no es importante especificar qué día de la semana es el séptimo, puede escribir **?** en el campo Day-of-week.
+ El comodín **L** en los campos Día del mes o Día de la semana especifica el último día del mes o de la semana.
+ El comodín **W** en el campo Día del mes especifica un día de la semana. En el campo Día del mes, **3W** especifica el día de la semana más cercano al tercer día del mes.
+ El comodín **\$1** en el campo Día de la semana especifica una instancia concreta del día de la semana de un mes. Por ejemplo, 3\$12 es el segundo martes del mes. El número 3 hace referencia al martes, ya que es el tercer día de la semana en el calendario anglosajón, mientras que 2 hace referencia al segundo día de ese tipo dentro de un mes.

**Limitaciones**
+ No se pueden especificar los campos Día del mes y Día de la semana en la misma expresión cron. Si especifica un valor o un `*` (asterisco) en uno de los campos, debe utilizar un **?** (signo de interrogación) en el otro.
+ No se admiten expresiones cron que produzcan frecuencias superiores a un minuto.
+ No se puede configurar un valor controlado para que espere más de un año antes de la ejecución, por lo que solo se puede especificar `*` en el `Year`.

**Ejemplos**  
Puede consultar las siguientes cadenas cron de muestra al crear un valor controlado. Los siguientes ejemplos son la sintaxis correcta para utilizar AWS CLI o SDK de AWS para crear o actualizar un valor controlado. Si está utilizando la consola de CloudWatch, omita el `*` final en cada ejemplo.


| Expresión | Significado | 
| --- | --- | 
|   `0 10 * * ? *`   |  Ejecutar a las 10:00 h (UTC) todos los días  | 
|   `15 12 * * ? *`   |  Ejecutar a las 12:15 h (UTC) todos los días  | 
|   `0 18 ? * MON-FRI *`   |  Ejecutar a las 18:00 h (UTC) de lunes a viernes  | 
|   `0 8 1 * ? *`   |  Ejecútelo a las 08.00 h (UTC) el primer día de cada mes  | 
|   `0/10 * ? * MON-SAT *`   |  Ejecútelo cada 10 minutos de lunes a sábado de cada semana  | 
|   `0/5 8-17 ? * MON-FRI *`   |  Ejecútelo cada 5 minutos de lunes a viernes entre las 8.00 h y las 17.55 h (UTC)   | 

# Configuración de su canario para que reintente automáticamente
<a name="CloudWatch_Synthetics_Canaries_autoretry"></a>

Al crear o actualizar un canario, puede configurarlo para que intente nuevas ejecuciones automáticamente cuando falle la ejecución programada. Esto ayuda a diferenciar entre los fallos genuinos y los temporales para obtener resultados más fiables. Esta característica es ideal para crear sistemas de monitorización más resistentes y, al mismo tiempo, reducir las falsas alarmas y la intervención manual.

**Creación de un canario con reintento automático**

1. Abra la consola de CloudWatch en [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. En el panel de navegación, elija **Señales de aplicación**, **Valores controlados de Synthetics**.

1. Elija **Crear valor controlado**.

1. En **Configuración adicional**, **Reintento automático**, seleccione el número máximo de reintentos deseado.

**Actualización del número máximo de reintentos de un canario**

1. Abra la consola de CloudWatch en [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. En el panel de navegación, elija **Señales de aplicación**, **Valores controlados de Synthetics**.

1. Puede elegir una de las opciones siguientes:
   + Seleccione el canario y elija **Acciones**, **Habilitar reintento automático** y ajuste el número máximo de reintentos.
   + Seleccione el canario y elija **Acciones**, **Editar**. En la página **Editar detalles**, en **Configuración adicional**, **Reintento automático**, ajuste la configuración de reintentos.

 **Limitaciones** 

Estas son las limitaciones para configurar el reintento automático.
+ Solo se admite en las versiones de tiempo de ejecución `syn-nodejs-puppeteer-10.0 ` o posteriores, ` syn-nodejs-playwright-2.0` o posteriores, `syn-python-selenium-5.1` o posteriores, o `syn-nodejs-3.0` o posteriores.
+ Los canarios de larga duración cuyo tiempo de espera se agote después de diez minutos tienen un límite de un reintento. Todos los demás canarios admiten hasta dos reintentos.

# Uso de dependencias con canarios de CloudWatch Synthetics
<a name="CloudWatch_Synthetics_Canaries_dependencies"></a>

En esta sección se explica cómo usar `Dependencies` en los canarios de CloudWatch Synthetics. El campo `Dependencies` le permite especificar las dependencias de sus canarios, lo que le permite incluir otras bibliotecas o código personalizado que pueden utilizar los scripts de canarios.

## Descripción general
<a name="overview"></a>

Los canarios de CloudWatch Synthetics permite especificar las capas de Lambda como dependencias. Esta característica le permite hacer lo siguiente:
+ Compartir código común en varios canarios
+ Administrar las dependencias por separado del código del script de canarios
+ Reducir el tamaño del script de canarios al mover las dependencias a una capa de Lambda

## API compatibles:
<a name="supported-apis"></a>

El campo `Dependencies` es compatible con las siguientes API:
+  [CreateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html) 
+  [UpdateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_UpdateCanary.html) 
+  [ StartCanaryDryRun](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_StartCanaryDryRun.html) 

## Sintaxis
<a name="syntax"></a>

El campo `Dependencies` forma parte de la estructura de código de la sintaxis de la solicitud:

```
"Code": { 
  "Handler": "string",
  "S3Bucket": "string",
  "S3Key": "string",
  "S3Version": "string",
  "ZipFile": blob,
  "Dependencies": [
    {
      "Type": "LambdaLayer",
      "Reference": "string"
    }
  ]
}
```

## Uso de dependencias
<a name="usage"></a>

Estos son algunos ejemplos e instrucciones para usar el campo `Dependencies` en diferentes escenarios.

### Crear un canario con dependencias
<a name="creating-canary"></a>

Al crear un canario, puede especificar una capa de Lambda como dependencia:

```
{
  "Name": "my-canary",
  "Code": {
    "Handler": "pageLoadBlueprint.handler",
    "S3Bucket": "my-bucket",
    "S3Key": "my-canary-script.zip",
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-custom-layer:1"
      }
    ]
  },
  "ArtifactS3Location": "s3://my-bucket/artifacts/",
  "ExecutionRoleArn": "arn:aws:iam::123456789012:role/my-canary-role",
  "Schedule": {
    "Expression": "rate(5 minutes)"
  },
  "RuntimeVersion": "syn-nodejs-puppeteer-3.9"
}
```

### Actualizar las dependencias de un canario
<a name="updating-canary"></a>

Puede actualizar las dependencias de un canario mediante la API UpdateCanary:

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-updated-layer:2"
      }
    ]
  }
}
```

### Eliminar dependencias
<a name="removing-dependencies"></a>

Para eliminar las dependencias de un canario, proporcione una matriz vacía para el campo Dependencias:

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": []
  }
}
```

### Probar las dependencias con StartCanaryDryRun
<a name="testing-dependencies"></a>

Antes de actualizar un canario con nuevas dependencias, puede probarlas con la API StartCanaryDryRun:

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-test-layer:3"
      }
    ]
  }
}
```

## Limitaciones y consideraciones
<a name="limitations"></a>
+ Solo se puede especificar una capa de Lambda como dependencia
+ El rol que se utilice para crear un canario con dependencias debe tener acceso de ` lambda:GetLayerVersion` a la capa de dependencias además de los [roles y permisos necesarios](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Roles.html)

## Crear capas de Lambda compatibles
<a name="creating-compatible-layers"></a>

Para obtener información sobre cómo crear y empaquetar capas, consulte [Administrar dependencias de Lambda con capas](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html) y para comprender la estructura de empaquetado de un canario según la estructura de empaquetado del canario, consulte [Escritura de un script de canario](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html).