

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menulis skrip canary Node.js menggunakan runtime Playwright
<a name="Synthetics_WritingCanary_Nodejs_Playwright"></a>

**Topics**
+ [Mengemas file canary Node.js Anda untuk runtime Playwright](#Synthetics_canary_Nodejs_Playwright_package)
+ [Mengubah skrip Playwright yang ada untuk digunakan sebagai kenari Synthetics CloudWatch](#CloudWatch_Synthetics_canary_edit_Playwright_script)
+ [CloudWatch Konfigurasi Synthetics](#Synthetics_canary_configure_Playwright_script)

## Mengemas file canary Node.js Anda untuk runtime Playwright
<a name="Synthetics_canary_Nodejs_Playwright_package"></a>

 Skrip canary Anda terdiri dari file `.js` (sintaks CommonJS) atau `.mjs` (sintaks ES) yang berisi kode handler Synthetics Anda, bersama dengan paket dan modul tambahan yang bergantung pada kode Anda. Skrip yang dibuat dalam format ES (ECMAScript) harus menggunakan.mjs sebagai ekstensi atau menyertakan file package.json dengan set bidang “type”: “module”. Tidak seperti runtime lain seperti Node.js Puppeteer, Anda tidak diharuskan menyimpan skrip Anda dalam struktur folder tertentu. Anda dapat mengemas skrip Anda secara langsung. Gunakan `zip` utilitas pilihan Anda untuk membuat `.zip` file dengan file handler Anda di root. Jika skrip canary Anda bergantung pada paket atau modul tambahan yang tidak disertakan dalam runtime Synthetics, Anda dapat menambahkan dependensi ini ke file Anda. `.zip` Untuk melakukannya, Anda dapat menginstal pustaka yang diperlukan fungsi Anda di `node_modules` direktori dengan menjalankan `npm install` perintah. Berikut contoh perintah CLI membuat `.zip` file bernama `my_deployment_package.zip` berisi `index.js` or `index.mjs` file (Synthetics handler) dan dependensinya. Dalam contoh, Anda menginstal dependensi menggunakan manajer `npm` paket.

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

Buat `.zip` file yang berisi isi folder proyek Anda di root. Gunakan opsi `r` (rekursif), seperti yang ditunjukkan pada contoh berikut, untuk memastikan bahwa `zip` kompres subfolder.

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

Tambahkan file konfigurasi Synthetics untuk mengonfigurasi perilaku CloudWatch Synthetics. Anda dapat membuat `synthetics.json` file dan menyimpannya di jalur yang sama dengan titik masuk atau file handler Anda.

Secara opsional, Anda juga dapat menyimpan file titik masuk Anda dalam struktur folder pilihan Anda. Namun, pastikan bahwa path folder ditentukan dalam nama handler Anda.

 **Nama handler** 

Pastikan untuk mengatur titik masuk skrip canary Anda (handler) ` myCanaryFilename.functionName` agar cocok dengan nama file dari titik masuk skrip Anda. Anda dapat menyimpan kenari secara opsional di folder terpisah seperti. ` myFolder/my_canary_filename.mjs` Jika Anda menyimpannya di folder terpisah, tentukan jalur itu di titik entri skrip Anda, seperti ` myFolder/my_canary_filename.functionName`.

## Mengubah skrip Playwright yang ada untuk digunakan sebagai kenari Synthetics CloudWatch
<a name="CloudWatch_Synthetics_canary_edit_Playwright_script"></a>

Anda dapat mengedit skrip yang ada untuk Node.js dan Playwright untuk digunakan sebagai kenari. Untuk informasi selengkapnya tentang Playwright, lihat dokumentasi pustaka [Playwright](https://playwright.dev/docs/api/class-playwright). 

Anda dapat menggunakan skrip Playwright berikut yang disimpan dalam 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();
```

Konversi skrip dengan melakukan langkah-langkah berikut:

1. Membuat dan mengekspor `handler` fungsi. Penanggung jawab adalah fungsi titik masuk untuk naskah. Anda dapat memilih nama apa pun untuk fungsi handler, tetapi fungsi yang digunakan dalam skrip Anda harus sama seperti di pengendali kenari Anda. Jika nama skrip Anda`exampleCanary.mjs`, dan nama fungsi handler adalah`myhandler`, pengendali kenari Anda diberi nama. `exampleCanary.myhandler` Dalam contoh berikut, nama fungsi handler adalah`handler`.

   ```
   exports.handler = async () => {
     // Your script here
     };
   ```

1. Impor `Synthetics Playwright module` sebagai ketergantungan.

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

1. Luncurkan browser menggunakan fungsi Synthetics. `Launch`

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

1. Buat halaman Playwright baru dengan menggunakan fungsi Synthetics. `newPage`

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

Skrip Anda sekarang siap dijalankan sebagai kenari Synthetics. Berikut ini adalah skrip yang diperbarui:

 **Skrip diperbarui dalam ES6 format** 

File skrip disimpan dengan `.mjs` ekstensi.

```
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 diperbarui dalam format CommonJS** 

File skrip disimpan dengan `.js` ekstensi.

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

## CloudWatch Konfigurasi Synthetics
<a name="Synthetics_canary_configure_Playwright_script"></a>

Anda dapat mengonfigurasi perilaku runtime Synthetics Playwright dengan menyediakan file konfigurasi JSON opsional bernama. `synthetics.json` File ini harus dikemas di lokasi yang sama dengan file handler. Meskipun file konfigurasi adalah opsional, jika Anda tidak menyediakan file konfigurasi, atau kunci konfigurasi hilang, CloudWatch mengasumsikan default.

 **Mengemas file konfigurasi Anda** 

Berikut ini adalah nilai konfigurasi yang didukung, dan defaultnya.

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

 **Konfigurasi langkah** 
+ `screenshotOnStepStart`— Menentukan apakah Synthetics harus menangkap tangkapan layar sebelum langkah dimulai. Nilai default-nya `true`. 
+ `screenshotOnStepSuccess`— Menentukan apakah Synthetics harus menangkap tangkapan layar setelah langkah berhasil. Nilai default-nya `true`. 
+ `screenshotOnStepFailure`— Menentukan apakah Synthetics harus menangkap tangkapan layar setelah langkah gagal. Nilai default-nya `true`. 
+ `continueOnStepFailure`— Menentukan apakah skrip harus dilanjutkan bahkan setelah langkah gagal. Nilai default-nya `false`. 
+ `stepSuccessMetric`— Menentukan apakah ` SuccessPercent` metrik langkah dipancarkan. `SuccessPercent`Metrik untuk sebuah langkah adalah `100` untuk menjalankan kenari jika langkah berhasil, dan `0` jika langkah gagal. Nilai default-nya `true`. 
+ `stepDurationMetric`— Menentukan apakah `Duration` metrik langkah dipancarkan. `Duration`Metrik dipancarkan sebagai durasi, dalam milidetik, dari langkah yang dijalankan. Nilai default-nya `true`.

 **Laporkan konfigurasi** 

Termasuk semua laporan yang dihasilkan oleh CloudWatch Synthetics, seperti file HAR dan laporan langkah Synthetics. Bidang redaksi data sensitif `restrictedHeaders` dan `restrictedUrlParameters` juga berlaku untuk log yang dihasilkan oleh Synthetics. 
+ `includeRequestHeaders`— Apakah akan menyertakan header permintaan dalam laporan. Nilai default-nya `false`. 
+ `includeResponseHeaders`— Apakah akan menyertakan header respons dalam laporan. Nilai default-nya `false`.
+ `includeUrlPassword`— Apakah akan menyertakan kata sandi yang muncul di URL. Secara default, kata sandi yang muncul URLs disunting dari log dan laporan, untuk mencegah pengungkapan data sensitif. Default-nya adalah `false` . 
+ `includeRequestBody`— Apakah akan memasukkan badan permintaan dalam laporan. Nilai default-nya `false`. 
+ `includeResponseBody`— Apakah akan memasukkan badan respons dalam laporan. Nilai default-nya `false`. 
+ `restrictedHeaders`— Daftar nilai header untuk diabaikan, jika header disertakan. Ini berlaku untuk header permintaan dan respons. Misalnya, Anda dapat menyembunyikan kredensil Anda dengan meneruskan `includeRequestHeaders` sebagai benar dan `restrictedHeaders` sebagai. `['Authorization']` 
+ `restrictedUrlParameters`— Daftar jalur URL atau parameter kueri untuk disunting. Ini berlaku untuk URLs yang muncul di log, laporan, dan kesalahan. Parameter tersebut tidak peka terhadap huruf besar/kecil. Anda dapat meneruskan tanda bintang (`*`) sebagai nilai untuk menyunting semua jalur URL dan nilai parameter kueri. Default-nya adalah array kosong. 
+ `har`— Menentukan apakah arsip HTTP (HAR) harus dihasilkan. Nilai default-nya `true`.

Berikut ini adalah contoh file konfigurasi laporan.

```
"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
```

 **Konfigurasi logging** 

Berlaku untuk log yang dihasilkan oleh CloudWatch Synthetics. Mengontrol verbositas log permintaan dan respons.
+ `logRequest`— Apakah akan mencatat setiap permintaan di log kenari. Untuk canary UI, ini mencatat setiap permintaan yang dikirim oleh browser. Nilai default-nya ` false`. 
+ `logResponse`— Apakah akan mencatat setiap respons di log kenari. Untuk canary UI, ini membuat log terhadap setiap respons yang diterima oleh browser. Bawaannya adalah ` false`. 
+ `logRequestBody`— Apakah akan mencatat badan permintaan bersama dengan permintaan di log kenari. Konfigurasi ini hanya berlaku `logRequest` jika benar. Nilai default-nya `false`. 
+ `logResponseBody`— Apakah akan mencatat badan respons bersama dengan permintaan di log kenari. Konfigurasi ini hanya berlaku `logResponse` jika benar. Nilai default-nya `false`. 
+ `logRequestHeaders`— Apakah akan mencatat header permintaan bersama dengan permintaan di log kenari. Konfigurasi ini hanya berlaku ` logRequest` jika benar. Nilai default-nya `false`. 
+ `logResponseHeaders`— Apakah akan mencatat header respons bersama dengan tanggapan di log kenari. Konfigurasi ini hanya berlaku ` logResponse` jika benar. Nilai default-nya `false`. 

 **Konfigurasi metrik HTTP** 

Konfigurasi untuk metrik yang terkait dengan jumlah permintaan jaringan dengan kode status HTTP yang berbeda, yang dipancarkan oleh CloudWatch Synthetics untuk kenari ini.
+ `metric_2xx`— Apakah akan memancarkan `2xx` metrik (dengan `CanaryName` dimensi) untuk kenari ini. Nilai default-nya ` true`. 
+ `metric_4xx`— Apakah akan memancarkan `4xx` metrik (dengan `CanaryName` dimensi) untuk kenari ini. Nilai default-nya ` true`. 
+ `metric_5xx`— Apakah akan memancarkan `5xx` metrik (dengan `CanaryName` dimensi) untuk kenari ini. Nilai default-nya ` true`. 
+ `failedRequestsMetric`— Apakah akan memancarkan ` failedRequests` metrik (dengan `CanaryName` dimensi) untuk kenari ini. Nilai default-nya `true`. 
+ `aggregatedFailedRequestsMetric`— Apakah akan memancarkan ` failedRequests` metrik (tanpa `CanaryName` dimensi) untuk kenari ini. Nilai default-nya `true`. 
+ `aggregated2xxMetric`— Apakah akan memancarkan `2xx` metrik (tanpa `CanaryName` dimensi) untuk kenari ini. Nilai default-nya `true`. 
+ `aggregated4xxMetric`— Apakah akan memancarkan `4xx` metrik (tanpa `CanaryName` dimensi) untuk kenari ini. Nilai default-nya `true`. 
+ `aggregated5xxMetric`— Apakah akan memancarkan `5xx` metrik (tanpa `CanaryName` dimensi) untuk kenari ini. Nilai default-nya `true`. 

 **Konfigurasi metrik kenari** 

Konfigurasi untuk metrik lain yang dipancarkan oleh Synthetics. CloudWatch 
+ `failedCanaryMetric`— Apakah akan memancarkan `Failed` metrik (dengan `CanaryName` dimensi) untuk kenari ini. Nilai default-nya ` true`. 
+ `aggregatedFailedCanaryMetric`— Apakah akan memancarkan ` Failed` metrik (tanpa `CanaryName` dimensi) untuk kenari ini. Nilai default-nya `true`. 

 **Konfigurasi lainnya** 
+ `userAgent`— String untuk ditambahkan ke agen pengguna. Agen pengguna adalah string yang disertakan dalam header permintaan, dan mengidentifikasi browser Anda ke situs web yang Anda kunjungi saat Anda menggunakan browser tanpa kepala. CloudWatch Synthetics secara otomatis menambahkan. `CloudWatchSynthetics/{{canary-arn}} to the user agent` Konfigurasi yang ditentukan ditambahkan ke agen pengguna yang dihasilkan. Nilai default agen pengguna untuk menambahkan adalah string kosong (`""`).

### CloudWatch Variabel lingkungan Synthetics
<a name="Synthetics_canary_Nodejs_Playwright_script"></a>

Konfigurasikan tingkat dan format logging dengan menggunakan variabel lingkungan.

 **Format log** 

Runtime CloudWatch Synthetics Playwright membuat CloudWatch log untuk setiap lari kenari. Log ditulis dalam format JSON untuk query yang nyaman. Secara opsional, Anda dapat mengubah format log menjadi`TEXT`.
+ `Environment variable name`— CW\_SYNTHETICS\_LOG\_FORMAT 
+ `Supported values`— JSON, TEKS 
+ `Default`— JSON 

 **Tingkat log** 

Meskipun `Debug` mode pengaktifan meningkatkan verbositas, ini dapat berguna untuk pemecahan masalah.
+ `Environment variable name`— CW\_SYNTHETICS\_LOG\_LEVEL
+ `Supported values`— JEJAK, DEBUG, INFO, PERINGATAN, KESALAHAN, FATAL 
+ `Default`— INFO