Memantau Azure Functions dan Event Hubs

Azure Event Hubs
Azure Functions
Azure Monitor

Pemantauan memberikan wawasan tentang perilaku dan kesehatan sistem Anda, serta membantu membangun pandangan holistik tentang lingkungan, tren bersejarah, menghubungkan beragam faktor, dan mengukur perubahan performa, konsumsi, atau tingkat kesalahan.

Azure Functions menawarkan integrasi bawaan dengan Application Insights. Dari Application Insights, Anda bisa mendapatkan informasi seperti jumlah instans atau permintaan aplikasi fungsi dan dependensi telemetri fungsi. Saat bekerja dengan Functions dan Azure Event Hubs, Application Insights juga dapat melacak telemetri dependensi keluar ke pusat aktivitas, menghitung waktu yang dihabiskan dalam antrean dan menampilkan aliran end-to-end dari sistem yang terhubung melalui Event Hubs.

Bagian ini memperkenalkan fitur dan wawasan berguna yang bisa Anda dapatkan dari Application Insights untuk solusi Azure Event Hubs plus Functions Anda.

Peta Aplikasi

Peta Aplikasi menunjukkan bagaimana komponen dalam sistem saling berinteraksi. Karena telemetri dependensi yang disediakan Application Insights, ini memetakan aliran peristiwa antara Azure Functions dan Event Hubs, termasuk rata-rata setiap eksekusi fungsi dan rata-rata durasi suatu peristiwa di Azure Event Hubs, serta menampilkan transaksi yang mengandung kegagalan yang ditandai dengan warna merah.

Setelah mengirim beban yang diharapkan ke sistem Anda, Anda dapat masuk ke Application Insights di portal Azure, dan di bilah sisi, pilih di Peta Aplikasi. Berikut adalah peta yang menunjukkan tiga fungsi, tiga pusat aktivitas, dan kegagalan nyata saat menulis ke database hilir:

Peta Aplikasi

Detail transaksi end-to-end

Detail transaksi end-to-end menunjukkan bagaimana komponen sistem Anda saling berinteraksi, dalam urutan kronologis. Tampilan ini juga menunjukkan berapa lama peristiwa dihabiskan dalam antrean. Anda juga dapat menelusuri telemetri setiap komponen dari tampilan ini, yang membuatnya lebih mudah untuk memecahkan masalah di seluruh komponen dalam permintaan yang sama ketika terjadi masalah.

Transaksi End-to-End

Metrik dan telemetri platform

Metrik yang dihasilkan platform di Azure Monitor untuk Event Hubs dan Azure Functions dapat digunakan untuk pemantauan keseluruhan perilaku dan kesehatan solusi:

Azure Functions terintegrasi dengan Application Insights untuk memberikan telemetri dan wawasan tingkat lanjut serta terperinci ke dalam host Functions dan eksekusi fungsi. Untuk mempelajari selengkapnya, lihat Menganalisis telemetri Azure Functions dalam Application Insights. Saat menggunakan Application Insights untuk memantau topologi, ada berbagai konfigurasi yang tersedia. Untuk mempelajari selengkapnya, lihat Cara mengonfigurasi pemantauan untuk Azure Functions.

Berikut ini adalah contoh telemetri ekstra untuk fungsi yang dipicu Azure Event Hubs yang dihasilkan dalam tabel jejak:

Trigger Details: PartionId: 6, Offset: 3985758552064-3985758624640, EnqueueTimeUtc: 2022-10-31T12:51:58.1750000+00:00-2022-10-31T12:52:03.8160000+00:00, SequenceNumber: 3712266-3712275, Count: 10

Informasi ini mengharuskan Anda menggunakan ekstensi Event Hubs 4.2.0 atau versi yang lebih baru. Data ini sangat berguna karena berisi informasi tentang pesan yang memicu eksekusi fungsi dan dapat digunakan untuk kueri dan wawasan. Ini termasuk data berikut untuk setiap kali fungsi dipicu:

  • ID partisi (6)
  • Rentang offset partisi (3985758552064-3985758624640)
  • Rentang Waktu Antrean dalam UTC (2022-10-31T12:51:58.1750000+00:00-2022-10-31T12:52:03.8160000+00:00)
  • Rentang nomor urut 3712266-3712275
  • Dan jumlah pesan (10)

Lihat bagian Contoh kueri Application Insights untuk contoh tentang cara menggunakan telemetri ini.

Telemetri kustom juga dimungkinkan untuk bahasa lain (pustaka kelas C#, C# Isolated, C# Script, JavaScript, Java, PowerShell, dan Python). Pengelogan ini muncul di tabel jejak di Application Insights. Anda dapat membuat entri Anda sendiri ke dalam Application Insights dan menambahkan dimensi kustom yang dapat digunakan untuk mengkueri data dan membuat dasbor kustom.

Terakhir, ketika aplikasi fungsi Anda terhubung ke pusat aktivitas menggunakan pengikatan output, entri juga ditulis ke tabel Dependensi Application Insights.

Tabel dependensi

Untuk Azure Event Hubs, korelasi diinjeksikan ke dalam payload peristiwa, dan Anda melihat properti Diagnostic-Id dalam peristiwa:

Properti Id Diagnostik

Ini mengikuti format Konteks Pelacakan W3C yang juga digunakan sebagai Id Operasi dan Tautan Operasi dalam telemetri yang dibuat oleh Functions, yang memungkinkan Application Insights untuk membangun korelasi antara peristiwa hub peristiwa dan eksekusi fungsi, bahkan ketika didistribusikan.

Korelasi Peristiwa Batch

Contoh kueri Application Insights

Di bawah ini adalah daftar kueri Application Insights yang bermanfaat saat memantau Event Hubs dengan Azure Functions. Kueri ini menampilkan informasi terperinci untuk fungsi yang dipicu pusat aktivitas menggunakan telemetri yang dipancarkan oleh ekstensi Event Hubs 4.2.0 dan yang lebih baru.

Ketika pengambilan sampel diaktifkan di Application Insights, mungkin ada celah dalam data.

Informasi pemrosesan peristiwa terperinci

Data hanya dipancarkan dalam format yang benar ketika pengiriman batch digunakan. Pengiriman batch berarti bahwa fungsi menerima beberapa peristiwa untuk setiap eksekusi, yang direkomendasikan untuk performa. Perhatikan pertimbangan berikut:

  • Nilai dispatchTimeMilliseconds tersebut mendekati lamanya waktu antara kapan peristiwa ditulis ke pusat aktivitas dan kapan ini diambil oleh aplikasi fungsi untuk diproses.
  • dispatchTimeMilliseconds dapat negatif atau tidak akurat karena penyimpangan jam antara server pusat aktivitas dan aplikasi fungsi.
  • Partisi Azure Event Hubs diproses secara berurutan. Pesan tidak akan dikirim ke kode fungsi untuk diproses sampai semua pesan sebelumnya telah diproses. Pantau waktu eksekusi fungsi Anda karena waktu eksekusi yang lebih lama akan menyebabkan penundaan pengiriman.
  • Perhitungan menggunakan enqueueTime pesan pertama dalam batch. Waktu pengiriman mungkin lebih rendah untuk pesan lain dalam batch.
  • dispatchTimeMilliseconds didasarkan pada titik waktu.
  • Nomor urut adalah per-partisi, dan pemrosesan duplikat dapat terjadi karena Azure Event Hubs tidak menjamin pengiriman pesan tepat satu kali.
traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| project timestamp, cloud_RoleInstance, operation_Name, processId =
customDimensions.ProcessId, partitionId, messageCount, sequenceNumberStart,
sequenceNumberEnd, enqueueTimeStart, enqueueTimeEnd, dispatchTimeMilliseconds

Pemrosesan Peristiwa Terperinci

Visualisasi latensi pengiriman

Kueri ini memvisualisasikan latensi pengiriman peristiwa persentil ke-50 dan ke-90 untuk fungsi yang dipicu pusat aktivitas tertentu. Lihat kueri di atas untuk detail dan catatan selengkapnya.

traces
| where operation_Name == "<ENTER THE NAME OF YOUR FUNCTION HERE>"
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize percentiles(dispatchTimeMilliseconds, 50, 90) by bin(timestamp, 5m)
| render timechart

Visualisasi Latensi pengiriman

Ringkasan latensi pengiriman

Kueri ini mirip dengan yang di atas, tetapi menampilkan tampilan ringkasan.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize messageCount = sum(messageCount),
percentiles(dispatchTimeMilliseconds, 50, 90, 99, 99.9, 99.99) by operation_Name

Ringkasan Latensi pengiriman

Distribusi pesan di seluruh partisi

Kueri ini menunjukkan cara memvisualisasikan distribusi pesan di seluruh partisi.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

Distribusi pesan di seluruh partisi

Distribusi pesan di seluruh instans

Kueri ini menunjukkan cara memvisualisasikan distribusi pesan di seluruh instans.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

Distribusi pesan di seluruh instans

Instans Eksekusi dan Instans yang Dialokasikan

Kueri ini menunjukkan cara memvisualisasikan jumlah instans Azure Functions yang memproses peristiwa dari Event Hubs, dan jumlah total instans (pemrosesan dan menunggu sewa). Sebagian besar waktu instans tersebut harus sama.

traces
| where message startswith "Trigger Details: Parti"
| summarize type = "Executing Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
| union (
    traces
    | summarize type = "Allocated Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
)
| project timestamp, type, Count
| render timechart

Instans Eksekusi dan Instans yang Dialokasikan

Semua Telemetri untuk Eksekusi Fungsi tertentu

Bidang operation_Id dapat digunakan di berbagai tabel di Application Insights. Untuk Event Hubs yang dipicu Azure Functions, kueri berikut misalnya akan menghasilkan informasi pemicu, telemetri dari log di dalam kode Fungsi, serta dependensi dan pengecualian:

union isfuzzy=true requests, exceptions, traces, dependencies
| where * has "<ENTER THE OPERATION_ID OF YOUR FUNCTION EXECUTION HERE>"
| order by timestamp asc

Semua Telemetri untuk Eksekusi Fungsi tertentu

Latensi End-to-End untuk Peristiwa

Karena properti enqueueTimeUtc dalam jejak detail pemicu menunjukkan waktu masuk antrean peristiwa pertama saja dari setiap batch yang diproses fungsi, kueri yang lebih canggih dapat digunakan untuk menghitung latensi peristiwa end-to-end di antara dua fungsi dengan Azure Event Hubs di antaranya. Kueri ini akan memperluas tautan operasi (jika ada) dalam permintaan fungsi kedua dan memetakan waktu berakhirnya ke ID operasi terkait yang sama dari waktu mulai fungsi pertama.

let start = view(){
requests
| where operation_Name == "FirstFunction"
| project start_t = timestamp, first_operation_Id = operation_Id
};
let link = view(){
requests
| where operation_Name == "SecondFunction"
| mv-expand ex = parse_json(tostring(customDimensions["_MS.links"]))
| extend parent = case(isnotempty(ex.operation_Id), ex.operation_Id, operation_Id )
| project first_operation_Id = parent, second_operation_Id = operation_Id
};
let finish = view(){
traces
| where customDimensions["EventName"] == "FunctionCompleted" and operation_Name
== "SecondFunction"
| project end_t = timestamp, second_operation_Id = operation_Id
};
start
| join kind=inner (
link
| join kind=inner finish on second_operation_Id
) on first_operation_Id
| project start_t, end_t, first_operation_Id, second_operation_Id
| summarize avg(datetime_diff('second', end_t, start_t))

Latensi End-to-End untuk Peristiwa

Kontributor

Artikel ini dikelola oleh Microsoft. Awalnya ditulis oleh kontributor berikut.

Penulis utama:

Untuk melihat profil LinkedIn non-publik, masuk ke LinkedIn.

Langkah berikutnya

Untuk mempelajari selengkapnya, pertimbangkan untuk mengulas artikel terkait ini: