

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

# Menulis skrip canary
<a name="CloudWatch_Synthetics_Canaries_WritingCanary"></a>

Bagian berikut menjelaskan cara menulis skrip kenari dan cara mengintegrasikan kenari dengan AWS layanan lain dan dengan dependensi dan pustaka eksternal.

**Topics**
+ [Menulis skrip kenari menggunakan runtime Java](Synthetics_WritingCanary_Java.md)
+ [Menulis skrip canary Node.js menggunakan runtime Playwright](Synthetics_WritingCanary_Nodejs_Playwright.md)
+ [Menulis skrip kenari Node.js menggunakan runtime Puppeteer](CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup.md)
+ [Menulis skrip canary Python](CloudWatch_Synthetics_Canaries_WritingCanary_Python.md)
+ [Menulis konfigurasi JSON untuk cetak biru Node.js multi Checks](CloudWatch_Synthetics_WritingCanary_Multichecks.md)

# Menulis skrip kenari menggunakan runtime Java
<a name="Synthetics_WritingCanary_Java"></a>

**Topics**
+ [Struktur proyek Java untuk burung kenari](#Synthetics_canary_Java_package)
+ [Mengemas proyek untuk kenari](#Synthetics_canary_Java_package_canary)
+ [Nama handler](#Synthetics_canary_Java_handler)
+ [CloudWatch Konfigurasi Synthetics](#Synthetics_canary_Java_config)
+ [CloudWatch Variabel lingkungan Synthetics](#Synthetics_canary_Java_variables)

## Struktur proyek Java untuk burung kenari
<a name="Synthetics_canary_Java_package"></a>

Untuk membuat kenari di Jawa, Anda perlu menulis kode Anda, mengompilasinya, dan menyebarkan artefak yang dikompilasi ke Synthetics. Anda dapat menginisialisasi proyek Java Lambda dengan berbagai cara. Misalnya, Anda dapat menggunakan pengaturan proyek Java standar di IDE pilihan Anda, seperti IntelliJ IDEA atau Visual Studio Code. Atau, Anda dapat membuat struktur file yang diperlukan secara manual.

Sebuah proyek Java Synthetics berisi struktur umum berikut:

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

Anda dapat menggunakan Maven atau Gradle untuk membangun proyek dan mengelola dependensi.

Dalam struktur di atas, `ExampleCanary` kelas adalah titik masuk atau handler untuk kenari.

 **Contoh kelas kenari Java** 

Contoh ini adalah untuk kenari untuk membuat permintaan get ke URL yang disimpan dalam variabel lingkungan Lambda *TESTING\$1URL*. Canary tidak menggunakan metode apa pun yang disediakan oleh runtime 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);
      }
  }
}
```

Sangat disarankan untuk memodulasi kenari Anda menggunakan fungsi perpustakaan yang disediakan Synthetics. `executeStep` Kenari membuat `get` panggilan ke dua variabel yang URLs diperoleh dari URL1 dan URL2 lingkungan yang terpisah.

**catatan**  
Untuk menggunakan `executeStep` fungsionalitas, metode handler untuk kenari harus menggunakan parameter tipe Synthetics seperti yang ditunjukkan di bawah ini. 

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

## Mengemas proyek untuk kenari
<a name="Synthetics_canary_Java_package_canary"></a>

*Synthetics menerima kode untuk kenari java dalam format zip.* Zip terdiri dari file kelas untuk kode kenari, toples untuk dependensi pihak ketiga dan file konfigurasi Synthetics.

Sebuah zip Synthetics Java berisi struktur umum berikut.

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

Untuk membangun zip ini dari struktur proyek di atas, Anda dapat menggunakan gradle (build.gradle) atau maven (pom.xml). Inilah contohnya.

[Untuk informasi tentang dependensi waktu kompilasi atau antarmuka untuk pustaka Synthetics, lihat README di bawah -java. aws-cloudwatch-synthetics-sdk](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"
}
```

## Nama handler
<a name="Synthetics_canary_Java_handler"></a>

Nama handler adalah titik masuk untuk kenari. Untuk runtime Java, handler dalam format berikut.

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

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

Anda dapat mengonfigurasi perilaku runtime Synthetics Java dengan menyediakan file konfigurasi JSON opsional bernama. `synthetics.json` File ini harus dikemas dalam direktori root dari paket zip. Meskipun file konfigurasi bersifat opsional, jika Anda tidak menyediakan file konfigurasi, atau kunci konfigurasi tidak ada, CloudWatch gunakan default.

Berikut ini adalah nilai konfigurasi yang didukung, dan defaultnya.

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

 **Konfigurasi langkah** 
+ *continueOnStepKegagalan* — Menentukan apakah skrip harus dilanjutkan bahkan setelah langkah gagal. Default-nya adalah salah.
+ *stepSuccessMetric*— Menentukan apakah ` SuccessPercent` metrik langkah dipancarkan. `SuccessPercent`Metrik untuk langkah adalah *100* untuk lari kenari jika langkah berhasil, dan *0* jika langkah gagal. Defaultnya *benar*.
+ *stepDurationMetric*— Menentukan apakah metrik *Durasi* langkah dipancarkan. Metrik *Durasi* dipancarkan sebagai durasi, dalam milidetik, dari langkah yang dijalankan. Defaultnya *benar*.

 **Konfigurasi logging** 

Berlaku untuk log yang dihasilkan oleh CloudWatch Synthetics. Mengontrol verbositas log permintaan dan respons.
+ *LogRequest* - Menentukan apakah akan log setiap permintaan di log kenari. Default-nya adalah salah.
+ *LogResponse* - Menentukan apakah akan log setiap respon dalam log kenari. Default-nya adalah salah.

 **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\$12xx* - Menentukan apakah akan memancarkan metrik *2xx* (dengan dimensi) untuk kenari ini. CanaryName Defaultnya *benar*.
+ *metric\$14xx* - Menentukan apakah akan memancarkan metrik *4xx* (dengan dimensi) untuk kenari ini. CanaryName Defaultnya *benar*.
+ *metric\$15xx* - Menentukan apakah akan memancarkan metrik *5xx* (dengan dimensi) untuk kenari ini. CanaryName Defaultnya *benar*.
+ *Aggregated2xxMetric* - Menentukan apakah akan memancarkan metrik *2xx* (tanpa dimensi) untuk kenari ini. CanaryName Defaultnya *benar*.
+ *Aggregated4xxMetric* - Menentukan apakah akan memancarkan metrik *4xx* (tanpa dimensi) untuk kenari ini. CanaryName Defaultnya *benar*.
+ *Aggregated5xxMetric* - Menentukan apakah akan memancarkan metrik *5xx* (tanpa dimensi) untuk kenari ini. CanaryName Defaultnya *benar*.

 **Konfigurasi metrik kenari** 

Konfigurasi untuk metrik lain yang dipancarkan oleh Synthetics. CloudWatch 
+ *failedCanaryMetric*Network Access Analyzer Menentukan apakah akan memancarkan metrik *Gagal* (dengan CanaryName dimensi) untuk kenari ini. Defaultnya *benar*.
+ *aggregatedFailedCanaryMetrik* - Menentukan apakah akan memancarkan metrik *Gagal* (tanpa CanaryName dimensi) untuk kenari ini. Defaultnya *benar*.

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

Anda dapat mengonfigurasi tingkat dan format logging dengan menggunakan variabel lingkungan.

 **Format log** 

Runtime CloudWatch Synthetics Java membuat CloudWatch log untuk setiap proses kenari. Log ditulis dalam format JSON untuk query yang nyaman. Secara opsional, Anda dapat mengubah format log menjadi *TEXT*.
+ *Nama variabel lingkungan* - CW\$1SYNTHETICS\$1LOG\$1FORMAT
+ *Nilai yang didukung* - JSON, TEXT
+ *Standar* —JSON

 **Tingkat log** 
+ *Nama variabel lingkungan* - CW\$1SYNTHETICS\$1LOG\$1LEVEL
+ *Nilai yang didukung* - TRACE, DEBUG, INFO, WARN, ERROR, FATAL
+ *Default* — INFO

Terlepas dari variabel lingkungan di atas, ada variabel lingkungan default yang ditambahkan untuk runtime Java, variabel `AWS_LAMBDA-EXEC_WRAPPER` lingkungan ke fungsi Anda, dan menetapkan nilainya. `/opt/synthetics-otel-instrument` Variabel lingkungan ini memodifikasi perilaku startup fungsi Anda untuk telemetri. Jika variabel lingkungan ini sudah ada, pastikan bahwa itu diatur ke nilai yang diperlukan.

# 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 kenari 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\$1SYNTHETICS\$1LOG\$1FORMAT 
+ `Supported values`— JSON, TEKS 
+ `Default`— JSON 

 **Tingkat log** 

Meskipun `Debug` mode pengaktifan meningkatkan verbositas, ini dapat berguna untuk pemecahan masalah.
+ `Environment variable name`— CW\$1SYNTHETICS\$1LOG\$1LEVEL
+ `Supported values`— MELACAK, MEN-DEBUG, INFO, PERINGATAN, KESALAHAN, FATAL 
+ `Default`— INFO

# Menulis skrip kenari Node.js menggunakan runtime Puppeteer
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup"></a>

**Topics**
+ [Membuat kenari CloudWatch Synthetics dari awal](#CloudWatch_Synthetics_Canaries_write_from_scratch)
+ [Mengemas file kenari Node.js Anda](#CloudWatch_Synthetics_Canaries_package)
+ [Mengubah skrip Puppeteer yang sudah ada untuk digunakan sebagai canary Synthetic](#CloudWatch_Synthetics_Canaries_modify_puppeteer_script)
+ [Variabel-variabel lingkungan](#CloudWatch_Synthetics_Environment_Variables)
+ [Mengintegrasikan kenari Anda dengan layanan lain AWS](#CloudWatch_Synthetics_Canaries_AWS_integrate)
+ [Menyempurnakan canary Anda untuk menggunakan alamat IP statis](#CloudWatch_Synthetics_Canaries_staticIP)

## Membuat kenari CloudWatch Synthetics dari awal
<a name="CloudWatch_Synthetics_Canaries_write_from_scratch"></a>

Berikut adalah contoh skrip Canary Synthetic minimal. skrip ini berhasil dijalani, dan mengembalikan rangkaian. Untuk melihat bentuk canary yang gagal, ubah `let fail = false;` untuk `let fail = true;`. 

Anda harus menetapkan fungsi titik masuk untuk skrip canary. Untuk melihat bagaimana file diunggah ke lokasi Amazon S3 yang ditentukan sebagai kenari, buat file-file ini `ArtifactS3Location` di folder. `/tmp` Semua artefak kenari harus disimpan`/tmp`, karena itu satu-satunya direktori yang dapat ditulis. Pastikan bahwa jalur tangkapan layar diatur `/tmp` untuk tangkapan layar atau file lain yang dibuat oleh skrip. Synthetics secara otomatis mengunggah file ` /tmp` ke bucket S3.

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

Setelah skrip berjalan, metrik pass/fail status dan durasi dipublikasikan CloudWatch dan file di bawah `/tmp` diunggah ke bucket 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();
};
```

Selanjutnya, kita akan memperluas script untuk menggunakan Synthetics logging dan membuat panggilan menggunakan SDK AWS . Untuk tujuan demonstrasi, skrip ini akan menciptakan klien Amazon DynamoDB dan memanggil API listTables DynamoDB. skrip ini mencatat respons terhadap permintaan dan log akan lulus atau gagal bergantung pada permintaan berhasil atau tidak.

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

## Mengemas file kenari Node.js Anda
<a name="CloudWatch_Synthetics_Canaries_package"></a>

 **Untuk syn-nodejs-puppeteer -11.0 dan di atas** 

 Struktur kemasan yang lebih lama (untuk syn-nodejs-puppeteer -10.0 dan di bawah) masih didukung dalam versi yang lebih baru.

Buat skrip menggunakan salah satu opsi berikut:
+ .js file (sintaks CommonJS)
+ .mjs file (sintaks modul ES)

Untuk modul ES, gunakan salah satu opsi berikut:
+ .js file (sintaks CommonJS)
+ .mjs file (sintaks modul ES)

Struktur paket didefinisikan di bawah ini:
+ File penangan tingkat root (index.js/index.mjs)
+ File konfigurasi opsional (synthetics.json)
+ Ketergantungan tambahan di node\$1modules (jika diperlukan)

Contoh struktur kemasan:

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

Untuk paket, ikuti langkah-langkah di bawah ini:

1. Instal dependensi (jika ada).

   ```
   npm install
   ```

1. Buat paket.zip.

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

 **Untuk syn-nodejs-puppeteer -11.0 dan di bawah** 

Struktur berikut diperlukan saat menggunakan Amazon S3:

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

 **Untuk menambahkan dukungan sub-folder opsional di syn-nodejs-puppeteer -3.4\$1:** 

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

**catatan**  
Path handler dalam konfigurasi harus sesuai dengan lokasi file Anda.

 **Nama handler** 

Pastikan untuk mengatur titik masuk skrip canary Anda (handler) ` myCanaryFilename.functionName` agar cocok dengan nama file dari titik masuk skrip Anda. Jika Anda menggunakan runtime yang lebih awal dari `syn-nodejs-puppeteer-3.4`, `functionName` harus `handler`. Jika Anda menggunakan ` syn-nodejs-puppeteer-3.4` atau yang lebih baru, Anda dapat memilih nama fungsi apa pun sebagai handler. Jika Anda menggunakan `syn-nodejs-puppeteer-3.4` atau lebih baru, Anda juga dapat secara opsional menyimpan canary di folder terpisah seperti ` nodejs/node_modules/myFolder/my_canary_filename`. Jika Anda menyimpannya di folder terpisah, tentukan jalur itu di titik entri skrip Anda, seperti ` myFolder/my_canary_filename.functionName`.

## Mengubah skrip Puppeteer yang sudah ada untuk digunakan sebagai canary Synthetic
<a name="CloudWatch_Synthetics_Canaries_modify_puppeteer_script"></a>

Bagian ini menjelaskan cara mengambil skrip Puppeteer dan memodifikasinya untuk berjalan sebagai skrip canary Synthetic. Untuk informasi selengkapnya tentang Puppeteer, silakan lihat [API Puppeteer v1.14.0](https://github.com/puppeteer/puppeteer/blob/v1.14.0/docs/api.md). 

Kita akan mulai dengan contoh skrip 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();
})();
```

Langkah konversinya adalah sebagai berikut:
+ Membuat dan mengekspor `handler` fungsi. Penanggung jawab adalah fungsi titik masuk untuk skrip. Jika Anda menggunakan runtime yang lebih awal dari ` syn-nodejs-puppeteer-3.4`, fungsi handler harus diberi nama `handler`. Jika Anda menggunakan `syn-nodejs-puppeteer-3.4` atau lebih baru, fungsi tersebut dapat memiliki nama apa pun, tetapi harus nama yang sama yang digunakan dalam skrip. Juga, jika Anda menggunakan `syn-nodejs-puppeteer-3.4` atau yang lebih baru, Anda akan dapat menyimpan skrip Anda di bawah folder apa pun dan menentukan folder itu sebagai bagian dari nama handler.

  ```
  const basicPuppeteerExample = async function () {};
  
  exports.handler = async () => {
      return await basicPuppeteerExample();
  };
  ```
+ Gunakan dependensi `Synthetics`.

  ```
  var synthetics = require('@aws/synthetics-puppeteer');
  ```
+ Gunakan fungsi `Synthetics.getPage` untuk mendapatkan objek `Page` Puppeteer.

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

  Objek halaman yang dikembalikan oleh fungsi Synthetics.getPage memiliki **page.on`request`, `response` dan peristiwa yang diinstrumentasi** untuk logging. ` requestfailed` Synthetics juga mengatur pembuatan file HAR untuk permintaan dan respons di halaman tersebut, serta menambahkan ARN canary ke header agen-pengguna atas permintaan keluar di halaman tersebut.

skripnya sekarang siap untuk dijalankan sebagai canary Synthetics. Berikut adalah skrip yang diperbarui:

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

## Variabel-variabel lingkungan
<a name="CloudWatch_Synthetics_Environment_Variables"></a>

Anda dapat menggunakan variabel lingkungan saat membuat canary. Hal ini memungkinkan Anda untuk menulis skrip canary tunggal dan kemudian menggunakan skrip tersebut dengan nilai yang berbeda untuk dengan cepat membuat beberapa canary yang memiliki tugas serupa.

Misalnya, andaikan organisasi Anda memiliki titik akhir seperti `prod`, ` dev`, dan `pre-release` untuk berbagai tahap pengembangan perangkat lunak Anda, dan Anda perlu membuat canary untuk menguji setiap titik akhir ini. Anda dapat menulis skrip canary tunggal yang menguji perangkat lunak Anda dan kemudian menentukan nilai yang berbeda untuk variabel lingkungan titik akhir ketika Anda membuat masing-masing dari tiga canary. Kemudian, ketika Anda membuat canary, Anda menentukan skrip dan nilai-nilai yang akan digunakan untuk variabel lingkungan.

Nama-nama variabel lingkungan dapat memuat huruf, angka, dan karakter garis bawah. Nama variavel harus dimulai dengan sebuah huruf dan setidaknya dua karakter. Ukuran total variabel lingkungan Anda tidak dapat lebih dari 4 KB. Anda tidak dapat menentukan variabel lingkungan yang dicadangkan Lambda sebagai nama variabel lingkungan Anda. Untuk informasi selengkapnya tentang variabel lingkungan yang dicadangkan, silakan lihat [Variabel lingkungan runtime](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime).

**penting**  
Kunci dan nilai variabel lingkungan dienkripsi saat istirahat menggunakan kunci yang AWS dimiliki AWS KMS . Namun, variabel lingkungan tidak dienkripsi di sisi klien. Jangan menyimpan informasi sensitif di dalamnya.

Contoh skrip berikut menggunakan dua variabel lingkungan. Skrip ini adalah untuk canary yang memeriksa apakah sebuah halaman web tersedia. Ini menggunakan variabel lingkungan untuk membuat parameter URL yang diperiksa dan tingkat log CloudWatch Synthetics yang digunakannya. 

Fungsi berikut menetapkan `LogLevel` ke nilai variabel lingkungan ` LOG_LEVEL`.

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

Fungsi ini menetapkan `URL` ke nilai variabel lingkungan `URL`.

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

Ini adalah skrip yang lengkap. Ketika Anda membuat canary menggunakan skrip ini, Anda menentukan nilai untuk variabel lingkungan `LOG_LEVEL` dan `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();
};
```

### Meneruskan variabel lingkungan ke script Anda
<a name="CloudWatch_Synthetics_Canaries_pass_variables"></a>

Untuk meneruskan variabel lingkungan ke skrip Anda ketika Anda membuat canary di konsol, tentukan kunci dan nilai-nilai variabel lingkungan di bagian **Variabel lingkungan** pada konsol. Untuk informasi selengkapnya, lihat [Membuat canary](CloudWatch_Synthetics_Canaries_Create.md).

Untuk meneruskan variabel lingkungan melalui API atau AWS CLI, gunakan ` EnvironmentVariables` parameter di `RunConfig` bagian. Berikut ini adalah contoh AWS CLI perintah yang menciptakan kenari yang menggunakan dua variabel lingkungan dengan kunci `Environment` dan`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"
}'
```

## Mengintegrasikan kenari Anda dengan layanan lain AWS
<a name="CloudWatch_Synthetics_Canaries_AWS_integrate"></a>

Semua kenari dapat menggunakan pustaka AWS SDK. Anda dapat menggunakan perpustakaan ini ketika Anda menulis kenari Anda untuk mengintegrasikan kenari dengan layanan lain AWS .

Untuk melakukan hal itu, Anda perlu menambahkan kode berikut ke canary. Untuk contoh-contoh AWS Secrets Manager ini, digunakan sebagai layanan yang terintegrasi dengan kenari.
+ Impor AWS SDK.

  ```
  const AWS = require('aws-sdk');
  ```
+ Buat klien untuk AWS layanan yang Anda integrasikan.

  ```
  const secretsManager = new AWS.SecretsManager();
  ```
+ Gunakan klien untuk melakukan panggilan API ke layanan tersebut.

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

Kode skrip snippet canary berikut menunjukkan contoh integrasi dengan Secrets Manager secara lebih terperinci.

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

## Menyempurnakan canary Anda untuk menggunakan alamat IP statis
<a name="CloudWatch_Synthetics_Canaries_staticIP"></a>

Anda dapat menyiapkan canary sehingga menggunakan alamat IP statis.

**Untuk memaksa canary menggunakan alamat IP statis**

1. Buat VPC baru. Untuk informasi selengkapnya, silakan lihat [Menggunakan DNS dengan VPC Anda](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html).

1. Membuat gateway internet baru. Untuk informasi selengkapnya, silakan lihat [Menambahkan gateway internet ke VPC Anda](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#working-with-igw).

1. Buat subnet publik di dalam VPC Anda yang baru.

1. Tambahkan tabel rute baru ke VPC.

1. Tambahkan rute di tabel rute baru, yang dimulai dari `0.0.0.0/0` ke gateway internet.

1. Kaitkan tabel rute baru dengan subnet publik.

1. Buat alamat IP elastis. Untuk informasi selengkapnya, silakan lihat [Alamat IP elastis](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html).

1. Buat gateway NAT baru dan tetapkan ke subnet publik dan alamat IP elastis.

1. Buat subnet privat di dalam VPC.

1. Tambahkan rute ke tabel rute bawaan VPC, yang dimulai dari `0.0.0.0/0` ke gateway NAT

1. Buat canary Anda. 

# Menulis skrip canary Python
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python"></a>

Skrip ini berhasil dijalani, dan mengembalikan rangkaian. Untuk melihat bentuk canary yang gagal, ubah fail = False ke fail = True

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

## Mengemas file kenari Python Anda
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_package"></a>

Jika Anda memiliki lebih dari satu file .py atau skrip Anda memiliki dependensi, Anda dapat menggabungkan file itu semua ke dalam sebuah paket file ZIP tunggal. Jika Anda menggunakan runtime `syn-python-selenium-1.1`, file ZIP harus berisi file .py canary utama Anda di dalam folder `python`, seperti `python/my_canary_filename.py`. Jika Anda menggunakan ` syn-python-selenium-1.1` atau yang lebih baru, Anda dapat menggunakan folder yang berbeda secara opsional, seperti `python/myFolder/my_canary_filename.py`.

File ZIP ini harus memuat semua folder dan file yang diperlukan, tetapi file lain tidak perlu berada dalam folder `python`.

Pastikan untuk mengatur titik masuk skrip canary Anda agar ` my_canary_filename.functionName` cocok dengan nama file dan nama fungsi dari titik masuk skrip Anda. Jika Anda menggunakan runtime `syn-python-selenium-1.0`, `functionName` harus `handler`. Jika Anda menggunakan ` syn-python-selenium-1.1` atau yang lebih baru, pembatasan nama handler ini tidak berlaku, dan Anda juga dapat secara opsional menyimpan canary di folder terpisah seperti ` python/myFolder/my_canary_filename.py`. Jika Anda menyimpannya di folder terpisah, tentukan jalur itu di titik entri skrip Anda, seperti ` myFolder/my_canary_filename.functionName`. 

## Mengubah skrip Selenium yang sudah ada untuk menggunakan canary Synthetics
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_Selenium"></a>

Anda dapat dengan cepat memodifikasi skrip yang ada untuk Python dan Selenium untuk digunakan sebagai canary. Untuk informasi lebih lanjut tentang Selenium, lihat [www.selenium.dev/](https://www.selenium.dev/).

Untuk contoh ini, kita akan mulai dengan skrip Selenium berikut:

```
from selenium import webdriver

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

basic_selenium_script()
```

Langkah konversinya adalah sebagai berikut.

**Untuk mengkonversi skrip Selenium yang akan digunakan sebagai canary**

1. Ubah pernyataan `import` untuk menggunakan Selenium dari modul ` aws_synthetics`:

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

   Modul Selenium dari `aws_synthetics` memastikan bahwa kenari dapat memancarkan metrik dan log, menghasilkan file HAR, dan bekerja dengan fitur Synthetics lainnya. CloudWatch 

1. Buat fungsi handler dan panggil metode Selenium Anda. Penanggung jawab adalah fungsi titik masuk untuk skrip.

   Jika Anda menggunakan `syn-python-selenium-1.0`, fungsi handler harus diberi nama `handler`. Jika Anda menggunakan `syn-python-selenium-1.1` atau lebih baru, fungsi tersebut dapat memiliki nama apa pun, tetapi harus nama yang sama yang digunakan dalam skrip. Juga, jika Anda menggunakan `syn-python-selenium-1.1` atau yang lebih baru, Anda akan dapat menyimpan skrip Anda di bawah folder apa pun dan menentukan folder itu sebagai bagian dari nama handler.

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

Skrip sekarang diperbarui menjadi kenari CloudWatch Synthetics. Berikut adalah skrip yang diperbarui:

`webdriver`Ini adalah contoh dari kelas [ SyntheticsWebDriver](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver)dan browser yang dikembalikan oleh `webdriver.Chrome()` adalah instance dari [ 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()
```

## Mengubah skrip Puppeteer Synthetics yang ada untuk mengautentikasi sertifikat non-standar
<a name="Canaries_Non-Standard_Certificates"></a>

Salah satu kasus penggunaan penting untuk kenari Synthetics adalah bagi Anda untuk memantau titik akhir Anda sendiri. Jika Anda ingin memantau titik akhir yang tidak siap untuk lalu lintas eksternal, pemantauan ini terkadang dapat berarti bahwa Anda tidak memiliki sertifikat yang tepat yang ditandatangani oleh otoritas sertifikat pihak ketiga tepercaya.

Dua solusi yang mungkin untuk skenario ini adalah sebagai berikut:
+ Untuk mengautentikasi sertifikat klien, lihat [Cara memvalidasi autentikasi menggunakan Amazon CloudWatch Synthetics](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-using-amazon-cloudwatch-synthetics-part-2/) — Bagian 2.
+ Untuk mengautentikasi sertifikat yang ditandatangani sendiri, lihat [Cara memvalidasi autentikasi dengan sertifikat yang ditandatangani](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-with-self-signed-certificates-in-amazon-cloudwatch-synthetics/) sendiri di Amazon Synthetics CloudWatch

Anda tidak terbatas pada dua opsi ini ketika Anda menggunakan kenari CloudWatch Synthetics. Anda dapat memperluas fitur-fitur ini dan menambahkan logika bisnis Anda dengan memperluas kode canary.

**catatan**  
Synthetics canary yang berjalan pada runtime Python secara bawaan mengaktifkan ` --ignore-certificate-errors` flag, jadi kenari tersebut seharusnya tidak memiliki masalah dalam menjangkau situs dengan konfigurasi sertifikat non-standar.

# Menulis konfigurasi JSON untuk cetak biru Node.js multi Checks
<a name="CloudWatch_Synthetics_WritingCanary_Multichecks"></a>

Cetak biru multi cek Node.js memungkinkan Anda membuat kenari yang melakukan beberapa pemeriksaan validasi dalam satu canary run. Cetak biru ini berguna ketika Anda ingin menguji beberapa titik akhir, memvalidasi berbagai aspek aplikasi Anda, atau melakukan serangkaian pemeriksaan terkait secara berurutan. 

**Topics**
+ [Struktur konfigurasi root](#root-configuration-structure)
+ [Pengaturan global](#global-settings)
+ [Variabel dan manajemen data](#variables-data-management)
+ [Definisi langkah](#step-definitions)
+ [Periksa jenis](#check-types)
+ [Metode autentikasi](#authentication-methods)
+ [Pernyataan dan validasi](#assertions-validation)
+ [Ekstraksi data](#data-extraction)

## Struktur konfigurasi root
<a name="root-configuration-structure"></a>

Konfigurasi root mendefinisikan keseluruhan struktur canary cetak biru API tingkat lanjut Anda.


**Properti skema**  

| Properti | Tipe | Diperlukan | Deskripsi | 
| --- | --- | --- | --- | 
|  globalSettings  | Objek | Tidak | Konfigurasi default diterapkan ke semua langkah | 
|  variables  | Objek | Tidak | Nilai yang dapat digunakan kembali di seluruh langkah (maks 10) | 
|  steps  | Objek |  Ya  | Pengumpulan langkah pemantauan (1-10 langkah) | 

 **Contoh** 

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

 **Aturan validasi** 
+ Harus berisi setidaknya satu langkah
+ Maksimal 10 langkah diizinkan
+ Tidak ada properti tambahan yang diizinkan di luar`globalSettings`,` variables`, dan `steps`

## Pengaturan global
<a name="global-settings"></a>

Pengaturan global menyediakan konfigurasi default yang berlaku untuk semua langkah kecuali diganti pada tingkat langkah.

 **Sifat-sifat** 


**Properti pengaturan global**  

| Properti | Tipe | Default | Kisaran | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  stepTimeout  | Integer | 30000 | 5000-300000 | Batas waktu default untuk semua langkah (milidetik) | 

 **Contoh** 

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

## Variabel dan manajemen data
<a name="variables-data-management"></a>

Variabel memungkinkan Anda untuk menentukan nilai yang dapat digunakan kembali yang dapat direferensikan di seluruh konfigurasi Anda menggunakan `${variableName}` sintaks.

 **Properti variabel** 


| Properti | Tipe | Deskripsi | 
| --- | --- | --- | 
| Nama variabel | string | Harus cocok pola ^[a-zA-Z][a-zA-Z0-9\$1]\$1\$1 | 
| Nilai variabel | string | Nilai string apa pun | 

 **Batasan** 
+ Maksimum 10 variabel per konfigurasi
+ Nama variabel harus dimulai dengan huruf
+ Nama variabel hanya dapat berisi huruf, angka, dan garis bawah
+ Panjang maksimum tidak ditentukan dalam skema

 **Contoh** 

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

 **Penggunaan konfigurasi** 

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

## Definisi langkah
<a name="step-definitions"></a>

Langkah-langkah menentukan operasi pemantauan individu. Setiap langkah diberi nomor dari 1 hingga 10 dan berisi jenis cek tertentu.

 *Properti langkah umum* 


| Properti | Tipe | Diperlukan | Deskripsi | 
| --- | --- | --- | --- | 
|  stepName  | string |  Ya  | Pengidentifikasi unik untuk langkah | 
|  checkerType  | string |  Ya  | Jenis cek:HTTP,DNS,SSL,  TCP | 
|  extractors  | array | Tidak | Konfigurasi ekstraksi data | 

 *Validasi nama langkah* 
+ Pola - ^ [A-za-z] [A-za-Z0-9\$1-] \$1\$1
+ Panjang maksimum - 64 karakter
+ Harus dimulai dengan surat

 *Penomoran langkah* 
+ Langkah-langkah diberi nomor sebagai tombol string: “1", “2",..., “10"
+ Pola: ^ ([1-9] \$110) \$1
+ Minimal 1 langkah yang diperlukan
+ Maksimal 10 langkah diizinkan

 *Contoh* 

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

## Periksa jenis
<a name="check-types"></a>

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

Pantau titik akhir web dan APIs dengan validasi permintaan dan respons yang komprehensif.

 **Properti yang dibutuhkan** 


| Properti | Tipe | Deskripsi | 
| --- | --- | --- | 
|  url  | string | URL target (harus format URI yang valid) | 
|  httpMethod  | string | Metode HTTP: GETPOST,PUT, PATCH,DELETE,HEAD, OPTIONS | 

 **Properti opsional** 


| Properti | Tipe | Default | Kisaran | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  timeout  | Integer | 30000 | 5000-300000 | Minta batas waktu (milidetik) | 
|  waitTime  | integer | 0 | 0-60 | Tunda sebelum permintaan (detik) | 
|  headers  | object | - | - | Header HTTP kustom | 
|  body  | string | - | - | Permintaan badan untuk POST/PUT operasi | 
|  authentication  | object | - | - | Konfigurasi autentikasi | 
|  assertions  | array | - | - | Aturan validasi respons | 

 **Contoh** 

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

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

Validasi resolusi DNS dan merekam informasi.

 **Properti yang dibutuhkan** 


| Properti | Tipe | Deskripsi | 
| --- | --- | --- | 
|  domain  | string | Nama domain untuk kueri (format nama host) | 

 **Properti opsional** 


| Properti | Tipe | Default | Deskripsi | 
| --- | --- | --- | --- | 
|  recordType  | string | “A” | Jenis catatan DNS:A,,CNAME,MX,  TXT NS | 
|  nameserver  | string | - | Server DNS khusus untuk kueri | 
|  timeout  | integer | 30000 | Batas waktu kueri (5000-300000ms) | 
|  port  | integer | 53 | Port server DNS (1-65535) | 
|  protocol  | string | “UDP” | Protokol: UDP atau TCP | 
|  assertions  | array | - | Aturan validasi respons DNS | 

 **Contoh** 

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

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

Pantau kesehatan dan konfigurasi sertifikat SSL.

 **Properti yang dibutuhkan** 


| Properti | Tipe | Deskripsi | 
| --- | --- | --- | 
|  hostname  | string | Target nama host (format nama host) | 

 **Properti opsional** 


| Properti | Tipe | Default | Deskripsi | 
| --- | --- | --- | --- | 
|  port  | Integer | 443 | Port SSL (1-65535) | 
|  timeout  | integer | 30000 | Batas waktu koneksi (5000-300000ms) | 
|  sni  | boolean | BETUL | Indikasi Nama Server | 
|  verifyHostname  | boolean | BETUL | Verifikasi nama host | 
|  allowSelfSigned  | boolean | SALAH | Terima sertifikat yang ditandatangani sendiri | 
|  assertions  | array | - | Aturan validasi sertifikat | 

 **Contoh** 

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

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

Uji konektivitas port TCP dan validasi respons.

 **Properti yang dibutuhkan** 


| Properti | Tipe | Deskripsi | 
| --- | --- | --- | 
|  hostname  | string | Target nama host (format nama host) | 
|  port  | integer | Port target (1-65535) | 

 **Properti opsional** 


| Properti | Tipe | Default | Deskripsi | 
| --- | --- | --- | --- | 
|  timeout  | Integer | 30000 | Batas waktu keseluruhan (5000-300000ms) | 
|  connectionTimeout  | integer | 3000 | Batas waktu koneksi (5000-300000ms) | 
|  readTimeout  | integer | 2000 | Batas waktu baca data (5000-300000ms) | 
|  sendData  | string | - | Data untuk dikirim setelah koneksi | 
|  expectedResponse  | string | - | Data respons yang diharapkan | 
|  encoding  | string | “UTF-8" | Pengkodean data:UTF-8,, ASCII HEX | 
|  assertions  | array | - | Koneksi dan validasi respons | 

 **Contoh** 

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

## Metode autentikasi
<a name="authentication-methods"></a>

 **Tidak ada otentikasi** 

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

 **Otentikasi dasar** 


| Properti | Tipe | Diperlukan | Deskripsi | 
| --- | --- | --- | --- | 
|  type  | string |  Ya  | Harus "BASIC" | 
|  username  | string |  Ya  | Nama pengguna untuk otentikasi | 
|  password  | string |  Ya  | Kata sandi untuk otentikasi | 

 **Contoh** 

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

 **Otentikasi kunci API** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "API\$1KEY" | 
|  apiKey  | string |  Ya  | - | Nilai kunci API | 
|  headerName  | string | Tidak | “Tombol X-api” | Nama header untuk kunci API | 

 **Contoh** 

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

 **OAuth kredensi klien** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "OAUTH\$1CLIENT\$1CREDENTIALS" | 
|  tokenUrl  | string |  Ya  | - | OAuth URL titik akhir token | 
|  clientId  | string |  Ya  | - | OAuth ID klien | 
|  clientSecret  | string |  Ya  | - | OAuth rahasia klien | 
|  scope  | string | Tidak | - | OAuth ruang lingkup | 
|  audience  | string | Tidak | - | OAuth penonton | 
|  resource  | string | Tidak | - | OAuth sumber daya | 
|  tokenApiAuth  | array | Tidak | - | Metode autentikasi Token API:BASIC\$1AUTH\$1HEADER, REQUEST\$1BODY | 
|  tokenCacheTtl  | integer | Tidak | 3600 | Token cache TTL (minimal 60 detik) | 

 **Contoh** 

```
{
  "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 Tanda Tangan (Versi 4)** 


| Properti | Tipe | Diperlukan | Deskripsi | 
| --- | --- | --- | --- | 
|  type  | string |  Ya  | Harus "SIGV4" | 
|  service  | string |  Ya  | Nama AWS layanan (misalnya, “execute-api”) | 
|  region  | string |  Ya  | AWS wilayah | 
|  roleArn  | string |  Ya  | IAM peran ARN untuk penandatanganan | 

 **Contoh** 

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

## Pernyataan dan validasi
<a name="assertions-validation"></a>

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

 **Pernyataan kode status** 


| Properti | Tipe | Diperlukan | Deskripsi | 
| --- | --- | --- | --- | 
|  type  | string |  Ya  | Harus "STATUS\$1CODE" | 
|  operator  | string |  Ya  | EQUALS, NOT\$1EQUALS, GREATER\$1THAN,  LESS\$1THAN, IN\$1RANGE | 
|  value  | bilangan bulat | Bersyarat | Kode status HTTP (100-599) | 
|  rangeMin  | integer | Bersyarat | Nilai rentang minimum (untukIN\$1RANGE) | 
|  rangeMax  | integer | Bersyarat | Nilai rentang maksimum (untukIN\$1RANGE) | 

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

 **Pernyataan waktu respons** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "RESPONSE\$1TIME" | 
|  operator  | string |  Ya  | - | LESS\$1THAN, GREATER\$1THAN, EQUALS | 
|  value  | number |  Ya  | - | Nilai waktu (minimum 0) | 
|  unit  | string | Tidak | “MILIDETIK” | Harus "MILLISECONDS" | 

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

 **Pernyataan kepala** 


| Properti | Tipe | Diperlukan | Deskripsi | 
| --- | --- | --- | --- | 
|  type  | string |  Ya  | Harus "HEADER" | 
|  headerName  | string |  Ya  | Nama header untuk memvalidasi | 
|  operator  | string |  Ya  | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH, EXIST | 
|  value  | senar/boolean | Bersyarat | Nilai yang diharapkan (boolean untuk EXIST operator) | 

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

 **Pernyataan tubuh** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "BODY" | 
|  target  | string | Tidak | “JSON” | JSON atau TEXT | 
|  path  | string | Bersyarat | - | JSONPath (diperlukan untuk target JSON) | 
|  operator  | string |  Ya  | - | CONTAINS, NOT\$1CONTAINS, EQUALS,  NOT\$1EQUALS, EXISTS | 
|  value  | senar/boolean |  Ya  | - | Nilai yang diharapkan (boolean untuk EXISTS operator) | 

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

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

 **Catat pernyataan nilai** 


| Properti | Tipe | Diperlukan | Kisaran | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "RECORD\$1VALUE" | 
|  operator  | string |  Ya  | - | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH | 
|  value  | string |  Ya  | - | Nilai rekor yang diharapkan | 

 **Rekam penegasan hitungan** 


| Properti | Tipe | Diperlukan | Kisaran | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "RECORD\$1COUNT" | 
|  operator  | string |  Ya  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | bilangan bulat |  Ya  | ≥ 0 | Jumlah yang diharapkan (minimum 0) | 

 **Pernyataan otoritatif** 


| Properti | Tipe | Diperlukan | Kisaran | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "AUTHORITATIVE" | 
|  value  | boolean |  Ya  | - | Status otoritatif yang diharapkan | 

 **Pernyataan TTL** 


| Properti | Tipe | Diperlukan | Kisaran | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "TTL" | 
|  operator  | string |  Ya  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | bilangan bulat |  Ya  | ≥ 0 | TTL yang diharapkan (minimal 0) | 

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

 **Pernyataan kedaluwarsa sertifikat** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "CERTIFICATE\$1EXPIRY" | 
|  operator  | string |  Ya  | - | GREATER\$1THAN, LESS\$1THAN | 
|  value  | bilangan bulat |  Ya  | - | Nilai waktu (minimum 0) | 
|  unit  | string | Tidak | “HARI” | DAYS, HOURS | 

 **Pernyataan subjek sertifikat** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "CERTIFICATE\$1SUBJECT" | 
|  field  | string |  Ya  | - | Bidang subjek:CN,O,OU,C,ST, L | 
|  operator  | string |  Ya  | - | CONTAINS, EQUALS, REGEX\$1MATCH | 
|  value  | string |  Ya  | - | Nilai bidang yang diharapkan | 

 **Pernyataan penerbit sertifikat** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "CERTIFICATE\$1ISSUER" | 
|  field  | string |  Ya  | - | Bidang penerbit:CN, O | 
|  operator  | string |  Ya  | - | CONTAINS, EQUALS | 
|  value  | string |  Ya  | - | Nilai bidang yang diharapkan | 

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

 **Pernyataan keberhasilan koneksi** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "CONNECTION\$1SUCCESSFUL" | 
|  value  | boolean |  Ya  | - | Status koneksi yang diharapkan | 

 **Pernyataan data respons** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Ya  | - | Harus "RESPONSE\$1DATA" | 
|  operator  | string |  Ya  | - | CONTAINS, EQUALS, NOT\$1CONTAINS,  REGEX\$1MATCH, STARTS\$1WITH, ENDS\$1WITH | 
|  value  | string |  Ya  | - | Data respons yang diharapkan | 
|  encoding  | string | Tidak | “UTF-8" | UTF-8, ASCII, HEX | 

## Ekstraksi data
<a name="data-extraction"></a>

Ekstraktor memungkinkan Anda untuk menangkap data dari tanggapan untuk digunakan dalam langkah berikutnya atau untuk tujuan pelaporan.

 **Sifat ekstraksi** 


| Properti | Tipe | Diperlukan | Default | Deskripsi | 
| --- | --- | --- | --- | --- | 
|  name  | string |  Ya  | - | Nama variabel untuk data yang diekstraksi | 
|  type  | string |  Ya  | - | Jenis ekstraksi: BODY | 
|  path  | string | Tidak | - | JSONPath untuk ekstraksi tubuh | 
|  regex  | string | Tidak | - | Pola ekspresi reguler | 
|  regexGroup  | integer | Tidak | 0 | Grup penangkapan Regex (minimal 0) | 

 **Validasi nama ekstraksi** 
+ Pola: `^[a-zA-Z][a-zA-Z0-9_]*$`
+ Harus dimulai dengan surat
+ Dapat berisi huruf, angka, dan garis bawah

**Batasan** - Substitusi tidak berlaku untuk bidang dalam skema yang memiliki nilai ENUM tertentu

 **Jenis ekstraksi** 

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