Στατιστικά στοιχεία και παρακολούθηση σεναρίων PHP σε πραγματικό χρόνο. Οι ClickHouse και Grafana έρχονται να βοηθήσουν την Pinba

Σε αυτό το άρθρο θα σας πω πώς να χρησιμοποιήσετε το pinba με το clickhouse και το grafana αντί για το pinba_engine και το pinboard.

Σε ένα έργο PHP, το pinba είναι ίσως ο μόνος αξιόπιστος τρόπος για να κατανοήσετε τι συμβαίνει με την απόδοση. Είναι αλήθεια ότι το pinba εφαρμόζεται συνήθως μόνο όταν παρατηρούνται ήδη προβλήματα και δεν είναι ξεκάθαρο "πού να σκάψει".

Συχνά κανείς δεν έχει ιδέα πόσες φορές ανά δευτερόλεπτο/λεπτό καλείται αυτό ή εκείνο το σενάριο και αρχίζουν να βελτιστοποιούνται «με την αφή», ξεκινώντας από εκείνα τα μέρη που φαίνονται πιο λογικά.

Μερικοί αναλύουν αρχεία καταγραφής nginx, ενώ άλλοι αναλύουν αργά ερωτήματα βάσης δεδομένων.

Φυσικά, το pinba δεν θα ήταν περιττό, αλλά υπάρχουν αρκετοί λόγοι για τους οποίους δεν το έχει κάθε έργο.

Στατιστικά στοιχεία και παρακολούθηση σεναρίων PHP σε πραγματικό χρόνο. Οι ClickHouse και Grafana έρχονται να βοηθήσουν την Pinba

Και ο πρώτος λόγος είναι η εγκατάσταση.

Για να πάρετε λίγο πολύ κάποιο είδος «εξάτμισης» από την εφαρμογή του Pinba, είναι πολύ επιθυμητό να βλέπετε μετρήσεις όχι μόνο για τα τελευταία λεπτά, αλλά και για μεγάλο χρονικό διάστημα (από ημέρες σε μήνες).

Για αυτό χρειάζεστε:

  • εγκατάσταση επέκτασης για php (και μπορεί να θέλετε μια ενότητα για το nginx)
  • μεταγλώττιση επέκτασης για mysql
  • εγκαταστήστε pinboard και διαμορφώστε το cron

Λόγω του μικρού όγκου πληροφοριών για το Pinba, πολλοί άνθρωποι έχουν την εντύπωση ότι δούλευε μόνο σε PHP5 και αποτελεί εδώ και καιρό παρελθόν, αλλά όπως θα δούμε αργότερα, αυτό δεν ισχύει.

Το πρώτο βήμα είναι το πιο απλό, το μόνο που χρειάζεται να κάνετε είναι να εκτελέσετε την εντολή:

apt install php-pinba

Αυτή η επέκταση είναι διαθέσιμη στα αποθετήρια μέχρι και την php 7.3 και δεν χρειάζεται να μεταγλωττίσετε τίποτα.

Μετά την εκτέλεση της εντολής εγκατάστασης, λαμβάνουμε αμέσως μια επέκταση εργασίας που συλλέγει και στέλνει μετρήσεις για κάθε σενάριο (χρόνος εκτέλεσης, μνήμη κ.λπ.) στη μορφή πρωτόφουφ μέσω udp σε 127.0.0.1:30002.

Μέχρι στιγμής κανείς δεν έχει πιάσει ή επεξεργαστεί αυτά τα πακέτα UDP, αλλά αυτό δεν επηρεάζει με κανέναν τρόπο αρνητικά την ταχύτητα ή τη σταθερότητα των σεναρίων PHP σας.

Μέχρι πρόσφατα, η μόνη εφαρμογή που μπορούσε να πιάσει και να επεξεργαστεί αυτά τα πακέτα UDP ήταν pinba_engine. Περιγραφή "απλό και περιεκτικό"Η εγκατάσταση αποθαρρύνει την επιθυμία να την διαβάσουμε και να την εμβαθύνουμε ξανά. Οι λίστες εξαρτήσεων μήκους χιλιομέτρων περιέχουν τόσο τα ονόματα των πακέτων όσο και τα ονόματα των προγραμμάτων και συνδέσμους προς μεμονωμένες σελίδες με την εγκατάστασή τους, και αυτές έχουν τους δικούς τους συνδέσμους προς άλλες εξαρτήσεις. Κανείς δεν έχει το χρόνο ή την επιθυμία να ασχοληθεί με αυτή τη βλακεία.

Διαδικασία εγκατάστασης pinba2 δεν ιδιαίτερα πιο εύκολο.

Ίσως κάποια μέρα θα είναι δυνατό να εγκαταστήσετε το pinba10 με μία ή δύο εντολές και να μην χρειαστεί να διαβάσετε ένα σωρό υλικό για να καταλάβετε πώς να το κάνετε, αλλά προς το παρόν αυτό δεν ισχύει.

Εάν εγκαταστήσετε το pinba_engine, τότε αυτό είναι μόνο η μισή μάχη. Άλλωστε χωρίς σανίδα θα πρέπει να περιοριστείτε σε δεδομένα μόνο των τελευταίων λεπτών ή θα πρέπει να συγκεντρώσετε, να αποθηκεύσετε και να οπτικοποιήσετε τα δεδομένα μόνοι σας. Είναι καλό ότι το pinboard είναι αρκετά απλό στη χρήση εγκατάσταση.

Φαίνεται, γιατί να ταλαιπωρείται τόσο πολύ αν όλες οι μετρήσεις από την php έχουν ήδη αποσταλεί στη θύρα udp σε μορφή protobuf και το μόνο που χρειάζεστε είναι να γράψετε μια εφαρμογή που θα τις πιάσει και θα τις βάλει σε κάποιο είδος αποθήκευσης; Προφανώς, όσοι προγραμματιστές είχαν αυτή την ιδέα κάθισαν αμέσως να γράψουν τις δικές τους ιδέες, μερικές από τις οποίες κατέληξαν στο GitHub.

Ακολουθεί μια επισκόπηση τεσσάρων έργων ανοιχτού κώδικα που αποθηκεύουν μετρήσεις στον χώρο αποθήκευσης, από τα οποία αυτά τα δεδομένα μπορούν εύκολα να ανακτηθούν και να οπτικοποιηθούν, για παράδειγμα, χρησιμοποιώντας το grafana.

olegfedoseev/pinba-server (Νοέμβριος 2017)

Διακομιστής udp εν κινήσει που αποθηκεύει μετρήσεις στο OpenTSDB. Ίσως αν χρησιμοποιείτε ήδη το OpenTSDB στο έργο σας, τότε αυτή η λύση θα σας ταιριάζει, διαφορετικά σας συνιστώ να το προσπεράσετε.

olegfedoseev/pinba-influxdb (Ιούνιος 2018)

διακομιστής udp εν κινήσει, από τον ίδιο πρόγραμμα περιήγησης, το οποίο αυτή τη φορά αποθηκεύει τις μετρήσεις στο InfluxDB. Πολλά έργα χρησιμοποιούν ήδη το InfluxDB για παρακολούθηση, επομένως αυτή η λύση μπορεί να είναι ιδανική για αυτά.

Πλεονεκτήματα:

  • InfluxDB позволяет συγκεντρώστε τις μετρήσεις που έχετε λάβει και διαγράψτε το πρωτότυπο μετά από ένα καθορισμένο χρονικό διάστημα.

Μειονεκτήματα:

  • Αυτή η λύση δεν αποθηκεύει πληροφορίες σε χρονοδιακόπτες.
  • Το InfluxDB θα αποθηκεύει τις διευθύνσεις σελίδων ιστότοπου ως ετικέτες και εάν έχετε πολλές μοναδικές διευθύνσεις σελίδων, αυτό θα οδηγήσει σε αυξημένη κατανάλωση μνήμη τυχαίας προσπέλασης. Από μια συγκεκριμένη στιγμή "θα αρχίσει να τρώει τη μνήμη σαν τρελός". (πηγή)

ClickHouse-Ninja/Proton (Ιανουάριος 2019)

Διακομιστής udp εν κινήσει, ο οποίος αποθηκεύει μετρήσεις στο ClickHouse. Αυτή είναι η λύση του φίλου μου. Μετά τη γνωριμία με αυτό, αποφάσισα ότι ήρθε η ώρα να αντιμετωπίσω το Pinbu και το Clickhouse.

Πλεονεκτήματα:

  • Το Clickhouse είναι ιδανικό για τέτοιες εργασίες· σας επιτρέπει να συμπιέσετε δεδομένα τόσο πολύ ώστε να μπορείτε να αποθηκεύσετε όλα τα ακατέργαστα δεδομένα ακόμη και χωρίς συναθροίσεις
  • εάν απαιτείται, μπορείτε εύκολα να συγκεντρώσετε τις μετρήσεις που προκύπτουν
  • έτοιμο πρότυπο για grafana
  • αποθηκεύει πληροφορίες σε χρονοδιακόπτες

Μειονεκτήματα:

  • μοιραίο ελάττωμα
  • δεν υπάρχει καμία ρύθμιση στην οποία μπορείτε να διαμορφώσετε το όνομα της βάσης δεδομένων και των πινάκων, τη διεύθυνση και τη θύρα του διακομιστή.
  • κατά την αποθήκευση μη επεξεργασμένων δεδομένων, χρησιμοποιείται ένας βοηθητικός πίνακας λεξικών για την αποθήκευση διευθύνσεων σελίδων και τομέα, γεγονός που περιπλέκει τα επόμενα ερωτήματα
  • άλλα μικροπράγματα που ακολουθούν από το πρώτο μείον

pinba-server/pinba-server (Απρίλιος 2019)

διακομιστής udp σε php, ο οποίος αποθηκεύει μετρήσεις στο ClickHouse. Αυτή είναι η λύση μου, η οποία είναι το αποτέλεσμα της γνωριμίας με το pinba, το ClickHouse και το protobuf. Ενώ τακτοποιούσα όλη αυτή τη δέσμη, έγραψα ένα "proof of concept", το οποίο, απροσδόκητα για μένα, δεν κατανάλωσε σημαντικούς πόρους (30 MB μνήμης RAM και λιγότερο από 1% ενός από τους οκτώ πυρήνες επεξεργαστή). αποφάσισε να το μοιραστεί με το κοινό.

Τα πλεονεκτήματα είναι τα ίδια με την προηγούμενη λύση, χρησιμοποίησα επίσης τα συνήθη ονόματα από το αρχικό pinba_engine. Πρόσθεσα επίσης μια διαμόρφωση που σας επιτρέπει να εκκινήσετε πολλές παρουσίες διακομιστή pinbase ταυτόχρονα για να αποθηκεύσετε μετρήσεις σε διαφορετικούς πίνακες - αυτό είναι χρήσιμο εάν θέλετε να συλλέγετε δεδομένα όχι μόνο από php, αλλά και από nginx.
Μειονεκτήματα - "μοιραίο ελάττωμα" και αυτά τα μικρά πράγματα που δεν σας ταιριάζουν προσωπικά, αλλά η λύση μου είναι "απλή όσο μια παντόφλα" και αποτελείται από μόνο περίπου 100 γραμμές κώδικα, οπότε οποιοσδήποτε προγραμματιστής PHP μπορεί να αλλάξει αυτό που δεν του αρέσει σε λίγα λεπτά.

Αρχή της λειτουργίας

Ακούγεται η θύρα UDP 30002. Όλα τα εισερχόμενα πακέτα αποκωδικοποιούνται σύμφωνα με το σχήμα protobuf και συγκεντρώνονται. Μία φορά το λεπτό, ένα πακέτο εισάγεται στο clickhouse στον πίνακα pinba.requests. (όλες οι παράμετροι έχουν ρυθμιστεί σε config)

Λίγα λόγια για το clickhouse

Το Clickhouse υποστηρίζει διαφορετικές μηχανές αποθήκευσης δεδομένων. Το πιο συχνά χρησιμοποιούμενο είναι το MergeTree.

Εάν κάποια στιγμή αποφασίσετε να αποθηκεύσετε συγκεντρωτικά δεδομένα για πάντα και ανεπεξέργαστα δεδομένα μόνο για το τελευταίο, τότε μπορείτε να δημιουργήσετε μια υλοποιημένη προβολή με ομαδοποίηση και να καθαρίζετε περιοδικά τον κύριο πίνακα pinba.requests, ενώ όλα τα δεδομένα θα παραμείνουν στο υλοποιημένη άποψη. Επιπλέον, κατά τη δημιουργία του πίνακα pinba.requests, μπορείτε να καθορίσετε "engine = Null", τότε τα ακατέργαστα δεδομένα δεν θα αποθηκευτούν καθόλου στο δίσκο και ταυτόχρονα θα εξακολουθούν να καταλήγουν στην υλοποιημένη προβολή και να αποθηκεύονται συγκεντρωτικά . Χρησιμοποιώ αυτό το σχήμα για μετρήσεις nginx, επειδή στο nginx έχω 50 φορές περισσότερα αιτήματα από ό,τι σε php.

Λοιπόν, έχετε κάνει πολύ δρόμο και δεν θα ήθελα να σας αφήσω στη μέση, οπότε αυτό που ακολουθεί είναι μια λεπτομερής περιγραφή της εγκατάστασης και διαμόρφωσης της λύσης μου και όλων όσων χρειάζεστε, καθώς και των παγίδων που έχουν προκαλέσει περισσότερα από ένα πλοία να συγκρουστεί. Η όλη διαδικασία εγκατάστασης περιγράφεται για το Ubuntu 18.04 LTS και το Centos 7· η διαδικασία ενδέχεται να διαφέρει ελαφρώς σε άλλες διανομές και εκδόσεις.

Εγκατάσταση

Έβαλα όλες τις απαραίτητες εντολές Dockerfile για τη διευκόλυνση της αναπαραγωγιμότητας των οδηγιών. Μόνο οι παγίδες θα περιγραφούν παρακάτω.

php-pinba

Μετά την εγκατάσταση, βεβαιωθείτε ότι στο αρχείο /etc/php/7.2/fpm/conf.d/20-pinba.ini έχετε καταργήσει το σχόλιο όλων των επιλογών. Σε ορισμένες διανομές (π.χ. centos) μπορεί να σχολιαστούν.

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

clickhouse

Κατά την εγκατάσταση, το clickhouse θα σας ζητήσει να ορίσετε έναν κωδικό πρόσβασης για τον προεπιλεγμένο χρήστη. Από προεπιλογή, αυτός ο χρήστης είναι προσβάσιμος από όλες τις IP, επομένως εάν δεν έχετε τείχος προστασίας στον διακομιστή σας, φροντίστε να ορίσετε έναν κωδικό πρόσβασης για αυτό. Αυτό μπορεί επίσης να γίνει μετά την εγκατάσταση στο αρχείο /etc/clickhouse-server/users.xml.

Αξίζει επίσης να σημειωθεί ότι το clickhouse χρησιμοποιεί πολλές θύρες, συμπεριλαμβανομένων των 9000. Αυτή η θύρα χρησιμοποιείται επίσης για php-fpm σε ορισμένες διανομές (για παράδειγμα, centos). Εάν χρησιμοποιείτε ήδη αυτήν τη θύρα, μπορείτε να την αλλάξετε σε άλλη στο αρχείο /etc/clickhouse-server/config.xml.

grafana με το πρόσθετο clickhouse

Μετά την εγκατάσταση του Grafana, χρησιμοποιήστε τον διαχειριστή σύνδεσης και τον διαχειριστή κωδικού πρόσβασης. Όταν συνδεθείτε για πρώτη φορά, το Grafana θα σας ζητήσει να ορίσετε νέο κωδικό πρόσβασης.

Στη συνέχεια, μεταβείτε στο μενού "+" -> εισαγωγή και υποδείξτε τον αριθμό του πίνακα εργαλείων για εισαγωγή 10011. Ετοίμασα και ανέβασα αυτόν τον πίνακα ελέγχου για να μην χρειαστεί να το ξανακάνετε μόνοι σας.

Το Grafana υποστηρίζει την εργασία με το clickhouse μέσω μιας προσθήκης τρίτου κατασκευαστή, αλλά το Grafana δεν έχει ειδοποιήσεις για προσθήκες τρίτων (υπάρχει εισιτήριο για αυτό εδώ και αρκετά χρόνια).

διακομιστής pinba

Η εγκατάσταση του protobuf και του libevent είναι προαιρετική, αλλά βελτιώνει την απόδοση του διακομιστή pinba. Εάν εγκαταστήσετε τον διακομιστή pinba σε φάκελο διαφορετικό από το /opt, τότε θα πρέπει επίσης να το διορθώσετε systemd script αρχείο.

Μονάδα pinba για nginx

Για να μεταγλωττίσετε μια λειτουργική μονάδα, χρειάζεστε πηγαίους κώδικες της ίδιας έκδοσης του nginx που είναι ήδη εγκατεστημένος στον διακομιστή σας, καθώς και τις ίδιες επιλογές μεταγλώττισης, διαφορετικά η κατασκευή θα είναι επιτυχής, αλλά κατά τη σύνδεση της λειτουργικής μονάδας, θα εμφανιστεί ένα σφάλμα που "Η μονάδα δεν είναι συμβατή με δυαδικό περιεχόμενο." Οι επιλογές μεταγλώττισης μπορούν να προβληθούν χρησιμοποιώντας την εντολή nginx -V

Καθημερινές λύσεις

Όλοι οι ιστότοποί μου λειτουργούν μόνο σε https. Το πεδίο σχήματος δεν έχει νόημα, επομένως το χρησιμοποιώ για να διαχωρίσω τον ιστό/κονσόλα.

Σε σενάρια που είναι προσβάσιμα από τον Ιστό χρησιμοποιώ:

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

Και σε σενάρια κονσόλας (για παράδειγμα, σενάρια cron):

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

Στο ταμπλό μου στα Γραφάνα υπάρχει διακόπτης web/κονσόλας για ξεχωριστή προβολή στατιστικών.

Μπορείτε επίσης να στείλετε τις ετικέτες σας στο Pinba, για παράδειγμα:

pinba_tag_set('country', $countryCode);

Αυτά.

Απαντήστε στις δημοσκοπήσεις κάτω από το άρθρο.

Ως συνήθως, σας προειδοποιώ ότι δεν συμβουλεύω ούτε βοηθώ μέσω προσωπικών μηνυμάτων στο Habr και στα κοινωνικά δίκτυα.

Δημιουργήστε ένα εισιτήριο στο Github.

Υποστηρίξτε επίσης με likes αγγλική έκδοση του παρόντος άρθρου στο reddit.

Μόνο εγγεγραμμένοι χρήστες μπορούν να συμμετάσχουν στην έρευνα. Συνδεθείτε, Σας παρακαλούμε.

Τι λειτουργικό σύστημα χρησιμοποιείτε στον διακομιστή;

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Μαλακό καπέλλο

  • OpenSUSE

  • SUSE

  • Unix

  • Windows

  • άλλος

Ψήφισαν 114 χρήστες. 11 χρήστες απείχαν.

Ποια έκδοση της php χρησιμοποιείτε στον διακομιστή;

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • άλλος

Ψήφισαν 105 χρήστες. 17 χρήστες απείχαν.

Έχετε χρησιμοποιήσει ποτέ pinba;

  • да

  • όχι, αλλά θα ήθελα

  • όχι και δεν θα ήθελα

  • όχι και δεν την έχω ακούσει

Ψήφισαν 100 χρήστες. 14 χρήστες απείχαν.

Ποια έκδοση του διακομιστή Pinba θα θέλατε να δοκιμάσετε;

  • pinba_engine (μηχανή mysql)

  • pinba2 (μηχανή mysql)

  • pinboard (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

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

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

  • Θα γράψω το δικό μου

  • άλλος

Ψήφισαν 39 χρήστες. 47 χρήστες απείχαν.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο