Tracing: τι είναι, αρχές και συλλογή δεδομένων

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-05-29 Χρόνος ανάγνωσης: 8 λεπ

Η ιχνηλάτηση (tracing) είναι μια μέθοδος παρατήρησης της ροής αιτημάτων μέσω ενός κατανεμημένου συστήματος, όπου κάθε βήμα επεξεργασίας καταγράφεται ως ξεχωριστό συμβάν με χρονική σφραγίδα. Σύμφωνα με τα δεδομένα OpenTelemetry, 2025, ένα trace ενώνει την πλήρη διαδρομή ενός αιτήματος από το σημείο εισόδου μέχρι την τελική απάντηση, διερχόμενο από όλες τις μικροϋπηρεσίες και τις εξωτερικές κλήσεις. Αυτό επιτρέπει στους προγραμματιστές να εντοπίζουν συμφορήσεις, καθυστερήσεις και αποτυχίες σε πολύπλοκες αρχιτεκτονικές κινητών backend.

Βασικά σημεία

  • Tracing — καταγραφή της διαδρομής ενός αιτήματος μέσω όλων των συστατικών ενός κατανεμημένου συστήματος με καταγραφή του χρόνου κάθε βήματος.
  • Span — βασική μονάδα της ιχνηλάτησης, αντιπροσωπεύοντας μια μοναδική λειτουργία με καθορισμό χρόνου έναρξης και λήξης.
  • Distributed tracing — μηχανισμός που συνδέει spans από διαφορετικές υπηρεσίες σε μια ενιαία αλυσίδα trace μέσω μεταφοράς περιεχομένου.
  • OpenTelemetry — πρότυπο συλλογής τηλεμετρίας που υποστηρίζει την ιχνηλάτηση για όλες τις δημοφιλείς γλώσσες και πλατφόρμες.
  • Sampling — στρατηγική επιλογής μέρους των αιτημάτων για ιχνηλάτηση, που επιτρέπει τον έλεγχο του όγκου δεδομένων και του κόστους αποθήκευσης.

Τι είναι το tracing στην παρακολούθηση

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

Κάθε βήμα επεξεργασίας — κλήση βάσης δεδομένων, αίτημα HTTP προς μια άλλη μικροϋπηρεσία, εκτέλεση εργασίας υποβάθρου — καταγράφεται ως ξεχωριστή μονάδα με χρονική σφραγίδα, κατάσταση και γνωρίσματα. Σύμφωνα με τα δεδομένα Google Dapper (αρχική δημοσίευση 2010), η ιχνηλάτηση επιτρέπει τον εντοπισμό καθυστερήσεων σε κατανεμημένα συστήματα με ακρίβεια μιας κλήσης.

Η ιχνηλάτηση είναι ιδιαίτερα σημαντική για τις κινητές εφαρμογές, όπου το backend αποτελείται από δεκάδες μικροϋπηρεσίες. Μια ενέργεια χρήστη — για παράδειγμα, σύνδεση σε λογαριασμό — μπορεί να περάσει από API Gateway, υπηρεσία ταυτοποίησης, βάση δεδομένων και υπηρεσία Push. Χωρίς trace, είναι πρακτικά αδύνατο να προσδιοριστεί ποιο συστατικό επιβραδύνει την απάντηση.

Spans και traces: βασική δομή δεδομένων

Η βασική μονάδα της ιχνηλάτησης είναι το span. Κάθε span αντιπροσωπεύει μια λογική λειτουργία: αίτημα HTTP, ερώτημα SQL, κλήση gRPC, σειριοποίηση JSON. Ένα span περιέχει ένα μοναδικό αναγνωριστικό, αναγνωριστικό γονέα, όνομα λειτουργίας, χρόνο έναρξης, διάρκεια, κατάσταση και ένα σύνολο γνωρισμάτων.

Ιεραρχία span σε ένα trace

Όλα τα span που ανήκουν σε ένα κεντρικό αίτημα ενώνονται σε ένα trace. Το κεντρικό span (root span) αντιπροσωπεύει το σημείο εισόδου — ένα αίτημα HTTP από τον κινητό πελάτη προς το API. Τα θυγατρικά span δημιουργούν ένα δέντρο όπου κάθε span αναφέρεται στον γονέα μέσω του πεδίου parent_span_id.

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

Γνωρίσματα και συμβάντα span

Κάθε span μπορεί να περιέχει γνωρίσματα — ζεύγη κλειδιού-τιμής με μεταπληροφορίες: URL του αιτήματος, ID χρήστη, έκδοση API, όνομα διακομιστή. Τα γνωρίσματα χρησιμοποιούνται για φιλτράρισμα και ομαδοποίηση των trace. Εκτός από τα γνωρίσματα, το span υποστηρίζει συμβάντα — χρονικές σφραγίδες με περιγραφή κειμένου, για παράδειγμα “αστοχία cache” ή “προσπάθεια επανασύνδεσης”.

Πώς λειτουργεί το distributed tracing

Το distributed tracing λύνει το πρόβλημα σύνδεσης span που δημιουργούνται σε διαφορετικές διεργασίες και σε διαφορετικές μηχανές. Ο μηχανισμός βασίζεται στη μεταφορά περιεχομένου: κατά την κλήση της υπηρεσίας B από την υπηρεσία A, στο εξερχόμενο αίτημα προστίθεται μια κεφαλίδα με το αναγνωριστικό του τρέχοντος trace και του γονικού span.

Τα πρότυπα πρωτόκολλα μεταφοράς περιεχομένου — W3C Trace Context (κεφαλίδες traceparent και tracestate) και Zipkin B3 (κεφαλίδες X-B3-TraceId, X-B3-SpanId). Το W3C Trace Context υιοθετήθηκε ως πρότυπο από τον οργανισμό W3C το 2021 και υποστηρίζεται από όλους τους κύριους παρόχους τηλεμετρίας.

Κατά τη λήψη του αιτήματος, η υπηρεσία B εξάγει το trace_id από την κεφαλίδα και δημιουργεί ένα θυγατρικό span με αυτό το trace_id. Έτσι, μετά την ολοκλήρωση του αιτήματος, όλα τα span από διαφορετικές υπηρεσίες ενώνονται σε ένα trace στην πλευρά του συλλέκτη. Για αυτό, κάθε υπηρεσία πρέπει να είναι ενσωματωμένη με την ίδια βιβλιοθήκη ιχνηλάτησης.

Μεταφορά περιεχομένου σε μικροϋπηρεσίες

Στην ανάπτυξη κινητών, η μεταφορά περιεχομένου καλύπτει όχι μόνο το backend, αλλά και την αλληλεπίδραση πελάτη-εξυπηρετητή. Μια κινητή εφαρμογή μπορεί να στέλνει trace_id στην κεφαλίδα κάθε αιτήματος API, επιτρέποντας τη σύνδεση της ενέργειας του πελάτη με την επεξεργασία του εξυπηρετητή. Το OpenTelemetry SDK για iOS και Android υποστηρίζει αυτόματη δημιουργία και μεταφορά περιεχομένου trace μέσω HTTP πελατών.

kotlin
import io.opentelemetry.api.trace.Span
import io.opentelemetry.api.trace.Tracer
import io.opentelemetry.context.Context

class TracingInterceptor : Interceptor {
    private val tracer: Tracer = OpenTelemetry.getTracer("mobile-app")

    override fun intercept(chain: Interceptor.Chain): Response {
        val span = tracer.spanBuilder("HTTP POST /api/login")
            .setParent(Context.current())
            .startSpan()

        return chain.proceed(chain.request())
            .also { span.end() }
    }
}

Ο παρουσιαζόμενος interceptor σε Kotlin δημιουργεί ένα span για κάθε αίτημα HTTP προς τον εξυπηρετητή. Το γονικό περιεχόμενο μεταφέρεται από τον καλούντα κώδικα μέσω Context.current(), που επιτρέπει τη σύνδεση του trace στην πλευρά του πελάτη με το trace στην πλευρά του εξυπηρετητή.

Υλοποίηση ιχνηλάτησης μέσω OpenTelemetry

Το OpenTelemetry είναι το de facto πρότυπο για τη συλλογή δεδομένων trace. Παρέχει ενιαίο API για τη δημιουργία span, αυτόματη ενσωμάτωση δημοφιλών βιβλιοθηκών και ευέλικτο μηχανισμό εξαγωγής δεδομένων σε διάφορα backend: Jaeger, Zipkin, Grafana Tempo, Datadog, New Relic.

Αυτόματη ενσωμάτωση

Το OpenTelemetry υποστηρίζει αυτόματη δημιουργία span για δημοφιλή frameworks: Spring Boot, Ktor, Flask, Express, gRPC. Ο προγραμματιστής πρέπει απλώς να προσθέσει μια εξάρτηση στο έργο, και η βιβλιοθήκη παρακολουθεί ανεξάρτητα τα εισερχόμενα και εξερχόμενα αιτήματα. Το Auto-instrumentation για Java χρησιμοποιεί javaagent, που τροποποιεί το bytecode εν κινήσει χωρίς να αλλάζει τον πηγαίο κώδικα.

Για κινητές πλατφόρμες, το OpenTelemetry παρέχει Swift SDK και Kotlin SDK. Δημιουργούν αυτόματα span για αιτήματα δικτύου (URLSession, OkHttp), εργασία με βάση δεδομένων (CoreData, Room) και εργασίες υποβάθρου. Ο προγραμματιστής μπορεί να προσθέσει προσαρμοσμένα span για την επιχειρηματική λογική.

Εξαγωγή δεδομένων

Τα συλλεγμένα span αποστέλλονται στον συλλέκτη μέσω του πρωτοκόλλου OTLP (OpenTelemetry Protocol). Ο συλλέκτης μπορεί να αποθηκεύει προσωρινά, να φιλτράρει και να ανακατευθύνει δεδομένα σε ένα ή περισσότερα συστήματα αποθήκευσης. Σύμφωνα με την τεκμηρίωση του OpenTelemetry, η τυπική καθυστέρηση από τη δημιουργία ενός span έως την εμφάνισή του στον πίνακα ελέγχου είναι 2–5 δευτερόλεπτα κατά τη χρήση εξαγωγής gRPC.

swift
import OpenTelemetryApi
import OpenTelemetrySdk
import URLSessionInstrumentation

let instrumentation = URLSessionInstrumentation()
instrumentation.enable()

let tracer = OpenTelemetry.instance.tracerFactory
    .get("mobile-monitoring")

let span = tracer.spanBuilder("fetch-user-profile")
    .setAttribute(key: "user.id", value: userId)
    .startSpan()
span.end()

Ο κώδικας σε Swift ενεργοποιεί την αυτόματη ενσωμάτωση του επιπέδου δικτύου και δημιουργεί ένα προσαρμοσμένο span για τη λειτουργία λήψης προφίλ χρήστη. Το γνώρισμα user.id επιτρέπει το μεταγενέστερο φιλτράρισμα trace ανά συγκεκριμένο χρήστη.

Στρατηγικές δειγματοληψίας trace

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

Head-based sampling

Η απόφαση για αποθήκευση ενός trace λαμβάνεται τη στιγμή της δημιουργίας του — στο κεντρικό span. Η απλούστερη και πιο διαδεδομένη προσέγγιση: ένα σταθερό ποσοστό αιτημάτων (π.χ. 5%) αποθηκεύεται, τα υπόλοιπα απορρίπτονται. Μειονέκτημα — δεν μπορεί να εγγυηθεί ότι σπάνια σφάλματα θα συλληφθούν. Το Probability sampler στο OpenTelemetry υποστηρίζει ρύθμιση πιθανότητας από 0,0 έως 1,0.

Tail-based sampling

Η απόφαση αναβάλλεται μέχρι την ολοκλήρωση όλων των span του trace. Ο αναλυτής αξιολογεί αν το trace περιέχει σφάλματα, υπέρβαση χρόνου ή ενδιαφέροντα γνωρίσματα, και μόνο τότε το αποθηκεύει. Αυτή η προσέγγιση απαιτεί προσωρινή αποθήκευση όλων των span στον συλλέκτη, που αυξάνει την κατανάλωση μνήμης. Σύμφωνα με τα δεδομένα Grafana Labs, η tail-based sampling είναι 40–60% πιο αποδοτική όσον αφορά την αναλογία “τιμής για χρήσιμα δεδομένα” σε συστήματα με σπάνια αλλά κρίσιμα σφάλματα.

ΣτρατηγικήΠλεονεκτήματαΜειονεκτήματα
Fixed probabilityΑπλότητα, προβλέψιμη φόρτωσηΧάνει σπάνια συμβάντα
Rate limitingΕγγυημένος όγκος δεδομένωνΆνιση κάλυψη
Tail-basedΣύλληψη όλων των σφαλμάτωνΥψηλή κατανάλωση μνήμης
AdaptiveΙσορροπία κόστους και κάλυψηςΠολυπλοκότητα διαμόρφωσης

Διαφορά μεταξύ tracing και καταγραφής

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

Τα αρχεία καταγραφής είναι αποτελεσματικά για λεπτομερή ανάλυση ενός συγκεκριμένου σφάλματος: ο προγραμματιστής βλέπει το ακριβές μήνυμα, την αναδρομή στοιχείων, τις τιμές μεταβλητών. Η ιχνηλάτηση απαντά στην ερώτηση “γιατί το αίτημα διαρκεί 5 δευτερόλεπτα” — δείχνει ποια μικροϋπηρεσία ή κλήση πήρε τον περισσότερο χρόνο. Σύμφωνα με τα δεδομένα Honeycomb (2024), οι ομάδες που χρησιμοποιούν ιχνηλάτηση μαζί με καταγραφή βρίσκουν τη βασική αιτία περιστατικών 2,3 φορές γρηγορότερα.

Η σύγχρονη προσέγγιση — observability — συνδυάζει trace, μετρικές και αρχεία καταγραφής σε ένα ενιαίο σύστημα. Το OpenTelemetry υποστηρίζει συσχέτιση μεταξύ αυτών των τριών σημάτων: κάθε span μπορεί να περιέχει αναφορές σε σχετικά αρχεία καταγραφής, και οι μετρικές μπορούν να επισημαίνονται με trace_id για πλοήγηση σε συγκεκριμένα trace.

Συχνές Ερωτήσεις

Τι διαφορά έχει το tracing από την παρακολούθηση;

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

Ποιο ποσοστό αιτημάτων πρέπει να ιχνηλατείται;

Για συστήματα παραγωγής, αρκεί 1–5% αιτημάτων με head-based sampling. Αν το σύστημα σπάνια δίνει σφάλματα, συνιστάται tail-based sampling με εστίαση στη σύλληψη όλων των εσφαλμένων trace. Για περιβάλλον staging, επιτρέπεται η ιχνηλάτηση 100% αιτημάτων χωρίς περιορισμούς.

Ποια εργαλεία υποστηρίζουν distributed tracing;

Τα κύρια εργαλεία: Jaeger (λύση από την Uber, ανοιχτό λογισμικό), Grafana Tempo (κλιμακούμενη αποθήκευση trace), Datadog APM, New Relic Distributed Tracing, AWS X-Ray και Honeycomb. Όλα υποστηρίζουν το πρότυπο OpenTelemetry για λήψη δεδομένων.

Μπορεί να ιχνηλατηθεί κινητή εφαρμογή χωρίς backend;

Ναι, η τοπική ιχνηλάτηση λειτουργεί εντός μιας διεργασίας. Το OpenTelemetry SDK για iOS και Android δημιουργεί span για τοπικές λειτουργίες: ανάγνωση από βάση δεδομένων, επεξεργασία εικόνων, αιτήματα δικτύου. Τέτοια trace δεν είναι κατανεμημένα, αλλά είναι χρήσιμα για διάγνωση της απόδοσης της πλευράς του πελάτη.

Πώς επηρεάζει το tracing την απόδοση της εφαρμογής;

Οι σύγχρονες βιβλιοθήκες ιχνηλάτησης προσθέτουν λιγότερο από 1% επιβάρυνση με head-based sampling. Το OpenTelemetry χρησιμοποιεί ασύγχρονη εξαγωγή δεδομένων που δεν μπλοκάρει το κύριο νήμα. Για κινητές συσκευές, συνιστάται ο περιορισμός της συχνότητας δημιουργίας span και η χρήση στρατηγικής προσαρμοστικής δειγματοληψίας.

Συμπεράσματα

  • Tracing — μέθοδος παρατήρησης που καταγράφει τη διαδρομή κάθε αιτήματος μέσω όλων των συστατικών ενός κατανεμημένου συστήματος με ακρίβεια μεμονωμένης λειτουργίας.
  • Span — στοιχειώδης μονάδα trace που περιέχει όνομα λειτουργίας, διάρκεια, κατάσταση και γνωρίσματα.
  • Distributed tracing — μηχανισμός που συνδέει span από διαφορετικές υπηρεσίες μέσω μεταφοράς περιεχομένου trace_id.
  • OpenTelemetry — πρότυπο συλλογής δεδομένων trace με υποστήριξη αυτόματης ενσωμάτωσης και πολλαπλών backend.
  • Δειγματοληψία επιτρέπει τον έλεγχο όγκου αποθηκευμένων trace — head-based για απλότητα, tail-based για σύλληψη σπάνιων σφαλμάτων.
  • Tracing σε συνδυασμό με καταγραφή και μετρικές δίνει πλήρη εικόνα της παρατηρησιμότητας του συστήματος.
  • Η υλοποίηση distributed tracing συνιστάται να ξεκινά από κρίσιμα σενάρια — ταυτοποίηση, πληρωμές, φόρτωση δεδομένων — και σταδιακά να επεκτείνεται σε όλες τις υπηρεσίες.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης