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

Προαπαιτούμενα

  • Απαιτούνται βασικές γνώσεις GoLang καθώς δεν θα καλύψω τα βασικά. (έκδοση Golang 1.18)
  • Αυτό δεν θα καλύψει τη ρύθμιση των συμπλεγμάτων Kibana ή Elastic Search, μόνο το τμήμα GoLang του
  • IDE της επιλογής σας, το VSCode είναι η προτίμησή μου

Εισαγωγή

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

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

Kibana APM

Η Kibana APM είναι μια από τις υπηρεσίες που προσφέρει η Elastic και μεταφράζεται σε παρακολούθηση απόδοσης εφαρμογής. Με αυτό μπορείτε να απεικονίσετε εσωτερικές διαδικασίες και την κατανομή τους. Έτσι φαίνεται ένας πίνακας ελέγχου μετρήσεων APM:

Μετρική Ανάλυση

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

Μια συναλλαγή είναι η κύρια πληροφορία που στέλνει ο πράκτορας της APM. Είναι η λειτουργία ανώτατου επιπέδου, που περιγράφει την κύρια μέτρηση που θα θέλατε να εξαγάγετε. Οι κύριες χρήσεις είναι το HTTP, τα αιτήματα gRPC, η διαδικασία μετασχηματισμού δεδομένων, οι κύκλοι κ.λπ. Ένα διάστημα είναι λειτουργία δευτερεύοντος επιπέδου, που συνήθως αναφέρεται ως παιδιά της συναλλαγής. Ένα κοινό μοτίβο είναι να υπάρχει μια μητρική συναλλαγή που περιγράφει ολόκληρη τη διαδικασία προς παρακολούθηση και τις κλήσεις της συνάρτησής της ή τμήματα κώδικα μέσα στη διεργασία που πρέπει να εκτείνονται. Αυτή είναι μια αναπαράσταση ψευδοκώδικα μιας τυπικής μέτρησης:

func MainOperation(ctx context, …) {
   startTransaction(ctx)
   ...
   // logic here
   ...
   ChildFunction1(ctx, ...)
   ...
   ChildFunction2(ctx, ...)
   ...
   closeTransaction()
}
func ChildFunction1(ctx, ...){
   startSpan(ctx)
   ...
   closeSpan()
}
func ChildFunction2(ctx, ...){
   startSpan(ctx)
   ...
   closeSpan()
}

Η παραπάνω αναπαράσταση δείχνει τα θεμελιώδη στοιχεία της ροής της μέτρησης. Χρησιμοποιούμε ένα περιβάλλον για να ξεκινήσουμε τη μητρική μας συναλλαγή (αυτό το περιβάλλον μπορεί να δημιουργηθεί εδώ αν δεν μεταβιβαστεί ως όρισμα). Σε αυτό το στάδιο μπορούμε να προσθέσουμε πληροφορίες στη συναλλαγή ως τύπο και όνομα. Εδώ ξεκινά η καταγραφή της μέτρησης και περνάμε το πλαίσιο (που κάτω από την κουκούλα περιέχει τις πληροφορίες συναλλαγής) στις θυγατρικές μας λειτουργίες για τη δημιουργία των διαστημάτων.

Έχω φτιάξει αυτόν τον ψευδοκώδικα, ώστε οποιοσδήποτε (όχι μόνο το Golang) να μπορεί να εφαρμόσει τη ροή στους χώρους του. Αλλά τώρα ας το κωδικοποιήσουμε ως gophers:

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

Τα εκτός κουτιού πακέτα APM όπως το mongoDB ή το gRPC υποστηρίζουν τέλεια αυτή τη ροή, χρειάζεται μόνο να χρησιμοποιήσετε τη διάδοση περιβάλλοντος στις λειτουργίες τους.

Ο πράκτορας APM (αν έχει ρυθμιστεί σωστά) θα καταγράψει αυτόματα αυτές τις μετρήσεις, αλλά υπάρχει ένα ακόμη πράγμα που θα πρέπει να εφαρμόσετε για να λειτουργήσει σωστά ο παράγοντας APM. Η τεκμηρίωση του Kibana δεν το προσδιορίζει ρητά, αλλά πρέπει να συμπεριλάβετε έναν διακομιστή http με τη συνάρτηση αναδίπλωσης APM.

Αυτό είναι ένα απόσπασμα κώδικα δρομολογητή boilerplate για το go-chi που θα έκανε αρκετά για αυτήν την περίπτωση:

Παραδείγματα

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

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

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

Έχω προσθέσει μια διαφορετική συναλλαγή και τις εκτελώ μαζί για να σας δείξω πώς φαίνεται το πλαίσιο συναλλαγών για τους διαφορετικούς τύπους συναλλαγών που συγκεντρώνονται ονομαστικά:

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

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

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

Οποιοδήποτε σχόλιο είναι ευπρόσδεκτο και ακολουθήστε για περισσότερα άρθρα όπως αυτό.

Σας ευχαριστώ για την ανάγνωση :)