Scrittura di uno script canary Node.js utilizzando il runtime Playwright - Amazon CloudWatch

Scrittura di uno script canary Node.js utilizzando il runtime Playwright

Creazione di pacchetti dei file canary Node.js per il runtime di Playwright

Il tuo script canary comprende un file .js (sintassi CommonJS) o .mjs (sintassi ES) contenente il codice del gestore Synthetics, insieme a tutti i pacchetti e moduli aggiuntivi da cui dipende il codice. Gli script creati in formato ES (ECMAScript) devono utilizzare l'estensione .mjs o includere un file package.json con il campo “type”: “module” impostato. A differenza di altri runtime come Node.js Puppeteer, non è necessario salvare gli script in una struttura di cartelle specifica. Puoi direttamente creare pacchetti dei tuoi script. Utilizza il tuo strumento di compressione zip preferito per creare un file .zip con il file gestore nella directory root. Se il tuo script canary dipende da pacchetti o moduli aggiuntivi non inclusi nel runtime Synthetics, puoi aggiungere queste dipendenze al tuo file .zip. A tale scopo, puoi installare le librerie richieste dalla tua funzione nella directory node_modules eseguendo il comando npm install. I seguenti comandi della CLI di esempio creano un file .zip denominato my_deployment_package.zip, contenente il file index.js o index.mjs (gestore Synthetics) e le relative dipendenze. Nell'esempio, installi le dipendenze utilizzando il gestore di pacchetti npm.

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

Crea un file .zip dei contenuti della cartella di progetto della directory root. Utilizza l'opzione r (ricorsiva), come illustrato nell'esempio seguente, per assicurarti che zip comprima le sottocartelle.

zip -r my_deployment_package.zip .

Aggiungi un file di configurazione Synthetics per configurare il comportamento di CloudWatch Synthetics. Puoi creare un file synthetics.json e salvarlo nello stesso percorso del punto di ingresso o del file del gestore.

Facoltativamente, puoi anche archiviare il file del punto di ingresso in una struttura di cartelle a tua scelta. Tuttavia, assicurati che il percorso della cartella sia specificato nel nome del gestore.

Nome del gestore

Assicurati di impostare il punto di ingresso dello script del tuo canary (gestore) in modo che myCanaryFilename.functionName corrisponda al nome del file del punto di ingresso dello script. Facoltativamente, puoi anche archiviare il canary in una cartella separata, ad esempio myFolder/my_canary_filename.mjs. Se lo archivi in una cartella separata, definisci il percorso nel punto di ingresso dello script, ad esempio myFolder/my_canary_filename.functionName.

Modifica di uno script Playwright esistente da utilizzare come canary di CloudWatch Synthetics

Puoi modificare uno script esistente per Node.js e Playwright da utilizzare come canary. Per ulteriori informazioni su Playwright, consulta la documentazione Playwright library.

Puoi utilizzare il seguente script Playwright salvato nel file 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();

Converti lo script seguendo i passaggi di seguito:

  1. Creare ed esportare una funzione handler. Il gestore è la funzione del punto di ingresso per lo script. Puoi scegliere qualsiasi nome per la funzione del gestore, ma la funzione utilizzata nel tuo script dovrebbe essere la stessa nel gestore del tuo canary. Se il nome del tuo script è exampleCanary.mjs, e il nome della funzione del gestore è myhandler, il tuo gestore canary è denominato exampleCanary.myhandler. Nell'esempio seguente, il nome della funzione del gestore è handler.

    exports.handler = async () => { // Your script here };
  2. Importa il Synthetics Playwright module come dipendenza.

    import { synthetics } from '@amzn/synthetics-playwright';
  3. Avvia un browser utilizzando la funzione Launch di Synthetics.

    const browser = await synthetics.launch();
  4. Crea una nuova pagina Playwright utilizzando la funzione newPage di Synthetics.

    const page = await synthetics.newPage();

Il tuo script è ora pronto per essere eseguito come canary di Synthetics. Di seguito è riportato lo script aggiornato:

Script aggiornato in formato ES6

Il file di script salvato con un'estensione .mjs.

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

Script aggiornato in formato CommonJS

Il file di script salvato con un'estensione .js.

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

Configurazioni di CloudWatch Synthetics

Puoi configurare il comportamento del runtime Synthetics Playwright fornendo un file di configurazione JSON facoltativo denominato synthetics.json. Questo file dovrebbe essere incluso nella stessa posizione del file gestore. Sebbene un file di configurazione sia facoltativo, se non fornisci un file di configurazione o manca una chiave di configurazione, CloudWatch impiega i valori predefiniti.

Creazione di un pacchetto del file di configurazione

Di seguito sono riportati i valori di configurazione supportati e i relativi valori predefiniti.

{ "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 }

Configurazioni di passaggio

  • screenshotOnStepStart: determina se Synthetics deve acquisire uno screenshot prima dell'inizio del passaggio. Il valore predefinito è true.

  • screenshotOnStepSuccess: determina se Synthetics deve acquisire uno screenshot dopo che un passaggio ha avuto esito positivo. Il valore predefinito è true.

  • screenshotOnStepFailure: determina se Synthetics deve acquisire uno screenshot dopo che un passaggio ha avuto esito negativo. Il valore predefinito è true.

  • continueOnStepFailure: determina se uno script deve continuare anche dopo un passaggio non riuscito. Il valore predefinito è false.

  • stepSuccessMetric: determina se viene emessa la metrica SuccessPercent di un passaggio. La metrica SuccessPercent per un passaggio vale 100 per l'esecuzione canary se il passaggio ha esito positivo, mentre 0 se ha esito negativo. Il valore predefinito è true.

  • stepDurationMetric: determina se viene emessa la metrica Duration di un passaggio. La metrica Duration viene emessa come durata, in millisecondi, dell'esecuzione del passaggio. Il valore predefinito è true.

Configurazioni dei report

Include tutti i report generati da CloudWatch Synthetics, come un file HAR e un report dei passaggi di Synthetics. Anche i campi di redazione dei dati sensibili restrictedHeaders e restrictedUrlParameters si applicano ai log generati da Synthetics.

  • includeRequestHeaders: indica se includere le intestazioni della richiesta nel report. Il valore predefinito è false.

  • includeResponseHeaders: indica se includere le intestazioni della risposta nel report. Il valore predefinito è false.

  • includeUrlPassword: indica se includere una password visualizzata nell'URL. Per impostazione predefinita, le password visualizzate negli URL vengono cancellate da log e report, per evitare la divulgazione di dati sensibili. Il valore predefinito è false.

  • includeRequestBody: indica se includere il corpo della richiesta nel report. Il valore predefinito è false.

  • includeResponseBody: indica se includere il corpo della risposta nel report. Il valore predefinito è false.

  • restrictedHeaders: un elenco di valori di intestazione da ignorare, se le intestazioni sono incluse. Questo vale sia per le intestazioni della richiesta che della risposta. Ad esempio, puoi nascondere le tue credenziali inserendo includeRequestHeaders come true e restrictedHeaders come ['Authorization'].

  • restrictedUrlParameters: un elenco di parametri del percorso dell'URL o della query da oscurare. Si applica agli URL visualizzati nei log, nei report e negli errori. Il parametro prevede la distinzione tra lettere maiuscole e minuscole. Puoi passare un asterisco (*) come valore per oscurare tutti i valori dei parametri del percorso dell'URL e delle query. L'impostazione predefinita è una matrice vuota.

  • har: determina se deve essere generato un archivio HTTP (HAR). Il valore predefinito è true.

Di seguito è riportato un esempio di file di configurazioni del 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

Configurazioni di registrazione

Si applica ai log generati da CloudWatch Synthetics. Controlla la verbosità dei log di richieste e risposte.

  • logRequest: indica se registrare ogni richiesta nei log del canary. Per i canary dell'interfaccia utente, registra ogni richiesta inviata dal browser. Il valore predefinito è false.

  • logResponse: indica se registrare ogni risposta nei log del canary. Per i canary dell'interfaccia utente, registra ogni risposta ricevuta dal browser. Il valore predefinito è false.

  • logRequestBody: indica se registrare i corpi delle richieste insieme alle richieste nei log dei canary. Questa configurazione si applica solo se logRequest è true. Il valore predefinito è false.

  • logResponseBody: indica se registrare i corpi delle risposte insieme alle richieste nei log dei canary. Questa configurazione si applica solo se logResponse è true. Il valore predefinito è false.

  • logRequestHeaders: indica se registrare le intestazioni delle richieste insieme alle richieste nei log dei canary. Questa configurazione si applica solo se logRequest è true. Il valore predefinito è false.

  • logResponseHeaders: indica se registrare le intestazioni delle risposte insieme alle risposte nei log dei canary. Questa configurazione si applica solo se logResponse è true. Il valore predefinito è false.

Configurazioni delle metriche HTTP

Configurazioni per metriche relative al conteggio delle richieste di rete con codici di stato HTTP diversi, emesse da CloudWatch Synthetics per questo canary.

  • metric_2xx: indica se emettere la metrica 2xx (con la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • metric_4xx: indica se emettere la metrica 4xx (con la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • metric_5xx: indica se emettere la metrica 5xx (con la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • failedRequestsMetric: indica se emettere la metrica failedRequests (con la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • aggregatedFailedRequestsMetric: indica se emettere la metrica failedRequests (senza la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • aggregated2xxMetric: indica se emettere la metrica 2xx (senza la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • aggregated4xxMetric: indica se emettere la metrica 4xx (senza la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • aggregated5xxMetric: indica se emettere la metrica 5xx (senza la dimensione CanaryName) per questo canary. Il valore predefinito è true.

Configurazioni delle metriche del canary

Configurazioni per altre metriche emesse da CloudWatch Synthetics.

  • failedCanaryMetric: indica se emettere la metrica Failed (con la dimensione CanaryName) per questo canary. Il valore predefinito è true.

  • aggregatedFailedCanaryMetric: indica se emettere la metrica Failed (senza la dimensione CanaryName) per questo canary. Il valore predefinito è true.

Altre configurazioni

  • userAgent: una stringa da aggiungere all'agente utente. L'agente utente è una stringa inclusa nell'intestazione della richiesta e identifica il browser nei siti web visitati quando si utilizza il browser headless. CloudWatch Synthetics aggiunge automaticamente CloudWatchSynthetics/canary-arn to the user agent. La configurazione specificata viene aggiunta all'agente utente generato. Il valore predefinito dell'agente utente da aggiungere è una stringa vuota ("").

Variabili di ambiente di CloudWatch Synthetics

Configura il livello e il formato di registrazione utilizzando le variabili di ambiente.

Formato dei log

Il runtime Playwright di CloudWatch Synthetics crea log CloudWatch per ogni esecuzione canary. I log sono scritti in formato JSON per facilitare le interrogazioni. Facoltativamente, puoi modificare il formato del log in TEXT.

  • Environment variable name: CW_SYNTHETICS_LOG_FORMAT

  • Supported values: JSON, TEXT

  • Default: JSON

Livelli di log

Sebbene l'attivazione della modalità Debug aumenti la verbosità, può essere utile per la risoluzione dei problemi.

  • Environment variable name: CW_SYNTHETICS_LOG_LEVEL

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

  • Default: INFO