Statistiche e monitoraggio degli script PHP in tempo reale. ClickHouse e Grafana vengono in aiuto di Pinba

In questo articolo ti spiegherò come utilizzare pinba con clickhouse e grafana invece di pinba_engine e pinboard.

In un progetto PHP, pinba è forse l'unico modo affidabile per capire cosa sta succedendo con le prestazioni. È vero, Pinba viene solitamente implementato solo quando si sono già osservati problemi e non è chiaro "dove scavare".

Spesso nessuno ha idea di quante volte al secondo/minuto viene chiamato questo o quello script e cominciano a ottimizzare “al tocco”, partendo da quei posti che sembrano più logici.

Alcuni analizzano i log nginx, mentre altri analizzano le query lente del database.

Naturalmente, il pinba non sarebbe superfluo, ma ci sono diversi motivi per cui non tutti i progetti ne sono dotati.

Statistiche e monitoraggio degli script PHP in tempo reale. ClickHouse e Grafana vengono in aiuto di Pinba

E il primo motivo è l'installazione.

Per ottenere più o meno una sorta di "esaurimento" dall'implementazione di Pinba, è molto auspicabile vedere le metriche non solo per gli ultimi minuti, ma anche per un lungo periodo di tempo (da giorni a mesi).

Per fare ciò:

  • installa l'estensione per php (e potresti volere un modulo per nginx)
  • compilare l'estensione per mysql
  • installa la bacheca e configura cron

A causa delle poche informazioni su Pinba, molte persone hanno l'impressione che funzioni solo su PHP5 e che sia ormai una cosa del passato, ma come vedremo più avanti non è così.

Il primo passo è il più semplice, tutto quello che devi fare è eseguire il comando:

apt install php-pinba

Questa estensione è disponibile nei repository fino a php 7.3 incluso e non è necessario compilare nulla.

Dopo aver eseguito il comando di installazione, riceviamo immediatamente un'estensione funzionante che raccoglie e invia le metriche per ogni script (tempo di esecuzione, memoria, ecc.) nel formato protobuff tramite udp a 127.0.0.1:30002.

Finora nessuno è riuscito a catturare o elaborare questi pacchetti UDP, ma ciò non influisce in alcun modo negativamente sulla velocità o sulla stabilità dei tuoi script PHP.

Fino a poco tempo fa, l'unica applicazione in grado di catturare ed elaborare questi pacchetti UDP era pinba_engine. Descrizione "semplice e conciso" L'installazione scoraggia il desiderio di leggerlo e approfondirlo di nuovo. Gli elenchi di dipendenze lunghi un chilometro contengono sia i nomi dei pacchetti che i nomi dei programmi e collegamenti a singole pagine con la loro installazione, e questi hanno i propri collegamenti ad altre dipendenze. Nessuno ha il tempo o la voglia di affrontare questa schifezza.

Processo di installazione pinba2 non lo fece particolarmente più facile.

Forse un giorno sarà possibile installare pinba10 con uno o due comandi e non dover leggere un sacco di materiale per capire come farlo, ma per ora non è così.

Se installi pinba_engine, questa è solo metà della battaglia. Dopotutto, senza pinboard dovrai limitarti ai dati degli ultimi minuti oppure dovrai aggregare, archiviare e visualizzare i dati tu stesso. È positivo che la bacheca sia abbastanza semplice da usare installazione.

Sembrerebbe, perché tanta sofferenza se tutte le metriche di php sono già inviate alla porta udp in formato protobuf e tutto ciò che serve è scrivere un'applicazione che le catturi e le inserisca in una sorta di archivio? A quanto pare, gli sviluppatori che hanno avuto questa idea si sono immediatamente seduti per scrivere le proprie idee, alcune delle quali sono finite su GitHub.

Quella che segue è una panoramica di quattro progetti open source che salvano le metriche nello spazio di archiviazione, da cui questi dati possono essere facilmente recuperati e visualizzati, ad esempio, utilizzando grafana.

olegfedoseev/pinba-server (novembre 2017)

server udp in movimento che salva le metriche su OpenTSDB. Forse se stai già utilizzando OpenTSDB nel tuo progetto, questa soluzione sarà adatta a te, altrimenti ti consiglio di passarla.

olegfedoseev/pinba-influxdb (giugno 2018)

server udp in movimento, dallo stesso habrowser, che questa volta memorizza le metriche in InfluxDB. Molti progetti utilizzano già InfluxDB per il monitoraggio, quindi questa soluzione potrebbe essere perfetta per loro.

pro:

  • InflussoDB permette aggregare le metriche ricevute ed eliminare l'originale dopo un tempo specificato.

contro:

Fare clic su House-Ninja/Proton (Gennaio 2019)

server udp in movimento, che salva le metriche in ClickHouse. Questa è la soluzione del mio amico. È stato dopo averlo conosciuto che ho deciso che era giunto il momento di affrontare Pinbu e Clickhouse.

pro:

  • Clickhouse è l'ideale per tali compiti; ti consente di comprimere i dati così tanto da poter archiviare tutti i dati grezzi anche senza aggregazioni
  • se necessario, puoi facilmente aggregare le metriche risultanti
  • modello già pronto per grafana
  • salva le informazioni sui timer

contro:

  • difetto fatale
  • non esiste una configurazione in cui è possibile configurare il nome del database e delle tabelle, l'indirizzo e la porta del server.
  • quando si memorizzano i dati grezzi, viene utilizzata una tabella del dizionario ausiliario per memorizzare gli indirizzi di pagina e dominio, il che complica le query successive
  • altre piccole cose che seguono dal primo meno

pinba-server/pinba-server (aprile 2019)

server udp in php, che salva le metriche in ClickHouse. Questa è la mia soluzione, che è il risultato della conoscenza di pinba, ClickHouse e protobuf. Mentre sistemavo tutto questo gruppo, ho scritto una "prova di concetto" che, inaspettatamente per me, non ha consumato risorse significative (30 MB di RAM e meno dell'1% di uno degli otto core del processore), quindi ho ha deciso di condividerlo con il pubblico.

I vantaggi sono gli stessi della soluzione precedente, ho utilizzato anche i soliti nomi dell'originale pinba_engine. Ho anche aggiunto una configurazione che ti consente di avviare più istanze del server pinbase contemporaneamente per salvare le metriche in tabelle diverse: questo è utile se vuoi raccogliere dati non solo da php, ma anche da nginx.
Svantaggi: "difetto fatale" e quelle piccole cose che non ti si addicono personalmente, ma la mia soluzione è "semplice come una pantofola" e consiste di solo circa 100 righe di codice, quindi qualsiasi sviluppatore PHP può modificare ciò che non gli piace in un paio di minuti.

Come funziona

Viene ascoltata la porta UDP 30002. Tutti i pacchetti in entrata vengono decodificati secondo lo schema protobuf e aggregati. Una volta al minuto, un pacchetto viene inserito nella clickhouse della tabella pinba.requests. (tutti i parametri sono configurati in config)

Un po' di clickhouse

Clickhouse supporta diversi motori di archiviazione dati. Quello più comunemente usato è MergeTree.

Se a un certo punto decidi di archiviare i dati aggregati per sempre e i dati grezzi solo per l'ultimo, puoi creare una vista materializzata con raggruppamento e pulire periodicamente la tabella pinba.requests principale, mentre tutti i dati rimarranno nella visione materializzata. Inoltre, quando si crea la tabella pinba.requests, è possibile specificare "engine = Null", quindi i dati grezzi non verranno affatto salvati su disco e allo stesso tempo finiranno comunque nella vista materializzata e verranno salvati aggregati . Utilizzo questo schema per le metriche nginx, perché su nginx ho 50 volte più richieste che su php.

Quindi, hai fatto molta strada e non vorrei lasciarti a metà strada, quindi quello che segue è una descrizione dettagliata dell'installazione e della configurazione della mia soluzione e di tutto ciò di cui hai bisogno, nonché le insidie ​​che hanno causato più di una nave fare un incidente. L'intero processo di installazione è descritto per Ubuntu 18.04 LTS e Centos 7; il processo potrebbe differire leggermente su altre distribuzioni e versioni.

Installazione

Ho inserito tutti i comandi necessari Dockerfile per facilitare la riproducibilità delle istruzioni. Di seguito verranno descritte solo le insidie.

php-pinba

Dopo l'installazione, assicurati di aver decommentato tutte le opzioni nel file /etc/php/7.2/fpm/conf.d/20-pinba.ini. Su alcune distribuzioni (es. Centos) potrebbero essere commentati.

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

clickhouse

Durante l'installazione, clickhouse ti chiederà di impostare una password per l'utente predefinito. Per impostazione predefinita, questo utente è accessibile da tutti gli IP, quindi se non disponi di un firewall sul tuo server, assicurati di impostare una password per esso. Questo può essere fatto anche dopo l'installazione nel file /etc/clickhouse-server/users.xml.

Vale anche la pena notare che clickhouse utilizza diverse porte, inclusa la 9000. Questa porta viene utilizzata anche per php-fpm in alcune distribuzioni (ad esempio centos). Se usi già questa porta, puoi cambiarla con un'altra nel file /etc/clickhouse-server/config.xml.

grafana con plugin clickhouse

Dopo aver installato Grafana, utilizza l'amministratore di accesso e la password admin. Al primo accesso Grafana ti chiederà di impostare una nuova password.

Successivamente, vai al menu “+” -> importa e indica il numero della dashboard per l'importazione 10011. Ho preparato e caricato questa dashboard in modo che tu non debba farlo di nuovo da solo.

Grafana supporta il lavoro con clickhouse tramite un plug-in di terze parti, ma Grafana non dispone di avvisi per plug-in di terze parti (esiste un ticket per questo da diversi anni).

pinba-server

L'installazione di protobuf e libevent è facoltativa, ma migliora le prestazioni del server pinba. Se installi pinba-server in una cartella diversa da /opt, dovrai anche correggere script systemd file.

modulo pinba per nginx

Per compilare un modulo, sono necessari i codici sorgente della stessa versione di nginx già installata sul tuo server, nonché le stesse opzioni di compilazione, altrimenti la compilazione avrà successo, ma quando si collega il modulo verrà generato un errore che "il modulo non è compatibile a livello binario." Le opzioni di compilazione possono essere visualizzate utilizzando il comando nginx -V

Trucchi per la vita

Tutti i miei siti funzionano solo su https. Il campo schema diventa privo di significato, quindi lo utilizzo per separare web/console.

Negli script accessibili dal web utilizzo:

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

E negli script della console (ad esempio, gli script cron):

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

Nella mia dashboard in Grafana è presente un commutatore web/console per visualizzare separatamente le statistiche.

Puoi anche inviare i tuoi tag a Pinba, ad esempio:

pinba_tag_set('country', $countryCode);

È tutto.

Si prega di rispondere ai sondaggi sotto l'articolo.

Come al solito vi avverto che non consiglio né aiuto tramite messaggi personali su Habr e sui social network.

Crea un ticket su Github.

Si prega inoltre di supportare con i Mi piace Versione inglese questo articolo su Reddit.

Solo gli utenti registrati possono partecipare al sondaggio. AccediPer favore.

Che sistema operativo stai utilizzando sul server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SVIZZERA

  • Unix

  • Windows

  • altro

114 utenti hanno votato. 11 utenti si sono astenuti.

Che versione di php stai utilizzando sul server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • altro

105 utenti hanno votato. 17 utenti si sono astenuti.

Hai mai usato Pinba?

  • no, ma mi piacerebbe

  • no e non vorrei

  • no e non ne ho sentito parlare

100 utenti hanno votato. 14 utenti si sono astenuti.

Quale versione del server Pinba vorresti provare?

  • pinba_engine (motore mysql)

  • pinba2 (motore mysql)

  • bacheca (php + mysql)

  • olegfedoseev/pinba-server (vai + OpenTSDB)

  • olegfedoseev/pinba-influxdb (vai + influxdb)

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

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

  • Scriverò il mio io stesso

  • altro

39 utenti hanno votato. 47 utenti si sono astenuti.

Fonte: habr.com

Aggiungi un commento