

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

# 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.