Menggunakan Log Lambda API - AWS Lambda

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

Menggunakan Log Lambda API

penting

Telemetri Lambda menggantikan Lambda API Log. API Meskipun Log API tetap berfungsi penuh, kami sarankan hanya menggunakan Telemetri API ke depan. Anda dapat berlangganan ekstensi Anda ke aliran telemetri menggunakan Telemetri API atau Log. API Setelah berlangganan menggunakan salah satu dari iniAPIs, setiap upaya untuk berlangganan menggunakan yang lain API mengembalikan 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 Lambda Runtime Logs API untuk berlangganan streaming log langsung dari dalam lingkungan eksekusi Lambda. Lambda mengalirkan log ke ekstensi, dan ekstensi kemudian dapat memproses, memfilter, dan mengirim log ke tujuan yang diinginkan.

Ekstensi API dan Log API menghubungkan Lambda dan ekstensi eksternal.

Log API memungkinkan ekstensi untuk berlangganan 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 mengirimkan permintaan berlangganan ke Log. API

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

catatan

APILangganan log 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 HTTP titik akhir lokal (http://sandbox.localdomain:${PORT}/${PATH}) sebagai larik catatan dalam format. JSON Parameter $PATH bersifat opsional. Perhatikan bahwa hanya HTTP didukung, tidakHTTPS. Anda dapat memilih untuk menerima log melalui PUT atauPOST.

  2. TCP— Lambda mengirimkan log ke TCP port dalam format Newline JSON delimited (). NDJSON

Kami merekomendasikan menggunakan HTTP daripadaTCP. DenganTCP, platform Lambda tidak dapat mengakui kapan mengirimkan log ke lapisan aplikasi. Oleh karena itu, Anda mungkin kehilangan log jika ekstensi Anda mengalami crash. HTTPtidak berbagi batasan ini.

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

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

  • Lambda mencoba kembali upaya untuk mengirim log (dengan backoff) jika tidak ada pendengar, atau jika permintaan atau menghasilkan kesalahanPOST. PUT 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 buffer batch. Default: 1.000. Minimum: 25. Maksimum: 30.000.

  • maxBytes— Ukuran maksimum (dalam byte) dari 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. Untuk informasi selengkapnya, lihat Lambda: Tidak semua log fungsi saya muncul.

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 menerima respons sukses HTTP 200.

HTTP/1.1 200 OK "OK"

Contoh kode untuk Log API

Untuk kode contoh yang menunjukkan cara mengirim log ke tujuan kustom, lihat Menggunakan AWS Lambda ekstensi untuk mengirim log ke tujuan khusus di Blog AWS Komputasi.

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

APIReferensi log

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

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

APISpesifikasi Terbuka untuk API versi Log 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 mengirimkan permintaan BerlanggananAPI.

Jalur/logs

Metode - PUT

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

APISpesifikasi Terbuka untuk respons langganan versi 2020-08-15 tersedia untuk HTTP dan TCP protokol:

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 menerima respons sukses 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

Log API memungkinkan ekstensi untuk berlangganan 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-20T 12:31:32.123 Z”, “type”: “function”, “record”: "ditemui. ERROR 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.

Secara opsional, Anda dapat berlangganan API skema Log versi 2021-03-18, yang menyertakan pesan log. platform.runtimeDone

Contoh pesan log platform

Contoh berikut menunjukkan log awal platform dan akhir platform. Log ini menunjukkan waktu mulai pemanggilan dan waktu akhir pemanggilan untuk pemanggilan yang ditentukan. 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 API permintaan /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" } }

Platform. initReportpesan log 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 platform. initReportpesan log untuk jenis snap-start inisialisasi.

{ "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 pemanggilan yang ditentukan. 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" }
catatan

AWS saat ini menerapkan perubahan pada layanan Lambda. Karena perubahan ini, Anda mungkin melihat perbedaan kecil antara struktur dan konten pesan log sistem dan segmen jejak yang dipancarkan oleh fungsi Lambda yang berbeda di Anda. Akun AWS

Salah satu output log yang terpengaruh oleh perubahan ini adalah "record" bidang log kesalahan platform. Contoh berikut menunjukkan "record" bidang ilustrasi dalam format lama dan baru. Gaya baru log kesalahan berisi pesan yang lebih ringkas

Perubahan ini akan diterapkan selama beberapa minggu mendatang, dan semua fungsi di semua Wilayah AWS kecuali China dan GovCloud wilayah akan bertransisi untuk menggunakan pesan log format baru dan segmen pelacakan.

contoh catatan log kesalahan platform (gaya lama)
"record":"RequestId: ...\tError: Runtime exited with error: exit status 255\nRuntime.ExitError"
contoh catatan log kesalahan platform (gaya baru)
"record":"RequestId: ... Status: error\tErrorType: Runtime.ExitError"

Lambda menghasilkan log ekstensi platform saat ekstensi mendaftar dengan ekstensi. API 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 log. API 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 } }

Platform. restoreStartpesan log menunjukkan waktu Restore fase dimulai (hanya jenis snap-start inisialisasi). Contoh:

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

Platform. restoreReportpesan log menunjukkan berapa lama Restore fase berlangsung dan berapa milidetik Anda ditagih selama fase ini (hanya jenis snap-start inisialisasi). 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.

APISpesifikasi Terbuka untuk jenis peristiwa Log dalam skema versi 2021-03-18 tersedia di sini: schema-2021-03-18.zip

Lambda menghasilkan pesan platform.runtimeDone log saat runtime mengirim permintaan Next atau Error runtime. API platform.runtimeDoneLog menginformasikan konsumen tentang Log API bahwa pemanggilan fungsi selesai. Ekstensi dapat menggunakan informasi ini untuk memutuskan kapan harus mengirim semua telemetri yang dikumpulkan selama invokasi tersebut.

Contoh

Lambda mengirimkan platform.runtimeDone pesan setelah runtime mengirimkan NEXT permintaan saat pemanggilan fungsi 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 runtime. restore/next API 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" } }