Στο παρελθόν, όταν μιλούσαμε για το backend, συνήθως αναφερόμασταν σε μια μεγάλη εφαρμογή με μια ενιαία, μεγάλη βάση δεδομένων και η καταγραφή ήταν επαρκής για παρακολούθηση. Τώρα, χάρη σε τεχνολογίες όπως το Kubernetes , οι μικροϋπηρεσίες έχουν γίνει το πρότυπο. Οι εφαρμογές είναι πιο πολλές και κατανεμημένες και η παραδοσιακή καταγραφή δεν είναι πλέον αρκετή για τον εντοπισμό σφαλμάτων και τη διάγνωση προβλημάτων στις εφαρμογές μας.
Μια εξαιρετική λύση για την οργάνωση της παρακολούθησης είναι το OpenTelemetry — μια σύγχρονη εργαλειοθήκη που μπορεί να χρησιμοποιηθεί για εντοπισμό σφαλμάτων και ανάλυση απόδοσης κατανεμημένων συστημάτων.
Αυτό το άρθρο προορίζεται για επαγγελματίες πληροφορικής που θέλουν να επεκτείνουν τις γνώσεις τους στη βελτιστοποίηση backend. Παρακάτω, θα δούμε αναλυτικά τι είναι το OpenTelemetry, τις βασικές έννοιές του και τα προβλήματα που βοηθά στην επίλυση. Εάν ενδιαφέρεστε για το πώς το OpenTelemetry μπορεί να αλλάξει την προσέγγισή σας στην παρακολούθηση και τον εντοπισμό σφαλμάτων συστημάτων υποστήριξης, βελτιώνοντας την αξιοπιστία και την αποτελεσματικότητά τους — διαβάστε παρακάτω.
Μια σύντομη ιστορία της OpenTelemetry
Οι μεγάλες εταιρείες τεχνολογίας αντιμετώπισαν για πρώτη φορά την πρόκληση της κατανεμημένης υλοτομίας και εντοπισμού στα τέλη της δεκαετίας του 2000. Το 2010, η Google δημοσίευσε μια εργασία,
Το 2014, εμφανίστηκε η Kubernetes, απλοποιώντας σημαντικά την ανάπτυξη μικροϋπηρεσιών και άλλων συστημάτων που διανέμονται στο cloud. Αυτό οδήγησε πολλές εταιρείες να αντιμετωπίσουν προβλήματα με την κατανεμημένη καταγραφή και τον εντοπισμό στις μικροϋπηρεσίες. Για την τυποποίηση της κατανεμημένης ανίχνευσης, δημιουργήθηκε το πρότυπο OpenTracing, που υιοθετήθηκε από το CNCF και το έργο OpenCensus της Google.
Το 2019, τα έργα OpenTracing και OpenCensus ανακοίνωσαν μια συγχώνευση με το όνομα OpenTelemetry. Αυτή η πλατφόρμα συνδυάζει τις βέλτιστες πρακτικές που έχουν συσσωρευτεί εδώ και πολλά χρόνια, επιτρέποντας την απρόσκοπτη ενσωμάτωση της ανίχνευσης, της καταγραφής και των μετρήσεων σε οποιοδήποτε σύστημα, ανεξάρτητα από την πολυπλοκότητά τους.
Σήμερα, το OpenTelemetry δεν είναι απλώς ένα έργο. είναι ένα βιομηχανικό πρότυπο για τη συλλογή και μετάδοση δεδομένων τηλεμετρίας. Αναπτύχθηκε και υποστηρίζεται από μια κοινότητα ειδικών και κορυφαίων εταιρειών στην αγορά, όπως η Google και η Microsoft. Το έργο συνεχίζει να εξελίσσεται, αποκτώντας νέες δυνατότητες για την απλοποίηση της διαδικασίας ολοκλήρωσης και χρήσης.
Τι υπάρχει μέσα;
Το OpenTelemetry είναι ένα ολοκληρωμένο σύνολο πρακτικών και εργαλείων που ορίζουν ποια σήματα μπορεί να παράγει μια εφαρμογή για να αλληλεπιδρά με τον έξω κόσμο και πώς αυτά τα σήματα μπορούν να συλλεχθούν και να οπτικοποιηθούν για την παρακολούθηση της κατάστασης των εφαρμογών και του συστήματος συνολικά. Οι τρεις κύριοι τύποι σημάτων είναι η ανίχνευση, η καταγραφή και η συλλογή μετρήσεων .
**Ας ρίξουμε μια πιο προσεκτική ματιά σε κάθε στοιχείο: \
Συμφραζόμενα
Το OpenTelemetry εισάγει την έννοια των πλαισίων λειτουργίας. Ένα περιβάλλον περιλαμβάνει κυρίως χαρακτηριστικά όπως `trace_id`
(αναγνωριστικό για την τρέχουσα λειτουργία) και `span_id`
(αναγνωριστικό για ένα δευτερεύον αίτημα, με κάθε επανάληψη ενός δευτερεύοντος αιτήματος να έχει ένα μοναδικό `span_id`
).
Επιπλέον, ένα περιβάλλον μπορεί να περιέχει στατικές πληροφορίες, όπως το όνομα του κόμβου όπου αναπτύσσεται η εφαρμογή ή το όνομα περιβάλλοντος (prod/qa). Αυτά τα πεδία, γνωστά ως πόροι στην ορολογία OpenTelemetry, συνδέονται με κάθε αρχείο καταγραφής, μέτρηση ή ίχνος για ευκολότερη αναζήτηση. Τα περιβάλλοντα μπορούν επίσης να περιλαμβάνουν δυναμικά δεδομένα, όπως το αναγνωριστικό του τρέχοντος τελικού σημείου ( `http_path: "GET /user/:id/info"`
), τα οποία μπορούν να προσαρτηθούν επιλεκτικά σε ομάδες αρχείων καταγραφής, μετρήσεων ή ιχνών.
Τα περιβάλλοντα OpenTelemetry μπορούν να περάσουν μεταξύ διαφορετικών εφαρμογών χρησιμοποιώντας πρωτόκολλα διάδοσης περιβάλλοντος. Αυτά τα πρωτόκολλα αποτελούνται από σύνολα κεφαλίδων που προστίθενται σε κάθε αίτημα HTTP ή gRPC ή από τις κεφαλίδες των μηνυμάτων για ουρές. Αυτό επιτρέπει στις μεταγενέστερες εφαρμογές να ανασυνθέσουν το περιβάλλον λειτουργίας από αυτές τις κεφαλίδες.
Ακολουθούν μερικά παραδείγματα διάδοσης περιβάλλοντος:
B3-Propagation Αυτό είναι ένα σύνολο κεφαλίδων (
x-b3-*
) που αναπτύχθηκε αρχικά για το σύστημα ανίχνευσης Zipkin. Προσαρμόστηκε στο OpenTracing και χρησιμοποιήθηκε από πολλά εργαλεία και βιβλιοθήκες. Το B3-Propagation φέρειtrace_id
/span_id
και μια σημαία που υποδεικνύει εάν είναι απαραίτητη η δειγματοληψία.
W3C Trace Context Αναπτύχθηκε από την ομάδα εργασίας του W3C, αυτό το πρότυπο ενοποιεί διάφορες προσεγγίσεις διάδοσης περιβάλλοντος σε ένα ενιαίο πρότυπο και είναι η προεπιλογή στο OpenTelemetry. Ένα καλό παράδειγμα εφαρμογής αυτών των προτύπων είναι η παρακολούθηση της εκτέλεσης ενός αιτήματος που διέρχεται από μικροϋπηρεσίες που υλοποιούνται με διαφορετικές τεχνολογίες χωρίς να διακυβεύεται η ακρίβεια παρακολούθησης και εντοπισμού σφαλμάτων.
Ιχνηλασία
Η ανίχνευση είναι η διαδικασία καταγραφής και, στη συνέχεια, απεικόνισης του χρονοδιαγράμματος της διαδρομής ενός αιτήματος μέσω πολλαπλών μικροϋπηρεσιών.
Στην οπτικοποίηση, κάθε γραμμή ονομάζεται "span" και έχει ένα μοναδικό "span_id" . Το ριζικό διάστημα αναφέρεται ως "ίχνος" και έχει ένα "trace_id" , το οποίο χρησιμεύει ως αναγνωριστικό για ολόκληρο το αίτημα.
Αυτός ο τύπος οπτικοποίησης σάς επιτρέπει:
- Αναλύστε το χρόνο εκτέλεσης των αιτημάτων σε διαφορετικά συστήματα και βάσεις δεδομένων για να εντοπίσετε σημεία συμφόρησης που χρειάζονται βελτιστοποίηση.
- Εντοπισμός κυκλικών εξαρτήσεων μεταξύ υπηρεσιών.
- Βρείτε διπλότυπα αιτήματα. Χρησιμοποιώντας δεδομένα ανίχνευσης, μπορείτε επίσης να δημιουργήσετε πρόσθετα αναλυτικά στοιχεία, όπως τη δημιουργία ενός χάρτη μικροϋπηρεσιών ή τη διανομή χρόνου σε διαφορετικά συστήματα κατά τη διάρκεια της επεξεργασίας λειτουργίας. Ακόμα κι αν δεν χρησιμοποιείτε δεδομένα ανίχνευσης για την οπτικοποίηση των χρονοδιαγραμμάτων, το OpenTelemetry εξακολουθεί να δημιουργεί
trace_id
καιspan_id
για χρήση σε άλλα σήματα.
κούτσουρα
Παρά τη φαινομενική απλότητά της, η καταγραφή παραμένει ένα από τα πιο ισχυρά εργαλεία για τη διάγνωση προβλημάτων. Το OpenTelemetry ενισχύει την παραδοσιακή καταγραφή προσθέτοντας πληροφορίες με βάση τα συμφραζόμενα. Συγκεκριμένα, εάν υπάρχει ενεργό ίχνος, τα χαρακτηριστικά «trace_id» και «span_id» προστίθενται αυτόματα στα αρχεία καταγραφής, συνδέοντάς τα με τη γραμμή χρόνου παρακολούθησης. Επιπλέον, τα χαρακτηριστικά καταγραφής μπορούν να περιλαμβάνουν στατικές πληροφορίες από το περιβάλλον OpenTelemetry, όπως το αναγνωριστικό κόμβου, καθώς και δυναμικές πληροφορίες, όπως το τρέχον αναγνωριστικό τελικού σημείου HTTP (`http_path: "GET /user/:id"`).
Χρησιμοποιώντας το `trace_id`, μπορείτε να βρείτε αρχεία καταγραφής από όλες τις μικροϋπηρεσίες που σχετίζονται με το τρέχον αίτημα, ενώ το `span_id` σάς επιτρέπει να διαφοροποιήσετε τα δευτερεύοντα αιτήματα. Για παράδειγμα, στην περίπτωση επαναλήψεων, τα αρχεία καταγραφής από διαφορετικές προσπάθειες θα έχουν διαφορετικά `span_id`. Η χρήση αυτών των αναγνωριστικών επιτρέπει τη γρήγορη ανάλυση της συμπεριφοράς ολόκληρου του συστήματος σε πραγματικό χρόνο, επιταχύνοντας τη διάγνωση προβλημάτων και ενισχύοντας τη σταθερότητα και την αξιοπιστία.
Μετρήσεις
Η συλλογή μετρήσεων παρέχει ποσοτικά δεδομένα σχετικά με την απόδοση του συστήματος, όπως καθυστέρηση, ποσοστά σφαλμάτων, χρήση πόρων και άλλα. Η παρακολούθηση των μετρήσεων σε πραγματικό χρόνο σάς επιτρέπει να ανταποκρίνεστε άμεσα σε αλλαγές απόδοσης, να αποτρέπετε αστοχίες και εξάντληση πόρων και να διασφαλίζετε υψηλή διαθεσιμότητα και αξιοπιστία της εφαρμογής για τους χρήστες.
Η ενσωμάτωση με συστήματα μετρικής αποθήκευσης και οπτικοποίησης όπως το Prometheus και το Grafana διευκολύνει την οπτικοποίηση αυτών των δεδομένων, απλοποιώντας σημαντικά την παρακολούθηση.
Μετρικοί Συλλέκτες
Οι συλλέκτες μετρικών OpenTelemetry είναι συμβατοί με τα πρότυπα Prometheus και OpenMetrics, επιτρέποντας την εύκολη μετάβαση σε λύσεις OpenTelemetry χωρίς σημαντικές αλλαγές. Το OpenTelemetry SDK επιτρέπει την εξαγωγή παραδειγμάτων trace_id μαζί με μετρήσεις, καθιστώντας δυνατή τη συσχέτιση μετρήσεων με παραδείγματα καταγραφής και ίχνη.
Συσχέτιση σήματος
Μαζί, τα αρχεία καταγραφής, οι μετρήσεις και η ανίχνευση δημιουργούν μια ολοκληρωμένη προβολή της κατάστασης του συστήματος:
- Τα αρχεία καταγραφής παρέχουν πληροφορίες σχετικά με συμβάντα του συστήματος, επιτρέποντας γρήγορη αναγνώριση και επίλυση σφαλμάτων.
- Οι μετρήσεις αντικατοπτρίζουν ποιοτικούς και ποσοτικούς δείκτες απόδοσης του συστήματος, όπως χρόνους απόκρισης ή ποσοστά σφάλματος.
- Η ανίχνευση συμπληρώνει αυτήν την άποψη δείχνοντας τη διαδρομή εκτέλεσης της αίτησης μέσω διαφόρων στοιχείων του συστήματος, βοηθώντας στην κατανόηση των αλληλεπιδράσεων τους. Η σαφής συσχέτιση μεταξύ αρχείων καταγραφής, ιχνών και μετρήσεων είναι ένα χαρακτηριστικό γνώρισμα του OpenTelemetry. Για παράδειγμα, το Grafana επιτρέπει στους χρήστες να βλέπουν τα αντίστοιχα ίχνη και μετρήσεις αιτημάτων κατά την προβολή ενός αρχείου καταγραφής, βελτιώνοντας σημαντικά τη χρηστικότητα και την αποτελεσματικότητα της πλατφόρμας.
Εκτός από τα τρία βασικά στοιχεία, το OpenTelemetry περιλαμβάνει τις έννοιες της δειγματοληψίας, των αποσκευών και της διαχείρισης περιβάλλοντος λειτουργίας.
Δειγματοληψία
Σε συστήματα υψηλού φορτίου, ο όγκος των αρχείων καταγραφής και των ιχνών γίνεται τεράστιος, απαιτώντας σημαντικούς πόρους για την υποδομή και την αποθήκευση δεδομένων. Για την αντιμετώπιση αυτού του ζητήματος, τα πρότυπα OpenTelemetry περιλαμβάνουν δειγματοληψία σήματος — τη δυνατότητα εξαγωγής μόνο ενός τμήματος ιχνών και αρχείων καταγραφής. Για παράδειγμα, μπορείτε να εξάγετε λεπτομερή σήματα από ένα ποσοστό αιτημάτων, μακροχρόνιων αιτημάτων ή αιτημάτων σφαλμάτων. Αυτή η προσέγγιση επιτρέπει επαρκή δειγματοληψία για τη δημιουργία στατιστικών στοιχείων, εξοικονομώντας ταυτόχρονα σημαντικούς πόρους.
Ωστόσο, εάν κάθε σύστημα αποφασίσει ανεξάρτητα ποια αιτήματα θα παρακολουθήσει λεπτομερώς, καταλήγουμε σε μια κατακερματισμένη προβολή κάθε αιτήματος. Ορισμένα συστήματα ενδέχεται να εξάγουν λεπτομερή δεδομένα ενώ άλλα μπορεί να εξάγουν μόνο εν μέρει ή να μην εξάγουν καθόλου.
Για την επίλυση αυτού του προβλήματος, οι μηχανισμοί διάδοσης περιβάλλοντος του OpenTelemetry μεταδίδουν μια σημαία δειγματοληψίας μαζί με το `trace_id`/`span_id`. Αυτό διασφαλίζει ότι εάν η αρχική υπηρεσία που λαμβάνει το αίτημα χρήστη αποφασίσει ότι το αίτημα πρέπει να παρακολουθείται λεπτομερώς, όλα τα άλλα συστήματα θα ακολουθήσουν το παράδειγμά τους. Διαφορετικά, όλα τα συστήματα θα πρέπει εν μέρει ή όχι να εξάγουν σήματα για εξοικονόμηση πόρων. Αυτή η προσέγγιση ονομάζεται "Head Sampling" — μια απόφαση που λαμβάνεται στην αρχή της επεξεργασίας του αιτήματος, είτε τυχαία είτε με βάση ορισμένα χαρακτηριστικά εισόδου.
Επιπλέον, το OpenTelemetry υποστηρίζει το "Tail Sampling", όπου όλες οι εφαρμογές εξάγουν πάντα όλα τα σήματα λεπτομερώς, αλλά υπάρχει ένα ενδιάμεσο buffer. Μετά τη συλλογή όλων των δεδομένων, αυτό το buffer αποφασίζει εάν θα διατηρήσει τα πλήρη δεδομένα ή θα διατηρήσει μόνο ένα μερικό δείγμα. Αυτή η μέθοδος επιτρέπει ένα πιο αντιπροσωπευτικό δείγμα κάθε κατηγορίας αιτήματος (επιτυχές/μακροχρόνιο/σφάλμα), αλλά απαιτεί πρόσθετη ρύθμιση υποδομής.
Αποσκευές
Ο μηχανισμός αποσκευών επιτρέπει τη μετάδοση αυθαίρετων ζευγών κλειδιού-τιμής μαζί με trace_id
/ span_id
, περνώντας αυτόματα μεταξύ όλων των μικροϋπηρεσιών κατά την επεξεργασία αιτήματος. Αυτό είναι χρήσιμο για τη μετάδοση πρόσθετων πληροφοριών που απαιτούνται σε όλη τη διαδρομή αιτήματος—όπως πληροφορίες χρήστη ή ρυθμίσεις περιβάλλοντος χρόνου εκτέλεσης.
Παράδειγμα κεφαλίδας για τη μετάδοση αποσκευών σύμφωνα με το πρότυπο W3C: tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE,userId=1c30032v5
Ακολουθούν ορισμένα παραδείγματα χρήσης αποσκευών:
Διαβίβαση πληροφοριών επιχειρηματικού πλαισίου όπως
userId
,productId
ήdeviceId
μπορούν να διαβιβαστούν σε όλες τις μικροϋπηρεσίες. Οι εφαρμογές μπορούν να καταγράφουν αυτόματα αυτές τις πληροφορίες, επιτρέποντας αναζητήσεις αρχείων καταγραφής ανά περιβάλλον χρήστη για το αρχικό αίτημα.Ρυθμίσεις ειδικών παραμέτρων διαμόρφωσης για SDK ή υποδομή.
Σημαίες δρομολόγησης Σημαίες που βοηθούν τους εξισορροπητές φορτίου να λαμβάνουν αποφάσεις δρομολόγησης. Κατά τη διάρκεια της δοκιμής, ορισμένα αιτήματα μπορεί να χρειαστεί να δρομολογηθούν σε εικονικά backend. Δεδομένου ότι οι αποσκευές μεταδίδονται αυτόματα μέσω όλων των υπηρεσιών, δεν χρειάζεται να δημιουργηθούν πρόσθετα πρωτόκολλα—απλώς ορίστε έναν κανόνα για τον εξισορροπητή φορτίου.
Λάβετε υπόψη ότι ενώ ο αντίκτυπος στην απόδοση των Αποσκευών είναι ελάχιστος, η υπερβολική χρήση μπορεί να αυξήσει σημαντικά το φόρτο δικτύου και υπηρεσιών. Επιλέξτε προσεκτικά ποια δεδομένα πρέπει πραγματικά να περάσετε από τις Αποσκευές για να αποφύγετε προβλήματα απόδοσης.
Υλοποίηση Υποδομών
Η υλοποίηση του OpenTelemetry σε επίπεδο υποδομής περιλαμβάνει την ενσωμάτωση των backends του OpenTelemetry στην αρχιτεκτονική της εφαρμογής και τη διαμόρφωση της υποδομής για τη συγκέντρωση δεδομένων.
Η διαδικασία αποτελείται από τέσσερα στάδια:
Ενσωμάτωση εφαρμογών Στο πρώτο στάδιο, τα OpenTelemetry SDK ενσωματώνονται απευθείας σε εφαρμογές για τη συλλογή μετρήσεων, αρχείων καταγραφής και ιχνών, διασφαλίζοντας μια συνεχή ροή δεδομένων σχετικά με την απόδοση κάθε στοιχείου συστήματος.
Διαμόρφωση Εξαγωγέων Τα δεδομένα που συλλέγονται δρομολογούνται από εφαρμογές μέσω εξαγωγέων σε εξωτερικά συστήματα για περαιτέρω επεξεργασία, όπως συστήματα καταγραφής, παρακολούθησης, ανίχνευσης ή ανάλυσης, ανάλογα με τις ανάγκες σας.
Συνάθροιση και αποθήκευση Αυτό το στάδιο μπορεί να περιλαμβάνει την κανονικοποίηση δεδομένων, τον εμπλουτισμό τους με πρόσθετες πληροφορίες και τη συγχώνευση δεδομένων από διαφορετικές πηγές για τη δημιουργία μιας ενοποιημένης προβολής της κατάστασης του συστήματος.
Οπτικοποίηση δεδομένων Τέλος, τα επεξεργασμένα δεδομένα παρουσιάζονται ως πίνακες εργαλείων σε συστήματα όπως το Grafana (για μετρήσεις και ίχνη) ή το Kibana (για αρχεία καταγραφής). Αυτό επιτρέπει στις ομάδες να αξιολογούν γρήγορα την υγεία του συστήματος, να εντοπίζουν ζητήματα και τάσεις και να ορίζουν ειδοποιήσεις με βάση τα σήματα που δημιουργούνται.
Υλοποίηση Εφαρμογής
Για να ενσωματωθείτε σε μια εφαρμογή, πρέπει να συνδέσετε το κατάλληλο OpenTelemetry SDK για τη γλώσσα προγραμματισμού που χρησιμοποιείται ή να χρησιμοποιήσετε βιβλιοθήκες και πλαίσια που υποστηρίζουν άμεσα το OpenTelemetry. Το OpenTelemetry συχνά εφαρμόζει ευρέως χρησιμοποιούμενες διεπαφές από γνωστές βιβλιοθήκες, επιτρέποντας αντικαταστάσεις drop-in. Για παράδειγμα, η βιβλιοθήκη Micrometer χρησιμοποιείται συνήθως για συλλογή μετρήσεων στο οικοσύστημα Java. Το OpenTelemetry SDK παρέχει τις υλοποιήσεις διεπαφών Micrometer, επιτρέποντας την εξαγωγή μετρήσεων χωρίς αλλαγή του κύριου κώδικα εφαρμογής. Επιπλέον, το OpenTelemetry προσφέρει υλοποιήσεις παλαιότερων διεπαφών OpenTracing και OpenCensus, διευκολύνοντας την ομαλή μετάβαση στο OpenTelemetry.
Σύναψη
Στα συστήματα πληροφορικής, το OpenTelemetry μπορεί να γίνει το κλειδί για το μέλλον αξιόπιστων και αποτελεσματικών backends. Αυτό το εργαλείο απλοποιεί τον εντοπισμό σφαλμάτων και την παρακολούθηση και επίσης ανοίγει ευκαιρίες για μια βαθιά κατανόηση της απόδοσης της εφαρμογής και της βελτιστοποίησης σε νέο επίπεδο. Γίνετε μέλος της κοινότητας OpenTelemetry για να βοηθήσετε στη διαμόρφωση ενός μέλλοντος όπου η ανάπτυξη backend είναι απλούστερη και πιο αποτελεσματική!