A PHP szkriptek statisztikái és monitorozása valós időben. A ClickHouse és a Grafana a Pinba segítségére siet

Ebben a cikkben elmondom, hogyan kell használni a pinbát a clickhouse-szal és a grafanával a pinba_engine és a pinboard helyett.

Egy PHP-projektben a pinba talán az egyetlen megbízható módja annak, hogy megértsük, mi történik a teljesítménnyel. Igaz, a pinba rendszerint csak akkor kerül bevezetésre, ha már észlelték a problémákat, és nem világos, „hol kell ásni”.

Gyakran senkinek fogalma sincs, hogy másodpercenként hányszor hívják meg ezt vagy azt a szkriptet, és elkezdenek „érintéssel” optimalizálni, azoktól a helyektől kezdve, amelyek logikusabbnak tűnnek.

Egyesek elemzik az nginx naplókat, míg mások lassú adatbázis-lekérdezéseket.

Természetesen a pinba nem lenne felesleges, de több oka is van annak, hogy nem minden projektben van ilyen.

A PHP szkriptek statisztikái és monitorozása valós időben. A ClickHouse és a Grafana a Pinba segítségére siet

És az első ok a telepítés.

Ahhoz, hogy többé-kevésbé kimerüljön a Pinba megvalósítása, nagyon kívánatos, hogy ne csak az utolsó percekre, hanem hosszú időre (napoktól hónapokig) lássuk a mutatókat.

Ehhez szükség van:

  • telepítse a php kiterjesztését (és lehet, hogy szeretne egy modult az nginx-hez)
  • fordítási kiterjesztés a mysql-hez
  • telepítse a pinboardot és konfigurálja a cront

A Pinba-val kapcsolatos kevés információ miatt sokaknak az a benyomása, hogy csak PHP5-ön működött, és már régóta a múlté, de mint később látni fogjuk, ez nem így van.

Az első lépés a legegyszerűbb, mindössze annyit kell tennie, hogy futtassa a parancsot:

apt install php-pinba

Ez a kiterjesztés a php 7.3-ig bezárólag elérhető a tárolókban, és nem kell semmit fordítania.

A telepítési parancs végrehajtása után azonnal kapunk egy működő bővítményt, amely összegyűjti és elküldi a metrikákat minden szkripthez (futási idő, memória stb.) formátumban protobuf udp-n keresztül 127.0.0.1:30002-re.

Eddig még senki nem fogta vagy dolgozta fel ezeket az UDP-csomagokat, de ez semmilyen módon nem befolyásolja negatívan a PHP-szkriptek sebességét vagy stabilitását.

Egészen a közelmúltig az egyetlen alkalmazás, amely el tudta fogni és feldolgozni ezeket az UDP-csomagokat, az volt pinba_motor. Leírás "egyszerű és tömörAz installáció elriasztja a vágyat, hogy valaha is újra olvassunk és elmélyedjünk benne. A függőségek kilométeres listái tartalmazzák a csomagok és a programok neveit és az egyes oldalakra mutató hivatkozásokat a telepítéssel együtt, és ezeknek megvan a saját hivatkozása más függőségekre. Senkinek nincs ideje vagy kedve ezzel a szarsággal foglalkozni.

Telepítési folyamat pinba2 nem főleg könnyebb.

Talán egyszer sikerül majd telepíteni a pinba10-et egy vagy két paranccsal, és nem kell egy csomó anyagot elolvasni ahhoz, hogy megértsük, hogyan kell csinálni, de egyelőre nem ez a helyzet.

Ha telepíti a pinba_engine-t, akkor ez csak a csata fele. Végül is anélkül hirdetőtábla Önnek csak az utolsó néhány perc adataira kell korlátoznia magát, vagy magának kell összesítenie, tárolnia és megjelenítenie az adatokat. Még jó, hogy a pinboard használata meglehetősen egyszerű telepítés.

Úgy tűnik, minek ez a szenvedés, ha a php összes mérőszáma már protobuf formátumban elküldésre kerül az udp portra, és csak egy alkalmazást kell írni, amely elkapja őket, és valamilyen tárolóba helyezi őket? Úgy tűnik, azok a fejlesztők, akik kitalálták ezt az ötletet, azonnal leültek, hogy megírják saját ötleteiket, amelyek egy része a GitHubon kötött ki.

Az alábbiakban négy olyan nyílt forráskódú projektet mutatunk be, amelyek tárhelyen mentik a mérőszámokat, amelyekből ezek az adatok könnyen lekérhetők és megjeleníthetők, például a grafana segítségével.

olegfedoseev/pinba-szerver (2017. november)

Az udp szerver folyamatban van, amely a mutatókat az OpenTSDB-be menti. Talán, ha már OpenTSDB-t használ a projektjében, akkor ez a megoldás megfelel Önnek, ellenkező esetben azt javaslom, hagyja el.

olegfedoseev/pinba-influxdb (2018. június)

udp szerver útközben, ugyanonnan habrowser, amely ezúttal az InfluxDB-ben tárolja a mutatókat. Sok projekt már használja az InfluxDB-t a monitorozáshoz, így ez a megoldás tökéletes lehet számukra.

Előnyök:

  • InfluxDB lehetővé teszi összesítse a kapott mérőszámokat, és meghatározott idő után törölje az eredetit.

Hátrányok:

ClickHouse-Ninja/Proton (2019. január)

udp szerver útközben, amely elmenti a mutatókat a ClickHouse-ban. Ez a barátom megoldása. Miután megismerkedtem vele, úgy döntöttem, hogy ideje felvenni a Pinbu-t és a Clickhouse-t.

Előnyök:

  • A Clickhouse ideális az ilyen feladatokhoz, lehetővé teszi az adatok annyira tömörítését, hogy az összes nyers adatot akár összesítés nélkül is tárolhatja.
  • ha szükséges, könnyen összesítheti a kapott mutatókat
  • kész sablon a grafana számára
  • információkat ment az időzítőkre

Hátrányok:

  • végzetes hiba
  • Nincs olyan konfiguráció, amelyben beállíthatná az adatbázis és a táblák nevét, a szerver címét és portját.
  • nyers adatok tárolásakor egy segédszótári táblázatot használnak az oldal- és tartománycímek tárolására, ami megnehezíti a későbbi lekérdezéseket
  • egyéb apróságok, amelyek az első mínuszból következnek

pinba-szerver/pinba-szerver (2019. április)

udp szerver php-ben, amely a ClickHouse-ba menti a mutatókat. Ez az én megoldásom, ami a pinba, a ClickHouse és a protobuf megismerésének eredménye. Amíg ezt az egész csomót rendeztem, írtam egy "proof of concept"-et, ami számomra váratlanul nem emésztett fel jelentős erőforrásokat (30 MB RAM és a nyolc processzormagból kevesebb, mint 1%-a), így úgy döntött, hogy megosztja a nyilvánossággal.

Az előnyök ugyanazok, mint az előző megoldásnál, én is az eredeti pinba_engine-ből megszokott neveket használtam. Hozzáadtam egy konfigurációt is, amivel egyszerre több pinbase szerverpéldányt is elindíthatsz, hogy a mérőszámokat különböző táblákba mentsd – ez akkor hasznos, ha nem csak php-ről, hanem nginx-ről is szeretnél adatokat gyűjteni.
Hátrányok - „végzetes hiba” és azok az apróságok, amelyek személy szerint nem fognak megfelelni, de az én megoldásom „egyszerű, mint egy papucs”, és mindössze 100 sornyi kódból áll, így bármely PHP fejlesztő megváltoztathatja azt, ami nem tetszik neki. pár perc múlva.

Működési elv

A 30002-es UDP portot figyelik, minden bejövő csomagot a protobuf séma szerint dekódolnak és összesítenek. Percenként egyszer egy csomag bekerül a clickhouse-ba a pinba.requests táblába. (minden paraméter be van állítva config)

Egy kicsit a clickhouse-ról

A Clickhouse különböző adattároló motorokat támogat. A leggyakrabban használt a MergeTree.

Ha egy bizonyos ponton úgy dönt, hogy az összesített adatokat minden időre, a nyers adatokat pedig csak az utolsóra tárolja, akkor létrehozhat egy materializált nézetet csoportosítással, és rendszeresen tisztíthatja a fő pinba.requests táblát, miközben minden adat a megvalósult nézet. Sőt, a pinba.requests tábla létrehozásakor megadhatja, hogy „motor = Null”, akkor a nyers adatok egyáltalán nem kerülnek lemezre, ugyanakkor továbbra is a materializált nézetbe kerülnek, és összesítve kerülnek mentésre. . Ezt a sémát használom az nginx metrikákhoz, mert nginx-en 50-szer több kérésem van, mint php-n.

Tehát hosszú utat tett meg, és nem szeretném félúton hagyni, ezért az alábbiakban részletes leírást adunk a megoldásom telepítéséről és konfigurációjáról, valamint mindenről, amire szüksége van, valamint azokat a buktatókat, amelyek több hajót okoztak. összetörni. A teljes telepítési folyamat az Ubuntu 18.04 LTS és a Centos 7 esetében le van írva; a folyamat némileg eltérhet más disztribúcióktól és verzióktól.

Telepítés

Minden szükséges parancsot megadtam dockerfile az utasítások reprodukálhatóságának megkönnyítése érdekében. Az alábbiakban csak a buktatókat ismertetjük.

php-pinba

A telepítés után győződjön meg arról, hogy az /etc/php/7.2/fpm/conf.d/20-pinba.ini fájlban az összes beállítás megjegyzését törölte. Egyes disztribúcióknál (pl. centos) ki lehet kommentelni.

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

clickhouse

A telepítés során a clickhouse meg fogja kérni, hogy állítson be jelszót az alapértelmezett felhasználóhoz. Alapértelmezés szerint ez a felhasználó minden IP-címről elérhető, ezért ha nincs tűzfal a szerveren, feltétlenül állítson be jelszót. Ezt a telepítés után is megteheti az /etc/clickhouse-server/users.xml fájlban.

Azt is érdemes megjegyezni, hogy a clickhouse több portot használ, köztük a 9000-et. Ezt a portot a php-fpm-hez is használják bizonyos disztribúciókban (például centos). Ha már használja ezt a portot, módosíthatja egy másikra az /etc/clickhouse-server/config.xml fájlban.

grafana a clickhouse beépülő modullal

A Grafana telepítése után használja a bejelentkezési adminisztrátort és az admin jelszót. Amikor először jelentkezik be, a Grafana új jelszó megadását kéri.

Ezután lépjen a „+” -> importálás menübe, és adja meg az importáláshoz tartozó irányítópult számát 10011. Elkészítettem és feltöltöttem ezt az irányítópultot, hogy ne kelljen újra megtenned.

A Grafana támogatja a clickhouse-szal való munkát egy harmadik féltől származó beépülő modulon keresztül, de a Grafana nem figyelmeztet a harmadik féltől származó bővítményekre (erre több éve van jegy).

pinba-szerver

A protobuf és a libevent telepítése nem kötelező, de javítja a pinba-szerver teljesítményét. Ha a pinba-servert nem /opt mappába telepíti, akkor szintén ki kell javítania systemd szkript fájlt.

Pinba modul nginx-hez

Modul lefordításához szükség van az nginx ugyanazon verziójának forráskódjaira, amely már telepítve van a szervereden, valamint ugyanazokra a fordítási lehetőségekre, különben a build sikeres lesz, de a modul csatlakoztatásakor hibaüzenet jelenik meg "a modul nem bináris kompatibilis." A fordítási beállítások az nginx -V paranccsal tekinthetők meg

Trükkök az élethez

Minden webhelyem csak https-en működik. A séma mező értelmetlenné válik, ezért a web/konzol szétválasztására használom.

Az általam internetről elérhető szkriptekben:

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

És konzol szkriptekben (például cron szkriptekben):

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

A Grafana műszerfalamon van egy web/konzol kapcsoló a statisztikák külön megtekintésére.

A címkéket a Pinbának is elküldheti, például:

pinba_tag_set('country', $countryCode);

Ennyi az egész.

Kérjük, válaszoljon a cikk alatti szavazásokra.

Szokás szerint figyelmeztetem, hogy nem tanácsolom és nem segítek személyes üzenetekkel a Habron és a közösségi oldalakon.

Hozzon létre jegyet a Githubon.

Kérlek támogass egy like-al is angol verzió ez a cikk a redditen.

A felmérésben csak regisztrált felhasználók vehetnek részt. Bejelentkezés, kérem.

Milyen operációs rendszert használsz a szerveren?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SVÁJC

  • Unix

  • Windows

  • más

114 felhasználó szavazott. 11 felhasználó tartózkodott.

Milyen php verziót használsz a szerveren?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • más

105 felhasználó szavazott. 17 felhasználó tartózkodott.

Használtál már pinbát?

  • igen

  • nem, de szeretném

  • nem és nem is szeretném

  • nem, és nem is hallottam róla

100 felhasználó szavazott. 14 felhasználó tartózkodott.

A Pinba szerver melyik verzióját szeretnéd kipróbálni?

  • pinba_engine (mysql motor)

  • pinba2 (mysql motor)

  • pinboard (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

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

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

  • Megírom az enyémet

  • más

39 felhasználó szavazott. 47 felhasználó tartózkodott.

Forrás: will.com

Hozzászólás