Pengujian Beban Azure dengan plugin kustom untuk Azure Event Hubs dan IoT Hub

Ide solusi

Artikel ini menjelaskan ide solusi. Arsitek cloud Anda dapat menggunakan panduan ini untuk membantu memvisualisasikan komponen utama untuk implementasi umum arsitektur ini. Gunakan artikel ini sebagai titik awal untuk merancang solusi yang dirancang dengan baik yang selaras dengan persyaratan spesifik beban kerja Anda.

Solusi ini menyediakan panduan tentang cara menggunakan Azure Load Testing, layanan yang memungkinkan Anda menjalankan skrip Apache JMeter dan plugin kustom untuk mensimulasikan perilaku pengguna dan perangkat. Solusi ini juga menjelaskan cara merancang indikator performa utama (KPI) dan mengembangkan dasbor untuk memantau dan menganalisis hasil pengujian beban dalam aplikasi sampel dengan Azure Functions dan Azure Event Hubs. Contoh ini menggunakan Azure Event Hubs, tetapi Anda dapat menerapkan pendekatan yang sama ke Azure IoT Hub dengan mengubah klien Azure Event Hubs ke klien IoT Hub. Artikel ini mengasumsikan bahwa Anda memiliki keakraban dengan JMeter, plugin dan plugin kustomnya, serta Functions dan Event Hubs.

IoT Hub berisi lebih banyak komponen inti daripada Azure Event Hubs, termasuk partisi. Oleh karena itu pendekatan pengujian beban yang dijelaskan dalam artikel ini juga berlaku untuk IoT Hub dengan perubahan minimal.

Arsitektur

Untuk melakukan pengujian beban, Anda memerlukan rencana pengujian, yang merupakan serangkaian instruksi yang memberi tahu JMeter apa yang harus dilakukan selama pengujian. Paket pengujian dapat mencakup beberapa skenario pengujian, dan setiap skenario dapat memiliki pengaturan dan konfigurasi yang berbeda. Misalnya, Anda mungkin memiliki satu skenario yang mensimulasikan satu pengguna yang mengakses aplikasi web dan skenario lain yang mensimulasikan beberapa pengguna secara bersamaan mengakses aplikasi yang sama.

Diagram arsitektur sampel untuk pengujian beban.

Unduh file Visio arsitektur ini.

Aliran Data

Aliran data berikut sesuai dengan diagram sebelumnya:

  1. Perangkat yang disimulasikan mengirim data ke pusat aktivitas melalui agen Pengujian Beban. Perilaku perangkat apa pun dapat disimulasikan dengan menggunakan plugin kustom JMeter. Agen Pengujian Beban mengirim data ke pusat aktivitas setelah menjalankan plugin kustom untuk semua jenis perangkat yang disimulasikan.

  2. Pusat aktivitas memicu aplikasi fungsi Azure yang memproses data dan mengirimkannya ke layanan hilir lainnya, seperti Azure SQL Database dan Azure Digital Twins.

  3. Azure Monitor memantau aplikasi fungsi dan Azure Event Hubs.

  4. Pengujian Beban mengumpulkan data dari Azure Monitor dan menampilkannya di dasbor.

Komponen

Contoh ini menggunakan komponen berikut:

  • Load Testing: Gunakan Pengujian Beban untuk menjalankan skrip Apache JMeter dan plugin kustom untuk mensimulasikan perilaku pengguna dan perangkat. Pengujian Beban menyediakan antarmuka berbasis web untuk mengelola dan menjalankan pengujian beban dan serangkaian API untuk mengotomatiskan proses. Pengujian Beban adalah layanan yang dikelola sepenuhnya, yang berarti Anda tidak perlu mengelola server atau infrastruktur. Dalam arsitektur ini, Pengujian Beban mengunggah skrip JMeter dan plugin kustom, dan itu adalah komputasi tempat skrip tersebut berjalan.

  • Azure Event Hubs: Azure Event Hubs adalah layanan pemrosesan peristiwa berbasis cloud yang dapat Anda gunakan untuk mengumpulkan, memproses, dan menganalisis peristiwa dan streaming data dari berbagai sumber secara real time. Azure Event Hubs mendukung beberapa protokol, termasuk Advanced Message Queuing Protocol (AMQP), HTTPS, protokol Kafka, Message Queuing Telemetry Transport (MQTT), dan AMQP melalui WebSocket. Arsitektur ini berbasis peristiwa, jadi Pengujian Beban mengisi peristiwa untuk menguji beban kerja.

  • IoT Hub: IoT Hub adalah layanan terkelola yang dihosting cloud yang berfungsi sebagai hub pesan pusat untuk komunikasi antara aplikasi IoT dan perangkat terlampirnya. Anda dapat menghubungkan jutaan perangkat dan solusi backend mereka dengan andal dan aman. Hampir semua perangkat dapat dihubungkan ke hub IoT. Anda dapat menyesuaikan arsitektur ini untuk menggunakan IoT Hub dengan mengubah klien Azure Event Hubs ke klien IoT Hub.

  • Azure Functions: Functions adalah layanan komputasi tanpa server yang dapat Anda gunakan untuk menjalankan kode tanpa perlu mengelola server atau infrastruktur. Ini mendukung beberapa bahasa pemrograman, termasuk C#, F#, Java, JavaScript, PowerShell, Python, dan TypeScript. Arsitektur ini menggunakan Functions sebagai tingkat komputasi utama. Data peristiwa di Azure Event Hubs memicu dan meluaskan skala aplikasi fungsi.

  • JMeter GUI: JMeter GUI adalah alat pengujian beban sumber terbuka yang terutama digunakan untuk menguji performa aplikasi web. Namun, Anda juga dapat menggunakannya untuk menguji jenis aplikasi lain, seperti layanan web SOAP dan REST, server FTP, dan database.

  • Azure Monitor: Azure Monitor menyediakan kemampuan pemantauan dan pemberitahuan untuk sumber daya Azure. Gunakan untuk memantau performa dan kesehatan aplikasi Anda dan infrastruktur yang mendasar. Dalam arsitektur ini, Azure Monitor memantau kesehatan komponen infrastruktur Azure selama pengujian beban.

Detail skenario

Anda dapat menggunakan Pengujian Beban untuk menerapkan skrip Apache JMeter yang ada dan menjalankan pengujian beban pada skala cloud pada sumber daya Azure apa pun.

JMeter memungkinkan penguji membuat dan menjalankan pengujian beban, pengujian stres, dan pengujian fungsional. Ini mensimulasikan beberapa pengguna secara bersamaan mengakses aplikasi web sehingga penguji dapat mengidentifikasi potensi penyempitan performa atau masalah lain yang mungkin muncul di bawah beban berat. Anda dapat menggunakan JMeter untuk mengukur berbagai metrik performa, seperti waktu respons, throughput, dan tingkat kesalahan.

JMeter menggunakan antarmuka berbasis GUI untuk memungkinkan pengguna membuat rencana pengujian, yang dapat mencakup beberapa skenario pengujian yang memiliki pengaturan dan konfigurasi yang berbeda. Penguji juga dapat menyesuaikan JMeter dengan menggunakan plugin atau dengan menulis kode kustom. Plugin dapat membantu pengguna bekerja dengan layanan yang menggunakan protokol non-HTTP, seperti AMQP dan WebSocket.

JMeter menyediakan berbagai fitur dan fungsi untuk pengujian beban, tetapi fungsionalitas bawaan mungkin tidak mencakup kasus atau persyaratan penggunaan tertentu. Dengan mengembangkan plugin kustom, penguji dapat menambahkan fungsionalitas baru atau menyesuaikan fitur yang ada agar lebih sesuai dengan kebutuhan mereka.

Misalnya, Anda dapat mengembangkan plugin kustom untuk mensimulasikan jenis perilaku pengguna tertentu atau untuk menghasilkan data pengujian yang lebih realistis. Anda juga dapat mengembangkan plugin kustom untuk mengintegrasikan JMeter dengan alat atau sistem lain, seperti alat pengelogan dan pelaporan atau integrasi berkelanjutan dan alur penyebaran berkelanjutan (CI/CD). Plugin kustom dapat membantu menyederhanakan proses pengujian dan memudahkan untuk menggabungkan pengujian beban ke dalam alur kerja pengembangan perangkat lunak secara keseluruhan. Mereka memungkinkan penguji untuk menyesuaikan JMeter dengan kebutuhan spesifik mereka dan meningkatkan akurasi dan efektivitas upaya pengujian beban mereka.

Dalam contoh ini, perangkat melaporkan suhu dan kelembaban selama periode waktu tertentu. Contoh mensimulasikan perilaku ini dengan menggunakan plugin JMeter kustom. Implementasi plugin kustom saat ini menghasilkan data acak menggunakan templat yang disediakan. Namun, plugin dapat berisi perilaku kompleks yang mungkin untuk perangkat apa pun. Dalam contoh ini, perangkat mengirim data ke pusat aktivitas di Azure. Pusat aktivitas memicu aplikasi fungsi Azure yang memproses data dan mengirimkannya ke layanan hilir lainnya, seperti SQL Database. Azure Functions adalah layanan yang diuji arsitekturnya. Rencana pengujian dirancang untuk mensimulasikan perilaku perangkat dan mengirim data ke pusat aktivitas.

Kemungkinan kasus penggunaan

Menggunakan Pengujian Beban dengan plugin kustom dapat berguna dalam berbagai skenario, seperti:

  • Menguji performa aplikasi yang menggunakan protokol non-HTTP, seperti AMQP dan WebSocket.
  • Menguji performa aplikasi yang menggunakan protokol kustom.
  • Menguji performa aplikasi yang menggunakan SDK non-Microsoft.
  • Mensimulasikan jenis perilaku pengguna atau perangkat tertentu.
  • Menghasilkan data pengujian yang lebih realistis.

Plugin khusus

Di JMeter, plugin kustom adalah komponen perangkat lunak yang dapat Anda tambahkan untuk memperluas fungsionalitas defaultnya. Plugin kustom menambahkan fitur, fungsi, atau integrasi baru ke JMeter. Anda dapat mengembangkan plugin kustom dengan menggunakan bahasa pemrograman Java dan kit pengembangan plugin JMeter (PDK). PDK menyediakan sekumpulan alat dan API yang membantu Anda membuat plugin baru, termasuk elemen GUI, listener, dan sampler.

Untuk mengimplementasikan sampler kustom untuk Event Hubs di JMeter, ikuti instruksi dalam Load Testing JMeter plugins. Setelah mengimplementasikan sampler kustom, Anda dapat menggunakannya dalam paket pengujian JMeter Anda di Pengujian Beban seperti sampler lainnya.

Anda dapat menerapkan rencana pengujian dengan menggunakan grup utas yang mengontrol jumlah utas, seperti pengguna virtual dan perangkat, untuk menjalankan skenario tertentu. Setiap grup utas dapat memiliki pengaturan yang berbeda untuk jumlah utas, periode peningkatan, jumlah perulangan, dan durasi. Grup utas dapat berjalan secara berurutan atau paralel, tergantung pada konfigurasi rencana pengujian dan persyaratan aplikasi. Anda dapat menambahkan sampler ke dalam kelompok thread, mengatur parameternya, dan mengonfigurasinya sesuai kebutuhan. Sampel kustom dapat menjadi alat canggih di JMeter yang memungkinkan Anda mensimulasikan skenario kompleks dan permintaan yang tidak didukung oleh sampler bawaan.

Membuat skrip Apache JMeter dengan plugin kustom

Di bagian ini, Anda membuat sampel skrip pengujian JMeter untuk memuat pengujian aplikasi dengan Azure Event Hubs.

Untuk membuat sampel skrip pengujian JMeter:

  1. Buat file LoadTest.jmx di editor teks dan tempelkan cuplikan kode berikut ke dalam file. Skrip ini mensimulasikan pengujian beban 36 komputer virtual yang secara bersamaan mengirim peristiwa ke pusat aktivitas. Dibutuhkan 10 menit untuk menyelesaikannya.

    <?xml version="1.0" encoding="UTF-8"?>
    <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.5">
        <hashTree>
        <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
            <stringProp name="TestPlan.comments"></stringProp>
            <boolProp name="TestPlan.functional_mode">false</boolProp>
            <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
            <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
            <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
                <collectionProp name="Arguments.arguments"/>
            </elementProp>
            <stringProp name="TestPlan.user_define_classpath"></stringProp>
        </TestPlan>
        <hashTree>
            <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
                <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
                <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
                    <boolProp name="LoopController.continue_forever">false</boolProp>
                    <intProp name="LoopController.loops">-1</intProp>
                </elementProp>
                <stringProp name="ThreadGroup.num_threads">36</stringProp>
                <stringProp name="ThreadGroup.ramp_time">20</stringProp>
                <boolProp name="ThreadGroup.scheduler">true</boolProp>
                <stringProp name="ThreadGroup.duration">600</stringProp>
                <stringProp name="ThreadGroup.delay"></stringProp>
                <boolProp name="ThreadGroup.same_user_on_next_iteration">false</boolProp>
            </ThreadGroup>
            <hashTree>
                 <com.microsoft.eventhubplugin.EventHubPlugin guiclass="com.microsoft.eventhubplugin.EventHubPluginGui" testclass="com.microsoft.eventhubplugin.EventHubPlugin" testname="Azure Event Hubs Sampler" enabled="true">
                    <!-- Azure Event Hub connection configuration using Managed Identity (see repository for instructions) -->
                    <boolProp name="useManagedIdentity">true</boolProp>
                    <stringProp name="eventHubNamespace">telemetry-ehn.servicebus.windows.net</stringProp>
                    <stringProp name="eventHubName">telemetry-data-changed-eh</stringProp>
                    <stringProp name="liquidTemplateFileName">StreamingDataTemplate.liquid</stringProp>
                </com.microsoft.eventhubplugin.EventHubPlugin>
            </hashTree>
        </hashTree>
        </hashTree>
    </jmeterTestPlan>
    

    Implementasi com.microsoft.eventhubplugin.EventHubPluginGui dan com.microsoft.eventhubplugin.EventHubPlugin tersedia di contoh Azure.

  2. Dalam berkas, atur nilai koneksi Azure Event Hubs dengan menggunakan identitas terkelola yang telah ditentukan untuk pengendali tes. Identitas tersebut harus memiliki akses tulis ke instans Azure Event Hubs.

  3. Dalam file, atur nilai simpul eventHubName ke nama hub peristiwa, seperti telemetry-data-changed-eh.

  4. Atur nilai simpul liquidTemplateFileName ke file yang berisi pesan yang dikirim ke hub peristiwa. Misalnya, buat file bernama StreamingDataTemplate.liquid :

    {
        {% assign numberOfMachines = 36 %}
        {% assign machineId = dataGenerator.randomNaturalNumber | modulo: numberOfMachines %}
        "MachineId": "{{machineId | prepend: '0000000000000000000000000000000000000000' | slice: -27, 27 }}",
        "Temperature": {{dataGenerator.randomInt | modulo: 100 }},
        "Humidity": {{dataGenerator.randomInt | modulo: 100 }}
    }
    

    Dalam contoh ini, payload untuk pesan pusat aktivitas adalah objek JSON yang memiliki tiga properti, MachineId, Temperature, dan Humidity. MachineId adalah ID yang dihasilkan secara acak yang panjangnya 27 karakter, dan Temperature dan Humidity adalah bilangan bulat acak yang kurang dari 100. File ini adalah sintaks templat cair. Templat Liquid adalah bahasa templat populer yang digunakan dalam berbagai kerangka kerja pengembangan web. Templat Liquid memungkinkan pengembang untuk membuat konten dinamis yang dapat dengan mudah diperbarui dan dimodifikasi. Ini memungkinkan Anda menyisipkan variabel, kondisi, perulangan, dan elemen dinamis lainnya ke dalam pesan pusat aktivitas Anda. Sintaksnya mudah, dan ada banyak sumber daya online yang tersedia untuk membantu Anda memulai. Templat Liquid menyediakan cara yang kuat dan fleksibel untuk membuat pesan dinamis dan dapat disesuaikan.

  5. Simpan dan tutup file.

    Penting

    Jangan sertakan data pribadi apa pun dalam nama sampler dalam skrip JMeter. Nama sampler muncul di dashboard hasil uji beban. Sampel templat cair bersama dengan file skrip JMeter tersedia untuk diunduh di sampel Azure.

Memperbarui plugin kustom dari Azure Event Hubs ke IoT Hub

Plugin kustom menggunakan Azure Event Hubs sebagai sumber daya target utama. Konfigurasi berikut adalah penyiapan klien SDK untuk Azure Event Hubs:

EventHubProducerClient producer = null;
EventHubClientBuilder producerBuilder = new EventHubClientBuilder();

producerBuilder.credential(getEventHubNamespace(), getEventHubName(), new DefaultAzureCredentialBuilder().build());
producer = producerBuilder.buildProducerClient();

EventDataBatch batch = producer.createBatch(new CreateBatchOptions());
batch.tryAdd(new EventData(msg));
producer.send(batch);

Contoh berikut menunjukkan bagaimana Anda dapat menggunakan kembali solusi yang sama, menambahkan dependensi IoT, dan mengubah klien SDK untuk menggunakan IoT Hub:

IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
ServiceClient client = new ServiceClient(getIoTHostName(), new DefaultAzureCredentialBuilder().build(), protocol);
client.open();

Message message = new Message(msg);
client.send(getDeviceName(), message);

client.close();

Jalankan uji beban dengan menggunakan plugin baru

Saat Pengujian Beban memulai pengujian beban Anda, pertama-tama menyebarkan skrip JMeter bersama dengan semua file lain ke instans mesin pengujian. Sebelum menjalankan pengujian, buka tab parameter untuk menentukan dan mengatur parameter yang diperlukan. Untuk informasi selengkapnya, lihat Menyesuaikan pengujian beban dengan plugin Apache JMeter dan Load Testing.

Menyiapkan pengujian performa untuk lingkungan

Untuk pengujian performa, penting bahwa lingkungan pengujian Anda mirip dengan lingkungan produksi. Contoh ini menggunakan lingkungan berikut untuk pengujian performa untuk lebih memahami kapasitas dan performa sistem.

Layanan Konfigurasi
Pusat Aktivitas Premium dengan satu unit pemrosesan
Azure Functions Linux dengan Paket Premium (EP1) - 210 ACU, Memori 3,5 GB, dan 1 Standard_D1_v2 setara vCPU
Wilayah US Timur

Memilih tingkat layanan yang tepat untuk layanan Azure apa pun, termasuk Azure Event Hubs dan Azure Functions, adalah proses yang kompleks dan bergantung pada banyak faktor. Untuk informasi selengkapnya, lihat harga Azure Event Hubs dan harga Functions.

Mendesain KPI untuk pengujian performa

Sebelum Anda dapat merancang KPI untuk pengujian performa, Anda perlu menentukan persyaratan bisnis dan arsitektur sistem. Persyaratan bisnis memberi tahu Anda KPI mana, seperti waktu respons, throughput, atau tingkat kesalahan, yang ingin Anda ukur. Arsitektur sistem memberi tahu Anda cara menguji performa setiap komponen, seperti server web, database, atau API. Ini juga membantu Anda memilih strategi pengujian performa terbaik, seperti pengujian beban, pengujian stres, atau pengujian daya tahan.

Contoh ini memiliki persyaratan bisnis berikut:

  • Sistem dapat menangani 1.000 permintaan per detik.
  • Keandalan sistem lebih tinggi dari 0,99.
  • Sistem dapat menangani 1.000 perangkat bersamaan yang melaporkan data telemetri.
  • Anda dapat menentukan kapasitas maksimum sistem dalam hal jumlah perangkat yang dapat didukungnya. Misalnya, sistem dapat mendukung 1.000 perangkat bersamaan dengan kapasitas tiga kali lipat saat ini.

Untuk mengukur apakah sistem memenuhi persyaratan ini, Anda dapat menggunakan KPI berikut untuk pengujian performa:

KPI Deskripsi
RPS Permintaan per detik untuk pusat aktivitas
MUAT Jumlah beban atau permintaan yang dikirim ke pusat aktivitas selama pengujian performa
IR Jumlah pemanggilan fungsi atau tingkat penyerapan
RT Waktu rata-rata untuk waktu eksekusi Azure Functions
AMU Penggunaan memori rata-rata untuk Azure Functions
SR Tingkat keberhasilan semua pemanggilan aplikasi fungsi
ARS Waktu respons layanan hilir rata-rata untuk layanan seperti server SQL atau layanan mikro
DF Jumlah kegagalan dependensi, termasuk kesalahan aplikasi fungsi internal
MRPS RPS maksimum tanpa backlog di pusat aktivitas (kapasitas sistem)

Mengukur KPI

Untuk mengukur KPI, Anda harus memiliki strategi pengujian performa. Strategi ini mendefinisikan pendekatan pengujian performa untuk setiap komponen. Contoh ini menggunakan strategi pengujian performa berikut.

  • Event Hubs: Pendekatan pengujian performa untuk pusat aktivitas adalah mengirim banyak pesan ke pusat aktivitas lalu mengukur RPS dan LOAD. RPS adalah jumlah pesan yang dikirim ke pusat aktivitas per detik. LOAD adalah jumlah total pesan yang dikirim ke pusat aktivitas selama pengujian performa. Pengujian Beban dapat mengukur RPS dan LOAD.

  • Azure Functions: Pendekatan pengujian performa untuk Functions adalah mengukur metrik berikut.

    • IR
    • RT
    • AMU
    • SR
    • ARS
    • DF

Azure Monitor dapat mengukur AMU, ARS, dan DF, tetapi bukan IR, RT, atau SR. Untuk mengukur KPI dengan menggunakan Azure Monitor, aktifkan Application Insights untuk Azure Functions. Untuk informasi selengkapnya, lihat Mengaktifkan Integrasi Application Insights.

Setelah mengaktifkan Azure Monitor, Anda dapat menggunakan kueri berikut untuk mengukur KPI:

  • Runtime integrasi: FunctionAppLogs | where Category startswith "name-space-of-your-function" and Message startswith "Executed" | summarize count() by FunctionName, Level, bin(TimeGenerated, 1h) | order by FunctionName desc

  • RT: FunctionAppLogs| where Category startswith "name-space-of-your-function" and Message startswith "Executed "| parse Message with "Executed " Name " (" Result ", Id=" Id ", Duration=" Duration:long "ms)"| project TimeGenerated, Message, FunctionName, Result, FunctionInvocationId, Duration

  • SR: FunctionAppLogs| where Category startswith "name-space-of-your-function" and Message startswith "Executed" | summarize Success=countif(Level == "Information" ), Total=count() by FunctionName| extend Result=Success*100.0/Total| project FunctionName, Result| order by FunctionName desc

Contoh Dasbor Azure Monitor

Gambar berikut menunjukkan sampel dasbor Azure Monitor. Ini menunjukkan KPI untuk Azure Functions berdasarkan kueri sebelumnya.

Cuplikan layar yang memperlihatkan sampel dasbor Azure Monitor.

Kontributor

Microsoft mempertahankan artikel ini. Kontributor berikut menulis artikel ini.

Penulis utama:

Untuk melihat profil LinkedIn nonpublik, masuk ke LinkedIn.

Langkah berikutnya