Поширення
Завдяки поширенню контексту, Сигнали можуть бути корельовані один з одним, незалежно від того, де вони генеруються. Хоча це не обмежується трасуванням, поширення контексту дозволяє трейсам будувати причинно-наслідкову інформацію про систему крізь сервіси, які довільно розподілені через процеси та мережеві межі.
Для переважної більшості випадків використання, бібліотеки, які нативно підтримують OpenTelemetry або бібліотеки інструментування, автоматично поширюватимуть контекст трасування крізь сервіси за вас. Лише в рідкісних випадках вам потрібно буде поширювати контекст вручну.
Щоб дізнатися більше, дивіться Поширення контексту.
Поширення — це механізм, який передає дані між сервісами та процесами. Хоча це не обмежується лише трасуванням, поширення дозволяє трейсам будувати причинно-наслідкову інформацію про систему крізь сервіси, які розподілені між процесами та мережевими межами.
OpenTelemetry надає текстовий підхід для поширення контексту до віддалених сервісів, використовуючи HTTP заголовки W3C Trace Context.
Автоматичне поширення контексту
Автоінструментування існує для деяких популярних PHP фреймворків, таких як Symfony, Laravel або Slim. HTTP бібліотеки пропагують контекст для вхідних та вихідних HTTP запитів.
Примітка
Використовуйте автоінструментування або бібліотеки інструментування для поширення контексту. Хоча ви можете поширювати контекст вручну, PHP автоінструментування та бібліотеки інструментування добре протестовані та легші у використанні.Вхідні запити
Автоінструментування для фреймворків, які реалізують PSR-15 RequestHandlerInterface
, автоматично витягує заголовки W3C tracecontext, створює кореневий відрізок та встановлює віддаленого батька для кореневого відрізка.
composer require open-telemetry/opentelemetry-auto-psr15
Вихідні запити
Автоінструментування PSR-18 автоматично застосовує заголовки W3C tracecontext до вихідних HTTP запитів для будь-якої бібліотеки, яка реалізує інтерфейс PSR-18.
open-telemetry/opentelemetry-auto-psr18
Ручне поширення контексту
У деяких випадках неможливо поширювати контекст за допомогою бібліотеки інструментування. Можливо, не існує бібліотеки інструментування, яка відповідає бібліотеці, яку ви використовуєте для комунікації між сервісами. Або у вас можуть бути вимоги, які бібліотеки інструментування не можуть виконати, навіть якщо вони існують.
Коли вам потрібно пропагувати контекст вручну, використовуйте 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 поширювачів.
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!