

 AWS SDK untuk .NET V3 telah memasuki mode pemeliharaan.

Kami menyarankan Anda bermigrasi ke [AWS SDK untuk .NET V4](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html). Untuk detail dan informasi tambahan tentang cara bermigrasi, silakan lihat [pengumuman mode pemeliharaan](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/) kami.

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

# Fitur dari AWS SDK untuk .NET
<a name="net-dg-sdk-features"></a>

Bagian ini memberikan informasi tentang fitur AWS SDK untuk .NET yang mungkin perlu Anda pertimbangkan saat membuat aplikasi Anda.

Pastikan Anda telah [menyiapkan proyek Anda](net-dg-config.md) terlebih dahulu.

Untuk informasi tentang mengembangkan perangkat lunak untuk AWS layanan tertentu bersama dengan contoh kode, lihat[Bekerja dengan AWS layanan](working-with-aws-services.md). Untuk contoh kode tambahan, lihat[SDK untuk .NET contoh kode](csharp_code_examples.md).

**Topics**
+ [Asinkron APIs](sdk-net-async-api.md)
+ [Mencoba lagi dan batas waktu](retries-timeouts.md)
+ [Paginator](paginators.md)
+ [Observabilitas](observability.md)
+ [Alat tambahan](sdk-features-additional-tools.md)

# AWS asinkron APIs untuk .NET
<a name="sdk-net-async-api"></a>

 AWS SDK untuk .NET Menggunakan *Task-based Asynchronous Pattern (TAP) untuk implementasi asinkron*. Untuk mempelajari TAP selengkapnya, lihat [Pola Asinkron Berbasis Tugas (TAP](https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap)) di docs.microsoft.com.

Topik ini memberi Anda gambaran umum tentang cara menggunakan TAP dalam panggilan Anda ke klien AWS layanan.

Metode asinkron dalam AWS SDK untuk .NET API adalah operasi berdasarkan `Task` kelas atau kelas. `Task<TResult>` [Lihat docs.microsoft.com untuk informasi tentang kelas-kelas ini: Kelas tugas, [Tugas < > kelas](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task). TResult](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1)

Ketika metode API ini dipanggil dalam kode Anda, mereka harus dipanggil dalam fungsi yang dideklarasikan dengan `async` kata kunci, seperti yang ditunjukkan pada contoh berikut.

```
static async Task Main(string[] args)
{
  ...
  // Call the function that contains the asynchronous API method.
  // Could also call the asynchronous API method directly from Main
  //  because Main is declared async
  var response = await ListBucketsAsync();
  Console.WriteLine($"Number of buckets: {response.Buckets.Count}");
  ...
}

// Async method to get a list of Amazon S3 buckets.
private static async Task<ListBucketsResponse> ListBucketsAsync()
{
  ...
  var response = await s3Client.ListBucketsAsync();
  return response;
}
```

Seperti yang ditunjukkan pada cuplikan kode sebelumnya, ruang lingkup yang lebih disukai untuk `async` deklarasi adalah fungsinya. `Main` Menyetel `async` cakupan ini memastikan bahwa semua panggilan ke klien AWS layanan harus asinkron. Jika Anda tidak dapat mendeklarasikan `Main` asinkron karena alasan tertentu, Anda dapat menggunakan `async` kata kunci pada fungsi selain `Main` dan kemudian memanggil metode API dari sana, seperti yang ditunjukkan pada contoh berikut. 

```
static void Main(string[] args)
{
  ...
  Task<ListBucketsResponse> response = ListBucketsAsync();
  Console.WriteLine($"Number of buckets: {response.Result.Buckets.Count}");
  ...
}

// Async method to get a list of Amazon S3 buckets.
private static async Task<ListBucketsResponse> ListBucketsAsync()
{
  ...
  var response = await s3Client.ListBucketsAsync();
  return response;
}
```

Perhatikan `Task<>` sintaks khusus yang diperlukan `Main` saat Anda menggunakan pola ini. Selain itu, Anda harus menggunakan **`Result`**anggota respons untuk mendapatkan data.

Anda dapat melihat contoh lengkap panggilan asinkron ke klien AWS layanan di [Ikuti tur singkat](quick-start.md) bagian ([Aplikasi lintas platform sederhana](quick-start-s3-1-cross.md)dan[Aplikasi berbasis Windows sederhana](quick-start-s3-1-winvs.md)) dan di. [Contoh kode dengan panduanPustaka dan kerangka kerja tingkat tinggi](tutorials-examples.md)

# Mencoba lagi dan batas waktu
<a name="retries-timeouts"></a>

 AWS SDK untuk .NET Ini memungkinkan Anda untuk mengonfigurasi jumlah percobaan ulang dan nilai batas waktu untuk permintaan HTTP ke AWS layanan. Jika nilai default untuk percobaan ulang dan batas waktu tidak sesuai untuk aplikasi Anda, Anda dapat menyesuaikannya dengan persyaratan spesifik Anda, tetapi penting untuk memahami bagaimana hal itu akan memengaruhi perilaku aplikasi Anda.

Untuk menentukan nilai mana yang akan digunakan untuk percobaan ulang dan batas waktu, pertimbangkan hal berikut:
+ Bagaimana seharusnya AWS SDK untuk .NET dan aplikasi Anda merespons ketika konektivitas jaringan menurun atau AWS layanan tidak dapat dijangkau? Apakah Anda ingin panggilan gagal dengan cepat, atau apakah pantas untuk panggilan untuk terus mencoba lagi atas nama Anda?
+ Apakah aplikasi Anda merupakan aplikasi atau situs web yang harus responsif, atau apakah itu pekerjaan pemrosesan latar belakang yang memiliki toleransi lebih untuk peningkatan latensi?
+ Apakah aplikasi digunakan pada jaringan yang andal dengan latensi rendah, atau apakah itu digunakan di lokasi terpencil dengan konektivitas yang tidak dapat diandalkan?

## Percobaan ulang
<a name="retries"></a>

### Ikhtisar
<a name="w2aac11c13c11b5"></a>

Permintaan AWS SDK untuk .NET dapat mencoba ulang yang gagal karena pelambatan sisi server atau koneksi terputus. Ada dua properti kelas konfigurasi layanan yang dapat Anda gunakan untuk menentukan perilaku coba lagi dari klien layanan. Kelas konfigurasi layanan mewarisi properti ini dari [Amazon.Runtime abstrak. ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html)kelas [Referensi AWS SDK untuk .NET API](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/):
+ `RetryMode`[menentukan salah satu dari tiga mode coba lagi, yang didefinisikan dalam Amazon.Runtime. RequestRetryMode](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TRequestRetryMode.html)pencacahan.

  Nilai default untuk aplikasi Anda dapat dikontrol dengan menggunakan variabel `AWS_RETRY_MODE` lingkungan atau pengaturan *retry\$1mode* dalam file konfigurasi bersama AWS .
+ `MaxErrorRetry`menentukan jumlah percobaan ulang yang diizinkan di tingkat klien layanan; SDK mencoba ulang operasi beberapa kali yang ditentukan sebelum gagal dan melempar pengecualian.

  Nilai default untuk aplikasi Anda dapat dikontrol dengan menggunakan variabel `AWS_MAX_ATTEMPTS` lingkungan atau pengaturan *max\$1attempts* dalam file AWS konfigurasi bersama.

Deskripsi terperinci untuk properti ini dapat ditemukan di [Amazon.Runtime abstrak. ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html)kelas [Referensi AWS SDK untuk .NET API](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/). Setiap nilai `RetryMode` sesuai secara default dengan nilai tertentu`MaxErrorRetry`, seperti yang ditunjukkan pada tabel berikut.

|  |  |  | 
| --- |--- |--- |
| Warisan | 10 | 4 | 
| Standar | 10 | 2 | 
| Adaptif (eksperimental) | 10 | 2 | 

### Perilaku
<a name="w2aac11c13c11b9"></a>

**Saat aplikasi Anda dimulai**

Ketika aplikasi Anda dimulai, nilai default untuk `RetryMode` dan `MaxErrorRetry` dikonfigurasi oleh SDK. Nilai default ini digunakan saat Anda membuat klien layanan kecuali Anda menentukan nilai lainnya.
+ Jika properti tidak disetel di lingkungan Anda, default untuk `RetryMode` dikonfigurasi sebagai *Legacy* dan default untuk `MaxErrorRetry` dikonfigurasi dengan nilai yang sesuai dari tabel sebelumnya.
+ Jika mode coba lagi telah disetel di lingkungan Anda, nilai tersebut digunakan sebagai default untuk`RetryMode`. Default untuk `MaxErrorRetry` dikonfigurasi dengan nilai yang sesuai dari tabel sebelumnya kecuali nilai untuk kesalahan maksimum juga telah ditetapkan di lingkungan Anda (dijelaskan selanjutnya).
+ Jika nilai untuk kesalahan maksimum telah ditetapkan di lingkungan Anda, nilai tersebut digunakan sebagai default untuk`MaxErrorRetry`. Amazon DynamoDB adalah pengecualian untuk aturan ini; nilai default DynamoDB `MaxErrorRetry` untuk selalu nilai dari tabel sebelumnya.

**Saat aplikasi Anda berjalan**

Saat membuat klien layanan, Anda dapat menggunakan nilai default untuk `RetryMode` dan`MaxErrorRetry`, seperti yang dijelaskan sebelumnya, atau Anda dapat menentukan nilai lainnya. Untuk menentukan nilai lain, buat dan sertakan objek konfigurasi layanan seperti [AmazonDynamoDBConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TDynamoDBConfig.html)atau [Amazon SQSConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/SQS/TSQSConfig.html) saat Anda membuat klien layanan.

Nilai-nilai ini tidak dapat diubah untuk klien layanan setelah dibuat.

**Pertimbangan-pertimbangan**

Ketika percobaan ulang terjadi, latensi permintaan Anda meningkat. Anda harus mengonfigurasi percobaan ulang berdasarkan batas aplikasi untuk latensi permintaan total dan tingkat kesalahan.

## Timeout
<a name="timeouts"></a>

 AWS SDK untuk .NET Ini memungkinkan Anda untuk mengonfigurasi batas waktu permintaan di tingkat klien layanan dan per panggilan metode. Ada dua mekanisme untuk mengonfigurasi batas waktu, yang tercakup dalam bagian selanjutnya:
+ Jika Anda menggunakan [panggilan asinkron](#timeouts-async), Anda dapat menggunakan `CancellationToken` parameter metode ini.
+ Jika Anda menggunakan [panggilan sinkron di.NET Framework](#timeouts-sync-framework), Anda dapat menggunakan `Timeout` dan `ReadWriteTimeout` properti [Amazon.Runtime abstrak. ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html)kelas.

### Menggunakan `CancellationToken` parameter untuk batas waktu
<a name="timeouts-async"></a>

 AWS SDK untuk .NET Ini memungkinkan Anda untuk mengonfigurasi batas waktu permintaan pada panggilan asinkron dengan menggunakan parameter. `CancellationToken` Cuplikan kode berikut menunjukkan contoh. Kode melempar `System.Threading.Tasks.TaskCanceledException` jika permintaan tidak selesai dalam 10 detik.

```
string bucketName = "amzn-s3-demo-bucket";
string path = "pathToBucket";
using (var amazonS3Client = new AmazonS3Client(new AmazonS3Config()))
{
    // Cancel request after 10 seconds
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(10000));
    CancellationToken cancellationToken = cancellationTokenSource.Token;
    ListObjectsV2Request listRequestV2 = new()
    {
        BucketName = bucketName,
        Prefix = path,
    };

    ListObjectsV2Response listResponseV2 = await amazonS3Client.ListObjectsV2Async(listRequestV2, cancellationToken);
}
```

### Menggunakan `Timeout` dan `ReadWriteTimeout` properti untuk batas waktu
<a name="timeouts-sync-framework"></a>

**catatan**  
`Timeout`Properti tidak memengaruhi panggilan asinkron. Jika Anda menggunakan panggilan asinkron, lihat sebagai gantinya. [Menggunakan `CancellationToken` parameter untuk batas waktu](#timeouts-async)

 AWS SDK untuk .NET Ini memungkinkan Anda untuk mengonfigurasi batas waktu permintaan dan nilai read/write batas waktu soket di tingkat klien layanan. Nilai-nilai ini ditentukan dalam `Timeout` dan `ReadWriteTimeout` properti abstrak [Amazon.Runtime. ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html)kelas. Nilai-nilai ini diteruskan sebagai `Timeout` dan `ReadWriteTimeout` properti dari [HttpWebRequest](https://learn.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest)objek yang dibuat oleh objek klien AWS layanan. Secara default, `Timeout` nilainya 100 detik dan `ReadWriteTimeout` nilainya 300 detik.

Ketika jaringan Anda memiliki latensi tinggi, atau ada kondisi yang menyebabkan operasi dicoba ulang, menggunakan nilai batas waktu yang lama dan jumlah percobaan ulang yang tinggi dapat menyebabkan beberapa operasi SDK tampak tidak responsif.

**catatan**  
Versi AWS SDK untuk .NET yang menargetkan perpustakaan kelas portabel (PCL) menggunakan [HttpClient](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient)kelas bukan `HttpWebRequest` kelas, dan hanya mendukung properti [Timeout](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout).

Berikut ini adalah pengecualian untuk nilai batas waktu default. Nilai-nilai ini diganti ketika Anda secara eksplisit menetapkan nilai batas waktu.
+ `Timeout`dan `ReadWriteTimeout` disetel ke nilai maksimum jika metode yang dipanggil mengunggah aliran, seperti [Amazons3Client. PutObjectAsync()](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/MS3PutObjectAsyncPutObjectRequestCancellationToken.html), [Amazons3Client. UploadPartAsync()](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/MS3UploadPartAsyncUploadPartRequestCancellationToken.html), [AmazonGlacierClient. UploadArchiveAsync()](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Glacier/MGlacierUploadArchiveAsyncUploadArchiveRequestCancellationToken.html), dan sebagainya.
+ Versi dari target AWS SDK untuk .NET yang ditetapkan .NET Framework `Timeout` dan `ReadWriteTimeout` ke nilai maksimum untuk semua [Amazons3Client](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Client.html) dan objek. [AmazonGlacierClient](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Glacier/TGlacierClient.html)
+ Versi AWS SDK untuk .NET yang menargetkan perpustakaan kelas portabel (PCL) dan .NET Core diatur `Timeout` ke nilai maksimum untuk semua [Amazons3Client](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Client.html) dan objek. [AmazonGlacierClient](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Glacier/TGlacierClient.html)

Contoh berikut menunjukkan kepada Anda cara menentukan mode coba ulang *Standar*, maksimal 3 percobaan ulang, batas waktu 10 detik, dan read/write batas waktu 10 detik (jika ada). [Konstruktor [Amazons3Client diberikan objek](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Client.html) Amazons3config.](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Config.html)

```
var s3Client = new AmazonS3Client(
  new AmazonS3Config
  {
    Timeout = TimeSpan.FromSeconds(10),
    // NOTE: The following property is obsolete for
    //       versions of the AWS SDK untuk .NET that target .NET Core.
    ReadWriteTimeout = TimeSpan.FromSeconds(10),
    RetryMode = RequestRetryMode.Standard,
    MaxErrorRetry = 3
  });
```

# Paginator
<a name="paginators"></a>

Beberapa AWS layanan mengumpulkan dan menyimpan sejumlah besar data, yang dapat Anda ambil dengan menggunakan panggilan API. AWS SDK untuk .NET*Jika jumlah data yang ingin Anda ambil menjadi terlalu besar untuk satu panggilan API, Anda dapat memecah hasilnya menjadi potongan-potongan yang lebih mudah dikelola melalui penggunaan pagination.* 

Untuk memungkinkan Anda melakukan pagination, objek permintaan dan respons untuk banyak klien layanan di SDK menyediakan *token lanjutan* (biasanya bernama). `NextToken` Beberapa klien layanan ini juga menyediakan **paginator**.

Paginator memungkinkan Anda menghindari overhead token lanjutan, yang mungkin melibatkan loop, variabel status, beberapa panggilan API, dan sebagainya. Bila Anda menggunakan paginator, Anda dapat mengambil data dari AWS layanan melalui satu baris kode, deklarasi `foreach` loop. Jika beberapa panggilan API diperlukan untuk mengambil data, paginator menangani ini untuk Anda.

## Di mana saya menemukan paginator?
<a name="paginators-find-them"></a>

Tidak semua layanan menyediakan paginator. Salah satu cara untuk menentukan apakah layanan menyediakan paginator untuk API tertentu adalah dengan melihat definisi kelas klien layanan di Referensi [AWS SDK untuk .NET API](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/).

Misalnya, jika Anda memeriksa definisi untuk [AmazonCloudWatchLogsClient](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatchLogs/TCloudWatchLogsClient.html)kelas, Anda melihat `Paginators` properti. Ini adalah properti yang menyediakan paginator untuk Amazon CloudWatch Logs.

## Apa yang diberikan paginator kepada saya?
<a name="paginators-use-them"></a>

Paginator berisi properti yang memungkinkan Anda melihat respons lengkap. Mereka juga biasanya berisi satu atau lebih properti yang memungkinkan Anda mengakses bagian paling menarik dari tanggapan, yang akan kami sebut *hasil utama*.

Misalnya, dalam yang `AmazonCloudWatchLogsClient` disebutkan sebelumnya, `Paginator` objek berisi `Responses` properti dengan [DescribeLogGroupsResponse](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatchLogs/TDescribeLogGroupsResponse.html)objek lengkap dari panggilan API. `Responses`Properti ini berisi, antara lain, kumpulan grup log.

Objek Paginator juga berisi satu hasil kunci bernama. `LogGroups` Properti ini hanya menyimpan bagian log grup dari respons. Memiliki hasil kunci ini memungkinkan Anda untuk mengurangi dan menyederhanakan kode Anda dalam banyak keadaan.

## Pagination sinkron vs. asinkron
<a name="paginators-sync-async"></a>

Paginator menyediakan mekanisme sinkron dan asinkron untuk pagination. Pagination sinkron tersedia dalam proyek .NET Framework 4.7.2 (atau yang lebih baru). Pagination asinkron tersedia di proyek .NET Core (.NET Core 3.1, .NET 5, dan seterusnya).

Karena operasi asinkron dan .NET Core direkomendasikan, contoh yang muncul berikutnya menunjukkan pagination asinkron. Informasi tentang cara melakukan tugas yang sama menggunakan pagination sinkron dan .NET Framework 4.7.2 (atau yang lebih baru) ditampilkan setelah contoh di. [Pertimbangan tambahan untuk paginator](#paginators-additional)

## Contoh
<a name="paginators-example"></a>

Contoh berikut menunjukkan cara menggunakan AWS SDK untuk .NET untuk menampilkan daftar grup log. Sebagai kontras, contoh menunjukkan bagaimana melakukan ini baik dengan maupun tanpa paginator. Sebelum melihat kode lengkap, ditampilkan nanti, pertimbangkan cuplikan berikut.

**Mendapatkan grup CloudWatch log tanpa paginator**

```
      // Loop as many times as needed to get all the log groups
      var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit};
      do
      {
        Console.WriteLine($"Getting up to {LogGroupLimit} log groups...");
        var response = await cwClient.DescribeLogGroupsAsync(request);
        foreach(var logGroup in response.LogGroups)
        {
          Console.WriteLine($"{logGroup.LogGroupName}");
        }
        request.NextToken = response.NextToken;
      } while(!string.IsNullOrEmpty(request.NextToken));
```

**Mendapatkan grup CloudWatch log dengan menggunakan paginator**

```
      // No need to loop to get all the log groups--the SDK does it for us behind the scenes
      var paginatorForLogGroups =
        cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest());
      await foreach(var logGroup in paginatorForLogGroups.LogGroups)
      {
        Console.WriteLine(logGroup.LogGroupName);
      }
```

Hasil dari kedua cuplikan ini persis sama, sehingga keuntungan dalam menggunakan paginator dapat dilihat dengan jelas.

**catatan**  
Sebelum Anda mencoba membangun dan menjalankan kode lengkap, pastikan Anda telah [menyiapkan lingkungan dan proyek Anda](net-dg-config.md).  
Anda mungkin juga membutuhkan [Microsoft.Bcl. AsyncInterfaces](https://www.nuget.org/packages/Microsoft.Bcl.AsyncInterfaces/) NuGet paket karena paginator asinkron menggunakan antarmuka. `IAsyncEnumerable`

### Kode lengkap
<a name="paginators-complete-code"></a>

Bagian ini menunjukkan referensi yang relevan dan kode lengkap untuk contoh ini.

#### Referensi SDK
<a name="w2aac11c15c23c19b5b1"></a>

NuGet paket:
+ [AWSSDK.CloudWatch](https://www.nuget.org/packages/AWSSDK.CloudWatch)

Elemen pemrograman:
+ [Namespace Amazon. CloudWatch](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatch/NCloudWatch.html)

  Kelas [AmazonCloudWatchLogsClient](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatchLogs/TCloudWatchLogsClient.html)
+ [Namespace Amazon. CloudWatchLogs.Model](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatchLogs/NCloudWatchLogsModel.html)

  Kelas [DescribeLogGroupsRequest](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatchLogs/TDescribeLogGroupsRequest.html)

  Kelas [DescribeLogGroupsResponse](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatchLogs/TDescribeLogGroupsResponse.html)

  Kelas [LogGroup](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudWatchLogs/TLogGroup.html)

#### Kode lengkap
<a name="w2aac11c15c23c19b7b1"></a>

```
using System;
using System.Threading.Tasks;
using Amazon.CloudWatchLogs;
using Amazon.CloudWatchLogs.Model;

namespace CWGetLogGroups
{
  class Program
  {
    // A small limit for demonstration purposes
    private const int LogGroupLimit = 3;

    //
    // Main method
    static async Task Main(string[] args)
    {
      var cwClient = new AmazonCloudWatchLogsClient();
      await DisplayLogGroupsWithoutPaginators(cwClient);
      await DisplayLogGroupsWithPaginators(cwClient);
    }


    //
    // Method to get CloudWatch log groups without paginators
    private static async Task DisplayLogGroupsWithoutPaginators(IAmazonCloudWatchLogs cwClient)
    {
      Console.WriteLine("\nGetting list of CloudWatch log groups without using paginators...");
      Console.WriteLine("------------------------------------------------------------------");

      // Loop as many times as needed to get all the log groups
      var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit};
      do
      {
        Console.WriteLine($"Getting up to {LogGroupLimit} log groups...");
        DescribeLogGroupsResponse response = await cwClient.DescribeLogGroupsAsync(request);
        foreach(LogGroup logGroup in response.LogGroups)
        {
          Console.WriteLine($"{logGroup.LogGroupName}");
        }
        request.NextToken = response.NextToken;
      } while(!string.IsNullOrEmpty(request.NextToken));
    }


    //
    // Method to get CloudWatch log groups by using paginators
    private static async Task DisplayLogGroupsWithPaginators(IAmazonCloudWatchLogs cwClient)
    {
      Console.WriteLine("\nGetting list of CloudWatch log groups by using paginators...");
      Console.WriteLine("-------------------------------------------------------------");

      // Access the key results; i.e., the log groups
      // No need to loop to get all the log groups--the SDK does it for us behind the scenes
      Console.WriteLine("\nFrom the key results...");
      Console.WriteLine("------------------------");
      IDescribeLogGroupsPaginator paginatorForLogGroups =
        cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest());
      await foreach(LogGroup logGroup in paginatorForLogGroups.LogGroups)
      {
        Console.WriteLine(logGroup.LogGroupName);
      }

      // Access the full response
      // Create a new paginator, do NOT reuse the one from above
      Console.WriteLine("\nFrom the full response...");
      Console.WriteLine("--------------------------");
      IDescribeLogGroupsPaginator paginatorForResponses =
        cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest());
      await foreach(DescribeLogGroupsResponse response in paginatorForResponses.Responses)
      {
        Console.WriteLine($"Content length: {response.ContentLength}");
        Console.WriteLine($"HTTP result: {response.HttpStatusCode}");
        Console.WriteLine($"Metadata: {response.ResponseMetadata}");
        Console.WriteLine("Log groups:");
        foreach(LogGroup logGroup in response.LogGroups) 
        {
          Console.WriteLine($"\t{logGroup.LogGroupName}");
        }
      }
    }
  }
}
```

## Pertimbangan tambahan untuk paginator
<a name="paginators-additional"></a>
+ **Paginator tidak dapat digunakan lebih dari sekali**

  Jika Anda membutuhkan hasil AWS paginator tertentu di beberapa lokasi dalam kode Anda, Anda tidak boleh menggunakan objek paginator lebih dari sekali. Sebagai gantinya, buat paginator baru setiap kali Anda membutuhkannya. Konsep ini ditunjukkan dalam contoh kode sebelumnya dalam metode. `DisplayLogGroupsWithPaginators`
+ **pagination sinkron**

  Pagination sinkron tersedia untuk proyek-proyek .NET Framework 4.7.2 (atau yang lebih baru).
**Awas**  
Mulai 15 Agustus 2024, AWS SDK untuk .NET akan mengakhiri dukungan untuk .NET Framework 3.5 dan akan mengubah versi.NET Framework minimum menjadi 4.7.2. Untuk informasi lebih lanjut, lihat posting blog [Perubahan penting yang datang untuk target.NET Framework 3.5 dan 4.5 dari AWS SDK untuk .NET](https://aws.amazon.com/blogs/developer/important-changes-coming-for-net-framework-3-5-and-4-5-targets-of-the-aws-sdk-for-net/).

  Untuk melihat ini, buat proyek .NET Framework 4.7.2 (atau yang lebih baru) dan salin kode sebelumnya ke sana. Kemudian cukup hapus `await` kata kunci dari dua panggilan `foreach` paginator, seperti yang ditunjukkan pada contoh berikut.

  ```
  /*await*/ foreach(var logGroup in paginatorForLogGroups.LogGroups)
  {
    Console.WriteLine(logGroup.LogGroupName);
  }
  ```

  Bangun dan jalankan proyek untuk melihat hasil yang sama yang Anda lihat dengan pagination asinkron.

# Observabilitas
<a name="observability"></a>

Observabilitas adalah sejauh mana keadaan sistem saat ini dapat disimpulkan dari data yang dipancarkannya. Data yang dipancarkan biasanya disebut sebagai telemetri.

 AWS SDK untuk .NET Dapat menyediakan dua sinyal telemetri umum, metrik dan jejak, serta pencatatan. Anda dapat menghubungkan data telemetri [TelemetryProvider](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TTelemetryProvider.html)untuk mengirim ke backend observabilitas (seperti atau [AWS X-Ray](https://docs.aws.amazon.com/xray/?icmpid=docs_homepage_devtools)[Amazon CloudWatch](https://docs.aws.amazon.com/cloudwatch/?icmpid=docs_homepage_mgmtgov)) dan kemudian menindaklanjutinya.

Secara default, sinyal telemetri dinonaktifkan di SDK. Topik ini menjelaskan cara mengaktifkan dan mengonfigurasi keluaran telemetri.

## Sumber daya tambahan
<a name="observability-resources"></a>

Untuk informasi selengkapnya tentang mengaktifkan dan menggunakan observabilitas, lihat sumber daya berikut:
+ [OpenTelemetry](https://opentelemetry.io/)
+ Posting blog [Enhancing Observability in the with. AWS SDK untuk .NET OpenTelemetry](https://aws.amazon.com/blogs/developer/enhancing-observability-in-the-aws-sdk-for-net-with-opentelemetry/)
+ Posting blog [Mengumumkan ketersediaan umum OpenTelemetry pustaka AWS .NET](https://aws.amazon.com/blogs/dotnet/announcing-the-general-availability-of-aws-net-opentelemetry-libraries/).
+ [Eksportir untuk OpenTelemetry](https://opentelemetry.io/docs/languages/net/exporters/)
+ Untuk contoh observabilitas di Alat AWS untuk PowerShell, lihat [Observabilitas](https://docs.aws.amazon.com/powershell/latest/userguide/observability.html) di [Alat untuk PowerShell Panduan Pengguna](https://docs.aws.amazon.com/powershell/latest/userguide/).

## Konfigurasikan `TelemetryProvider`
<a name="observability-conf-telemetry-provider"></a>

Anda dapat mengonfigurasi a `TelemetryProvider` dalam aplikasi Anda secara global untuk semua klien layanan atau untuk klien individu, seperti yang ditunjukkan dalam contoh berikut. [Penyedia telemetri](observability-telemetry-providers.md)Bagian ini berisi informasi tentang implementasi telemetri, termasuk informasi tentang implementasi yang disediakan bersama SDK.

### Konfigurasikan penyedia telemetri global default
<a name="observability-conf-telemetry-provider-global"></a>

Secara default, setiap klien layanan mencoba menggunakan penyedia telemetri yang tersedia secara global. Dengan cara ini, Anda dapat mengatur penyedia sekali, dan semua klien akan menggunakannya. Ini harus dilakukan hanya sekali, sebelum Anda membuat klien layanan apa pun.

Cuplikan kode berikut menunjukkan cara mengatur penyedia telemetri global. Kemudian membuat klien layanan Amazon S3 dan mencoba melakukan operasi yang gagal. Kode menambahkan penelusuran dan metrik ke aplikasi. Kode ini menggunakan NuGet paket-paket berikut: `OpenTelemetry.Exporter.Console` dan`OpenTelemetry.Instrumentation.AWS`.

**catatan**  
Jika Anda menggunakan AWS IAM Identity Center untuk otentikasi, pastikan untuk juga menambahkan `AWSSDK.SSO` dan`AWSSDK.SSOOIDC`.

```
using Amazon.S3;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

Sdk.CreateTracerProviderBuilder()
    .ConfigureResource(e => e.AddService("DemoOtel"))
    .AddAWSInstrumentation()
    .AddConsoleExporter()
    .Build();

Sdk.CreateMeterProviderBuilder()
    .ConfigureResource(e => e.AddService("DemoOtel"))
    .AddAWSInstrumentation()
    .AddConsoleExporter()
    .Build();

var s3Client = new AmazonS3Client();

try
{
    var listBucketsResponse = await s3Client.ListBucketsAsync();
    // Attempt to delete a bucket that doesn't exist.
    var deleteBucketResponse = await s3Client.DeleteBucketAsync("amzn-s3-demo-bucket");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Console.Read();
```

### Konfigurasikan penyedia telemetri untuk klien layanan tertentu
<a name="observability-conf-telemetry-provider-client"></a>

Anda dapat mengonfigurasi klien layanan individual dengan penyedia telemetri tertentu (selain yang global). Untuk melakukannya, gunakan `TelemetryProvider` kelas objek Config dari konstruktor klien layanan. Misalnya, lihat [Amazons3config](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Config.html) dan cari propertinya. `TelemetryProvider` Lihat [Penyedia telemetri](observability-telemetry-providers.md) untuk informasi tentang implementasi telemetri kustom.

**Topics**
+ [Sumber daya tambahan](#observability-resources)
+ [Konfigurasikan `TelemetryProvider`](#observability-conf-telemetry-provider)
+ [Metrik](observability-metrics.md)
+ [Penyedia telemetri](observability-telemetry-providers.md)

# Metrik
<a name="observability-metrics"></a>

Tabel berikut mencantumkan metrik telemetri yang dipancarkan SDK. [Konfigurasikan penyedia telemetri](observability.md#observability-conf-telemetry-provider) untuk membuat metrik dapat diamati.


**Metrik apa yang dipancarkan?**  

| Nama metrik | Unit | Tipe | Atribut | Deskripsi | 
| --- | --- | --- | --- | --- | 
| client.call.duration | detik | Histogram | rpc.service, rpc.method | Durasi panggilan keseluruhan (termasuk percobaan ulang dan waktu untuk mengirim atau menerima permintaan dan badan respons) | 
| client.uptime | detik | Histogram | rpc.layanan | Jumlah waktu sejak klien dibuat | 
| client.call.attempts | \$1mencoba\$1 | MonotonicCounter | rpc.service, rpc.method | Jumlah upaya untuk operasi individu | 
| client.call.errors | \$1kesalahan\$1 | MonotonicCounter | rpc.service, rpc.method, exception.type | Jumlah kesalahan untuk suatu operasi | 
| client.call.attempt\$1duration | detik | Histogram | rpc.service, rpc.method | Waktu yang diperlukan untuk terhubung ke layanan, mengirim permintaan, dan mendapatkan kembali kode status HTTP dan header (termasuk waktu antrian menunggu untuk dikirim) | 
| client.call.resolve\$1endpoint\$1duration | detik | Histogram | rpc.service, rpc.method | Waktu yang dibutuhkan untuk menyelesaikan titik akhir (endpoint resolver, bukan DNS) untuk permintaan | 
| client.call.serialization\$1duration | detik | Histogram | rpc.service, rpc.method | Waktu yang dibutuhkan untuk membuat serial badan pesan | 
| client.call.deserialization\$1duration | detik | Histogram | rpc.service, rpc.method | Waktu yang dibutuhkan untuk deserialisasi badan pesan | 
| client.call.auth.signing\$1duration | detik | Histogram | rpc.service, rpc.method | Waktu yang dibutuhkan untuk menandatangani permintaan | 
| client.call.auth.resolve\$1identity\$1duration | detik | Histogram | rpc.service, rpc.method | Waktu yang dibutuhkan untuk memperoleh identitas (seperti AWS kredensial atau token pembawa) dari Penyedia Identitas | 
| client.http.bytes\$1sent | Oleh | MonotonicCounter | server.address | Jumlah total byte yang dikirim oleh klien HTTP | 
| client.http.bytes\$1received | Oleh | MonotonicCounter | server.address | Jumlah total byte yang diterima oleh klien HTTP | 

Berikut ini adalah deskripsi kolom:
+ **Nama metrik** —Nama metrik yang dipancarkan.
+ **Satuan** —Satuan ukuran untuk metrik. Unit diberikan dalam notasi [UCUM](https://unitsofmeasure.org/ucum) case sensitive (“c/s”).
+ **Jenis** —Jenis instrumen yang digunakan untuk menangkap metrik.
+ **Atribut** —Himpunan atribut (dimensi) yang dipancarkan dengan metrik.
+ **Deskripsi** —Deskripsi tentang apa yang diukur metrik.

# Penyedia telemetri
<a name="observability-telemetry-providers"></a>

[SDK menyediakan implementasi [OpenTelemetry](https://opentelemetry.io/)sebagai penyedia telemetri, yang dijelaskan di bagian selanjutnya.](observability-telemetry-providers-otel.md)

Jika Anda memiliki persyaratan telemetri tertentu, sudah memiliki solusi telemetri dalam pikiran, atau memerlukan kontrol halus atas bagaimana data telemetri ditangkap dan diproses, Anda juga dapat menerapkan penyedia telemetri Anda sendiri.

Daftarkan implementasi Anda sendiri dengan [TelemetryProvider](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TTelemetryProvider.html)kelas. Berikut ini adalah contoh sederhana tentang cara mendaftar sendiri `TracerProvider` dan`MeterProvider`.

```
using Amazon;
using Amazon.Runtime.Telemetry;
using Amazon.Runtime.Telemetry.Metrics;
using Amazon.Runtime.Telemetry.Tracing;

public class CustomTracerProvider : TracerProvider
{
    // Implement custom tracing logic here
}
public class CustomMeterProvider : MeterProvider
{
    // Implement custom metrics logic here
}

// Register custom implementations
AWSConfigs.TelemetryProvider.RegisterTracerProvider(new CustomTracerProvider());
AWSConfigs.TelemetryProvider.RegisterMeterProvider(new CustomMeterProvider());
```

**Topics**
+ [OpenTelemetry](observability-telemetry-providers-otel.md)

# Konfigurasikan penyedia telemetri OpenTelemetry berbasis
<a name="observability-telemetry-providers-otel"></a>

 AWS SDK untuk .NET Termasuk implementasi penyedia telemetri OpenTelemetry berbasis. Untuk detail tentang cara menetapkan penyedia ini sebagai penyedia telemetri global, lihat. [Konfigurasikan `TelemetryProvider`](observability.md#observability-conf-telemetry-provider) Untuk menggunakan penyedia telemetri ini, Anda memerlukan sumber daya berikut dalam proyek Anda:
+ Paket [OpenTelemetry NuGet .instrumentation.aws](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.AWS).
+ Eksportir telemetri seperti OTLP atau Console. Untuk informasi selengkapnya, lihat [Eksportir](https://opentelemetry.io/docs/languages/net/exporters/) dalam OpenTelemetry dokumentasi.

 OpenTelemetry Implementasi yang disertakan dengan SDK dapat dikonfigurasi untuk mengurangi jumlah penelusuran untuk permintaan, kredensi, dan kompresi HTTPS. Untuk melakukannya, atur `SuppressDownstreamInstrumentation` opsi ke`true`, mirip dengan yang berikut ini:

```
Sdk.CreateTracerProviderBuilder()
    .ConfigureResource(e => e.AddService("DemoOtel"))
    .AddAWSInstrumentation(options => options.SuppressDownstreamInstrumentation = true)
    .AddConsoleExporter()
    .Build();
```

Untuk informasi tambahan tentang penyedia ini, lihat posting blog [Enhancing Observability in the with. AWS SDK untuk .NET OpenTelemetry](https://aws.amazon.com/blogs/developer/enhancing-observability-in-the-aws-sdk-for-net-with-opentelemetry/)

# Alat tambahan
<a name="sdk-features-additional-tools"></a>

Berikut ini adalah beberapa alat tambahan yang dapat Anda gunakan untuk memudahkan pekerjaan mengembangkan, menyebarkan, dan memelihara aplikasi.NET Anda.

## AWS Menyebarkan Alat
<a name="sdk-features-deployment-tool"></a>

Setelah Anda mengembangkan aplikasi .NET Core cloud-native Anda pada mesin pengembangan, Anda dapat menggunakan Alat AWS Deploy untuk.NET CLI agar lebih mudah menyebarkan aplikasi Anda. AWS

Untuk informasi selengkapnya, lihat [Menyebarkan aplikasi ke AWS](deploying.md).

## AWS Kerangka Pemrosesan Pesan untuk.NET
<a name="sdk-features-msg-proc"></a>

Jika Anda menggunakan layanan seperti Amazon SQS, Amazon SNS atau EventBridge Amazon, Anda mungkin dapat memanfaatkan Kerangka Pemrosesan Pesan AWS untuk.NET. Untuk informasi selengkapnya, lihat [AWS Kerangka Pemrosesan Pesan untuk.NET](msg-proc-fw.md).

## Integrasi dengan .NET Aspire
<a name="sdk-features-aspire-integrations"></a>

Anda dapat memanfaatkan integrasi dengan.NET Aspire untuk meningkatkan loop dev dalam. Lihat informasi yang lebih lengkap di [Integrasi AWS dengan .NET Aspire di AWS SDK untuk .NET](aspire-integrations.md).