Spring Boot 4 की संपूर्ण मार्गदर्शिका · पाठ

संदर्भ प्रसार और स्पैन इंस्ट्रुमेंटेशन

Micrometer Observation और OpenTelemetry से थ्रेडों व सेवाओं के बीच ट्रेस संदर्भ प्रसारित कीजिए।

पाठ 1, कुल 4 में से13 चरण

संदर्भ प्रसार और स्पैन इंस्ट्रुमेंटेशन, CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Spring Boot 4 की संपूर्ण मार्गदर्शिका सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

संदर्भ का प्रसार क्यों महत्वपूर्ण है

वितरित प्रणाली में, उपयोगकर्ता का एक अनुरोध थ्रेड, कतारों और सेवाओं के बीच आगे बढ़ता है। वितरित ट्रेसिंग साझा ट्रेस संदर्भ (एक ट्रेस ID और वर्तमान स्पैन ID) का उपयोग करके इन सभी चरणों को जोड़ती है।

  • यदि संदर्भ खो जाता है, तो आपका ट्रेस आपस में न जुड़े हुए टुकड़ों में टूट जाता है।
  • Spring Boot 4 एकीकृत API के रूप में Micrometer Observation और ट्रेसिंग ब्रिज के रूप में OpenTelemetry (या Brave) का उपयोग करता है।
  • चुनौती यह है कि थ्रेड और प्रक्रिया की सीमाओं के पार काम जाते समय सक्रिय स्पैन जुड़ा रहे।

यह पाठ दिखाता है कि स्पैन में उपकरण-संयोजन कैसे करें और संदर्भ का प्रसार एक ही प्रक्रिया के भीतर (थ्रेड के बीच) तथा सेवाओं के बीच (HTTP/मैसेजिंग हेडर के माध्यम से) कैसे करें।

Observation API

Micrometer का ObservationRegistry प्रवेश-बिंदु है। Observation मेट्रिक्स और ट्रेसिंग स्पैन, दोनों को अमूर्त करता है, इसलिए उपकरण-संयोजन का एक ही बिंदु दोनों आधारों को डेटा देता है।

  • Observation.createNotStarted(name, registry) इसे बनाता है।
  • observe(Runnable) एक कार्य-सीमा खोलता है, कोड चलाता है और उसे बंद कर देता है — इससे वर्तमान थ्रेड के लिए स्पैन सक्रिय रहता है।

जब तक कार्य-सीमा खुली रहती है, तब तक कोई भी नेस्टेड उपकरण-संयोजन (HTTP क्लाइंट, JDBC, लॉगिंग MDC) अपने-आप चाइल्ड स्पैन बन जाता है।

import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;

@Service
public class OrderService {

    private final ObservationRegistry registry;

    public OrderService(ObservationRegistry registry) {
        this.registry = registry;
    }

    public Order place(Long id) {
        return Observation.createNotStarted("order.place", registry)
            .lowCardinalityKeyValue("order.type", "standard")
            .observe(() -> doPlace(id));
    }

    private Order doPlace(Long id) {
        // child spans created here join the same trace
        return new Order(id);
    }
}

उच्च बनाम निम्न कार्डिनैलिटी वाले टैग

Observation के कुंजी-मान, मेट्रिक टैग और स्पैन एट्रिब्यूट, दोनों बन जाते हैं। सही कार्डिनैलिटी चुनना एक महत्वपूर्ण निर्णय है:

  • lowCardinalityKeyValue: सीमित मान (HTTP विधि, स्थिति, क्षेत्र)। मेट्रिक आयामों के लिए सुरक्षित।
  • highCardinalityKeyValue: असीमित मान (उपयोगकर्ता ID, ऑर्डर ID)। टैगों की अत्यधिक वृद्धि से बचने के लिए इसे केवल स्पैन से जोड़ा जाता है, मेट्रिक्स से कभी नहीं।

निम्न-कार्डिनैलिटी वाले टैग में उपयोगकर्ता ID रखने से हर उपयोगकर्ता के लिए एक टाइम सीरीज़ बनेगी और आपका मेट्रिक्स बैकएंड अत्यधिक भारग्रस्त हो जाएगा।

Observation.createNotStarted("order.place", registry)
    .lowCardinalityKeyValue("order.type", order.getType())   // bounded -> metric + span
    .highCardinalityKeyValue("order.id", order.getId().toString()) // span only
    .observe(() -> process(order));

सक्रिय स्पैन और थ्रेड-स्थानीय मान

OpenTelemetry वर्तमान Context को थ्रेड-स्थानीय मान में रखता है। Micrometer इसे Observation की कार्य-सीमा के रूप में प्रतिबिंबित करता है, जो थ्रेड से भी बंधी होती है।

  • observe(...) के भीतर Span.current() सक्रिय स्पैन लौटाता है।
  • जिस क्षण आप काम किसी दूसरे थ्रेड (एक्जीक्यूटर, CompletableFuture, रिएक्टिव शेड्यूलर) को सौंपते हैं, वहाँ थ्रेड-स्थानीय मान खाली होता है — स्पैन अपने-आप आगे नहीं जाता।

असिंक्रोनस कोड में टूटे हुए ट्रेस का मूल कारण यही है। अगले दृश्यों में इसे ठीक किया जाएगा।

import io.opentelemetry.api.trace.Span;

public void log() {
    Span span = Span.current();
    System.out.println("traceId=" + span.getSpanContext().getTraceId());
}

ContextSnapshot के साथ थ्रेड के बीच प्रसार

Micrometer की context-propagation लाइब्रेरी सभी पंजीकृत थ्रेड-स्थानीय मानों को एक ContextSnapshot में कैप्चर करती है और उन्हें दूसरे थ्रेड में पुनर्स्थापित करती है।

  • उत्पादक थ्रेड पर ContextSnapshotFactory.captureAll() से कैप्चर करें।
  • कार्य को snapshot.wrap(runnable) से रैप करके वर्कर के भीतर संदर्भ पुनर्स्थापित करें।

इससे OpenTelemetry संदर्भ और Observation की कार्य-सीमा दोनों आगे पहुँचते हैं, इसलिए वर्कर के स्पैन मूल ट्रेस में जुड़ जाते हैं।

import io.micrometer.context.ContextSnapshot;
import io.micrometer.context.ContextSnapshotFactory;
import java.util.concurrent.ExecutorService;

public void runAsync(ExecutorService pool) {
    ContextSnapshot snapshot = ContextSnapshotFactory.builder().build().captureAll();
    pool.submit(snapshot.wrap(() -> {
        // active span here is the same as on the calling thread
        doWork();
    }));
}

अपने-आप प्रसार करने वाले एक्जीक्यूटर

हर कार्य को हाथ से रैप करना त्रुटिपूर्ण हो सकता है। इसके बजाय, एक्जीक्यूटर को एक बार सजाएँ, ताकि जमा किया गया हर कार्य संदर्भ को अपने-आप कैप्चर और पुनर्स्थापित करे।

  • context-propagation से ContextExecutorService.wrap(delegate, () -> ContextSnapshot.captureAll()), या
  • ThreadPoolTaskExecutor पर Spring का ContextPropagatingTaskDecorator।

Spring Boot 4 में, टास्क डेकोरेटर पंजीकृत करने से @Async विधियाँ हर कॉल के लिए अलग कोड लिखे बिना ट्रेस संदर्भ बनाए रखती हैं।

import org.springframework.core.task.support.ContextPropagatingTaskDecorator;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Bean
public ThreadPoolTaskExecutor applicationTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(8);
    executor.setTaskDecorator(new ContextPropagatingTaskDecorator());
    executor.initialize();
    return executor;
}

कस्टम स्पैन हाथ से बनाना

कभी-कभी आपको पूर्ण Observation के बिना किसी विशेष कोड-खंड के चारों ओर स्पैन चाहिए होता है। Micrometer का Tracer इंजेक्ट करें और स्पैन को स्पष्ट रूप से प्रबंधित करें।

  • tracer.nextSpan().name("...").start() वर्तमान स्पैन का चाइल्ड बनाता है।
  • tracer.withSpan(span) से SpanInScope खोलें, ताकि नेस्टेड कोड इसे वर्तमान स्पैन के रूप में देख सके।
  • अंत में हमेशा end() चलाएँ और span.error(ex) से त्रुटियाँ दर्ज करें।
import io.micrometer.tracing.Span;
import io.micrometer.tracing.Tracer;

public void doImport(Tracer tracer) {
    Span span = tracer.nextSpan().name("file.import").start();
    try (Tracer.SpanInScope ws = tracer.withSpan(span)) {
        parseAndStore();
    } catch (RuntimeException ex) {
        span.error(ex);
        throw ex;
    } finally {
        span.end();
    }
}

HTTP के माध्यम से सेवाओं के बीच प्रसार

प्रक्रियाओं के बीच संदर्भ HTTP हेडर में जाता है। डिफ़ॉल्ट प्रारूप W3C Trace Context है: traceparent हेडर में ट्रेस ID, पैरेंट स्पैन ID और फ़्लैग होते हैं।

  • अपने-आप उपकरण-संयोजित RestClient/WebClient बीन्स बाहर भेजे जाने वाले अनुरोध में हेडर इंजेक्ट करते हैं।
  • प्राप्त करने वाला Spring Boot ऐप इसे एक्सट्रैक्ट करता है और उसी ट्रेस को जारी रखता है।

फ़्रेमवर्क द्वारा दिए गए बिल्डरों का उपयोग करें (new RestClient.Builder() का नहीं), ताकि ट्रेसिंग इंटरसेप्टर जुड़ा रहे।

@Service
public class InventoryClient {

    private final RestClient restClient;

    // inject the auto-configured, instrumented builder
    public InventoryClient(RestClient.Builder builder) {
        this.restClient = builder.baseUrl("http://inventory").build();
    }

    public Stock check(String sku) {
        // traceparent header is injected automatically
        return restClient.get().uri("/stock/{sku}", sku)
            .retrieve().body(Stock.class);
    }
}

W3C traceparent हेडर

वायर प्रारूप समझने से टूटे हुए ट्रेस की समस्या ठीक करने में सहायता मिलती है। traceparent इस तरह दिखता है:

  • 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
  • 00 = संस्करण, फिर 16-बाइट का trace-id, 8-बाइट का parent-id, और 01 = सैंपल किया गया फ़्लैग।

यदि डाउनस्ट्रीम स्पैन में नया ट्रेस ID दिखता है, तो हेडर बीच में हट गया है — अक्सर ऐसा इसलिए होता है क्योंकि बिना उपकरण-संयोजन वाला क्लाइंट या हाथ से की गई हेडर कॉपी ने उसे हटा दिया। साथ वाला tracestate हेडर विक्रेता-विशिष्ट डेटा रखता है।

मैसेजिंग के माध्यम से प्रसार

Kafka या RabbitMQ के लिए संदर्भ मैसेज हेडर में जाता है। उपकरण-संयोजित Spring Messaging के साथ, उत्पादक रिकॉर्ड के हेडर में traceparent इंजेक्ट करता है और उपभोक्ता उसे एक्सट्रैक्ट करके उत्पादक से जुड़ा स्पैन बनाता है।

  • उत्पादक स्पैन का प्रकार = PRODUCER; उपभोक्ता स्पैन का प्रकार = CONSUMER।
  • कतार के पार संबंध को अक्सर सख्त पैरेंट/चाइल्ड संबंध के बजाय स्पैन लिंक के रूप में मॉडल किया जाता है, क्योंकि कई उपभोक्ता बैचों को संसाधित कर सकते हैं।

अपने-आप कॉन्फ़िगर किए गए KafkaTemplate/लिसनर का उपयोग जारी रखें, ताकि हेडर को हाथ से संभाले बिना प्रसार काम करता रहे।

@Component
public class OrderEvents {

    private final KafkaTemplate<String, OrderEvent> template;

    public OrderEvents(KafkaTemplate<String, OrderEvent> template) {
        this.template = template;
    }

    public void publish(OrderEvent event) {
        // traceparent header added to the Kafka record automatically
        template.send("orders", event.id(), event);
    }

    @KafkaListener(topics = "orders")
    public void consume(OrderEvent event) {
        // this span links back to the producing trace
        process(event);
    }
}

लॉग और Baggage का सहसंबंध

दो अंतिम सुधार ट्रेस को उपयोगी बनाते हैं:

  • लॉग सहसंबंध: Micrometer traceId और spanId को SLF4J के MDC में डालता है, इसलिए हर लॉग पंक्ति में ये ID रहती हैं। Spring Boot का डिफ़ॉल्ट लॉग पैटर्न इन्हें प्रिंट करता है।
  • Baggage: मनमाने कुंजी-मान, जो ट्रेस संदर्भ के साथ सेवाओं के पार प्रसारित होते हैं। इन्हें आगे भेजने और MDC में दिखाने के लिए management.tracing.baggage.correlation.fields और remote-fields कॉन्फ़िगर करें।

Baggage का उपयोग सीमित रखें (जैसे userId या tenantId) — हर मान हर डाउनस्ट्रीम चरण पर कॉपी किया जाता है।

management:
  tracing:
    sampling:
      probability: 1.0
    baggage:
      remote-fields: tenantId
      correlation:
        fields: tenantId

त्वरित जाँच

प्रक्रिया के भीतर संदर्भ प्रसार की अपनी समझ का परीक्षण करें।

पुनरावलोकन

आपने सीखा कि Spring Boot 4 प्रणाली में ट्रेस संदर्भ कैसे प्रवाहित होता है:

  • Micrometer Observation मेट्रिक्स और स्पैन को एकीकृत करता है; observe(...) थ्रेड से बंधी कार्य-सीमा खोलता है।
  • मेट्रिक्स के लिए निम्न-कार्डिनैलिटी वाले टैग और केवल स्पैन के लिए उच्च-कार्डिनैलिटी वाले एट्रिब्यूट चुनें।
  • संदर्भ थ्रेड-स्थानीय मान में रहता है, इसलिए असिंक्रोनस हस्तांतरण के लिए ट्रेस को सही बनाए रखने हेतु ContextSnapshot या ContextPropagatingTaskDecorator चाहिए।
  • जब Observation अनावश्यक रूप से भारी हो, तब Tracer से स्पष्ट स्पैन बनाएँ और उन्हें हमेशा finally ब्लॉक में समाप्त करें।
  • सेवाओं के बीच, W3C traceparent हेडर (HTTP) या मैसेज हेडर (Kafka/Rabbit) ट्रेस को आगे ले जाते हैं; अपने-आप उपकरण-संयोजित क्लाइंट का उपयोग करें।
  • MDC सहसंबंध लॉग को ट्रेस से जोड़ता है और baggage छोटे कुंजी-मानों को डाउनस्ट्रीम भेजता है।
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
21
पाठ
84

अक्सर पूछे जाने वाले प्रश्न

क्या “संदर्भ प्रसार और स्पैन इंस्ट्रुमेंटेशन” पाठ निःशुल्क है?

हाँ — Spring Boot 4 की संपूर्ण मार्गदर्शिका अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “संदर्भ प्रसार और स्पैन इंस्ट्रुमेंटेशन” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“संदर्भ प्रसार और स्पैन इंस्ट्रुमेंटेशन” में मैं क्या सीखूँगा?

Micrometer Observation और OpenTelemetry से थ्रेडों व सेवाओं के बीच ट्रेस संदर्भ प्रसारित कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Spring Boot 4 की संपूर्ण मार्गदर्शिका का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“संदर्भ प्रसार और स्पैन इंस्ट्रुमेंटेशन” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. संदर्भ प्रसार और स्पैन इंस्ट्रुमेंटेशन
  2. सर्किट ब्रेकर और बल्कहेड पृथक्करण
  3. दर सीमांकन, पुनःप्रयास और समय सीमक
  4. लॉग, मेट्रिक्स और ट्रेस का सहसंबंध
← Spring Boot 4 की संपूर्ण मार्गदर्शिका पर वापस जाएँ