Statistik dan pemantauan skrip PHP secara real time. ClickHouse dan Grafana datang membantu Pinba

Pada artikel ini saya akan memberi tahu Anda cara menggunakan pinba dengan clickhouse dan grafana alih-alih pinba_engine dan pinboard.

Pada proyek PHP, pinba mungkin satu-satunya cara yang dapat diandalkan untuk memahami apa yang terjadi dengan kinerja. Benar, pinba biasanya diterapkan hanya ketika masalah sudah terlihat dan tidak jelas β€œdi mana harus menggalinya”.

Seringkali tidak ada yang tahu berapa kali per detik/menit skrip ini atau itu dipanggil dan mereka mulai mengoptimalkan β€œdengan sentuhan”, mulai dari tempat yang tampaknya lebih logis.

Beberapa menganalisis log nginx, sementara yang lain menganalisis kueri database yang lambat.

Tentu saja, pinba tidak akan berlebihan, namun ada beberapa alasan mengapa tidak setiap proyek memilikinya.

Statistik dan pemantauan skrip PHP secara real time. ClickHouse dan Grafana datang membantu Pinba

Dan alasan pertama adalah instalasi.

Untuk mendapatkan semacam β€œkelelahan” dari penerapan Pinba, sangat diinginkan untuk melihat metrik tidak hanya untuk menit-menit terakhir, tetapi juga untuk jangka waktu yang lama (dari hari ke bulan).

Untuk ini, Anda perlu:

  • instal ekstensi untuk php (dan Anda mungkin menginginkan modul untuk nginx)
  • kompilasi ekstensi untuk mysql
  • instal pinboard dan konfigurasikan cron

Karena sedikitnya informasi tentang Pinba, banyak orang mendapat kesan bahwa Pinba hanya berfungsi pada PHP5 dan sudah lama berlalu, namun seperti yang akan kita lihat nanti, kenyataannya tidak demikian.

Langkah pertama adalah yang paling sederhana, yang perlu Anda lakukan hanyalah menjalankan perintah:

apt install php-pinba

Ekstensi ini tersedia di repositori hingga dan termasuk php 7.3 dan Anda tidak perlu mengkompilasi apa pun.

Setelah menjalankan perintah instalasi, kami segera menerima ekstensi yang berfungsi yang mengumpulkan dan mengirimkan metrik untuk setiap skrip (waktu berjalan, memori, dll.) dalam format protobuf melalui udp ke 127.0.0.1:30002.

Sejauh ini belum ada yang menangkap atau memproses paket UDP ini, namun hal ini sama sekali tidak berdampak negatif pada kecepatan atau stabilitas skrip PHP Anda.

Sampai saat ini, satu-satunya aplikasi yang dapat menangkap dan memproses paket UDP tersebut adalah pinba_engine. Keterangan "sederhana dan ringkas" instalasi mengecilkan keinginan untuk membaca dan mempelajarinya lagi. Daftar dependensi sepanjang satu kilometer berisi nama paket dan nama program serta link ke halaman individual dengan instalasinya, dan halaman tersebut memiliki link sendiri ke dependensi lain. Tidak ada yang punya waktu atau keinginan untuk menangani omong kosong ini.

Proses instalasi pinba2 tidak terutama lebih mudah.

Mungkin suatu hari nanti pinba10 dapat diinstal dengan satu atau dua perintah dan tidak perlu membaca banyak materi untuk memahami cara melakukannya, tetapi untuk saat ini tidak demikian.

Jika Anda menginstal pinba_engine, maka ini hanya setengah dari perjuangan. Lagi pula, tanpa papan pin Anda harus membatasi diri pada data beberapa menit terakhir saja, atau Anda harus mengumpulkan, menyimpan, dan memvisualisasikan data sendiri. Ada baiknya pinboard cukup mudah digunakan instalasi.

Tampaknya, mengapa harus menderita jika semua metrik dari php sudah dikirim ke port udp dalam format protobuf dan yang Anda butuhkan hanyalah menulis aplikasi yang akan menangkapnya dan menyimpannya di semacam penyimpanan? Rupanya, para developer yang mencetuskan ide ini langsung duduk untuk menuliskan idenya sendiri, beberapa di antaranya berakhir di GitHub.

Berikut ini adalah ikhtisar empat proyek sumber terbuka yang menyimpan metrik dalam penyimpanan, yang darinya data ini dapat dengan mudah diambil dan divisualisasikan, misalnya menggunakan grafana.

olegfedoseev/pinba-server (November 2017)

server udp saat bepergian yang menyimpan metrik ke OpenTSDB. Mungkin jika Anda sudah menggunakan OpenTSDB di proyek Anda, maka solusi ini cocok untuk Anda, jika tidak, saya sarankan untuk melewatkannya.

olegfedoseev/pinba-influxdb (Juni 2018)

server udp saat bepergian, dari yang sama browser, yang kali ini menyimpan metrik di InfluxDB. Banyak proyek sudah menggunakan InfluxDB untuk pemantauan, jadi solusi ini mungkin cocok untuk mereka.

Pro:

  • masuknyaDB memungkinkan menggabungkan metrik yang diterima, dan menghapus metrik asli setelah waktu yang ditentukan.

Cons:

ClickHouse-Ninja/Proton (Januari 2019)

server udp saat bepergian, yang menyimpan metrik di ClickHouse. Ini adalah solusi teman saya. Setelah mengenalnya, saya memutuskan sudah waktunya untuk menghadapi Pinbu dan Clickhouse.

Pro:

  • Clickhouse sangat ideal untuk tugas-tugas seperti itu; ini memungkinkan Anda mengompresi data sedemikian rupa sehingga Anda dapat menyimpan semua data mentah bahkan tanpa agregasi
  • jika diperlukan, Anda dapat dengan mudah menggabungkan metrik yang dihasilkan
  • template siap pakai untuk grafana
  • menyimpan informasi tentang pengatur waktu

Cons:

  • kesalahan fatal
  • tidak ada konfigurasi di mana Anda dapat mengkonfigurasi nama database dan tabel, alamat dan port server.
  • saat menyimpan data mentah, tabel kamus tambahan digunakan untuk menyimpan alamat halaman dan domain, yang mempersulit kueri berikutnya
  • hal-hal kecil lainnya yang mengikuti dari minus pertama

pinba-server/pinba-server (April 2019)

server udp di php, yang menyimpan metrik di ClickHouse. Ini solusi saya yang merupakan hasil mengenal pinba, ClickHouse dan protobuf. Saat saya memilah-milah semuanya, saya menulis "bukti konsep", yang, secara tak terduga bagi saya, tidak menghabiskan sumber daya yang signifikan (RAM 30 MB dan kurang dari 1% dari salah satu dari delapan inti prosesor), jadi saya memutuskan untuk membagikannya kepada publik.

Kelebihannya sama dengan solusi sebelumnya, saya juga menggunakan nama biasa dari pinba_engine asli. Saya juga menambahkan konfigurasi yang memungkinkan Anda meluncurkan beberapa instance server pinbase sekaligus untuk menyimpan metrik di tabel yang berbeda - ini berguna jika Anda ingin mengumpulkan data tidak hanya dari php, tetapi juga dari nginx.
Kekurangan - "kelemahan fatal" dan hal-hal kecil yang tidak cocok untuk Anda secara pribadi, tetapi solusi saya adalah "sederhana sandal" dan hanya terdiri dari sekitar 100 baris kode, sehingga pengembang PHP mana pun dapat mengubah apa yang tidak disukainya beberapa menit lagi.

Prinsip operasi

Port UDP 30002 didengarkan Semua paket masuk didekodekan sesuai dengan skema protobuf dan dikumpulkan. Semenit sekali, sebuah paket dimasukkan ke dalam clickhouse ke dalam tabel pinba.requests. (semua parameter dikonfigurasikan konfigurasi)

Sedikit tentang clickhouse

Clickhouse mendukung mesin penyimpanan data yang berbeda. Yang paling umum digunakan adalah MergeTree.

Jika suatu saat Anda memutuskan untuk menyimpan data gabungan sepanjang waktu, dan data mentah hanya untuk yang terakhir, maka Anda dapat membuat tampilan terwujud dengan pengelompokan, dan secara berkala membersihkan tabel pinba.requests utama, sementara semua data akan tetap berada di tabel pandangan terwujud. Selain itu, saat membuat tabel pinba.requests, Anda dapat menentukan "engine = Null", maka data mentah tidak akan disimpan ke disk sama sekali, dan pada saat yang sama akan tetap berada dalam tampilan material dan disimpan secara agregat. . Saya menggunakan skema ini untuk metrik nginx, karena di nginx saya memiliki permintaan 50 kali lebih banyak daripada di php.

Jadi, Anda telah menempuh perjalanan panjang dan saya tidak ingin meninggalkan Anda di tengah jalan, jadi berikut ini adalah penjelasan rinci tentang instalasi dan konfigurasi solusi saya dan semua yang Anda butuhkan, serta jebakan yang menyebabkan lebih dari satu kapal menabrak. Seluruh proses instalasi dijelaskan untuk Ubuntu 18.04 LTS dan Centos 7; prosesnya mungkin sedikit berbeda pada distribusi dan versi lain.

Instalasi

Saya memasukkan semua perintah yang diperlukan Dockerfile untuk memfasilitasi reprodusibilitas instruksi. Hanya kendalanya yang akan dijelaskan di bawah ini.

php-pinba

Setelah instalasi, pastikan bahwa di file /etc/php/7.2/fpm/conf.d/20-pinba.ini Anda telah menghapus komentar semua opsi. Pada beberapa distribusi (misalnya centos) mungkin akan dikomentari.

extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002

rumah klik

Selama instalasi, clickhouse akan meminta Anda mengatur kata sandi untuk pengguna default. Secara default, pengguna ini dapat diakses dari semua IP, jadi jika Anda tidak memiliki firewall di server Anda, pastikan untuk menyetel kata sandinya. Ini juga dapat dilakukan setelah instalasi di file /etc/clickhouse-server/users.xml.

Perlu juga dicatat bahwa clickhouse menggunakan beberapa port, termasuk 9000. Port ini juga digunakan untuk php-fpm di beberapa distribusi (misalnya centos). Jika Anda sudah menggunakan port ini, Anda dapat mengubahnya ke port lain di file /etc/clickhouse-server/config.xml.

grafana dengan plugin clickhouse

Setelah install Grafana, gunakan login admin dan password admin. Saat Anda login pertama kali, Grafana akan meminta Anda untuk mengatur kata sandi baru.

Selanjutnya, masuk ke menu β€œ+” -> impor dan tunjukkan nomor dashboard untuk impor 10011. Saya menyiapkan dan mengunggah dasbor ini sehingga Anda tidak perlu melakukannya sendiri lagi.

Grafana mendukung bekerja dengan clickhouse melalui plugin pihak ketiga, tetapi Grafana tidak memiliki peringatan untuk plugin pihak ketiga (sudah ada tiket untuk ini selama beberapa tahun).

server pinba

Menginstal protobuf dan libevent bersifat opsional, tetapi meningkatkan kinerja server pinba. Jika Anda menginstal pinba-server di folder selain /opt, Anda juga perlu memperbaikinya skrip sistemd mengajukan.

modul pinba untuk nginx

Untuk mengkompilasi modul, Anda memerlukan kode sumber dari versi nginx yang sama yang sudah diinstal di server Anda, serta opsi kompilasi yang sama, jika tidak, build akan berhasil, tetapi saat menghubungkan modul, kesalahan akan muncul yang β€œmodul ini tidak kompatibel dengan biner.” Opsi kompilasi dapat dilihat menggunakan perintah nginx -V

Peretasan hidup

Semua situs saya hanya berfungsi di https. Bidang skema menjadi tidak ada artinya, jadi saya menggunakannya untuk memisahkan web/konsol.

Dalam skrip yang dapat diakses dari web saya menggunakan:

if (ini_get('pinba.enabled')) {
    pinba_schema_set('web');
}

Dan di skrip konsol (misalnya, skrip cron):

if (ini_get('pinba.enabled')) {
    pinba_schema_set('console');
}

Di dasbor saya di Grafana ada tombol web/konsol untuk melihat statistik secara terpisah.

Anda juga dapat mengirimkan tag Anda ke Pinba, misalnya:

pinba_tag_set('country', $countryCode);

Itu saja.

Silakan jawab jajak pendapat di bawah artikel.

Seperti biasa, saya memperingatkan Anda bahwa saya tidak menyarankan atau membantu melalui pesan pribadi di Habr dan jejaring sosial.

Buat tiket di Github.

Juga tolong dukung dengan suka versi bahasa Inggris artikel ini di reddit.

Hanya pengguna terdaftar yang dapat berpartisipasi dalam survei. Masuk, silakan.

OS apa yang Anda gunakan di server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SWIS

  • Unix

  • Windows

  • lain

114 pengguna memilih. 11 pengguna abstain.

Versi php apa yang Anda gunakan di server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • lain

105 pengguna memilih. 17 pengguna abstain.

Pernahkah Anda menggunakan pinba?

  • ya

  • tidak, tapi aku ingin

  • tidak dan aku tidak mau

  • tidak dan belum pernah mendengar tentang dia

100 pengguna memilih. 14 pengguna abstain.

Versi server Pinba manakah yang ingin Anda coba?

  • pinba_engine (mesin mysql)

  • pinba2 (mesin mysql)

  • papan pin (php + mysql)

  • olegfedoseev/pinba-server (buka + OpenTSDB)

  • olegfedoseev/pinba-influxdb (pergi + influxdb)

  • server pinba/server pinba (pergi + clickhouse)

  • pinba-server/pinba-server (php + clickhouse)

  • Saya akan menulis milik saya sendiri

  • lain

39 pengguna memilih. 47 pengguna abstain.

Sumber: www.habr.com

Tambah komentar