

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

# Pemecahan masalah dan pemantauan Fungsi
<a name="monetization-functions-troubleshooting"></a>

Halaman ini membantu Anda mendiagnosis kesalahan fungsi umum dan memantau kinerja fungsi dalam produksi. Bagian pemecahan masalah diatur berdasarkan gejala — mulailah dengan apa yang Anda amati, lalu ikuti penyebabnya dan perbaiki.

## Memantau
<a name="monetization-functions-troubleshooting-monitoring"></a>

### CloudWatch metrik
<a name="monetization-functions-troubleshooting-cw-metrics"></a>

MediaTailor menerbitkan metrik untuk eksekusi fungsi ke Amazon. CloudWatch Tidak diperlukan opt-in.

**Hook-level metrik** — satu titik data per eksekusi kait siklus hidup:


| Metrik | Deskripsi | Dimensi | 
| --- | --- | --- | 
| PreSessionInitHook.Invocations | Hitungan eksekusi hook | ConfigurationName | 
| PreSessionInitHook.Errors | Hitungan kesalahan kait | ConfigurationName | 
| PreSessionInitHook.Latency | Waktu eksekusi hook (ms) | ConfigurationName | 
| PreAdsRequestHook.Invocations | Hitungan eksekusi hook | ConfigurationName | 
| PreAdsRequestHook.Errors | Hitungan kesalahan kait | ConfigurationName | 
| PreAdsRequestHook.Latency | Waktu eksekusi hook (ms) | ConfigurationName | 

**Function-level metrik** - satu titik data per eksekusi fungsi individu:


| Metrik | Deskripsi | Dimensi | 
| --- | --- | --- | 
| Function.Invocations | Hitungan eksekusi fungsi | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Errors | Hitungan kesalahan fungsi | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Latency | Waktu eksekusi fungsi (ms) | ConfigurationName, FunctionId, FunctionType, HookType | 

Untuk detail selengkapnya tentang pengaturan alarm dan bekerja dengan metrik ini, lihat. [Memantau AWS Elemental MediaTailor dengan CloudWatch metrik Amazon](monitoring-cloudwatch-metrics.md)

### Log acara
<a name="monetization-functions-troubleshooting-log-events"></a>

MediaTailor memancarkan peristiwa log untuk eksekusi fungsi. Peristiwa kesalahan dipancarkan secara default. Acara yang telah selesai dan ringkasan adalah opt-in.


| Tipe peristiwa | Default/ Opt-in | Grup log | Deskripsi | 
| --- | --- | --- | --- | 
| PRE\_SESSION\_INIT\_HOOK\_SUMMARY | Opt-in | Log Manifes | Ringkasan eksekusi hook (success/error) | 
| PRE\_SESSION\_INIT\_HOOK\_ERROR | Default | Log Manifes | Kegagalan kait dengan ErrorType dan penyebabnya | 
| PRE\_SESSION\_INIT\_FUNCTION\_COMPLETED | Opt-in | Log Manifes | Fungsi individu dilengkapi dengan input/output | 
| PRE\_SESSION\_INIT\_FUNCTION\_ERROR | Default | Log Manifes | Kegagalan fungsi individu | 
| PRE\_ADS\_REQUEST\_HOOK\_SUMMARY | Opt-in | Log Interaksi ADS | Ringkasan eksekusi hook (success/error) | 
| PRE\_ADS\_REQUEST\_HOOK\_ERROR | Default | Log Interaksi ADS | Kegagalan kait dengan ErrorType dan penyebabnya | 
| PRE\_ADS\_REQUEST\_FUNCTION\_COMPLETED | Opt-in | Log Interaksi ADS | Fungsi individu dilengkapi dengan input/output | 
| PRE\_ADS\_REQUEST\_FUNCTION\_ERROR | Default | Log Interaksi ADS | Kegagalan fungsi individu | 

Untuk mengaktifkan peristiwa log keikutsertaan, lihat[Memantau AWS Elemental MediaTailor dengan CloudWatch metrik Amazon](monitoring-cloudwatch-metrics.md).

Gunakan `eventId` bidang untuk mengkorelasikan peristiwa tingkat kait dan tingkat fungsi untuk eksekusi yang sama.

Kueri Amazon CloudWatch Logs Insights berikut memfilter peristiwa kesalahan fungsi `eventId` untuk melacak eksekusi tunggal:

```
fields @timestamp, eventType, functionId, errorType, cause
| filter eventId = "5dc6f040-0f72-4e8c-a64e-25eeef62708c"
| sort @timestamp asc
```

## Pemecahan masalah
<a name="monetization-functions-troubleshooting-guide"></a>

Ketika fungsi gagal, MediaTailor mencatat `errorType` bidang dalam peristiwa kesalahan. Gunakan bidang ini untuk mengidentifikasi kelas kegagalan:


| Jenis kesalahan | Deskripsi | 
| --- | --- | 
| SYNTAX\_ERROR | Ekspresi gagal dikompilasi atau mengalami kesalahan tipe runtime | 
| RESOURCE\_LIMIT\_ERROR | Ekspresi melebihi batas waktu CPU, memori, atau kedalaman tumpukan | 
| RESTRICTION\_ERROR | Ekspresi menggunakan fungsi yang diblokir, atau batas ukuran muatan masukan terlampaui | 
| TIMEOUT\_ERROR | Eksekusi fungsi melebihi batas waktunya | 
| VALIDATION\_ERROR | Jalur keluaran menargetkan bidang yang tidak dapat ditulis dalam lingkup hook saat ini | 
| INTERNAL\_ERROR | Kegagalan infrastruktur yang tidak terkait dengan fungsi | 

Entri diatur berdasarkan gejala dan referensi jenis kesalahan ini jika berlaku.

### Ekspresi mengembalikan null secara tak terduga
<a name="monetization-functions-ts-null"></a>

**Gejala:** Nilai output yang Anda harapkan akan diisi `null` atau hilang dari parameter pemain.

**Kemungkinan penyebabnya:**


| Penyebab | Cara mengidentifikasi | Perbaiki | 
| --- | --- | --- | 
| Bidang input tidak ada di hook siklus hidup ini. | Anda direferensikan adsRequest.url dalam suatu PRE\_SESSION\_INITIALIZATION fungsi. Data permintaan ADS tidak tersedia pada awal sesi. | Pindahkan fungsi ke kait PRE\_ADS\_REQUEST siklus hidup, atau gunakan bidang input yang berbeda. Lihat [Pengait siklus hidup](monetization-functions-hooks.md). | 
| Bidang input hilang dari data sesi. | Anda direferensikanplayer\_params.campaign\_id, tetapi pemain tidak melewati parameter itu pada inisialisasi sesi. | Gunakan $exists() untuk memeriksa sebelum mengakses:{%$exists(player\_params.campaign\_id) ? player\_params.campaign\_id : 'default'%}. | 
| Anda menulis objek atau larik ke parameter pemain atau permintaan ADS. | Namespace ini hanya menerima string, angka, dan boolean. Objek dan array disaring. | Simpan data kompleks temp.\* dan ekstrak string, angka, atau boolean pada langkah berikutnya. | 

### `RESOURCE_LIMIT_ERROR`: Tumpukan meluap
<a name="monetization-functions-ts-stack-overflow"></a>

**Gejala:** Fungsi gagal dengan `errorType: "RESOURCE_LIMIT_ERROR"` dan`cause: "Stack overflow error"`.

**Penyebab:** Ekspresi melebihi kedalaman tumpukan maksimum 100 level. Ini biasanya terjadi dengan ekspresi kondisional (if/then/else) yang sangat bersarang atau tugas variabel yang kompleks.

Ini berarti ekspresi memiliki terlalu banyak tingkat sarang MediaTailor untuk diproses.

**Perbaiki:** Sederhanakan ekspresi. Pecahkan logika kompleks menjadi beberapa entri keluaran atau beberapa langkah dalam eksekutor berurutan.

### `RESOURCE_LIMIT_ERROR`: batas waktu CPU
<a name="monetization-functions-ts-cpu-timeout"></a>

**Gejala:** Fungsi gagal dengan `errorType: "RESOURCE_LIMIT_ERROR"` dan`cause: "Expression evaluation timeout: Check for infinite loop"`.

**Penyebab:** Ekspresi melebihi batas waktu CPU 100 ms. Hal ini dapat terjadi dengan ekspresi yang melakukan perhitungan mahal pada struktur data yang besar.

**Perbaiki:** Kurangi kompleksitas ekspresi. Jika Anda memproses array besar, pertimbangkan untuk memindahkan logika itu ke layanan eksternal dan memanggilnya dengan `HTTP_REQUEST` fungsi.

### `RESTRICTION_ERROR: Fungsi` tidak diizinkan
<a name="monetization-functions-ts-function-not-allowed"></a>

**Gejala:** Fungsi gagal dengan `errorType: "RESTRICTION_ERROR"` dan`cause: "Function '<name>' is not allowed"`.

**Penyebab:** Ekspresi memanggil fungsi Jsonata yang tidak ada dalam daftar 38 fungsi yang diizinkan. Contoh umum termasuk`$filter`,`$reduce`,`$eval`,`$split`, dan`$join`.

**Perbaiki:** Periksa `cause` bidang untuk nama fungsi yang diblokir. Ganti dengan alternatif yang diizinkan. Lihat [Referensi ekspresi Jsonata](monetization-functions-jsonata.md) daftar lengkap 38 fungsi yang diizinkan.

Fungsi yang diizinkan yang umum digunakan meliputi `$string``$number`,`$substring`,,`$contains`, dan`$encodeUrlComponent`.

### `RESTRICTION_ERROR: Ekspresi` terlalu panjang
<a name="monetization-functions-ts-expression-too-long"></a>

**Gejala:** Fungsi gagal untuk membuat atau memperbarui dengan`cause: "Expression length <actual> exceeds limit <limit>"`.

**Penyebab:** Ekspresi tunggal melebihi 1.000 karakter.

**Perbaiki:** Pecahkan ekspresi menjadi bagian-bagian yang lebih kecil. Gunakan beberapa entri keluaran, atau pisahkan logika di beberapa langkah dalam eksekutor berurutan. Gunakan variable binding (`:=`) untuk menghindari pengulangan subexpressions panjang.

### Kesalahan HTTP: Kode status nol
<a name="monetization-functions-ts-status-null"></a>

**Gejala:** Dalam output suatu `HTTP_REQUEST` fungsi, `response.statusCode` adalah`null`.

**Penyebab:** API eksternal tidak dapat dijangkau, waktu koneksi habis, atau terjadi kesalahan jaringan. Ketika ini terjadi, MediaTailor tetapkan `response.statusCode` ke`null`, `response.body` ke`null`, dan `response.text` ke`"Internal Error"`.

**Perbaiki:** Selalu periksa `response.statusCode` sebelum mengakses data respons:

```
{%response.statusCode = 200 ? response.body.value : 'default'%}
```

Ekspresi ini memeriksa apakah panggilan HTTP mengembalikan kode status 200. Jika ya, ia menggunakan nilai respons. Jika tidak, itu akan kembali ke nilai default.

Jika ini sering terjadi, periksa apakah API eksternal sehat. Pertimbangkan untuk meningkatkan `RequestTimeoutMilliseconds` jika API lambat, atau kurangi jika Anda ingin gagal dengan cepat.

### Kesalahan HTTP: Badan respons adalah nol
<a name="monetization-functions-ts-body-null"></a>

**Gejala:** `response.statusCode` adalah 200 tetapi `response.body` adalah`null`.

**Penyebab:** Badan respons tidak valid JSON atau melebihi 20.000 karakter. MediaTailor hanya mem-parsing respons JSON hingga 20.000 karakter ke dalam. `response.body`

**Fix:** Gunakan `response.text` sebagai fallback. `response.text`Bidang berisi badan respons mentah yang dipotong menjadi 20.000 karakter:

```
{%response.statusCode = 200 ? ($exists(response.body.id) ? response.body.id : $substring(response.text, 0, 100)) : 'error'%}
```

Jika data yang Anda butuhkan melebihi batas 20.000 karakter, pertimbangkan untuk meminta API eksternal untuk mengembalikan respons yang lebih kecil (misalnya, dengan meminta bidang tertentu).

### Kesalahan HTTP: Kegagalan validasi URL
<a name="monetization-functions-ts-url-validation"></a>

**Gejala:** Fungsi gagal saat runtime dengan pesan tentang URL yang salah bentuk, menggunakan skema yang tidak valid, atau melebihi panjang maksimum.

**Kemungkinan penyebabnya:**


| Penyebab | Perbaiki | 
| --- | --- | 
| URL tidak menggunakan http atau https | Pastikan ekspresi URL menghasilkan URL yang dimulai dengan http:// atauhttps://. | 
| URL melebihi 2.048 karakter setelah evaluasi ekspresi. | Mempersingkat URL. Pindahkan nilai parameter besar ke badan permintaan menggunakan metode POST. | 
| URL salah bentuk (bukan URI yang valid). | Periksa ekspresi untuk karakter yang hilang atau tambahan. Gunakan $encodeUrlComponent() untuk nilai parameter kueri yang mungkin berisi karakter khusus. | 

### `VALIDATION_ERROR`
<a name="monetization-functions-ts-validation-error"></a>

**Gejala:** Fungsi gagal dengan`errorType: "VALIDATION_ERROR"`. Kesalahan ini dapat terjadi pada waktu penulisan (ketika Anda membuat atau memperbarui fungsi) atau pada waktu eksekusi (ketika fungsi berjalan selama sesi).

**Kemungkinan penyebabnya:**


| Penyebab | Contoh | Perbaiki | 
| --- | --- | --- | 
| Kunci keluaran menargetkan namespace yang tidak dapat ditulis pada hook saat ini. | Menulis ke adsRequest.url dalam fungsi yang melekat padaPRE\_SESSION\_INITIALIZATION. | Periksa ruang nama keluaran mana yang diizinkan di hook siklus hidup Anda. PRE\_SESSION\_INITIALIZATIONhanya memungkinkanplayer\_params.\*. Pindahkan fungsi ke hook yang benar atau ubah tombol output. Lihat [Pengait siklus hidup](monetization-functions-hooks.md). | 
| Tombol keluaran menggunakan karakter yang tidak valid. | Kunci keluaran seperti player\_params.device type (dengan spasi). Hanya huruf, angka, garis bawah, dan tanda hubung yang diizinkan. | Ganti nama tombol output untuk hanya menggunakan karakter yang valid. Misalnya, gunakan player\_params.device\_type sebagai gantinya. | 
| Kunci keluaran tidak dimulai dengan awalan yang valid. | Kunci keluaran seperti custom.myValue bukannya player\_params.myValue atautemp.myValue. | Gunakan awalan keluaran yang valid:player\_params.\*,temp.\*, atauadsRequest.\*. | 
| Ekspresi Jsonata memiliki kesalahan sintaks. | Kutipan penutup yang hilang atau kondisional tidak lengkap:. {%session.id & %} | Tinjau ekspresi untuk tanda kutip yang hilang, tanda kurung yang tak tertandingi, atau operator yang tidak didukung seperti atau. ?? ?: | 
| Bidang wajib hilang dalam fungsi HTTP\_REQUEST. | Bidang URL kosong atau metode tidak ditentukan. | Pastikan kolom URL dan metode disetel. Metodenya harus GET atauPOST. | 
| URL yang dibuat oleh ekspresi tidak valid. | URL yang dievaluasi menggunakan skema yang tidak didukung sepertiftp://, melebihi 2.048 karakter, atau cacat. | Verifikasi ekspresi URL menghasilkan valid http:// atau https:// URL. Gunakan $encodeUrlComponent() untuk nilai parameter kueri yang mungkin berisi karakter khusus. | 
| Header HTTP berisi karakter yang tidak valid atau menggunakan nama terbatas. | Nilai header berisi jeda baris, atau nama header adalah host atautransfer-encoding. | Hapus karakter yang tidak valid dari nilai header. Hindari nama header terbatas. Lihat [HTTP\_REQUEST](monetization-functions-types-http-request.md) untuk batas header. | 

Periksa `cause` bidang dalam peristiwa log kesalahan - ini mengidentifikasi bidang atau ekspresi mana yang gagal validasi.

### `INTERNAL_ERROR`
<a name="monetization-functions-ts-internal-error"></a>

**Gejala:** Fungsi gagal dengan`errorType: "INTERNAL_ERROR"`.

**Penyebab:** Terjadi kegagalan infrastruktur yang tidak terkait dengan konfigurasi fungsi Anda.

**Perbaiki:** Coba lagi permintaan. Jika kesalahan berlanjut, hubungi AWS Support.