View a markdown version of this page

Pemecahan masalah dan pemantauan Fungsi - AWS Elemental MediaTailor

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:

MetrikDeskripsiDimensi
PreSessionInitHook.InvocationsHitungan eksekusi hookConfigurationName
PreSessionInitHook.ErrorsHitungan kesalahan kaitConfigurationName
PreSessionInitHook.LatencyWaktu eksekusi hook (ms)ConfigurationName
PreAdsRequestHook.InvocationsHitungan eksekusi hookConfigurationName
PreAdsRequestHook.ErrorsHitungan kesalahan kaitConfigurationName
PreAdsRequestHook.LatencyWaktu eksekusi hook (ms)ConfigurationName

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

MetrikDeskripsiDimensi
Function.InvocationsHitungan eksekusi fungsiConfigurationName, FunctionId, FunctionType, HookType
Function.ErrorsHitungan kesalahan fungsiConfigurationName, FunctionId, FunctionType, HookType
Function.LatencyWaktu 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 peristiwaDefault/ Opt-inGrup logDeskripsi
PRE_SESSION_INIT_HOOK_SUMMARYOpt-inLog ManifesRingkasan eksekusi hook (success/error)
PRE_SESSION_INIT_HOOK_ERRORDefaultLog ManifesKegagalan kait dengan ErrorType dan penyebabnya
PRE_SESSION_INIT_FUNCTION_COMPLETEDOpt-inLog ManifesFungsi individu dilengkapi dengan input/output
PRE_SESSION_INIT_FUNCTION_ERRORDefaultLog ManifesKegagalan fungsi individu
PRE_ADS_REQUEST_HOOK_SUMMARYOpt-inLog Interaksi ADSRingkasan eksekusi hook (success/error)
PRE_ADS_REQUEST_HOOK_ERRORDefaultLog Interaksi ADSKegagalan kait dengan ErrorType dan penyebabnya
PRE_ADS_REQUEST_FUNCTION_COMPLETEDOpt-inLog Interaksi ADSFungsi individu dilengkapi dengan input/output
PRE_ADS_REQUEST_FUNCTION_ERRORDefaultLog Interaksi ADSKegagalan 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 kesalahanDeskripsi
SYNTAX_ERROREkspresi gagal dikompilasi atau mengalami kesalahan tipe runtime
RESOURCE_LIMIT_ERROREkspresi melebihi batas waktu CPU, memori, atau kedalaman tumpukan
RESTRICTION_ERROREkspresi menggunakan fungsi yang diblokir, atau batas ukuran muatan masukan terlampaui
TIMEOUT_ERROREksekusi fungsi melebihi batas waktunya
VALIDATION_ERRORJalur keluaran menargetkan bidang yang tidak dapat ditulis dalam lingkup hook saat ini
INTERNAL_ERRORKegagalan 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:

PenyebabCara mengidentifikasiPerbaiki
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:

PenyebabPerbaiki
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:

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