API Log Lambda - AWS Lambda

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

API Log Lambda

penting

API Telemetri Lambda menggantikan API Lambda Logs. Meskipun API Log tetap berfungsi penuh, kami sarankan hanya menggunakan API Telemetri ke depannya. Anda dapat berlangganan ekstensi Anda ke aliran telemetri menggunakan API Telemetri atau API Log. Setelah berlangganan menggunakan salah satu API ini, setiap upaya untuk berlangganan menggunakan API lain menghasilkan kesalahan.

Lambda secara otomatis menangkap log runtime dan mengalirkannya ke Amazon. CloudWatch Aliran log ini berisi log yang dibuat oleh kode fungsi dan ekstensi Anda, dan juga log yang dibuat oleh Lambda sebagai bagian dari invokasi fungsi.

Ekstensi Lambda dapat menggunakan API Lambda Runtime Logs untuk berlangganan aliran log langsung dari lingkungan eksekusi Lambda. Lambda mengalirkan log ke ekstensi, dan ekstensi kemudian dapat memproses, memfilter, dan mengirim log ke tujuan yang diinginkan.

API Ekstensi dan Logs API terhubung ke Lambda dan ekstensi eksternal.

API Log memungkinkan ekstensi untuk berlangganan ke tiga aliran log yang berbeda:

  • Log fungsi yang dibuat oleh fungsi Lambda dan ditulis ke stdout atau stderr.

  • Log ekstensi yang dibuat kode ekstensi.

  • Log platform Lambda, yang mencatat peristiwa dan kesalahan yang terkait dengan invokasi dan ekstensi.

catatan

Lambda mengirimkan semua log ke CloudWatch, bahkan ketika ekstensi berlangganan ke satu atau beberapa aliran log.

Berlangganan untuk menerima log

Ekstensi Lambda dapat berlangganan untuk menerima log dengan mengirim permintaan langganan ke API Log.

Untuk berlangganan guna menerima log, Anda memerlukan pengidentifikasi ekstensi (Lambda-Extension-Identifier). Pertama, daftarkan ekstensi untuk menerima pengidentifikasi ekstensi. Kemudian berlangganan API Log selama inisialisasi. Setelah fase inisialisasi selesai, Lambda tidak memproses permintaan langganan.

catatan

Berlangganan Log API adalah idempoten. Permintaan berlangganan duplikat tidak menghasilkan langganan duplikat.

Penggunaan memori

Penggunaan memori meningkat secara linear seiring bertambahnya jumlah pelanggan. Langganan menghabiskan sumber daya memori karena setiap langganan membuka buffer memori baru untuk menyimpan log. Untuk membantu mengoptimalkan penggunaan memori, Anda dapat menyesuaikan konfigurasi buffering. Penggunaan memori buffer dihitung untuk konsumsi memori keseluruhan dalam lingkungan eksekusi.

Protokol tujuan

Anda dapat memilih salah satu protokol berikut untuk menerima log:

  1. HTTP (disarankan) – Lambda mengirimkan log ke titik akhir HTTP lokal (http://sandbox.localdomain:${PORT}/${PATH}) sebagai array catatan dalam format JSON. Parameter $PATH bersifat opsional. Perhatikan bahwa hanya HTTP yang didukung, bukan HTTPS. Anda dapat memilih untuk menerima log melalui PUT atau POST.

  2. TCP – Lambda mengirimkan log ke port TCP dalam format JSON berbatas baris baru (NDJSON).

Kami menyarankan Anda untuk menggunakan HTTP alih-alih TCP. Dengan TCP, platform Lambda tidak dapat mengakui bahwa log dikirimkan ke lapisan aplikasi. Oleh karena itu, Anda mungkin kehilangan log jika ekstensi Anda mengalami crash. HTTP tidak berbagi batasan ini.

Kami juga menyarankan Anda untuk mengatur pendengar HTTP lokal atau port TCP sebelum berlangganan untuk menerima log. Selama penyetelan, perhatikan hal berikut ini:

  • Lambda hanya mengirimkan log ke tujuan yang berada di lingkungan eksekusi.

  • Lambda mengulang upaya untuk mengirim log (dengan pemunduran) jika tidak ada pendengar, atau jika permintaan POST atau PUT mengakibatkan kesalahan. Jika pelanggan log mengalami crahs, pelanggam terus menerima log setelah Lambda memulai ulang lingkungan eksekusi.

  • Lambda mencadangkan port 9001. Tidak ada pembatasan atau rekomendasi nomor port lainnya.

Konfigurasi buffering

Lambda dapat mem-buffer log dan mengirimkannya kepada pelanggan. Anda dapat mengonfigurasi perilaku ini dalam permintaan langganan dengan menentukan bidang opsional berikut. Perhatikan bahwa Lambda menggunakan nilai default untuk setiap bidang yang tidak Anda tentukan.

  • timeoutMs – Waktu maksimum (dalam milidetik) untuk mem-buffer batch. Default: 1.000. Minimum: 25. Maksimum: 30.000.

  • maxBytes – Ukuran maksimum (dalam byte) log untuk buffer dalam memori. Default: 262.144. Minimum: 262.144. Maksimum: 1.048.576.

  • maxItems – Jumlah maksimum peristiwa untuk buffer dalam memori. Default: 10.000. Minimum: 1.000. Maksimum: 10.000.

Selama konfigurasi buffering, perhatikan poin-poin berikut:

  • Lambda membilas log jika salah satu aliran input tertutup, misalnya, jika waktu pengoperasian macet.

  • Setiap pelanggan dapat menentukan konfigurasi buffering yang berbeda dalam permintaan langganan.

  • Pertimbangkan ukuran buffer yang Anda butuhkan untuk membaca data. Perkirakan penerimaan muatan sebesar 2*maxBytes+metadata, dengan maxBytes dikonfigurasi dalam permintaan berlangganan. Misalnya, Lambda menambahkan byte metadata berikut ke setiap catatan:

    { "time": "2020-08-20T12:31:32.123Z", "type": "function", "record": "Hello World" }
  • Jika pelanggan tidak dapat memproses log masuk dengan cukup cepat, Lambda mungkin akan menanggalkan log untuk menjaga pemanfaatan memori tetap terikat. Untuk menunjukkan jumlah catatan yang dihapus, Lambda mengirimkan log platform.logsDropped.

Contoh berlangganan

Contoh berikut menunjukkan permintaan untuk berlangganan ke platform dan log fungsi.

PUT http://${AWS_LAMBDA_RUNTIME_API}/2020-08-15/logs HTTP/1.1 { "schemaVersion": "2020-08-15", "types": [ "platform", "function" ], "buffering": { "maxItems": 1000, "maxBytes": 262144, "timeoutMs": 100 }, "destination": { "protocol": "HTTP", "URI": "http://sandbox.localdomain:8080/lambda_logs" } }

Jika permintaan berhasil, pelanggan akan menerima respons keberhasilan HTTP 200.

HTTP/1.1 200 OK "OK"

Kode sampel untuk API Log

Untuk kode sampel yang menunjukkan cara mengirim log ke tujuan kustom, lihat Menggunakan ekstensi AWS Lambda untuk mengirim log ke tujuan kustom pada Blog AWSCompute.

Untuk contoh kode Python dan Go yang menunjukkan cara mengembangkan ekstensi Lambda dasar dan berlangganan API Log, lihat AWS LambdaEkstensi pada repositori Sampel. AWS GitHub Untuk informasi lebih lanjut tentang membangun ekstensi Lambda, lihat Menggunakan Lambda Extensions API untuk membuat ekstensi.

Referensi API Log

Anda dapat mengambil titik akhir API Log dari variabel lingkungan AWS_LAMBDA_RUNTIME_API. Untuk mengirim permintaan API, gunakan prefiks 2020-08-15/ sebelum jalur API. Sebagai contoh:

http://${AWS_LAMBDA_RUNTIME_API}/2020-08-15/logs

Spesifikasi OpenAPI untuk Logs API versi 2020-08-15 tersedia di sini: .zip logs-api-request

Langganan

Untuk berlangganan satu atau beberapa aliran log yang tersedia di lingkungan eksekusi Lambda, ekstensi akan mengirim permintaan API Berlangganan.

Jalur/logs

MetodePUT

Parameter tubuh

destination – Lihat Protokol tujuan. Wajib: ya. Jenis: string.

buffering – Lihat Konfigurasi buffering. Wajib: tidak. Jenis: string.

types – Array jenis log yang akan diterima. Wajib: ya. Jenis: array string. Nilai valid: "platform", "function", "extension".

schemaVersion – Wajib: tidak. Nilai default: "2020-08-15". Atur ke "2021-03-18" untuk ekstensi untuk menerima pesan platform.runtimeDone.

Parameter respons

Spesifikasi OpenAPI untuk respons langganan versi 2020-08-15 tersedia untuk protokol HTTP dan TCP:

Kode respons
  • 200 – Permintaan berhasil diselesaikan

  • 202 – Permintaan diterima. Respons terhadap permintaan berlangganan selama pengujian lokal.

  • 4XX – Permintaan Buruk

  • 500 – Kesalahan Layanan

Jika permintaan berhasil, pelanggan akan menerima respons keberhasilan HTTP 200.

HTTP/1.1 200 OK "OK"

Jika permintaan gagal, pelanggan akan menerima respons kesalahan. Sebagai contoh:

HTTP/1.1 400 OK { "errorType": "Logs.ValidationError", "errorMessage": URI port is not provided; types should not be empty" }

Log pesan

API Log memungkinkan ekstensi untuk berlangganan ke tiga aliran log yang berbeda:

  • Fungsi –Log dibuat oleh fungsi Lambda dan menulis ke stdout atau stderr.

  • Ekstenso – Log yang dibuat kode ekstensi.

  • Platform –Log yang dibuat platform runtime, yang mencatat peristiwa dan kesalahan yang terkait dengan invokasi dan ekstensi.

Log fungsi

Fungsi Lambda dan ekstensi internal yang menghasilkan log fungsi dan menuliskannya ke stdout atau stderr.

Contoh berikut menunjukkan format pesan log fungsi. { "time": "2020-08-20T12:31:32.123Z", "type": "function", "record": "ERROR encountered. Stack trace:\n\my-function (line 10)\n" }

Log ekstensi:

Ekstensi dapat menghasilkan log ekstensi. Format log sama seperti untuk log fungsi.

Log platform

Lambda menghasilkan pesan log untuk peristiwa platform seperti platform.start, platform.end, dan platform.fault.

Atau, Anda dapat berlangganan ke versi 2021-03-18skema API Log, yang mencakup pesan log platform.runtimeDone.

Contoh pesan log platform

Contoh berikut menunjukkan log awal platform dan akhir platform. Log ini menunjukkan waktu mulai invokasi dan waktu berakhir invokasi untuk pemanggilan yang ditentukan oleh requestId.

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.start", "record": {"requestId": "6f7f0961f83442118a7af6fe80b88d56"} } { "time": "2020-08-20T12:31:32.123Z", "type": "platform.end", "record": {"requestId": "6f7f0961f83442118a7af6fe80b88d56"} }

Platform. initRuntimeDonepesan log menunjukkan status Runtime init sub-fase, yang merupakan bagian dari fase lifecyle Init. Runtime initKapan berhasil, runtime mengirimkan permintaan API /next runtime (untuk tipe on-demand dan provisioned-concurrency inisialisasi) atau restore/next (untuk tipe snap-start inisialisasi). Contoh berikut menunjukkan platform yang sukses. initRuntimeDonepesan log untuk jenis snap-start inisialisasi.

{ "time":"2022-07-17T18:41:57.083Z", "type":"platform.initRuntimeDone", "record":{ "initializationType":"snap-start", "status":"success" } }

Pesan log Platform.initReport menunjukkan berapa lama Init fase berlangsung dan berapa milidetik Anda ditagih selama fase ini. Ketika jenis inisialisasiprovisioned-concurrency, Lambda mengirimkan pesan ini selama pemanggilan. Saat jenis inisialisasisnap-start, Lambda mengirimkan pesan ini setelah memulihkan snapshot. Contoh berikut menunjukkan pesan log Platform.initReport untuk jenis inisialisasi. snap-start

{ "time":"2022-07-17T18:41:57.083Z", "type":"platform.initReport", "record":{ "initializationType":"snap-start", "metrics":{ "durationMs":731.79, "billedDurationMs":732 } } }

Log laporan platform menyertakan metrik tentang invokasi yang ditentukan oleh requestId. Bidang initDurationMs termasuk dalam log hanya jika invokasi termasuk mulai awal. Jika pelacakan AWS X-Ray aktif, log mencakup metadata X-Ray. Contoh berikut menunjukkan log laporan platform untuk invokasi yang mencakup mulai awal.

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.report", "record": {"requestId": "6f7f0961f83442118a7af6fe80b88d56", "metrics": {"durationMs": 101.51, "billedDurationMs": 300, "memorySizeMB": 512, "maxMemoryUsedMB": 33, "initDurationMs": 116.67 } } }

Log kesalahan platform menangkap waktu pengoperasian atau kesalahan lingkungan eksekusi. Contoh berikut ini menunjukkan pesan log kesalahan platform.

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.fault", "record": "RequestId: d783b35e-a91d-4251-af17-035953428a2c Process exited before completing request" }

Lambda membuat log ekstensi platform ketika ekstensi mendaftar dengan API ekstensi. Contoh berikut ini menunjukkan pesan ekstensi platform.

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.extension", "record": {"name": "Foo.bar", "state": "Ready", "events": ["INVOKE", "SHUTDOWN"] } }

Lambda menghasilkan log langganan log platform saat ekstensi berlangganan API log. Contoh berikut menunjukkan pesan langganan Log.

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.logsSubscription", "record": {"name": "Foo.bar", "state": "Subscribed", "types": ["function", "platform"], } }

Lambda menghasilkan log yang dihapus log platform ketika ekstensi tidak dapat memproses jumlah log yang diterimanya. Contoh berikut menunjukkan pesan log platform.logsDropped.

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.logsDropped", "record": {"reason": "Consumer seems to have fallen behind as it has not acknowledged receipt of logs.", "droppedRecords": 123, "droppedBytes" 12345 } }

Pesan log Platform.RestoRestart menunjukkan waktu Restore fase dimulai (snap-starthanya jenis inisialisasi). Contoh:

{ "time":"2022-07-17T18:43:44.782Z", "type":"platform.restoreStart", "record":{} }

Pesan log Platform.RestoreReport menunjukkan berapa lama Restore fase berlangsung dan berapa milidetik Anda ditagih selama fase ini (hanya jenis inisialisasi). snap-start Contoh:

{ "time":"2022-07-17T18:43:45.936Z", "type":"platform.restoreReport", "record":{ "metrics":{ "durationMs":70.87, "billedDurationMs":13 } } }

Pesan runtimeDone platform

Jika Anda mengatur versi skema ke "2021-03-18" dalam permintaan berlangganan, Lambda mengirimkan pesan platform.runtimeDonesetelah fungsi invokasi selesai baik berhasil maupun dengan kesalahan. Ekstensi dapat menggunakan pesan ini untuk menghentikan semua kumpulan telemetri untuk fungsi invokasi ini.

Spesifikasi OpenAPI untuk tipe peristiwa Log dalam versi skema 2021-03-18 tersedia di sini: schema-2021-03-18.zip

Lambda menghasilkan pesan log platform.runtimeDone ketika runtime mengirimkan permintaan API runtime Next atau Error. Log platform.runtimeDone memberi tahu konsumen API Log bahwa fungsi invokasi selesai. Ekstensi dapat menggunakan informasi ini untuk memutuskan kapan harus mengirim semua telemetri yang dikumpulkan selama invokasi tersebut.

Contoh-contoh

Lambda mengirimkan pesan platform.runtimeDone setelah runtime mengirimkan permintaan NEXT ketika fungsi invokasi selesai. Contoh berikut menunjukkan pesan untuk masing-masing nilai status: sukses, kegagalan, dan waktu habis.

contoh Contoh pesan sukses
{ "time": "2021-02-04T20:00:05.123Z", "type": "platform.runtimeDone", "record": { "requestId":"6f7f0961f83442118a7af6fe80b88", "status": "success" } }
contoh Contoh pesan kegagalan
{ "time": "2021-02-04T20:00:05.123Z", "type": "platform.runtimeDone", "record": { "requestId":"6f7f0961f83442118a7af6fe80b88", "status": "failure" } }
contoh Contoh pesan waktu habis
{ "time": "2021-02-04T20:00:05.123Z", "type": "platform.runtimeDone", "record": { "requestId":"6f7f0961f83442118a7af6fe80b88", "status": "timeout" } }
contoh Contoh platform. restoreRuntimeDone pesan (hanya jenis snap-start inisialisasi)

Platform. restoreRuntimeDonepesan log menunjukkan apakah Restore fase berhasil atau tidak. Lambda mengirimkan pesan ini saat runtime mengirimkan permintaan API restore/next runtime. Ada tiga kemungkinan status: sukses, gagal, dan batas waktu. Contoh berikut menunjukkan platform yang sukses. restoreRuntimeDonepesan log.

{ "time":"2022-07-17T18:43:45.936Z", "type":"platform.restoreRuntimeDone", "record":{ "status":"success" } }