Schreiben eines Node.js-Canary-Skript mit der Playwright-Laufzeit - Amazon CloudWatch

Schreiben eines Node.js-Canary-Skript mit der Playwright-Laufzeit

Bündeln Ihrer Node.js-Canary-Dateien für die Playwright-Laufzeit

Ihr Canary-Skript besteht aus einer .js (CommonJS-Syntax) oder .mjs (ES-Syntax)-Datei, die Ihren Synthetics-Handler-Code enthält, zusammen mit allen zusätzlichen Paketen und Modulen, von denen Ihr Code abhängt. Im ES-Format (ECMAScript) erstellte Skripte sollten entweder .mjs als Erweiterung verwenden oder eine package.json-Datei mit dem Feldsatz „type“: „module“ enthalten. Im Gegensatz zu anderen Laufzeiten wie Node.js Puppeteer müssen Sie Ihre Skripts nicht in einer bestimmten Ordnerstruktur speichern. Sie können Ihre Skripte direkt bündeln. Erstellen Sie mit Ihrem bevorzugten zip-Programm eine .zip-Datei mit Ihrer Handler-Datei im Stammverzeichnis. Wenn Ihr Canary-Skript von zusätzlichen Paketen oder Modulen abhängt, die nicht in der Synthetics-Laufzeit enthalten sind, können Sie diese Abhängigkeiten zu Ihrer .zip-Datei hinzufügen. Um dies zu tun, können Sie die erforderlichen Bibliotheken Ihrer Funktion im node_modules-Verzeichnis installieren, indem Sie den npm install-Befehl ausführen. Die folgenden CLI-Befehle erstellen eine .zip-Datei mit dem Namen my_deployment_package.zip, welche die index.js- oder index.mjs-Datei (Synthetics-Handler) und die zugehörigen Abhängigkeiten enthält. Im Beispiel installieren Sie Abhängigkeiten mit dem npm-Paketmanager.

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

Erstellen Sie im Stammverzeichnis eine .zip-Datei mit den Inhalten Ihres Projektordners. Verwenden Sie die r (rekursive) Option, wie im folgenden Beispiel gezeigt, um sicherzustellen, dass zip die Unterordner komprimiert.

zip -r my_deployment_package.zip .

Fügen Sie eine Synthetics-Konfigurationsdatei hinzu, um das Verhalten von CloudWatch Synthetics zu konfigurieren. Sie können eine synthetics.json-Datei erstellen und sie unter demselben Pfad wie Ihren Einstiegspunkt oder Ihre Handler-Datei speichern.

Optional können Sie Ihre Einstiegspunktdatei auch in einer Ordnerstruktur Ihrer Wahl speichern. Stellen Sie jedoch sicher, dass der Ordnerpfad in Ihrem Handlernamen angegeben ist.

Handlername

Legen Sie den Skript-Eintrittspunkt Ihres Canary (Handler) als myCanaryFilename.functionName fest, damit er mit dem Dateinamen des Skript-Eintrittspunkts übereinstimmt. Sie können den Canary auch in einem separaten Ordner (z. B. myFolder/my_canary_filename.mjs) ablegen. Wenn Sie ihn in einem separaten Ordner speichern, geben Sie den entsprechenden Pfad in Ihrem Skript-Eintrittspunkt an (z. B. myFolder/my_canary_filename.functionName).

Ändern eines vorhandenen Playwright-Skripts zur Verwendung als CloudWatch-Synthetics-Canary

Sie können ein vorhandenes Skript für Node.js und Playwright bearbeiten, um es als Canary zu verwenden. Weitere Informationen zu Playwright finden Sie in der Dokumentation in der Playwright-Bibliothek.

Sie können das folgende Playwright-Skript verwenden, das in der Datei exampleCanary.mjs gespeichert ist.

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();

Konvertieren Sie das Skript wie folgt:

  1. Erstellen und exportieren Sie eine handler-Funktion. Der Handler ist die Eintrittsfunktion für das Skript. Sie können einen beliebigen Namen für die Handler-Funktion wählen, aber die Funktion, die in Ihrem Skript verwendet wird, sollte dieselbe sein wie in Ihrem Canary-Handler. Wenn Ihr Skriptname exampleCanary.mjs lautet und der Name der Handler-Funktion myhandler lautet, wird Ihr Canary-Handler exampleCanary.myhandler genannt. Im folgenden Beispiel lautet der Name der Handler-Funktion handler.

    exports.handler = async () => { // Your script here };
  2. Importieren Sie das Synthetics Playwright module als Abhängigkeit.

    import { synthetics } from '@amzn/synthetics-playwright';
  3. Starten Sie einen Browser mit der Synthetics Launch-Funktion.

    const browser = await synthetics.launch();
  4. Erstellen Sie mithilfe der Synthetics newPage-Funktion eine neue Playwright-Seite.

    const page = await synthetics.newPage();

Ihr Skript kann nun als Synthetics-Canary ausgeführt werden. Das aktualisierte Skript ist das folgende:

Aktualisiertes Skript im ES6-Format

Die Skriptdatei wurde mit einer .mjs-Erweiterung gespeichert.

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(); } };

Aktualisiertes Skript im CommonJS-Format

Die Skriptdatei wurde mit einer .js-Erweiterung gespeichert.

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(); } };

CloudWatch-Synthetics-Konfigurationen

Sie können das Verhalten der Synthetics-Playwright-Laufzeit konfigurieren, indem Sie eine optionale JSON-Konfigurationsdatei mit dem Namen synthetics.json bereitstellen. Diese Datei sollte am selben Speicherort wie die Handler-Datei gebündelt werden. Eine Konfigurationsdatei ist zwar optional, aber wenn Sie keine Konfigurationsdatei angeben oder ein Konfigurationsschlüssel fehlt, geht CloudWatch von Standardwerten aus.

Bündeln Ihrer Konfigurationsdatei

Im Folgenden sind die unterstützten Konfigurationswerte und ihre Standardwerte aufgeführt.

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

Schritt-Konfigurationen

  • screenshotOnStepStart – Legt fest, ob Synthetics vor Beginn des Schritts einen Screenshot aufnehmen soll. Der Standardwert ist true.

  • screenshotOnStepSuccess – Legt fest, ob Synthetics einen Screenshot aufnehmen soll, nachdem ein Schritt erfolgreich war. Der Standardwert ist true.

  • screenshotOnStepFailure – Legt fest, ob Synthetics einen Screenshot aufnehmen soll, nachdem ein Schritt fehlgeschlagen ist. Der Standardwert ist true.

  • continueOnStepFailure – Legt fest, ob ein Skript auch dann fortgesetzt werden soll, wenn ein Schritt fehlgeschlagen ist. Der Standardwert ist false.

  • stepSuccessMetric – Bestimmt, ob die SuccessPercent-Metrik eines Schritts ausgegeben wird. Die SuccessPercent-Metrik für einen Schritt ist 100 für die Canary-Ausführung, wenn der Schritt erfolgreich ist und 0, wenn der Schritt fehlschlägt. Der Standardwert ist true.

  • stepDurationMetric – Ermittelt, ob die Duration-Metrik eines Schritts ausgegeben wird. Die Duration-Metrik wird als Dauer der Ausführung des Schritts in Millisekunden ausgegeben. Der Standardwert ist true.

Konfigurationen melden

Beinhaltet alle von CloudWatch Synthetics generierten Berichte, z. B. eine HAR-Datei und einen Synthetics-Schrittbericht. Felder zur Schwärzung sensibler Daten restrictedHeaders und restrictedUrlParameters gelten auch für von Synthetics generierte Protokolle.

  • includeRequestHeaders – Gibt an, ob Anforderungs-Header in den Bericht aufgenommen werden sollen. Der Standardwert ist false.

  • includeResponseHeaders – Gibt an, ob Antwort-Header in den Bericht aufgenommen werden sollen. Der Standardwert ist false.

  • includeUrlPassword – Gibt an, ob ein Passwort eingefügt werden soll, das in der URL angezeigt wird. Standardmäßig werden Passwörter, die in URLs angezeigt werden, aus Protokollen und Berichten abgedichtet, um die Offenlegung vertraulicher Daten zu verhindern. Der Standardwert ist false.

  • includeRequestBody – Gibt an, ob der Anforderungstext in den Bericht aufgenommen werden soll. Der Standardwert ist false.

  • includeResponseBody – Gibt an, ob der Antworttext in den Bericht aufgenommen werden soll. Der Standardwert ist false.

  • restrictedHeaders – Eine Liste von Header-Werten, die ignoriert werden sollen, wenn Header enthalten sind. Dies gilt sowohl für Anforderungs- als auch für Antwort-Header. Sie können Ihre Anmeldeinformationen beispielsweise verbergen, indem Sie includeRequestHeaders als wahr und restrictedHeaders als ['Authorization'] übergeben.

  • restrictedUrlParameters – Eine Liste von URL-Pfad- oder Abfrageparametern, die geschwärzt werden sollen. Dies gilt für URLs, die in Protokollen, Berichten und Fehlern angezeigt werden. Bei dem Parameter wird die Groß-/Kleinschreibung nicht beachtet. Sie können ein Sternchen (*) als Wert übergeben, um alle URL-Pfad- und Abfrageparameterwerte zu überarbeiten. Der Standardwert ist ein leeres Array.

  • har – Legt fest, ob ein HTTP-Archiv (HAR) generiert werden soll. Der Standardwert ist true.

Nachfolgend finden Sie ein Beispiel einer Berichts-Konfigurationsdatei.

"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

Protokollierungskonfigurationen

Gilt für von CloudWatch Synthetics generierte Protokolle. Steuert die Ausführlichkeit von Anfrage- und Antwortprotokollen.

  • logRequest – Gibt an, ob jede Anforderung in Canary-Protokollen protokolliert werden soll. Bei UI-Canarys protokolliert dies jede Anforderung, die vom Browser gesendet wird. Der Standardwert ist false.

  • logResponse – Gibt an, ob jede Antwort in Canary-Protokollen protokolliert werden soll. Bei UI-Canarys protokolliert dies jede vom Browser empfangene Antwort. Der Standardwert ist false.

  • logRequestBody – Gibt an, ob Anforderungstexte zusammen mit den Anforderungen in Canary- Protokollen protokolliert werden sollen. Diese Konfiguration gilt nur, wenn logRequest wahr ist. Der Standardwert ist false.

  • logResponseBody – Gibt an, ob Anforderungstexte zusammen mit den Anforderungen in Canary-Protokollen protokolliert werden sollen. Diese Konfiguration gilt nur, wenn logResponse wahr ist. Der Standardwert ist false.

  • logRequestHeaders – Gibt an, ob Anforderungsheader zusammen mit den Anforderungen in Canary-Protokollen protokolliert werden sollen. Diese Konfiguration gilt nur, wenn logRequest wahr ist. Der Standardwert ist false.

  • logResponseHeaders – Gibt an, ob Antwortheader zusammen mit den Antworten in Canary-Protokollen protokolliert werden sollen. Diese Konfiguration gilt nur, wenn logResponse wahr ist. Der Standardwert ist false.

Konfigurationen von HTTP-Metriken

Konfigurationen für Metriken, die sich auf die Anzahl der Netzwerkanforderungen mit unterschiedlichen HTTP-Statuscodes beziehen, die von CloudWatch Synthetics für diesen Canary ausgegeben wurden.

  • metric_2xx – Gibt an, ob die 2xx-Metrik (mit der CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • metric_4xx – Gibt an, ob die 4xx-Metrik (mit der CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • metric_5xx – Gibt an, ob die 5xx-Metrik (mit der CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • failedRequestsMetric – Gibt an, ob die failedRequests-Metrik (mit der CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • aggregatedFailedRequestsMetric – Gibt an, ob die failedRequests-Metrik (ohne die CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • aggregated2xxMetric – Gibt an, ob die 2xx-Metrik (ohne die CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • aggregated4xxMetric – Gibt an, ob die 4xx-Metrik (ohne die CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • aggregated5xxMetric – Gibt an, ob die 5xx-Metrik (ohne die CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

Canary-Metrik-Konfigurationen

Konfigurationen für andere von CloudWatch Synthetics ausgegebene Metriken.

  • failedCanaryMetric – Gibt an, ob die Failed-Metrik (mit der CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

  • aggregatedFailedCanaryMetric – Gibt an, ob die Failed-Metrik (ohne die CanaryName-Dimension) für diesen Canary emittiert werden soll. Der Standardwert ist true.

Sonstige Konfigurationen

  • userAgent – Eine Zeichenfolge, die an den Benutzeragenten angehängt werden soll. Der Benutzeragent ist eine Zeichenfolge, die im Anforderungsheader enthalten ist und Ihren Browser gegenüber Websites identifiziert, die Sie aufrufen, wenn Sie den Headless-Browser verwenden. CloudWatch Synthetics fügt automatisch CloudWatchSynthetics/canary-arn to the user agent hinzu. Die angegebene Konfiguration wird an den generierten Benutzeragenten angehängt. Der Standard-Benutzeragent, der angehängt wird, ist eine leere Zeichenfolge ("").

CloudWatch-Synthetics-Umgebungsvariablen

Konfigurieren Sie die Protokollierungsebene und das Format mithilfe von Umgebungsvariablen.

Protokollformat

Die CloudWatch-Synthetics-Playwright-Laufzeit erstellt CloudWatch-Protokolle für jede Canary-Ausführung. Die Protokolle werden zur bequemen Abfrage im JSON-Format geschrieben. Optional können Sie das Protokollformat in TEXT ändern.

  • Environment variable name – CW_SYNTHETICS_LOG_FORMAT

  • Supported values – JSON, TEXT

  • Default – JSON

Protokollstufen

Die Aktivierung des Modus Debug erhöht zwar die Ausführlichkeit, kann aber bei der Fehlerbehebung nützlich sein.

  • Environment variable name – CW_SYNTHETICS_LOG_LEVEL

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

  • Default – INFO