ЁЯз╡ рдзрдбрд╛ 05 тАФ Distributed tracing: рдПрдХрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдЪреЗ рдорд╛рд░реНрдЧ рдХрд╛рд░реНрдб
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-percentiles ┬╖ рдкреБрдвреЗ: lesson-06-opentelemetry
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ04, рдЖрдгрд┐ рддрд┐рд╕рд░рд╛ signal рд╡ рднрд╛рдЧ 2 рдЪреА рд╕реБрд░реБрд╡рд╛рдд: traces. рддреБрдореНрд╣реА spans,
parent рдЖрдгрд┐ child, critical path, рдЖрдгрд┐ trace рдПрдХрд╛ service рдХрдбреВрди рдкреБрдврдЪреНрдпрд╛ service рдХрдбреЗ рдиреЗрдгрд╛рд░рд╛
W3C traceparent header рд╢рд┐рдХрддрд╛. Span, trace_tree(),
critical_path() рдЖрдгрд┐ traceparent() obs/signals.py рдордзреНрдпреЗ рдЖрд╣реЗрдд;
obs/demo.py рдордзреАрд▓ tracing() рдПрдХрд╛ рдкрд╛рд▓рдХрд╛рдЪреА рдЕрдпрд╢рд╕реНрд╡реА request рдХрд╛рдвреВрди рджрд╛рдЦрд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдПрдХрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрд▓рд╛ рдмрд░реЗ рд╡рд╛рдЯрдд рдирд╛рд╣реА рдЖрдгрд┐ рддрд┐рд▓рд╛ рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖рд╛рдд рдкрд╛рдард╡рд▓реЗ рдЬрд╛рддреЗ. рд╡рд╛рдЯреЗрдд рддреА office, рд╢рд┐рдХреНрд╖рдХ рдХрдХреНрд╖ рдЖрдгрд┐ рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдд рдЬрд╛рддреЗ. рдХреБрдареЗрддрд░реА рддрд┐рдЪреА 15 рдорд┐рдирд┐рдЯреЗ рдЧреЗрд▓реА. рдХреБрдареЗ?
рдореНрд╣рдгреВрди рдХрддрд░рд┐рдирд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рд▓рд╛ рдПрдХ рдорд╛рд░реНрдЧ рдХрд╛рд░реНрдб ЁЯЧ║я╕П рджреЗрддреЗ, рдЬреНрдпрд╛рд╡рд░ рд╡рд░ рдПрдХ рдХреНрд░рдорд╛рдВрдХ рдЕрд╕рддреЛ. рддреА рдЬрд┐рдереЗ рдЬрд╛рддреЗ рддреА рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реА рдХрд╛рд░реНрдбрд╛рд╡рд░ рд╢рд┐рдХреНрдХрд╛ рдорд╛рд░рддреЗ: рдЦреЛрд▓реАрдЪреЗ рдирд╛рд╡, рдЖрдд рдпреЗрдгреНрдпрд╛рдЪреА рд╡реЗрд│, рдмрд╛рд╣реЗрд░ рдЬрд╛рдгреНрдпрд╛рдЪреА рд╡реЗрд│. Office рдЬреЗрд╡реНрд╣рд╛ рддрд┐рд▓рд╛ рд╢рд┐рдХреНрд╖рдХ рдХрдХреНрд╖рд╛рдд рдкрд╛рдард╡рддреЗ, рддреЗрд╡реНрд╣рд╛ office рдХрд╛рд░реНрдбрд╛рд╡рд░ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╢рд┐рдХреНрдХреНрдпрд╛рдЪрд╛ рдХреНрд░рдорд╛рдВрдХ рд▓рд┐рд╣рд┐рддреЗ, рдореНрд╣рдгрдЬреЗ рд╢рд┐рдХреНрд╖рдХ рдХрдХреНрд╖рд╛рд▓рд╛ рдХрд│рддреЗ рдХреА рддрд┐рд▓рд╛ рдХреЛрдгреА рдкрд╛рдард╡рд▓реЗ.
рд╢реЗрд╡рдЯреА, рдХрддрд░рд┐рдирд╛ рдХрд╛рд░реНрдб рдЯреЗрдмрд▓рд╡рд░ рдареЗрд╡рддреЗ. рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рдХреНрдХрд╛ рдореНрд╣рдгрдЬреЗ рдПрдХ рдЪреМрдХрдЯ. рдЪреМрдХрдЯреА рдЗрддрд░ рдЪреМрдХрдЯреАрдВрдЪреНрдпрд╛ рдЖрдд рдЕрд╕рддрд╛рдд: рд╢рд┐рдХреНрд╖рдХ рдХрдХреНрд╖рд╛рдЪреНрдпрд╛ рднреЗрдЯреАрдд рддреНрдпрд╛рдЪреА рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдЪреА рдлреЗрд░реА рдпреЗрддреЗ. рдЪреМрдХрдЯреАрдВрдЪреА рдПрдХ рд╕рд╛рдЦрд│реА рдмрд╛рдХреА рд╕рдЧрд│реНрдпрд╛рдВрдкреЗрдХреНрд╖рд╛ рд▓рд╛рдВрдм рдЖрд╣реЗ тАФ 15 рдкреИрдХреА 12 рдорд┐рдирд┐рдЯреЗ рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдд рдЧреЗрд▓реА. рддреА рд╕рд╛рдЦрд│реА рдореНрд╣рдгрдЬреЗ critical path. рдЗрддрд░ рдХреЛрдгрддреАрд╣реА рдЦреЛрд▓реА рдЬрд▓рдж рдХреЗрд▓реА рддрд░реА рддрд┐рд▓рд╛ рдЕрдЬрд┐рдмрд╛рдд рдорджрдд рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
a["GET /results/3A ┬╖ gateway ┬╖ 0тАУ1040 ms тЬЧ<br/>(root span)"]
b["check parent login ┬╖ auth ┬╖ 40 ms"]
c["load class list ┬╖ results-api ┬╖ 40 ms"]
d["fetch grades ┬╖ results-api ┬╖ 940 ms тЬЧ"]
e["SELECT grades ┬╖ postgres ┬╖ 60 ms"]
f["grade service call ┬╖ grade-service ┬╖ 865 ms тЬЧ"]
a --> b
a --> c
a ==>|"critical path"| d
d --> e
d ==>|"critical path"| f
h["ЁЯУи every hop carries:<br/>traceparent: 00-4bf92f35тАж4736-00f067aa0ba902b7-01"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/observability/lesson-diagrams.html#l05
тЭУ рдХрд╛рдп
- Trace тАФ рдПрдХрд╛ request рдЪрд╛ рддреА рд╕реНрдкрд░реНрд╢ рдХрд░рддреЗ рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ service рдордзреВрди рд╣реЛрдгрд╛рд░рд╛ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рд╡рд╛рд╕. рддрд┐рдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ рднрд╛рдЧрд╛рдВрдЪрд╛ рдПрдХрдЪ trace id рдЕрд╕рддреЛ (16 bytes, 32 hex рдЕрдХреНрд╖рд░реЗ рдореНрд╣рдгреВрди рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛).
- Span тАФ trace рдордзрд▓рд╛ рд╡реЗрд│ рдореЛрдЬрд▓реЗрд▓рд╛ рдХрд╛рдорд╛рдЪрд╛ рдПрдХ рддреБрдХрдбрд╛: рдПрдХ рдирд╛рд╡, рдПрдХ service, рд╕реБрд░реБрд╡рд╛рддреАрдЪреА рд╡реЗрд│, рд╢реЗрд╡рдЯрдЪреА
рд╡реЗрд│ (рдореНрд╣рдгрдЬреЗ рдХрд╛рд▓рд╛рд╡рдзреА), рдПрдХ span id (8 bytes, 16 hex рдЕрдХреНрд╖рд░реЗ), рддреНрдпрд╛рдЪреНрдпрд╛
parent span рдЪрд╛ id, рдПрдХ status (ok рдХрд┐рдВрд╡рд╛ error), attributes (keyтАУvalue рддрдкрд╢реАрд▓ рдЬрд╕реЗ
http.routeрдХрд┐рдВрд╡рд╛db.system) рдЖрдгрд┐ рдРрдЪреНрдЫрд┐рдХ events (timestamp рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдиреЛрдВрджреА, рдЬрд╕реЗ рдПрдЦрд╛рджреЗ exception). - Root span тАФ рдкрд╣рд┐рд▓рд╛ span, рдЬреНрдпрд╛рд▓рд╛ parent рдирд╛рд╣реА (рдЗрдереЗ: gateway рдЪрд╛
GET /results/3A). - Parent / child тАФ рдЬреЛ span рджреБрд╕рд░реЗ рдХрд╛рдо рдмреЛрд▓рд╛рд╡рддреЛ рддреЛ рддреНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ spans рдЪрд╛ parent рдЕрд╕рддреЛ. Children рдПрдХрд╛рдорд╛рдЧреВрди рдПрдХ (sequential) рдХрд┐рдВрд╡рд╛ рдПрдХрд╛рдЪ рд╡реЗрд│реА (parallel) рдЪрд╛рд▓реВ рд╢рдХрддрд╛рдд.
- Critical path тАФ рдПрдХреВрдг рд╡реЗрд│ рдард░рд╡рдгрд╛рд░реА spans рдЪреА рд╕рд╛рдЦрд│реА. Critical path рд╡рд░ рдирд╕рд▓реЗрд▓рд╛ span рдЬрд▓рдж рдХреЗрд▓реНрдпрд╛рдиреЗ request рдЬрд▓рдж рд╣реЛрдд рдирд╛рд╣реА. (Lab рдПрдХ рд╕реЛрдкрд╛ рдирд┐рдпрдо рд╡рд╛рдкрд░рддреЛ: root рдкрд╛рд╕реВрди, рд╕рд░реНрд╡рд╛рдд рд╢реЗрд╡рдЯреА рд╕рдВрдкрдгрд╛рд▒реНрдпрд╛ child рдЪрд╛ рдкрд╛рдард▓рд╛рдЧ рдХрд░рд╛. рдЦрд░реА tools children рдордзрд▓реНрдпрд╛ рд░рд┐рдХрд╛рдореНрдпрд╛ рд╡реЗрд│реЗрдЪрд╛рд╣реА рд╣рд┐рд╢реЛрдм рдХрд░рддрд╛рдд.)
- Context propagation тАФ trace id рдЖрдгрд┐ рдмреЛрд▓рд╛рд╡рдгрд╛рд▒реНрдпрд╛рдЪрд╛ span id рдкреБрдврдЪреНрдпрд╛ service рдХрдбреЗ рдкрд╛рдард╡рдгреЗ, рд╕рд╣рд╕рд╛ HTTP header рдордзреНрдпреЗ, рдореНрд╣рдгрдЬреЗ рддрд┐рдЪреЗ spans рддреНрдпрд╛рдЪ trace рдордзреНрдпреЗ рдЬреЛрдбрд▓реЗ рдЬрд╛рддрд╛рдд.
- W3C Trace Context тАФ standard header:
traceparent: 00-<32 hex trace-id>-<16 hex parent-id>-<2 hex flags>00тАФ version;- trace-id тАФ trace рдордзрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ span рд╕рд╛рдареА рддреЛрдЪ;
- parent-id тАФ рдмреЛрд▓рд╛рд╡рдгрд╛рд▒реНрдпрд╛ рдЪрд╛ span id (рдЬреНрдпрд╛ span рдиреЗ рд╣реА request рдкрд╛рдард╡рд▓реА рддреЛ);
- flags тАФ
01рдореНрд╣рдгрдЬреЗ sampled (рд╣рд╛ trace record рд╣реЛрдд рдЖрд╣реЗ),00рдореНрд╣рдгрдЬреЗ рдирд╛рд╣реА. рд╕рдЧрд│реЗ рд╢реВрдиреНрдп рдЕрд╕рд▓реЗрд▓реЗ ids рдЕрд╡реИрдз рдЕрд╕рддрд╛рдд. рджреБрд╕рд░рд╛ header,tracestate, vendor-specific data рдиреЗрддреЛ.
- Signals рдЬреЛрдбрдгреЗ тАФ trace id рдкреНрд░рддреНрдпреЗрдХ log рдУрд│реАрдд рдареЗрд╡рд╛ (рдзрдбрд╛ 02); рдЕрдиреЗрдХ tools metric points рдирд╛ рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ trace ids рд╕реБрджреНрдзрд╛ рдЬреЛрдбрддрд╛рдд (exemplars), рдореНрд╣рдгрдЬреЗ graph рд╡рд░рдЪреНрдпрд╛ рдПрдХрд╛ рд╣рд│реВ рдмрд┐рдВрджреВрд╡рд░реВрди рдереЗрдЯ рдПрдХрд╛ рд╣рд│реВ trace рд╡рд░ рдЬрд╛рддрд╛ рдпреЗрддреЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдПрдХ page load рдЕрдиреЗрдХ services рдУрд▓рд╛рдВрдбрддреЛ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ team рд▓рд╛ рдлрдХреНрдд рддрд┐рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рджрд┐рд╕рддреЗ. Gateway team рд▓рд╛ 1,040 ms рдЪреА request рджрд┐рд╕рддреЗ. results-api team рд▓рд╛ 940 ms рдЪрд╛ call рджрд┐рд╕рддреЛ. рдлрдХреНрдд trace рджрд╛рдЦрд╡рддреЛ рдХреА рддреНрдпрд╛рддрд▓реЗ 865 ms grade service рд▓рд╛ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛ call рдордзреНрдпреЗ рдЧреЗрд▓реЗ тАФ рдЖрдгрд┐ database, auth рдЖрдгрд┐ class list рдареАрдХ рд╣реЛрддреЗ. рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп, рдкрд╛рдЪ teams рдкрд╛рдЪ dashboards рдкрд╛рд╣рддрд╛рдд рдЖрдгрд┐ рд╡рд╛рдж рдШрд╛рд▓рддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
obs/signals.py рдордзреАрд▓ Span(span_id, parent, name, start, end, service, error=False)
рдореНрд╣рдгрдЬреЗ рдХрд╛рд░реНрдбрд╛рд╡рд░рдЪрд╛ рдПрдХ рд╢рд┐рдХреНрдХрд╛; .ms рддреНрдпрд╛рдЪрд╛ рдХрд╛рд▓рд╛рд╡рдзреА. trace_tree(spans) spans
indent рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЭрд╛рдбрд╛рд╕рд╛рд░рдЦреЗ print рдХрд░рддреЗ (children рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рд╡реЗрд│реЗрдиреБрд╕рд╛рд░ sort рдХреЗрд▓реЗрд▓реЗ, errors рд╕рд╛рдареА тЬЧ).
critical_path(spans) root рдкрд╛рд╕реВрди рд╕реБрд░реВ рдХрд░реВрди рд╕рд░реНрд╡рд╛рдд рд╢реЗрд╡рдЯреА рд╕рдВрдкрдгрд╛рд▒реНрдпрд╛ child рдЪрд╛ рдкрд╛рдард▓рд╛рдЧ рдХрд░рдд рд░рд╛рд╣рддреЗ.
traceparent(trace_id, span_id, sampled=True) W3C header рдмрдирд╡рддреЗ.
tracing() 11:40 рдЪреА рдЕрдпрд╢рд╕реНрд╡реА request рдмрдирд╡рддреЗ: рдкрд╛рдЪ services рдордзрд▓реЗ рд╕рд╣рд╛ spans.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
Grade service рджреБрд░реБрд╕реНрдд рдХрд░рд╛ (865 ms рдЪреНрдпрд╛ call рдРрд╡рдЬреА 5 ms рдЪреЗ cache read), parallel рдордзреНрдпреЗ load рд╣реЛрдгрд╛рд░рд╛ рдПрдХ photo рдЬреЛрдбрд╛ тАФ рдЖрдгрд┐ critical path рд╕рд░рдХрддрд╛рдирд╛ рдкрд╛рд╣рд╛:
python3 obs/demo.py tracing
python3 - <<'EOF'
import sys; sys.path.insert(0, "obs"); from signals import Span, trace_tree, critical_path, traceparent
fixed = [Span("a", None, "GET /results/3A", 0, 240, "gateway"), Span("b", "a", "check parent login", 5, 45, "auth"),
Span("c", "a", "load class list", 50, 90, "results-api"), Span("d", "a", "fetch grades", 95, 235, "results-api"),
Span("e", "d", "SELECT grades", 100, 160, "postgres"), Span("f", "d", "grade cache GET", 165, 170, "redis"),
Span("g", "a", "load photo", 50, 238, "photo-service")]
for line in trace_tree(fixed): print(line)
print("critical path:", " тЖТ ".join(critical_path(fixed)))
print(traceparent("a3ce929d0e0e47364bf92f3577b34da6", "b7ad6b7169203331"))
print(traceparent("a3ce929d0e0e47364bf92f3577b34da6", "b7ad6b7169203331", sampled=False))
EOF
python3 obs/test_obs.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
tracing рд╣реЗ print рдХрд░рддреЗ:
тФАтФА one parent's request, as a trace (one tree of spans):
GET /results/3A [gateway] 0тАУ1040 ms (1040 ms) тЬЧ
check parent login [auth] 5тАУ45 ms (40 ms)
load class list [results-api] 50тАУ90 ms (40 ms)
fetch grades [results-api] 95тАУ1035 ms (940 ms) тЬЧ
SELECT grades [postgres] 100тАУ160 ms (60 ms)
grade service call [grade-service] 165тАУ1030 ms (865 ms) тЬЧ
critical path: GET /results/3A тЖТ fetch grades тЖТ grade service call тАФ 865 of 1040 ms is the grade service
passed between services in a header: traceparent: 00-a3ce929d0e0e47364bf92f3577b34da6-00f067aa0ba902b7-01
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
GET /results/3A [gateway] 0тАУ240 ms (240 ms)
check parent login [auth] 5тАУ45 ms (40 ms)
load class list [results-api] 50тАУ90 ms (40 ms)
load photo [photo-service] 50тАУ238 ms (188 ms)
fetch grades [results-api] 95тАУ235 ms (140 ms)
SELECT grades [postgres] 100тАУ160 ms (60 ms)
grade cache GET [redis] 165тАУ170 ms (5 ms)
critical path: GET /results/3A тЖТ load photo
00-a3ce929d0e0e47364bf92f3577b34da6-b7ad6b7169203331-01
00-a3ce929d0e0e47364bf92f3577b34da6-b7ad6b7169203331-00
Tests рдордзреНрдпреЗ тЬЕ L05 the critical path follows the child that ends last рдЖрдгрд┐
тЬЕ L05 W3C traceparent has version-trace-span-flags рдЕрд╕рддрд╛рдд.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдЕрдпрд╢рд╕реНрд╡реА request рдордзреНрдпреЗ, critical path fetch grades тЖТ grade service call рдордзреВрди рдЧреЗрд▓рд╛:
1,040 рдкреИрдХреА 865 ms. рджреБрд░реБрд╕реНрддреАрдирдВрддрд░ request рд▓рд╛ 240 ms рд▓рд╛рдЧрддрд╛рдд, рдЖрдгрд┐ рдЖрддрд╛ critical path рдореНрд╣рдгрдЬреЗ
photo (188 ms, 50 рддреЗ 238 ms parallel рдордзреНрдпреЗ рдЪрд╛рд▓рдгрд╛рд░рд╛). fetch grades рдЖрдгрдЦреА рдЬрд▓рдж рдХреЗрд▓реЗ
рддрд░реА рдХрд╛рд╣реАрдЪ рдмрджрд▓рдгрд╛рд░ рдирд╛рд╣реА тАФ рддреЛ photo рдЪреНрдпрд╛ рдЖрдзреАрдЪ рд╕рдВрдкрддреЛ. Header рдиреЗ рддреЛрдЪ trace id рдареЗрд╡рд▓рд╛;
рдлрдХреНрдд parent id (рдмреЛрд▓рд╛рд╡рдгрд╛рд▒реНрдпрд╛рдЪрд╛ span) рдЖрдгрд┐ sampled flag рдмрджрд▓рд▓реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
traceparentрдкреБрдвреЗ рди рдкрд╛рдард╡рдгрд╛рд░реА рдПрдХ service тАФ trace рджреЛрди рдЕрд╕рдВрдмрдВрдзрд┐рдд traces рдордзреНрдпреЗ рддреБрдЯрддреЛ- рдпреЗрдгрд╛рд░рд╛ trace рдкреБрдвреЗ рдЪрд╛рд▓реВ рдареЗрд╡рдгреНрдпрд╛рдРрд╡рдЬреА рдкреНрд░рддреНрдпреЗрдХ service рдордзреНрдпреЗ рдирд╡рд╛ trace рд╕реБрд░реВ рдХрд░рдгреЗ
- critical path рд╡рд░ рдирд╕рддрд╛рдирд╛ рд╕рд░реНрд╡рд╛рдд рд╣рд│реВ рджрд┐рд╕рдгрд╛рд░рд╛ span optimise рдХрд░рдгреЗ
- рдЖрдд ids рдЕрд╕рд▓реЗрд▓реА span names (
GET /results/3A/pupil/1234) тАФ route template рд╡рд╛рдкрд░рд╛ рдЖрдгрд┐ id attribute рдордзреНрдпреЗ рдареЗрд╡рд╛ - message рдордзреНрдпреЗ context рдирд╕рд▓реЗрд▓реНрдпрд╛ queues рдЖрдгрд┐ background jobs, рддреНрдпрд╛рдореБрд│реЗ trace queue рд╡рд░рдЪ рдерд╛рдВрдмрддреЛ
- span attributes рдордзреНрдпреЗ рд╡реИрдпрдХреНрддрд┐рдХ рдорд╛рд╣рд┐рддреА тАФ рддреА logs рд╕рд╛рд░рдЦреАрдЪ рд╕рд╛рдард╡рд▓реА рдЖрдгрд┐ рджрд╛рдЦрд╡рд▓реА рдЬрд╛рддреЗ (рдзрдбрд╛ 02)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
On a real account тАФ рдПрдХрд╛ call рднреЛрд╡рддреА span, рдЖрдгрд┐ header рд╣рд╛рддрд╛рдиреЗ рдкреБрдвреЗ рдкрд╛рдард╡рд▓реЗрд▓рд╛ (OpenTelemetry
SDK рдзрдбрд╛ 06 рдордзреНрдпреЗ set up рд╣реЛрддреЛ; requests, Flask,
FastAPI рдЖрдгрд┐ рдЗрддрд░рд╛рдВрд╕рд╛рдареАрдЪреЗ auto-instrumentation рд╣реЗ рджреЛрдиреНрд╣реА рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдХрд░рддреЗ):
import requests
from opentelemetry import trace
from opentelemetry.propagate import inject
from opentelemetry.trace import Status, StatusCode
tracer = trace.get_tracer("results-api")
def fetch_grades(cls):
with tracer.start_as_current_span("fetch grades") as span:
span.set_attribute("school.class", cls)
headers = {}
inject(headers) # adds traceparent: 00-<trace-id>-<this span's id>-01
try:
return requests.get(f"http://grade-service/grades/{cls}", headers=headers, timeout=1.0).json()
except requests.Timeout as e:
span.record_exception(e)
span.set_status(Status(StatusCode.ERROR, "grade service timeout"))
raise
Wire рд╡рд░рдЪрд╛ header:
GET /grades/3A HTTP/1.1
Host: grade-service
traceparent: 00-a3ce929d0e0e47364bf92f3577b34da6-00f067aa0ba902b7-01
Trace backends: Grafana Tempo, Jaeger, AWS X-Ray (ADOT Collector рдорд╛рд░реНрдлрдд; X-Ray W3C trace ids рд╕реБрджреНрдзрд╛ рд╕реНрд╡реАрдХрд╛рд░рддреЛ), Datadog APM. Tempo рдордзреНрдпреЗ TraceQL рдиреЗ рд╣рд│реВ traces рд╢реЛрдзрд╛:
{ resource.service.name = "results-api" && duration > 500ms && status = error }
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдореЗрд╡рд░ propagation рддрдкрд╛рд╕рд╛ тАФ HTTP, gRPC, queues, scheduled jobs. Header рдЯрд╛рдХреВрди рджреЗрдгрд╛рд░реА рдПрдХ service рддрд┐рдЪреНрдпрд╛ рдирдВрддрд░рдЪреЗ рд╕рдЧрд│реЗ рд▓рдкрд╡рддреЗ.
тПня╕П рдкреБрдвреЗ
рдкрд╛рдЪ services, рддреАрди signals, рдЕрдиреЗрдХ vendors. рдкреНрд░рддреНрдпреЗрдХ service рдПрдХрджрд╛рдЪ, рдПрдХрд╛ standard рдкрджреНрдзрддреАрдиреЗ instrument рдХрд░рд╛, рдЖрдгрд┐ data рдХреБрдареЗрд╣реА рдкрд╛рдард╡рд╛: OpenTelemetry.
git checkout lesson-06-opentelemetry