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
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
CloudWatch metrik
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
Log acara
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, lihatMemantau AWS Elemental MediaTailor dengan CloudWatch metrik Amazon.
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
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
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. |
| 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
Gejala: Fungsi gagal dengan errorType: "RESOURCE_LIMIT_ERROR" dancause: "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
Gejala: Fungsi gagal dengan errorType: "RESOURCE_LIMIT_ERROR" dancause: "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
Gejala: Fungsi gagal dengan errorType: "RESTRICTION_ERROR" dancause: "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 daftar lengkap 38 fungsi yang diizinkan.
Fungsi yang diizinkan yang umum digunakan meliputi $string$number,$substring,,$contains, dan$encodeUrlComponent.
RESTRICTION_ERROR: Ekspresi terlalu panjang
Gejala: Fungsi gagal untuk membuat atau memperbarui dengancause: "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
Gejala: Dalam output suatu HTTP_REQUEST fungsi, response.statusCode adalahnull.
Penyebab: API eksternal tidak dapat dijangkau, waktu koneksi habis, atau terjadi kesalahan jaringan. Ketika ini terjadi, MediaTailor tetapkan response.statusCode kenull, response.body kenull, 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
Gejala: response.statusCode adalah 200 tetapi response.body adalahnull.
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.textBidang 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
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
Gejala: Fungsi gagal denganerrorType: "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. |
| 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 untuk batas header. |
Periksa cause bidang dalam peristiwa log kesalahan - ini mengidentifikasi bidang atau ekspresi mana yang gagal validasi.
INTERNAL_ERROR
Gejala: Fungsi gagal denganerrorType: "INTERNAL_ERROR".
Penyebab: Terjadi kegagalan infrastruktur yang tidak terkait dengan konfigurasi fungsi Anda.
Perbaiki: Coba lagi permintaan. Jika kesalahan berlanjut, hubungi AWS Support.