Sebagai pengantar ...
Eksploitasi industri membutuhkan pengetahuan tentang bagaimana aplikasi hidup. Tesis ini harus dianggap sebagai aksioma. Pengetahuan ini adalah metrik yang dihasilkan oleh aplikasi. Metrik dapat berupa teknis murni (misalnya, jumlah RAM yang dikonsumsi) dan bisnis (misalnya, pesanan yang diselesaikan).
Dengan sendirinya, pemotongan metrik tidak selalu menarik dan indikatif saat ini. Pertanyaan dasar muncul tentang mengumpulkan, menyimpan, dan menampilkan metrik ini.
Situasi dengan kebutuhan metrik dan cara mereka diproses menjadi lebih akut ketika pendekatan layanan digunakan dan satu aplikasi, dari sudut pandang pengguna, didukung oleh pengoperasian beberapa layanan yang berinteraksi. Tambahkan penyebaran awan ke dalamnya dan tuai cabai .
Tentang apa ini
Proyek yang saya ikuti hanya menggunakan layanan dan diterapkan ke AWS (Amazon Web Services). Sebagian besar layanan dibuat menggunakan Java 8+, Spring Boot, dan Docker. Kuliah di Luxoft IT Sreda # 7 dan artikel ini tumbuh dari kebutuhan dan tujuan proyek.
Sasaran saya adalah melihat sisi praktis dari mengumpulkan metrik aplikasi menggunakan Spring Boot dan mengekspornya ke AWS CloudWatch . Ini sebenarnya akan menjadi panduan langkah demi langkah dengan penjelasan, analisis nuansa, dan kemungkinan garu.
Ketika kita berbicara tentang pemecahan masalah praktis, penting untuk memahami gejala-gejalanya untuk membandingkannya dengan lingkungan yang ada. Apakah mungkin untuk menerapkan apa yang kita bicarakan secara pribadi atau jika adaptasi diperlukan, lebih banyak penelitian.
Mari kita lihat apa yang terdiri dari konteks kita saat ini:
- Seperti yang sudah diketahui, aplikasi atau layanan kami didasarkan pada Spring Boot. Sebagai pembuat Maven, Java 8+
- Buruh pelabuhan. Namun, penggunaannya tidak kritis. Penting bahwa untuk aplikasi yang berjalan di buruh pelabuhan semuanya akan bekerja juga
- AWS EC2 adalah infrastruktur kami tempat aplikasi berjalan. Pada intinya, ini adalah mesin virtual di dalam AWS.
- AWS CloudWatch adalah sistem pemantauan yang merupakan dasbor infrastruktur AWS.
Boot Musim Semi
Mari beralih ke SpringBoot dan fitur-fiturnya yang dapat membantu kita. Hal pertama dan terpenting dalam gudang senjata adalah Aktuator . Modul ini memungkinkan Anda untuk melihat ke dalam aplikasi yang sedang berjalan dan, sampai batas tertentu, menyesuaikan perilakunya. Misalnya:
- Health check:
- , , runtime.
- ,
- , , : , , GC.
- ...
Seperti banyak komponen Pegas, Aktuator mirip dengan konstruktor dan dapat disesuaikan, diperpanjang, dan disetel dengan baik. Anda bisa mulai belajar dari sini .
Dari keseluruhan rangkaian, kami saat ini tertarik pada metrik. Aktuator dan metrik khususnya tidak hanya dapat diperluas, tetapi juga dikonfigurasi sebelumnya, jadi hanya ada beberapa lusin kategori metrik yang tersedia di luar kotak. Tentu saja, Anda dapat mendaftarkan metrik Anda sendiri. Jika modul web terhubung dalam proyek, metrik dapat diperoleh dengan menghubungi
endpoint /metrics.
Pengumpulan dan pengiriman metrik diimplementasikan melalui perpustakaan mikrometer , yang merupakan produk Pivotal(sekarang bagian dari VMware), yang sama yang mengembangkan Spring. mikrometer dipasarkan sebagai fasad independen vendor untuk mengekspor metrik aplikasi Java.
Aktuator akan membutuhkan starter berikut untuk terhubung:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Spring Cloud
Selanjutnya kita membutuhkan modul dari Spring Cloud yaitu
spring-cloud-starter-aws.
Setiap modul dari keluarga Spring Cloud memiliki versinya sendiri dan akan benar jika menggunakan bukan versi modul tertentu, tetapi BOM dari
spring-cloud-dependenciesversi tertentu ( rangkaian rilis), tempat versi modul yang kompatibel dikumpulkan. Pada saat penulisan, ini adalah Hoxton.RELEASE.
Selain konfigurasi otomatis yang bagus untuk bekerja dengan AWS
spring-cloud-starter-aws, ini menyediakan ketergantungan transitif aws-java-sdk.
Di bagian dependencyManagement, letakkan
<dependencyManagement>
...
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
...
</dependencyManagement>
Dan tergantung pada:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
</dependency>
Registri mikrometer
Kami sekarang memiliki mikrometer di Spring Actuator dan
aws-java-sdk. Di luar kotak, mikrometer tidak dapat mengekspor data ke AWS CloudWatch, ini memerlukan implementasi MeterRegestry yang sesuai, abstraksi mikrometer untuk mengumpulkan metrik. Standarnya adalah SimpleMeterRegistry, yang menyimpan data dalam memori. Implementasi yang diperlukan terhubung bersama micrometer-registry-cloudwatch. Pada saat penulisan ini, versi saat ini adalah 1.3.5.
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-cloudwatch</artifactId>
<version>1.3.5</version>
</dependency>
Pom.xml terakhir, dalam kasus kami, terlihat seperti ini: github.com/MrArtemAA/blog-demos/blob/master/export-metrics-to-cloudwatch/pom.xml
app.properties
Mari kita lanjutkan ke menyiapkan properti aplikasi, yang dalam kasus kami memainkan peran penting:
1
management.metrics.export.cloudwatch.namespace.: Anda perlu menentukan namespace tempat metrik akan disimpan di CloudWatch. Karena dalam metrik itu sendiri tidak ada informasi dari mana contoh aplikasi tertentu datanya berasal, namespace akan menentukan metrik dari contoh tertentu. Jika tidak, jika Anda menentukan satu namespace untuk beberapa instance, data metrik akan dicampur dan tidak jelas dari mana asalnya.
2
management.metrics.export.cloudwatch.batch-size.: diperlukan untuk secara eksplisit mengatur nilai properti ukuran batch ke 20. Apakah parameter ini dan mengapa tepatnya 20? Metrik dikirim ke klien Amazon CloudWatch secara asinkron, dalam kelompok 20 (ini adalah batas AWS) pada satu waktu.
3
cloud.aws.stack.auto=false.: Perlu menonaktifkan deteksi otomatis tumpukan AWS CloudFormationsejak defaultnya adalah = true. Properti ini bertanggung jawab atas apakah aplikasi akan mencoba secara otomatis mendapatkan nama tumpukan untuk mengonfigurasi aplikasi untuk lingkungan cloud (dalam paradigma infrastruktur-sebagai-kode). Saat menerapkan pada EC2, seperti pada mesin virtual biasa, informasi ini tidak tersedia.
Penting untuk dipahami bahwa informasi apa pun yang akan dicoba didapatkan oleh AWS SDK sendiri tanpa konfigurasi tambahan, itu [pustaka] akan diambil dari metadata EC2 . Untuk memperoleh informasi ini, terdapat titik akhir layanan khusus tempat panggilan dibuat.
Tanya jawab
ukuran batch
Mari kembali ke properti
management.metrics.export.cloudwatch.batch-sizedan kebutuhan untuk menyetelnya sama dengan 20. Tampaknya semua ini dapat dilakukan pada tingkat perpustakaan terkait yang bekerja dengan AWS. Memang, micrometer-registry-cloudwatchada antarmuka dengan CloudWatchConfig defaultmetode yang memeriksa nilai dengan benar dan mengeluarkan pengecualian ketika melebihi 20. Namun, jika Anda perhatikan org.springframework.cloud.aws.autoconfigure.metrics.CloudWatchExportAutoConfiguration, kita akan melihat bahwa konfigurasi selesai menggunakanorg.springframework.cloud.aws.autoconfigure.metrics.CloudWatchPropertiesConfigAdapter:
@Bean
@ConditionalOnMissingBean
public CloudWatchConfig cloudWatchConfig(CloudWatchProperties cloudWatchProperties) {
return new CloudWatchPropertiesConfigAdapter(cloudWatchProperties);
}
Adaptor, pada gilirannya, menggantikan
batchSize()sebagai
@Override
public int batchSize() {
return get(CloudWatchProperties::getBatchSize, CloudWatchConfig.super::batchSize);
}
Ini berarti bahwa jika
CloudWatchPropertiesproperti ditentukan, itu akan diambil dari sana. Itu hanya tidak berisi pemeriksaan yang diperlukan, dan jika properti tidak disetel secara eksplisit, nilai defaultnya adalah 10000.
Permintaan ke AWS
Aplikasi (layanan) tidak bisa begitu saja mengajukan permintaan ke layanan Amazon. Mereka [permintaan] harus mengandung kredensial. Untuk melakukannya, AWS SDK memiliki rantai penyedia kredensial , yang direkomendasikan. Di antara penyedia ini adalah Profil Instance, yang dapat menerima data berdasarkan metadata EC2. Agar ini berfungsi, Anda perlu memastikan bahwa role terikat ke EC2 .
Peran tersebut harus memberikan izin untuk mengajukan permintaan ke CloudWatch dan tersedia untuk EC2. Peran dapat ditentukan saat membuat instans EC2 baru, atau dilampirkan ke instans yang sudah ada. Peran tersebut diterapkan dengan cepat.
Menonaktifkan metrik
Untuk build lokal atau lingkungan pengujian, mengekspor metrik mungkin berlebihan. Menyetel properti
management.metrics.export.cloudwatch.enabled=falsememungkinkan Anda menonaktifkan ekspor metrik ke CloudWatch, sementara pengumpulan metrik akan dilakukan dan, jika Anda memiliki modul web yang terhubung, metrik tersebut endpoint /metricsakan tetap tersedia.
Mikrometer mengumpulkan dan memberikan berbagai macam metrik. Jika beberapa di antaranya tidak diperlukan, Anda dapat menonaktifkannya. Anda dapat menonaktifkan baik secara individu maupun berdasarkan seluruh kategori. Jadi, misalnya, properti akan menonaktifkan semua metrik yang diawali dengan id . Harap diperhatikan: metrik yang dinonaktifkan tidak akan dikumpulkan sama sekali.
management.metrics.enable.some.metric=falsesome.metric
Menjalankan semua AWS
Kejutan lain menanti jika Anda mencoba menjalankan aplikasi dengan pengaturan minimum yang diperlukan semua AWS. Untuk pengoperasiannya, diperlukan data wilayah dimana aplikasi tersebut berjalan. Seperti yang telah kita ketahui, apapun yang tidak dinyatakan secara eksplisit, AWS SDK akan mencoba untuk mendapatkan dari metadata ... yang tidak ada. Oleh karena itu, kami secara eksplisit menunjukkan wilayah yang diinginkan melalui properti
cloud.aws.region.static=us-east-2. Seperti halnya dengan nama tumpukan (properti cloud.aws.stack.auto), ada properti yang cloud.aws.region.autosama truesecara default. Tetapi hanya mengatur nilai ke salah tidak akan membantu kami, karena nilai wilayah dibutuhkan.
Selain itu, seperti yang kami ingat, permintaan ke AWS memerlukan kredensial, jadi jika Anda perlu mengirim metrik ke CloudWatch (atau membuat permintaan lain ke AWS), Anda harus secara eksplisit menentukan parameter untuk kredensial tersebut.melalui, misalnya, properti aplikasi atau variabel lingkungan.
Melewati properti aplikasi terlihat seperti ini:
cloud.aws.credentials.access-key=YOUR_ACCESS_KEY
cloud.aws.credentials.secret-key=YOUR_SECRET_KEY
Hasil
Seperti yang saya pikir Anda mungkin telah memperhatikan, mendapatkan seluruh skema untuk bekerja dan mentransfer metrik dari aplikasi ke CloudWatch tidaklah sesulit itu: dibutuhkan 3 dependensi dan 3 properti .
Yang terpenting adalah detailnya. Perpustakaan (kerangka kerja) seperti Spring, AWS SDK mencoba membuat hidup lebih mudah dan melakukan semua pekerjaan untuk kami semaksimal mungkin, tetapi pada saat yang sama, langkah apa pun yang disisihkan dapat menyebabkan munculnya stacktrace, upaya untuk memahami mengapa metrik tidak pergi ke mana pun, mengapa aplikasi tidak memulai sama sekali dan cara memperbaikinya. Bagian dengan rincian nuansa dan deskripsi beberapa detail tentang cara kerja layanan EC2 dan CloudWatch, saya harap, akan memfasilitasi pemahaman Anda tentang apa yang terjadi.
Jika kita berbicara tentang penggunaan CloudWatch itu sendiri, maka menurut saya, ini adalah pilihan yang cukup wajar saat menggunakan infrastruktur AWS.
Metrik adalah mata dan telinga dari aplikasi kita, tetapi ini tidak meniadakan fakta bahwa Anda perlu memahami bagaimana metrik dikumpulkan, dihitung, dan ditampilkan. Jenis data apa yang akan Anda lihat di bagan Anda. Masalah ini akan menjadi sangat akut jika terjadi anomali dan analisis insiden. Jika kita berbicara tentang pustaka mikrometer, ada baiknya merujuk ke dokumentasinya , di sana, misalnya, dijelaskan secara rinci tentang jenis meter (Meter).
Tautan
Pertukaran pengalaman memungkinkan kami dengan cepat menguasai berbagai pendekatan, alat, teknologi, dan bergerak maju. Oleh karena itu, saya tidak dapat mengabaikan materi yang paling berguna tentang topik tersebut, yang tidak dirujuk selama artikel:
Spring Boot: Metrics With Micrometer dan AWS CloudWatch
Spring Cloud. Menggunakan Amazon Web Services. Konfigurasi otomatis Spring Boot
Spring in Action 5, Craig Walls, Manning
Populer tentang Amazon Web Services Proyek yang telah
selesai dapat ditemukan di GitHub .