Χειρισμός προσαρμοσμένων ιχνών κεφαλίδας στο Spring Boot 3.4
Φανταστείτε ότι έχετε μια υπηρεσία Ιστού Spring Boot 3.4 που λειτουργεί άψογα με δύο πελάτες. Ο πρώτος πελάτης χρησιμοποιεί το Spring Boot 3+, κάνοντας τη διάδοση του ίχνους παιχνιδάκι. Χωρίς καμία επιπλέον προσπάθεια, έχετε όμορφη από άκρο σε άκρο ίχνος συνέχεια 🪄. Τα κούτσουρα εμφανίζονται καθαρά και συνδεδεμένα, ως δια μαγείας.
Ωστόσο, τα πράγματα παίρνουν μια τροπή όταν ο client two μπαίνει στο παιχνίδι. Αντί για τυπικές κεφαλίδες ανίχνευσης, στέλνουν προσαρμοσμένες κεφαλίδες όπως «ot-custom-traceid» και «ot-custom-spanid». Ενώ αυτές οι προσαρμοσμένες κεφαλίδες περιέχουν έγκυρες πληροφορίες ανίχνευσης, η Spring Boot αποτυγχάνει να διαδώσει αυτά τα ίχνη. Το αποτέλεσμα; Χάνετε τη δυνατότητα σύνδεσης ιχνών πελάτη με αρχεία καταγραφής από την πλευρά του διακομιστή.
Αυτό δημιουργεί ένα κενό παρατηρητικότητας. Για τον πελάτη ένα, βλέπετε την πλήρη διαδρομή ενός αιτήματος μεταξύ των υπηρεσιών. Για το πρόγραμμα-πελάτη δύο, βλέπετε μόνο αρχεία καταγραφής από την πλευρά του διακομιστή, που χάνει το κρίσιμο ίχνος πελάτη. Είναι σαν να βλέπεις μισό παζλ - ξέρεις ότι κάτι λείπει, αλλά δεν μπορείς να συνδυάσεις τα κομμάτια. 😓
Σε αυτό το άρθρο, θα διερευνήσουμε πώς να λύσουμε αυτό το πρόβλημα χωρίς να βασιζόμαστε στο Spring Cloud Sleuth, παραμένοντας πιστοί στο οικοσύστημα Spring Boot 3.4. Στο τέλος, θα ξέρετε πώς να διαδώσετε και να συνεχίσετε τα ίχνη από προσαρμοσμένες κεφαλίδες, διασφαλίζοντας απρόσκοπτη παρατηρησιμότητα σε όλο το σύστημά σας.
Εντολή | Παράδειγμα χρήσης |
---|---|
MDC.put | Αυτή η εντολή προσθέτει ζεύγη κλειδιών-τιμών στο Αντιστοιχισμένο διαγνωστικό πλαίσιο (MDC), επιτρέποντας τη συμπερίληψη προσαρμοσμένων αναγνωριστικών ιχνών στα αρχεία καταγραφής. Για παράδειγμα, MDC.put("traceId", "12345"). |
MDC.clear | Διαγράφει όλες τις καταχωρήσεις από το MDC μετά την επεξεργασία ενός αιτήματος για να αποφευχθεί η μόλυνση από ίχνη μεταξύ των αιτημάτων. Για παράδειγμα, MDC.clear(). |
OncePerRequestFilter | Ένα φίλτρο Spring Boot που διασφαλίζει ότι η λογική του φίλτρου εκτελείται μόνο μία φορά ανά αίτημα HTTP, ιδανικό για τον εντοπισμό κεφαλίδων. Παράδειγμα: η δημόσια κλάση CustomTraceFilter επεκτείνει το OncePerRequestFilter. |
filterChain.doFilter | Προχωρά στο επόμενο φίλτρο της αλυσίδας, διασφαλίζοντας ότι το αίτημα συνεχίζεται μέσω άλλων φίλτρων. Για παράδειγμα, filterChain.doFilter(αίτημα, απάντηση). |
RestTemplate.getInterceptors() | Ανακτά τη λίστα των υποκλοπών για μια παρουσία RestTemplate, επιτρέποντας την προσθήκη προσαρμοσμένων παρεμβυσμάτων. Παράδειγμα: restTemplate.getInterceptors().add(new CustomInterceptor()). |
ClientHttpRequestInterceptor | Μια διεπαφή για την παρακολούθηση εξερχόμενων αιτημάτων HTTP και την προσθήκη προσαρμοσμένων κεφαλίδων. Για παράδειγμα, η εφαρμογή του ClientHttpRequestInterceptor για την εισαγωγή αναγνωριστικών ίχνους. |
HttpServletRequest.getHeader | Εξάγει την τιμή μιας συγκεκριμένης κεφαλίδας HTTP από το εισερχόμενο αίτημα. Παράδειγμα: request.getHeader("ot-custom-traceid"). |
FilterRegistrationBean | Καταχωρεί προσαρμοσμένα φίλτρα στην εφαρμογή Spring Boot. Για παράδειγμα: registerBean.setFilter(new CustomTraceFilter()). |
MockMvc.perform | Προσομοιώνει αιτήματα HTTP σε δοκιμές μονάδας για εφαρμογές Spring Boot. Παράδειγμα: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")). |
ClientHttpRequestExecution.execute | Εκτελεί το αίτημα HTTP που έχει υποκλαπεί με το παρεχόμενο σώμα αιτήματος και τις κεφαλίδες. Παράδειγμα: execution.execute(αίτημα, σώμα). |
Προσαρμοσμένη διάδοση ίχνους κεφαλίδας σε Spring Boot
Ένα από τα βασικά στοιχεία για την επίλυση αυτού του ζητήματος είναι το CustomTraceFilter. Αυτό το φίλτρο επεκτείνει το OncePerRequestFilter class, διασφαλίζοντας ότι η λογική της κεφαλίδας ανίχνευσης εκτελείται μόνο μία φορά για κάθε αίτημα HTTP. Τα φίλτρα στο Spring Boot είναι απίστευτα χρήσιμα κατά την τροποποίηση αιτημάτων ή απαντήσεων παγκοσμίως. Για παράδειγμα, εάν ο πελάτης στέλνει πληροφορίες ανίχνευσης όπως ot-custom-traceid ή ot-custom-spanid στις προσαρμοσμένες κεφαλίδες, αυτό το φίλτρο παρεμποδίζει το αίτημα, εξάγει αυτές τις κεφαλίδες και τις διαδίδει στο Χαρτογραφημένο διαγνωστικό πλαίσιο (MDC). Προσθέτοντας τα αναγνωριστικά ίχνους στο MDC, διασφαλίζουμε ότι αυτά τα αναγνωριστικά είναι ορατά στα αρχεία καταγραφής που δημιουργούνται κατά την επεξεργασία αιτημάτων.
Το MDC είναι ένα κρίσιμο μέρος των πλαισίων καταγραφής όπως το SLF4J και το Logback. Μας επιτρέπει να αποθηκεύουμε πληροφορίες με βάση τα συμφραζόμενα για το τρέχον νήμα, όπως προσαρμοσμένα αναγνωριστικά ίχνους. Χρησιμοποιώντας εντολές όπως MDC.put και MDC.καθαρό, διασφαλίζουμε ότι το σύστημα καταγραφής περιλαμβάνει τις λεπτομέρειες του ίχνους και αποφεύγει τη μόλυνση μεταξύ ταυτόχρονων αιτημάτων. Για παράδειγμα, εάν ο Client Two στείλει το "ot-custom-traceid" ως "8f7ebd8a73f9a8f50e6a00a87a20952a", αυτό το αναγνωριστικό αποθηκεύεται στο MDC και περιλαμβάνεται σε όλα τα αρχεία καταγραφής κατάντη, δημιουργώντας μια συνεπή διαδρομή ανίχνευσης.
Από την άλλη πλευρά, για τα εξερχόμενα αιτήματα HTTP, το RestTemplate interceptor παίζει ουσιαστικό ρόλο. Με την εφαρμογή ClientHttpRequestInterceptor, μπορούμε να επισυνάψουμε τις ίδιες κεφαλίδες παρακολούθησης («ot-custom-traceid» και «ot-custom-spanid») σε εξερχόμενα αιτήματα. Αυτό διασφαλίζει ότι η συνέχεια του ίχνους διατηρείται όταν η εφαρμογή καλεί άλλες μικροϋπηρεσίες. Για παράδειγμα, όταν ο διακομιστής επεξεργάζεται ένα αίτημα με αναγνωριστικό ίχνους «8f7ebd8a73f9a8f50e6a00a87a20952a», επισυνάπτει αυτό το αναγνωριστικό στις εξερχόμενες κεφαλίδες, έτσι ώστε οι υπηρεσίες μεταγενέστερης ροής να μπορούν να αναγνωρίσουν και να διαδώσουν το ίχνος απρόσκοπτα.
Τέλος, οι δοκιμές μονάδας γραμμένες με MockMvc επικυρώνουν ολόκληρη τη ρύθμιση προσομοιώνοντας αιτήματα HTTP και επαληθεύοντας τη διάδοση της κεφαλίδας. Σε εφαρμογές πραγματικού κόσμου, οι δοκιμές είναι ζωτικής σημασίας για να διασφαλιστεί ότι οι κεφαλίδες ίχνους χειρίζονται σωστά. Για παράδειγμα, στέλνοντας ένα αίτημα GET με προσαρμοσμένες κεφαλίδες και επιθεωρώντας την απόκριση ή τα αρχεία καταγραφής, μπορούμε να επιβεβαιώσουμε ότι το φίλτρο και ο υποκλοπής λειτουργούν όπως αναμένεται. Αυτή η ολοκληρωμένη προσέγγιση λύνει την πρόκληση χωρίς να βασίζεται σε εξαρτήσεις παλαιού τύπου όπως το Spring Cloud Sleuth. Τελικά, ο συνδυασμός φίλτρων, υποκλοπών και MDC εξασφαλίζει συνέχεια ίχνους ακόμα και όταν οι πελάτες χρησιμοποιούν προσαρμοσμένες κεφαλίδες, καθιστώντας το σύστημα στιβαρό και πλήρως παρατηρήσιμο. 🌟
Διάδοση κεφαλίδων προσαρμοσμένης ανίχνευσης σε Spring Boot 3.4
Χρήση Java με Spring Boot 3.4 και Μικρόμετρο για Επεξεργασία Backend
// Solution 1: Extract and Propagate Custom Trace Headers Manually
// Import necessary Spring Boot and Micrometer libraries
import org.slf4j.MDC;
import org.springframework.http.HttpHeaders;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomTraceFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws IOException {
String traceId = request.getHeader("ot-custom-traceid");
String spanId = request.getHeader("ot-custom-spanid");
try {
if (traceId != null) {
MDC.put("traceId", traceId); // Add traceId to Mapped Diagnostic Context
}
if (spanId != null) {
MDC.put("spanId", spanId);
}
filterChain.doFilter(request, response); // Continue request processing
} finally {
MDC.clear(); // Ensure MDC is cleared after processing
}
}
}
// Register the filter in your configuration class
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CustomTraceFilter> traceFilter() {
FilterRegistrationBean<CustomTraceFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CustomTraceFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
Δοκιμή μονάδας για τη διάδοση της κεφαλίδας προσαρμοσμένου ίχνους
Δοκιμή με JUnit και MockMvc για επικύρωση της διάδοσης κεφαλίδας ανίχνευσης
// Import necessary libraries
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
public class CustomTraceFilterTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testCustomTraceHeaders() throws Exception {
mockMvc.perform(get("/test-endpoint")
.header("ot-custom-traceid", "12345")
.header("ot-custom-spanid", "67890"))
.andExpect(status().isOk());
}
}
Διάδοση προσαρμοσμένων κεφαλίδων σε αιτήματα HTTP με χρήση RestTemplate
Χρήση RestTemplate Interceptors για προσθήκη προσαρμοσμένων κεφαλίδων σε εξερχόμενα αιτήματα
// Import necessary libraries
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
public class CustomHeaderInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add("ot-custom-traceid", "12345");
headers.add("ot-custom-spanid", "67890");
return execution.execute(request, body);
}
}
// Register the interceptor with RestTemplate
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add(new CustomHeaderInterceptor());
return restTemplate;
}
}
Χειρισμός προσαρμοσμένων ιχνών κεφαλίδας με το OpenTelemetry στο Spring Boot 3.4
Όταν εργάζεστε με το Spring Boot 3.4, μια άλλη ισχυρή προσέγγιση για τη διάδοση ιχνών από προσαρμοσμένες κεφαλίδες είναι η ενσωμάτωση OpenTelemetry. Το OpenTelemetry, ένα πλαίσιο παρατηρησιμότητας ανοιχτού κώδικα, βοηθά στην οργάνωση, τη συλλογή και την εξαγωγή ιχνών απρόσκοπτα. Παρέχει μηχανισμούς εξαγωγής και εισαγωγής πλαισίου ίχνους, συμπεριλαμβανομένων προσαρμοσμένων κεφαλίδων όπως ot-custom-traceid και ot-custom-spanid, στην αίτησή σας. Αξιοποιώντας το TextMapPropagator του OpenTelemetry, μπορείτε να γεφυρώσετε το χάσμα μεταξύ των μη τυπικών πελατών και του συστήματος παρατηρησιμότητας.
Για να χρησιμοποιήσετε το OpenTelemetry στην Spring Boot 3.4, μπορεί να εφαρμοστεί ένας προσαρμοσμένος διαδότης για την εξαγωγή πληροφοριών ανίχνευσης από τις προσαρμοσμένες κεφαλίδες και την προσάρτησή τους στο τρέχον περιβάλλον παρακολούθησης. Για παράδειγμα, όταν ο διακομιστής σας λαμβάνει ένα εισερχόμενο αίτημα από τον Πελάτη Δύο, το OpenTelemetry μπορεί να αναλύσει προσαρμοσμένες κεφαλίδες και να ανακατασκευάσει το αρχικό πλαίσιο παρακολούθησης. Αυτό διασφαλίζει ότι οι μεταγενέστερες υπηρεσίες βλέπουν τα ίδια αναγνωριστικά ίχνους, επιτρέποντας την ορατότητα από άκρο σε άκρο. Σε αντίθεση με παλαιότερες λύσεις όπως το Spring Cloud Sleuth, το OpenTelemetry είναι ελαφρύ και ευθυγραμμίζεται με τα σύγχρονα πρότυπα παρατηρησιμότητας.
Συνδυάζοντας τον πολλαπλασιαστή του OpenTelemetry με το Micrometer, μπορείτε να εμπλουτίσετε τις μετρήσεις και την καταγραφή σας με πληροφορίες ίχνους. Φανταστείτε να βλέπετε ίχνη για αιτήματα που προέρχονται τόσο από τον Πελάτη Ένα όσο και από τον Πελάτη Δύο χωρίς προβλήματα στο εργαλείο παρατηρησιμότητας. Το OpenTelemetry υποστηρίζει αυτόματα ενσωματώσεις με Prometheus, Zipkin ή Jaeger, επιτρέποντάς σας να κεντράρετε την οπτικοποίηση ιχνών. Αυτή η προσέγγιση διασφαλίζει ότι ακόμη και όταν εμπλέκονται προσαρμοσμένες κεφαλίδες, δεν χάνονται δεδομένα ιχνών και ο εντοπισμός σφαλμάτων γίνεται σημαντικά ευκολότερος. 🚀
Συχνές ερωτήσεις σχετικά με τη διάδοση προσαρμοσμένων ιχνών στο Spring Boot
- Πώς μπορώ να εξαγάγω με μη αυτόματο τρόπο τις προσαρμοσμένες κεφαλίδες παρακολούθησης στο Spring Boot;
- Μπορείτε να χρησιμοποιήσετε το request.getHeader("custom-header") για να ανακτήσετε με μη αυτόματο τρόπο μια συγκεκριμένη κεφαλίδα και να την προσθέσετε στο MDC χρησιμοποιώντας το MDC.put("traceId", value).
- Ποιο είναι το όφελος από τη χρήση του OpenTelemetry για προσαρμοσμένη διάδοση ιχνών;
- Το OpenTelemetry παρέχει μια σύγχρονη, ουδέτερη ως προς τον προμηθευτή προσέγγιση για τη διάδοση ιχνών, συμπεριλαμβανομένων προσαρμοσμένων κεφαλίδων, σε μικροϋπηρεσίες.
- Μπορώ να διαδώσω προσαρμοσμένες κεφαλίδες με το RestTemplate στο Spring Boot;
- Ναι, με την εφαρμογή ενός ClientHttpRequestInterceptor, μπορείτε να επισυνάψετε προσαρμοσμένες κεφαλίδες όπως traceid και spanid σε εξερχόμενα αιτήματα.
- Πώς μπορώ να καταχωρήσω ένα φίλτρο για να καταγράψω κεφαλίδες παγκοσμίως;
- Μπορείτε να δημιουργήσετε ένα φίλτρο που εκτείνεται OncePerRequestFilter και να το καταχωρήσετε χρησιμοποιώντας το FilterRegistrationBean για να καταγράψετε κεφαλίδες για όλα τα τελικά σημεία.
- Ποια εργαλεία μπορώ να χρησιμοποιήσω για να οπτικοποιήσω τα ίχνη από το Spring Boot;
- Εργαλεία όπως τα Zipkin, Jaeger και Prometheus μπορούν να ενσωματωθούν με το Spring Boot και το OpenTelemetry για να απεικονίσουν ίχνη από άκρο σε άκρο.
Εξασφάλιση αδιάλειπτης συνέχειας ίχνους
Στα σύγχρονα συστήματα, ο χειρισμός προσαρμοσμένων κεφαλίδων ίχνους είναι κρίσιμος για αξιόπιστη παρατηρησιμότητα. Χρησιμοποιώντας φίλτρα και υποκλοπές, μπορείτε να συλλάβετε πληροφορίες εντοπισμού που παρέχονται από τον πελάτη και να τις διαδώσετε σωστά στις υπηρεσίες σας. Αυτό αποφεύγει τα κατακερματισμένα αρχεία καταγραφής και τα ίχνη που λείπουν. 🔍
Το Spring Boot 3.4, σε συνδυασμό με το Micrometer ή το OpenTelemetry, επιτρέπει ισχυρές λύσεις χωρίς να βασίζεστε σε παλαιότερα εργαλεία όπως το Spring Cloud Sleuth. Είτε έχετε να κάνετε με τις τυπικές κεφαλίδες του Client One είτε τις προσαρμοσμένες κεφαλίδες του Client Two, η εφαρμογή αυτών των τεχνικών γεφυρώνει αποτελεσματικά τα κενά των ιχνών. 🚀
Πηγές και Αναφορές
- Επίσημη Τεκμηρίωση Spring Boot: Propagation of Tracing Contexts. Τεκμηρίωση για μπότες άνοιξης
- OpenTelemetry for Java Developers: Οδηγός για τη διάδοση ανίχνευσης. OpenTelemetry Java
- Τεκμηρίωση παρατηρησιμότητας μικρομέτρου: Ενσωμάτωση κεφαλίδων προσαρμοσμένου ίχνους. Παρατηρησιμότητα μικρομέτρου
- SLF4J Logging API: Αντιστοιχισμένες περιπτώσεις χρήσης διαγνωστικού περιβάλλοντος (MDC). Εγχειρίδιο SLF4J