Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry) · Oppitunti

Kontekstin välitys ja baggage

Perehtykää syvällisesti kontekstin välitykseen, joka on keskeinen OpenTelemetryn käsite hajautettujen operaatioiden yhdistämisessä. Tutustukaa siihen, miten baggage kuljettaa mielivaltaista dataa palvelujen välillä.

Oppitunti 3/411 vaihetta

Kontekstin välitys ja baggage on ilmainen Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-kurssilla on yhteensä 4 oppituntia.

Hajautettujen operaatioiden linkittäminen

Moderneissa sovelluksissa yksi käyttäjän pyyntö kulkee usein monien eri palvelujen kautta. Kuvitellaan verkkokauppa: napsautus siirtyy käyttöliittymään, sitten tilauspalveluun, maksupalveluun ja toimituspalveluun.

Miten tätä matkaa seurataan? Jos jokainen palvelu kirjaa tapahtumat itsenäisesti, yksittäisen säikeen seuraaminen on kuin yrittäisi löytää sen sotkeutuneesta lankakerästä!

Mitä kontekstin välitys tarkoittaa?

Kontekstin välitys yhdistää nämä hajautetut operaatiot toisiinsa. Se varmistaa, että pyynnön kaikki osat, riippumatta siitä, mihin palveluihin ne ulottuvat, jakavat yhteisen käsityksen kyseisestä pyynnöstä.

Ajattele sitä viestijuoksuna: viestikapula eli konteksti siirtyy yhdeltä juoksijalta eli palvelulta seuraavalle ja yhdistää kaikkien ponnistelut yhden tavoitteen saavuttamiseksi.

Trace Contextin selitys

Kontekstin välityksen ydin on Trace Context. Se sisältää yleensä kaksi tärkeää tietoa:

  • Trace ID: Yksilöllinen tunniste koko pyynnön matkalle kaikkien palvelujen läpi.
  • Span ID: Yksilöllinen tunniste palvelussa käynnissä olevalle operaatiolle.

Nämä tunnisteet ovat olennaisia, jotta OpenTelemetry voi muodostaa pyynnön kulusta täydellisen kokonaiskuvan.

Miten konteksti kulkee

Konteksti ei ilmesty paikalle itsestään! OpenTelemetry käyttää propagator-komponentteja kontekstin lisäämiseen ja lukemiseen.

Yleisiä tapoja välittää kontekstia:

  • HTTP-otsakkeet: Vakiomuotoiset otsakkeet, kuten traceparent ja tracestate.
  • gRPC-metatiedot: Samanlaiset kuin HTTP-otsakkeet, mutta gRPC-kutsuja varten.
  • Viestijonojen ominaisuudet: Kun palvelujen välillä lähetetään viestejä.

Näin Trace ID ja Span ID seuraavat pyyntöä.

Kontekstin lisäämisen esimerkki

Kun palvelu tekee lähtevän kutsun toiseen palveluun, nykyinen jäljityskonteksti on lisättävä pyyntöön. Tässä esimerkissä jäljityskontekstin lisäämistä otsakkeisiin simuloidaan.

import io.opentelemetry.api.trace.Span; 
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapSetter;
import java.util.HashMap;
import java.util.Map;

public class ContextInjector {

  public static void main(String[] args) {
    // Simulate an active span context
    SpanContext simulatedSpanContext =
        SpanContext.create(
            "0123456789abcdef0123456789abcdef", // Trace ID
            "fedcba9876543210", // Span ID
            io.opentelemetry.api.trace.TraceFlags.getDefault(),
            io.opentelemetry.api.trace.TraceState.getDefault());
    Span span = Span.wrap(simulatedSpanContext);
    Context context = Context.current().with(span);

    Map<String, String> headers = new HashMap<>();
    TextMapSetter<Map<String, String>> setter = Map::put;

    // OpenTelemetry usually handles this implicitly
    // Here, we simulate injecting context into headers
    // using a simplified representation.
    headers.put("traceparent", "00-" + simulatedSpanContext.getTraceId() + "-" + simulatedSpanContext.getSpanId() + "-01");
    
    System.out.println("Injected Headers:");
    headers.forEach((key, value) -> System.out.println(key + ": " + value));
  }
}

Kontekstin lukemisen esimerkki

Kun palvelu vastaanottaa saapuvan pyynnön, sen on luettava jäljityskonteksti pyynnöstä. Näin se voi jatkaa ylävirran palvelun aloittamaa jäljitystä.

import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapGetter;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import java.util.HashMap;
import java.util.Map;

public class ContextExtractor {

  public static void main(String[] args) {
    Map<String, String> incomingHeaders = new HashMap<>();
    incomingHeaders.put("traceparent", "00-112233445566778899aabbccddeeff00-aabbccddeeff0011-01");

    TextMapGetter<Map<String, String>> getter = new TextMapGetter<Map<String, String>>() {
      @Override
      public Iterable<String> keys(Map<String, String> carrier) {
        return carrier.keySet();
      }

      @Override
      public String get(Map<String, String> carrier, String key) {
        return carrier.get(key);
      }
    };

    // In a real app, OpenTelemetry.getGlobalPropagators() would be used
    TextMapPropagator propagator = OpenTelemetrySdk.builder().build()
        .getPropagators().getTextMapPropagator();

    Context extractedContext = propagator.extract(Context.current(), incomingHeaders, getter);
    SpanContext spanContext = Span.fromContext(extractedContext).getSpanContext();

    System.out.println("Extracted Trace ID: " + spanContext.getTraceId());
    System.out.println("Extracted Span ID: " + spanContext.getSpanId());
  }
}

Lisätietojen välittäminen: Baggage

Pelkkien trace- ja span-tunnisteiden lisäksi joskus on tarpeen välittää palvelujen välillä liiketoimintalogiikkaan liittyviä mielivaltaisia avain–arvo-tietoja, jotka eivät suoraan liity jäljitykseen.

Tähän tarkoitukseen käytetään Baggage-mekanismia. Se on kokoelma avain–arvo-pareja, jotka kulkevat jäljityskontekstin mukana.

Baggage ja Trace Context

On tärkeää ymmärtää niiden ero:

  • Trace Context: Olennainen spanien linkittämiseen ja jäljitysgraafin muodostamiseen. Se on rakenteellinen.
  • Baggage: Välittää sovelluskohtaista tietoa. Esimerkkejä ovat user_id, tenant_id ja A/B-testin variantti. Se on informatiivinen.

Baggage välitetään samoilla mekanismeilla kuin jäljityskonteksti, esimerkiksi HTTP-otsakkeissa, usein otsakkeessa baggage.

Baggagen käytön esimerkki

Näin voit lisätä kohteen Baggageen sovelluksesi yhdessä osassa ja hakea sen toisessa, mahdollisesti alavirran palvelussa. Tiedot kulkevat pyynnön mukana.

import io.opentelemetry.api.baggage.Baggage;
import io.opentelemetry.context.Context;

public class BaggageUsage {

  public static void main(String[] args) {
    // --- Service A: Add to Baggage ---
    System.out.println("--- Service A ---");
    Context contextWithBaggage = Baggage.current()
        .toBuilder()
        .put("user.id", "12345")
        .put("ab.test.group", "variantA")
        .build()
        .make   Current(); // Make this baggage active in current context

    System.out.println("Added user.id: " + Baggage.current().getEntryValue("user.id"));
    System.out.println("Added ab.test.group: " + Baggage.current().getEntryValue("ab.test.group"));
    
    // Simulate passing context (and thus baggage) to Service B
    // In a real app, this would be via HTTP headers, etc.
    callServiceB(contextWithBaggage);
  }

  public static void callServiceB(Context parentContext) {
    // --- Service B: Retrieve from Baggage ---
    System.out.println("\n--- Service B ---");
    // Activate the context from Service A
    try (io.opentelemetry.context.Scope scope = parentContext.makeCurrent()) {
      Baggage currentBaggage = Baggage.current();
      System.out.println("Retrieved user.id: " + currentBaggage.getEntryValue("user.id"));
      System.out.println("Retrieved ab.test.group: " + currentBaggage.getEntryValue("ab.test.group"));
    }
  }
}

Kontekstin välityksen tarkistus

Virheenkorjaat hajautettua järjestelmää. Käyttäjä ilmoittaa ongelmasta, ja sinulla on hänen user_id-tunnisteensa. Haluat nähdä kaikki tähän käyttäjään liittyvät lokit ja jäljitykset useissa palveluissa.

Kontekstin ja Baggagen yhteenveto

Opit, miten kontekstin välitys on hajautetun jäljityksen perusta ja miten Trace ID- ja Span ID-tunnisteilla operaatiot yhdistetään palvelujen välillä.

Tutustuit myös Baggage-mekanismiin, jonka avulla mukautettuja sovelluskohtaisia tietoja, kuten user_id tai A/B-testiryhmä, voidaan kuljettaa jäljityskontekstin mukana ja rikastaa havainnointitietoja.

Nämä käsitteet ovat olennaisia, kun hajautetuista sovelluksista halutaan muodostaa kattava ja toimintaan ohjaava kokonaiskuva!

Aloita maksutta

Opi Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry) tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Kontekstin välitys ja baggage” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-oppimispolun 3 oppituntia, myös oppitunnin “Kontekstin välitys ja baggage”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Kontekstin välitys ja baggage”?

Perehtykää syvällisesti kontekstin välitykseen, joka on keskeinen OpenTelemetryn käsite hajautettujen operaatioiden yhdistämisessä. Tutustukaa siihen, miten baggage kuljettaa mielivaltaista dataa pal… Harjoittelet Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Kontekstin välitys ja baggage”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-oppitunnilla?

Kyllä. Jokainen Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Automaattisen instrumentoinnin tekniikat
  2. Manuaalisen instrumentoinnin parhaat käytännöt
  3. Kontekstin välitys ja baggage
  4. Spanien attribuutit, tapahtumat ja tila
← Takaisin: Järjestelmän observability: lokitus, metriikat ja jäljitys (ELK + OpenTelemetry)