Поширення
Завдяки поширенню контексту сигнали можуть бути повʼязані між собою, незалежно від того, де вони генеруються. Хоча поширення контексту не обмежується трейсами, воно дозволяє трейсам створювати причинно-наслідкову інформацію про систему між сервісами, які довільно розподілені між процесами та межами мереж.
У переважній більшості випадків використання бібліотеки, що нативно підтримують OpenTelemetry або бібліотеки інструментування, автоматично поширюватимуть контекст трасування між сервісами. Лише в рідкісних випадках вам доведеться поширювати контекст вручну.
Щоб дізнатися більше, дивіться Поширення контексту.
Поширення — це механізм, який передає дані між сервісами та процесами. Хоча це не обмежується лише трасуванням, поширення дозволяє трейсам будувати причинно-наслідкову інформацію про систему крізь сервіси, які розподілені між процесами та мережевими межами.
OpenTelemetry надає текстовий підхід для поширення контексту до віддалених сервісів, використовуючи HTTP заголовки W3C Trace Context.
Автоматичне поширення контексту
Автоінструментування існує для деяких найпопулярніших фреймворків, бібліотек та розширень PHP. Багато з них виконують поширення вхідного та/або вихідного контексту, і їх можна знайти за допомогою Registry або Packagist.
Використовуйте автоінструментування або бібліотеки інструментування для поширення контексту. Хоча ви можете поширювати контекст вручну, PHP автоінструментування та бібліотеки інструментування добре протестовані та легші у використанні.
Вхідні запити
Розповсюдження контексту може автоматично оброблятися кількома способами:
- за допомогою підтримуваного PHP-фреймворку (наприклад: Laravel, Symfony, Slim) разом з відповідним пакетом автоінструментування
- реалізацією PSR-15
RequestHandlerInterfaceу вашому коді, разом з відповідним пакетом автоінструментування - за допомогою експериментальної можливості auto root span
Вихідні запити
Пакунки автоінструментування для HTTP-клієнтів та інтерфейсів автоматично додають заголовки W3C tracecontext до вихідних HTTP-запитів.
Ручне поширення контексту
У деяких випадках неможливо поширювати контекст за допомогою бібліотеки інструментування. Можливо, не існує бібліотеки інструментування, яка відповідає бібліотеці, яку ви використовуєте для комунікації між сервісами. Або у вас можуть бути вимоги, які бібліотеки інструментування не можуть виконати, навіть якщо вони існують.
Коли вам потрібно пропагувати контекст вручну, використовуйте API контексту.
Наступний фрагмент показує приклад вихідного HTTP запиту:
$request = new Request('GET', 'http://localhost:8080/resource');
$outgoing = $tracer->spanBuilder('/resource')->setSpanKind(SpanKind::CLIENT)->startSpan();
$outgoing->setAttribute(TraceAttributes::HTTP_METHOD, $request->getMethod());
$outgoing->setAttribute(TraceAttributes::HTTP_URL, (string) $request->getUri());
$carrier = [];
TraceContextPropagator::getInstance()->inject($carrier);
foreach ($carrier as $name => $value) {
$request = $request->withAddedHeader($name, $value);
}
try {
$response = $client->send($request);
} finally {
$outgoing->end();
}
Аналогічно, використовуйте текстовий підхід для читання W3C Trace Context з вхідних запитів. Наступний приклад показує обробку вхідного HTTP запиту:
$request = ServerRequestCreator::createFromGlobals();
$context = TraceContextPropagator::getInstance()->extract($request->getHeaders());
$root = $tracer->spanBuilder('HTTP ' . $request->getMethod())
->setStartTimestamp((int) ($request->getServerParams()['REQUEST_TIME_FLOAT'] * 1e9))
->setParent($context)
->setSpanKind(SpanKind::KIND_SERVER)
->startSpan();
$scope = $root->activate();
try {
/* do stuff */
} finally {
$root->end();
$scope->detach();
}
Наступні кроки
Щоб дізнатися більше про поширення, прочитайте Специфікацію API поширювачів.
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!