Propagarea contextului

Învață despre conceptul care permite urmărirea distribuită.

Cu propagarea contextului, semnalele (urmele, metricile, și log-urile) pot fi corelate între ele, indiferent de unde sunt generate. Deși nu se limitează la urmă, propagarea contextului permite urmelor să construiască informații uzuale despre un sistem prin intermediul unor servicii distribuite arbitrar peste limitele proceselor și rețelelor.

Pentru a înțelege propagarea contextului, ai nevoie să înțelegi două concepte separate: contextul și propagarea.

Context

Contextul este un obiect care conține informațiile necesare serviciului de trimitere și de primire sau a unității de execuție, pentru a corela un semnal cu altul.

Când serviciul A apelează serviciul B, serviciul A include un ID de urmă și un ID de interval ca parte a contextului. serviciul B folosește aceste valori pentru a crea un nou interval în cadrul aceleiași urme, setând intervalul din serviciul A ca părinte. Acest lucru face posibilă urmărirea fluxului complet al unei solicitări peste limitele serviciilor.

Propagare

Propagarea este mecanismul care transferă contextul între servicii și procese. Acesta serializează și deserializează obiectul context și oferă informațiile relevante ce vor fi propagate de la un serviciu la altul.

Propagarea este gestionată de obicei de librăriile de instrumentare și este transparentă pentru utilizator. În cazul în care ai nevoie să propagi manual contextul, poți folosi API-ul Propagators.

OpenTelemetry întreține mai mulți propagatori oficiali. Propagatorul implicit utilizează anteturile definite de specificația W3C TraceContext.

Exemplu

Un serviciu numit „Frontend”, care pune la dispoziție diferite puncte finale HTTP, precum „POST /cart/add” și „GET /checkout/”, accesează un serviciu din aval, „Product Catalog”, prin intermediul unui punct final HTTP „GET /product”, pentru a primi detalii despre produsele pe care un utilizator dorește să le adauge în coș sau care fac parte din procesul de finalizare a comenzii. Pentru a înțelege activitățile din serviciul „Product Catalog” în contextul solicitărilor provenite de la „Frontend”, contextul (aici: ID-ul de urmă și ID-ul de interval ca „ID părinte”) este propagat folosind antetul „traceparent”, așa cum este definit în specificația W3C TraceContext. Aceasta înseamnă că ID-urile sunt încorporate în câmpurile antetului:

<version>-<trace-id>-<parent-id>-<trace-flags>

De exemplu:

00-a0892f3577b34da6a3ce929d0e0e4736-f03067aa0ba902b7-01

Urme

După cum s-a menționat, propagarea contextului permite urmelor să construiască informații cauzale între servicii. În acest exemplu, cele două apeluri către punctul final HTTP GET /product al serviciului Product Catalog pot fi corelate cu apelurile lor din amonte din serviciul Frontend, prin extragerea contextului la distanță din antetul traceparent și injectarea acestuia în contextul local pentru a seta ID-ul urmei și ID-ul părintelui. Astfel, într-un backend precum Jaeger este posibil să se vadă cele două cereri ca segmente ale unei singure urme.

Exemplu de propagare a contextului care ilustrează corelarea urmelor între servicii

Jurnale

SDK-urile OpenTelemetry pot corela automat jurnalele cu urmele. Acest lucru înseamnă că pot insera informații de context (ID-ul urmei, ID-ul intervalului) într-o înregistrare de jurnal. Acest lucru nu numai că îți permite să vizualizezi jurnalele în contextul urmei și al intervalului cărora le aparțin, dar îți permite, de asemenea, să vizualizezi jurnalele care fac parte din același context, chiar și dincolo de limitele serviciilor sau ale unităților de execuție.

Metrici

În cazul metricilor, propagarea contextului îți permite să adaugi măsurătorile din acel context. De exemplu, în loc să analizezi doar timpul de răspuns al tuturor cererilor GET /product, poți obține, de asemenea, metrici pentru combinațiile POST /cart/add > GET /product și GET /checkout < GET /product.

NumeApeluri pe secundăTimp mediu de răspuns
* > GET /product370300 ms
POST /card/add > GET /product330130 ms
GET /checkout > GET /product401703 ms

Propagarea contextului personalizat

În majoritatea cazurilor de utilizare, vei găsi biblioteci de instrumentare sau instrumentarea bibliotecilor native care se ocupă de propagarea contextului în locul tău. În unele cazuri, un astfel de suport nu este disponibil și dorești să creezi acest suport singur. Pentru a face acest lucru, trebuie să utilizezi API-ul Propagators menționat anterior:

  • Din partea expeditorului, contextul este injectat în purtător, de exemplu, în anteturile unei cereri HTTP. În alte cazuri, trebuie să găsești un loc în care să poți stoca metadatele pentru cererea ta.
  • La primire, contextul este extras din purtător. Din nou, în cazul HTTP, acesta este preluat din antete. În alte cazuri, alegi locul pe care l-ai selectat la expeditor pentru a salva contextul.

Reține că este posibilă propagarea contextului în protocoale care nu dispun de un câmp dedicat pentru metadate, dar trebuie să te asiguri că, la recepție, acestea sunt extrase și eliminate înainte ca datele să fie procesate; în caz contrar, poți genera un comportament nedefinit.

Pentru următoarele limbaje există un tutorial pas-cu-pas pentru propagarea personalizată a contextului:

Cele mai bune practici în materie de securitate

Propagarea implică trimiterea și primirea de date dincolo de limitele serviciilor, ceea ce poate avea implicații asupra securității.

Servicii externe

Atunci când serviciul tău interacționează cu servicii externe (servicii pe care nu le deții sau în care nu ai încredere), ia în considerare următoarele:

  • Contextul primit: Fii precaut atunci când accepți context din surse externe. Actorii malițioși ar putea trimite antete de urmă falsificate pentru a manipula datele de urmă sau pentru a exploata eventual vulnerabilități în procesul de analiză a contextului. S-ar putea să dorești să ignori sau să sanitizezi contextul primit din surse străine.
  • Contextul trimis: Fii atent la ceea ce transmiți către serviciile externe. ID-urile interne de urmă, ID-urile de interval sau elementele de bagaj ar putea dezvălui informații sensibile despre arhitectura internă sau logica de afaceri. S-ar putea să dorești să configurezi propagatoarele astfel încât să nu trimită context către puncte finale externe sau publice.

Bagaj

Bagajul îți permite să transmiți perechi cheie-valoare arbitrare. Deoarece aceste date sunt transmise dincolo de limitele serviciului, evită să incluzi informații sensibile (cum ar fi datele de autentificare ale utilizatorilor, cheile API sau informațiile de identificare personală) în bagaj, deoarece acestea ar putea fi înregistrate sau trimise către servicii din aval care nu sunt de încredere.

Suport în SDK-urile de limbaj

Pentru implementările specifice fiecărui limbaj ale API-ului și SDK-ului OpenTelemetry, vei găsi detalii privind suportul pentru propagarea contextului în paginile de documentație corespunzătoare:

Specificații

Pentru mai multe informații despre propagarea contextului, vezi Specificația contextului.