PHP betiklerinin gerçek zamanlı istatistikleri ve izlenmesi. ClickHouse ve Grafana Pinba'nın yardımına koşuyor

Bu yazımda pinba_engine ve pinboard yerine clickhouse ve grafana ile pinbanın nasıl kullanılacağını anlatacağım.

Bir PHP projesinde pinba belki de performansta neler olduğunu anlamanın tek güvenilir yoludur. Doğru, pinba genellikle yalnızca sorunlar zaten gözlemlendiğinde ve "nereyi kazacağı" belli olmadığında uygulanır.

Çoğu zaman hiç kimsenin şu veya bu komut dosyasının saniyede/dakikada kaç kez çağrıldığına dair bir fikri yoktur ve daha mantıklı görünen yerlerden başlayarak "dokunarak" optimizasyona başlarlar.

Bazıları nginx günlüklerini analiz ederken diğerleri yavaş veritabanı sorgularını analiz eder.

Elbette pinba gereksiz olmayacaktır, ancak her projede pinba olmamasının birkaç nedeni vardır.

PHP betiklerinin gerçek zamanlı istatistikleri ve izlenmesi. ClickHouse ve Grafana Pinba'nın yardımına koşuyor

Ve ilk sebep kurulumdur.

Pinba'nın uygulanmasından az çok bir tür "yorgunluk" elde etmek için, metriklerin yalnızca son dakikalarda değil, aynı zamanda uzun bir süre boyunca (günlerden aylara) görülmesi çok arzu edilir.

Bunu yapmak için:

  • php için uzantı yükleyin (ve nginx için bir modül isteyebilirsiniz)
  • mysql için derleme uzantısı
  • pinboard'u kurun ve cron'u yapılandırın

Pinba hakkında az miktarda bilgi olması nedeniyle birçok kişi bunun yalnızca PHP5'te çalıştığı ve uzun süredir geçmişte kaldığı izlenimine sahip ancak daha sonra göreceğimiz gibi durum böyle değil.

İlk adım en basitidir, tek yapmanız gereken şu komutu çalıştırmaktır:

apt install php-pinba

Depolarda bu uzantı php 7.3'e kadar mevcuttur ve herhangi bir şey derlemenize gerek yoktur.

Kurulum komutunu yürüttükten sonra, hemen her komut dosyası için metrikleri (çalışma süresi, bellek vb.) biçiminde toplayan ve gönderen bir çalışma uzantısı alırız. Protobuf udp aracılığıyla 127.0.0.1:30002'ye.

Şu ana kadar hiç kimse bu UDP paketlerini yakalamadı veya işlemedi, ancak bu, PHP betiklerinizin hızını veya kararlılığını hiçbir şekilde olumsuz etkilemez.

Yakın zamana kadar bu UDP paketlerini yakalayıp işleyebilen tek uygulama pinba_engine. Tanım "basit ve özlü" Kurulum, onu tekrar okuma ve derinlemesine inceleme arzusunu caydırıyor. Kilometrelerce uzunluktaki bağımlılık listeleri, hem paket adlarını hem de program adlarını ve kurulumlarıyla birlikte ayrı ayrı sayfalara bağlantıları içerir ve bunların diğer bağımlılıklara kendi bağlantıları vardır. Kimsenin bu saçmalıkla uğraşmaya ne zamanı ne de arzusu var.

Yükleme işlemi pinba2 yapmadı özellikle daha kolay.

Belki bir gün pinba10'u bir veya iki komutla kurmak mümkün olacak ve bunun nasıl yapılacağını anlamak için bir sürü materyal okumanıza gerek kalmayacak, ancak şimdilik durum böyle değil.

Eğer pinba_engine'i kurarsanız, bu savaşın sadece yarısıdır. Sonuçta, olmadan pinboard kendinizi yalnızca son birkaç dakikadaki verilerle sınırlamanız gerekecek veya verileri kendiniz toplamanız, depolamanız ve görselleştirmeniz gerekecek. Pinboard'un kullanımının oldukça basit olması iyi Kurulum.

Görünüşe göre, php'deki tüm ölçümler zaten protobuf formatında udp bağlantı noktasına gönderiliyorsa ve ihtiyacınız olan tek şey onları yakalayacak ve bir tür depolamaya koyacak bir uygulama yazmaksa neden bu kadar acı çekiyorsunuz? Görünüşe göre, bu fikri ortaya atan geliştiriciler hemen kendi fikirlerini yazmaya başladılar ve bunların bir kısmı GitHub'a ulaştı.

Aşağıda, metrikleri depoya kaydeden ve bu verilerin örneğin grafana kullanılarak kolayca alınıp görselleştirilebilen dört açık kaynaklı projeye genel bir bakış yer almaktadır.

olegfedoseev/pinba-sunucusu (Kasım 2017)

Ölçümleri OpenTSDB'ye kaydeden hareket halindeki udp sunucusu. Belki projenizde zaten OpenTSDB kullanıyorsanız, bu çözüm size uyacaktır, aksi takdirde geçmenizi öneririm.

olegfedoseev/pinba-influxdb (Haziran 2018)

hareket halindeyken udp sunucusu, aynı yerden tarayıcı, bu sefer metrikleri InfluxDB'de saklıyor. Birçok proje zaten izleme için InfluxDB'yi kullanıyor, dolayısıyla bu çözüm onlar için mükemmel olabilir.

Artıları:

  • AkışDB verir alınan metrikleri toplayın ve orijinali belirli bir süre sonra silin.

Eksileri:

  • Bu çözüm zamanlayıcılara ilişkin bilgileri kaydetmez.
  • InfluxDB, site sayfası adreslerini etiketler olarak saklar ve çok sayıda benzersiz sayfa adresiniz varsa, bu durum aşağıdakilere yol açacaktır: artan tüketim rasgele erişim belleği. Belli bir andan itibaren o "hafızayı deli gibi yemeye başlayacak". (kaynak)

ClickHouse-Ninja/Proton (Ocak 2019)

Ölçümleri ClickHouse'a kaydeden hareket halindeyken udp sunucusu. Bu arkadaşımın çözümü. Onu tanıdıktan sonra Pinbu ve Clickhouse'u ele alma zamanının geldiğine karar verdim.

Artıları:

  • Clickhouse bu tür görevler için idealdir; verileri o kadar sıkıştırmanıza olanak tanır ki, tüm ham verileri toplamalar olmadan bile depolayabilirsiniz;
  • gerekirse ortaya çıkan metrikleri kolayca toplayabilirsiniz
  • grafana için hazır şablon
  • zamanlayıcılarla ilgili bilgileri kaydeder

Eksileri:

  • ölümcül kusur
  • veritabanı ve tabloların adını, sunucunun adresini ve bağlantı noktasını yapılandırabileceğiniz bir yapılandırma yoktur.
  • Ham verileri depolarken, sayfa ve etki alanı adreslerini depolamak için yardımcı bir sözlük tablosu kullanılır, bu da sonraki sorguları karmaşık hale getirir
  • ilk eksiden sonra gelen diğer küçük şeyler

pinba-sunucusu/pinba-sunucusu (Nisan 2019)

Metrikleri ClickHouse'a kaydeden php'deki udp sunucusu. Bu benim pinba, ClickHouse ve protobuf'u tanımamın sonucu olan çözümüm. Tüm bunları çözerken, benim için beklenmedik bir şekilde önemli miktarda kaynak (30 MB RAM ve sekiz işlemci çekirdeğinden birinin %1'inden azı) tüketmeyen bir "kavram kanıtı" yazdım. kamuoyuyla paylaşmaya karar verdi.

Avantajları önceki çözümle aynı, ayrıca orijinal pinba_engine'deki olağan isimleri de kullandım. Ayrıca, ölçümleri farklı tablolara kaydetmek için birkaç pinbase sunucusu örneğini aynı anda başlatmanıza olanak tanıyan bir yapılandırma da ekledim - bu, yalnızca php'den değil, aynı zamanda nginx'ten de veri toplamak istiyorsanız kullanışlıdır.
Dezavantajları - "ölümcül kusur" ve kişisel olarak size uymayan küçük şeyler, ancak benim çözümüm "terlik kadar basit" ve yalnızca yaklaşık 100 satır koddan oluşuyor, bu nedenle herhangi bir PHP geliştiricisi hoşlanmadığı şeyi değiştirebilir bir kaç dakika içinde.

Çalışma prensibi

UDP bağlantı noktası 30002 dinlenir. Gelen tüm paketlerin kodu protobuf şemasına göre çözülür ve toplanır. Dakikada bir, clickhouse'un pinba.requests tablosuna bir paket eklenir. (tüm parametreler yapılandırma)

Clickhouse hakkında biraz

Clickhouse farklı veri depolama motorlarını destekler. En sık kullanılanı MergeTree'dir.

Bir noktada toplu verileri tüm zamanlar için ve ham verileri yalnızca son kez saklamaya karar verirseniz, gruplandırmayla somutlaştırılmış bir görünüm oluşturabilir ve ana pinba.requests tablosunu periyodik olarak temizleyebilirsiniz; bu arada tüm veriler Gerçekleştirilmiş görünüm. Ayrıca, pinba.requests tablosunu oluştururken "engine = Null" belirtebilirsiniz, bu durumda ham veriler diske hiç kaydedilmeyecek ve aynı zamanda yine de materyalleştirilmiş görünümde yer alacak ve toplu olarak kaydedilecektir. . Bu şemayı nginx ölçümleri için kullanıyorum çünkü nginx'te php'den 50 kat daha fazla isteğim var.

Yani, uzun bir yol kat ettiniz ve sizi yarı yolda bırakmak istemem. Aşağıda, çözümümün kurulumu ve konfigürasyonu ile ihtiyacınız olan her şeyin yanı sıra birden fazla geminin yol açtığı tuzakların ayrıntılı bir açıklaması yer almaktadır. çarpmak. Kurulum sürecinin tamamı Ubuntu 18.04 LTS ve Centos 7 için açıklanmıştır; süreç diğer dağıtımlara ve sürümlere göre biraz farklılık gösterebilir.

Montaj

Gerekli tüm komutları girdim Dockerfile Talimatların tekrarlanabilirliğini kolaylaştırmak için. Aşağıda yalnızca tuzaklar açıklanacaktır.

php-pinba

Kurulumdan sonra, /etc/php/7.2/fpm/conf.d/20-pinba.ini dosyasında tüm seçeneklerin yorumlarını kaldırdığınızdan emin olun. Bazı dağılımlarda (örneğin cento'larda) bunlar yorum dışı bırakılabilir.

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

tıklama evi

Kurulum sırasında clickhouse sizden varsayılan kullanıcı için bir şifre belirlemenizi isteyecektir. Varsayılan olarak bu kullanıcıya tüm IP'lerden erişilebilir, dolayısıyla sunucunuzda güvenlik duvarı yoksa, bunun için bir şifre ayarladığınızdan emin olun. Bu, /etc/clickhouse-server/users.xml dosyasına kurulumdan sonra da yapılabilir.

Clickhouse'un 9000 de dahil olmak üzere birçok bağlantı noktası kullandığını da belirtmekte fayda var. Bu bağlantı noktası bazı dağıtımlarda (örneğin centos) php-fpm için de kullanılır. Bu bağlantı noktasını zaten kullanıyorsanız, /etc/clickhouse-server/config.xml dosyasında bunu başka bir bağlantı noktasıyla değiştirebilirsiniz.

clickhouse eklentili grafana

Grafana'yı yükledikten sonra oturum açma yöneticisini ve yönetici parolasını kullanın. İlk kez giriş yaptığınızda Grafana sizden yeni bir şifre belirlemenizi isteyecektir.

Daha sonra “+” -> içe aktarma menüsüne gidin ve içe aktarma için kontrol paneli numarasını belirtin 10011. Bir daha kendiniz yapmak zorunda kalmamanız için bu kontrol panelini hazırladım ve yükledim.

Grafana, bir üçüncü taraf eklentisi aracılığıyla clickhouse ile çalışmayı destekler, ancak Grafana'nın üçüncü taraf eklentileri için uyarıları yoktur (bunun için birkaç yıldır bir bilet vardır).

pinba sunucusu

Protobuf ve libevent'in kurulması isteğe bağlıdır ancak pinba-sunucu performansını artırır. Pinba-server'ı /opt dışında bir klasöre kurarsanız, düzeltmeniz de gerekecektir. sistem komut dosyası dosya.

nginx için pinba modülü

Bir modülü derlemek için, sunucunuzda zaten yüklü olan aynı nginx sürümünün kaynak kodlarına ve aynı derleme seçeneklerine ihtiyacınız vardır, aksi takdirde derleme başarılı olur, ancak modülü bağlarken bir hata atılır. “modül ikili uyumlu değil.” Derleme seçenekleri nginx -V komutu kullanılarak görüntülenebilir

hayat hileleri

Tüm sitelerim yalnızca https'de çalışıyor. Şema alanı anlamsız hale geliyor, bu yüzden onu web/konsolu ayırmak için kullanıyorum.

Web'den erişilebilen komut dosyalarında kullanıyorum:

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

Ve konsol komut dosyalarında (örneğin cron komut dosyaları):

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

Grafana'daki kontrol panelimde istatistikleri ayrı ayrı görüntülemek için bir web/konsol anahtarı var.

Etiketlerinizi Pinba'ya da gönderebilirsiniz, örneğin:

pinba_tag_set('country', $countryCode);

Hepsi bu.

Lütfen makalenin altındaki anketleri yanıtlayın.

Her zamanki gibi, Habr ve sosyal ağlardaki kişisel mesajlar yoluyla tavsiyede bulunmadığım veya yardım etmediğim konusunda sizi uyarıyorum.

Github'da bir bilet oluşturun.

Ayrıca lütfen beğenilerle destek olun ingilizce versiyon Bu makalede reddit'te.

Ankete sadece kayıtlı kullanıcılar katılabilir. Giriş yapLütfen.

Sunucuda hangi işletim sistemini kullanıyorsunuz?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • katolik kardinal şapkası

  • Fötr şapka

  • OpenSUSE

  • SUSE

  • Unix

  • Windows

  • diğer

114 kullanıcı oy kullandı. 11 kişi çekimser kaldı.

Sunucuda hangi php sürümünü kullanıyorsunuz?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • diğer

105 kullanıcı oy kullandı. 17 kişi çekimser kaldı.

Pinba'yı hiç kullandın mı?

  • evet

  • Hayır, ama isterim

  • hayır ve istemem

  • hayır ve onu duymadım

100 kullanıcı oy kullandı. 14 kişi çekimser kaldı.

Pinba sunucusunun hangi sürümünü denemek istersiniz?

  • pinba_engine (mysql motoru)

  • pinba2 (mysql motoru)

  • pano (php + mysql)

  • olegfedoseev/pinba-sunucusu (git + OpenTSDB)

  • olegfedoseev/pinba-influxdb (git + akındb)

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

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

  • benimkini kendim yazacağım

  • diğer

39 kullanıcı oy kullandı. 47 kişi çekimser kaldı.

Kaynak: habr.com

Yorum ekle