Statistik dan pemantauan skrip PHP dalam masa nyata. ClickHouse dan Grafana datang untuk membantu Pinba

Dalam artikel ini saya akan memberitahu anda cara menggunakan pinba dengan clickhouse dan grafana dan bukannya pinba_engine dan papan pin.

Pada projek PHP, pinba mungkin satu-satunya cara yang boleh dipercayai untuk memahami perkara yang berlaku dengan prestasi. Benar, pinba biasanya dilaksanakan hanya apabila masalah telah diperhatikan dan tidak jelas "di mana untuk digali."

Selalunya tiada siapa yang tahu berapa kali sesaat/minit skrip ini atau itu dipanggil dan mereka mula mengoptimumkan "melalui sentuhan", bermula dari tempat yang kelihatan lebih logik.

Sesetengah menganalisis log nginx, sementara yang lain menganalisis pertanyaan pangkalan data yang perlahan.

Sudah tentu, pinba tidak akan berlebihan, tetapi terdapat beberapa sebab mengapa tidak setiap projek memilikinya.

Statistik dan pemantauan skrip PHP dalam masa nyata. ClickHouse dan Grafana datang untuk membantu Pinba

Dan sebab pertama ialah pemasangan.

Untuk mendapatkan lebih kurang "ekzos" daripada pelaksanaan Pinba, adalah sangat wajar untuk melihat metrik bukan sahaja untuk minit terakhir, tetapi juga dalam tempoh masa yang panjang (dari hari ke bulan).

Untuk ini anda perlukan:

  • pasang sambungan untuk php (dan anda mungkin mahu modul untuk nginx)
  • menyusun sambungan untuk mysql
  • pasang papan pin dan konfigurasikan cron

Disebabkan oleh jumlah maklumat yang kecil tentang Pinba, ramai orang mempunyai tanggapan bahawa ia hanya berfungsi pada PHP5 dan telah lama menjadi perkara yang lepas, tetapi seperti yang akan kita lihat kemudian, ini tidak berlaku.

Langkah pertama adalah yang paling mudah, semua yang anda perlu lakukan ialah menjalankan arahan:

apt install php-pinba

Sambungan ini tersedia dalam repositori sehingga dan termasuk php 7.3 dan anda tidak perlu menyusun apa-apa.

Selepas melaksanakan arahan pemasangan, kami serta-merta menerima sambungan berfungsi yang mengumpul dan menghantar metrik untuk setiap skrip (masa berjalan, memori, dll.) dalam format protobuf melalui udp ke 127.0.0.1:30002.

Setakat ini tiada siapa yang menangkap atau memproses paket UDP ini, tetapi ini tidak sama sekali menjejaskan kelajuan atau kestabilan skrip PHP anda secara negatif.

Sehingga baru-baru ini, satu-satunya aplikasi yang boleh menangkap dan memproses paket UDP ini ialah pinba_enjin. Penerangan "ringkas dan padat"Pemasangan tidak menggalakkan keinginan untuk membaca dan menyelidikinya lagi. Senarai kebergantungan sepanjang kilometer mengandungi kedua-dua nama pakej dan nama program serta pautan ke halaman individu dengan pemasangannya, dan senarai tersebut mempunyai pautan sendiri ke kebergantungan lain. Tiada siapa yang mempunyai masa atau keinginan untuk menangani omong kosong ini.

Proses pemasangan pinba2 tidak terutamanya lebih mudah.

Mungkin suatu hari nanti mungkin untuk memasang pinba10 dengan satu atau dua arahan dan tidak perlu membaca banyak bahan untuk memahami cara melakukannya, tetapi buat masa ini ini tidak berlaku.

Jika anda memasang pinba_engine, maka ini hanya separuh daripada pertempuran. Lagipun, tanpa pinboard anda perlu mengehadkan diri anda kepada data hanya dari beberapa minit terakhir, atau anda perlu mengagregat, menyimpan dan menggambarkan data itu sendiri. Adalah baik bahawa papan pin agak mudah digunakan pemasangan.

Nampaknya, mengapa penderitaan sedemikian jika semua metrik dari php sudah dihantar ke port udp dalam format protobuf dan anda hanya perlu menulis aplikasi yang akan menangkapnya dan meletakkannya dalam beberapa jenis storan? Nampaknya, pembangun yang menghasilkan idea ini segera duduk untuk menulis idea mereka sendiri, beberapa daripadanya berakhir di GitHub.

Berikut ialah gambaran keseluruhan empat projek sumber terbuka yang menyimpan metrik dalam storan, yang mana data ini boleh diambil dan divisualkan dengan mudah, contohnya, menggunakan grafana.

olegfedoseev/pinba-server (November 2017)

pelayan udp dalam perjalanan yang menyimpan metrik ke OpenTSDB. Mungkin jika anda sudah menggunakan OpenTSDB dalam projek anda, maka penyelesaian ini akan sesuai dengan anda, jika tidak, saya cadangkan untuk meneruskannya.

olegfedoseev/pinba-influxdb (Jun 2018)

pelayan udp dalam perjalanan, dari yang sama habrowser, yang kali ini menyimpan metrik dalam InfluxDB. Banyak projek sudah menggunakan InfluxDB untuk pemantauan, jadi penyelesaian ini mungkin sesuai untuk mereka.

Kelebihan:

  • InfluxDB membolehkan agregat metrik yang diterima dan padamkan metrik asal selepas masa yang ditetapkan.

Cons:

ClickHouse-Ninja/Proton (Januari 2019)

pelayan udp dalam perjalanan, yang menjimatkan metrik dalam ClickHouse. Ini adalah penyelesaian kawan saya. Selepas berkenalan dengannya, saya memutuskan bahawa sudah tiba masanya untuk mengambil Pinbu dan Clickhouse.

Kelebihan:

  • Clickhouse sesuai untuk tugasan sedemikian; ia membolehkan anda memampatkan data dengan begitu banyak sehingga anda boleh menyimpan semua data mentah walaupun tanpa pengagregatan
  • jika perlu, anda boleh mengagregatkan metrik yang terhasil dengan mudah
  • templat siap sedia untuk grafana
  • menyimpan maklumat pada pemasa

Cons:

  • Kesilapan besar
  • tiada konfigurasi di mana anda boleh mengkonfigurasi nama pangkalan data dan jadual, alamat dan port pelayan.
  • apabila menyimpan data mentah, jadual kamus tambahan digunakan untuk menyimpan alamat halaman dan domain, yang merumitkan pertanyaan berikutnya
  • perkara kecil lain yang mengikuti dari tolak pertama

pinba-server/pinba-server (April 2019)

pelayan udp dalam php, yang menyimpan metrik dalam ClickHouse. Ini adalah penyelesaian saya, yang merupakan hasil daripada mengenali pinba, ClickHouse dan protobuf. Semasa saya menyusun keseluruhan kumpulan ini, saya menulis "bukti konsep", yang, secara tidak dijangka bagi saya, tidak menggunakan sumber yang ketara (30 MB RAM dan kurang daripada 1% daripada salah satu daripada lapan teras pemproses), jadi saya memutuskan untuk berkongsi dengan orang ramai.

Kelebihannya adalah sama seperti penyelesaian sebelumnya, saya juga menggunakan nama biasa dari pinba_engine asal. Saya juga menambah konfigurasi yang membolehkan anda melancarkan beberapa contoh pelayan pangkalan pin sekaligus untuk menyimpan metrik dalam jadual yang berbeza - ini berguna jika anda ingin mengumpul data bukan sahaja dari php, tetapi juga dari nginx.
Kelemahan - "kecacatan maut" dan perkara kecil yang tidak sesuai dengan anda secara peribadi, tetapi penyelesaian saya adalah "semudah selipar" dan hanya terdiri daripada kira-kira 100 baris kod, jadi mana-mana pembangun PHP boleh mengubah perkara yang dia tidak suka dalam beberapa minit.

Prinsip operasi

UDP port 30002 didengari. Semua paket masuk dinyahkod mengikut skema protobuf dan diagregatkan. Sekali seminit, satu paket dimasukkan ke dalam rumah klik ke dalam jadual pinba.requests. (semua parameter dikonfigurasikan dalam konfigurasi)

Sedikit tentang clickhouse

Clickhouse menyokong enjin storan data yang berbeza. Yang paling biasa digunakan ialah MergeTree.

Jika pada satu ketika anda memutuskan untuk menyimpan data agregat untuk sepanjang masa, dan data mentah hanya untuk yang terakhir, maka anda boleh membuat paparan terwujud dengan pengumpulan dan membersihkan jadual pinba.requests utama secara berkala, sementara semua data akan kekal dalam pandangan terwujud. Selain itu, apabila membuat jadual pinba.requests, anda boleh menentukan "enjin = Null", maka data mentah tidak akan disimpan ke cakera sama sekali, dan pada masa yang sama ia masih akan berakhir dalam paparan terwujud dan disimpan secara agregat . Saya menggunakan skema ini untuk metrik nginx, kerana pada nginx saya mempunyai 50 kali lebih banyak permintaan daripada pada php.

Jadi, anda telah pergi jauh dan saya tidak mahu meninggalkan anda separuh jalan, jadi yang berikut ialah penerangan terperinci mengenai pemasangan dan konfigurasi penyelesaian saya dan semua yang anda perlukan, serta perangkap yang telah menyebabkan lebih daripada satu kapal untuk terhempas. Keseluruhan proses pemasangan diterangkan untuk Ubuntu 18.04 LTS dan Centos 7; proses mungkin berbeza sedikit pada pengedaran dan versi lain.

Pemasangan

Saya meletakkan semua arahan yang diperlukan Dockerfile untuk memudahkan kebolehulangan arahan. Hanya perangkap yang akan diterangkan di bawah.

php-pinba

Selepas pemasangan, pastikan bahawa dalam fail /etc/php/7.2/fpm/conf.d/20-pinba.ini anda telah menyahkomen semua pilihan. Pada sesetengah pengedaran (cth centos) ia boleh diulas.

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

clickhouse

Semasa pemasangan, clickhouse akan meminta anda menetapkan kata laluan untuk pengguna lalai. Secara lalai, pengguna ini boleh diakses daripada semua IP, jadi jika anda tidak mempunyai tembok api pada pelayan anda, pastikan anda menetapkan kata laluan untuknya. Ini juga boleh dilakukan selepas pemasangan dalam fail /etc/clickhouse-server/users.xml.

Perlu juga diperhatikan bahawa clickhouse menggunakan beberapa port, termasuk 9000. Port ini juga digunakan untuk php-fpm dalam beberapa pengedaran (contohnya, centos). Jika anda sudah menggunakan port ini, anda boleh menukarnya kepada yang lain dalam fail /etc/clickhouse-server/config.xml.

grafana dengan pemalam clickhouse

Selepas memasang Grafana, gunakan pentadbir log masuk dan pentadbir kata laluan. Apabila anda log masuk buat kali pertama, Grafana akan meminta anda menetapkan kata laluan baharu.

Seterusnya, pergi ke β€œ+” -> menu import dan nyatakan nombor papan pemuka untuk import 10011. Saya menyediakan dan memuat naik papan pemuka ini supaya anda tidak perlu melakukannya sendiri lagi.

Grafana menyokong bekerja dengan clickhouse melalui pemalam pihak ketiga, tetapi Grafana tidak mempunyai makluman untuk pemalam pihak ketiga (telah ada tiket untuk ini selama beberapa tahun).

pinba-server

Memasang protobuf dan libevent adalah pilihan, tetapi meningkatkan prestasi pelayan pinba. Jika anda memasang pinba-server dalam folder selain /opt, maka anda juga perlu membetulkan skrip systemd fail.

modul pinba untuk nginx

Untuk menyusun modul, anda memerlukan kod sumber versi nginx yang sama yang telah dipasang pada pelayan anda, serta pilihan kompilasi yang sama, jika tidak binaan akan berjaya, tetapi apabila menyambungkan modul, ralat akan dilemparkan "modul itu tidak serasi binari." Pilihan kompilasi boleh dilihat menggunakan perintah nginx -V

Peretasan hidup

Semua tapak saya berfungsi hanya pada https. Medan skema menjadi tidak bermakna, jadi saya menggunakannya untuk memisahkan web/konsol.

Dalam skrip yang boleh diakses dari web yang saya gunakan:

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

Dan dalam skrip konsol (contohnya, skrip cron):

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

Dalam papan pemuka saya di Grafana terdapat suis web/konsol untuk melihat statistik secara berasingan.

Anda juga boleh menghantar teg anda ke Pinba, contohnya:

pinba_tag_set('country', $countryCode);

Itu sahaja.

Sila jawab tinjauan pendapat di bawah artikel.

Seperti biasa, saya memberi amaran kepada anda bahawa saya tidak menasihati atau membantu melalui mesej peribadi di Habr dan rangkaian sosial.

Buat tiket di Github.

Juga sila menyokong dengan suka versi Bahasa Inggeris artikel ini pada reddit.

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.

OS apa yang anda gunakan pada pelayan?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • Kejayaan

  • Unix

  • Windows

  • lain

114 pengguna mengundi. 11 pengguna berpantang.

Apakah versi php yang anda gunakan pada pelayan?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • lain

105 pengguna mengundi. 17 pengguna berpantang.

Adakah anda pernah menggunakan pinba?

  • ya

  • tidak, tetapi saya mahu

  • tidak dan saya tidak mahu

  • tidak dan tidak pernah mendengar tentang dia

100 pengguna mengundi. 14 pengguna berpantang.

Versi pelayan Pinba yang manakah anda ingin cuba?

  • pinba_engine (enjin mysql)

  • pinba2 (enjin mysql)

  • papan pin (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

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

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

  • Saya akan menulis saya sendiri

  • lain

39 pengguna mengundi. 47 pengguna berpantang.

Sumber: www.habr.com

Tambah komen