Інструментування на основі атрибутів
OpenTelemetry PHP Distro підтримує автоматичне створення відрізків з використанням PHP 8 атрибутів. Анотуйте методи або функції з #[WithSpan] для створення відрізків без написання коду інструментування вручну.
Передумови
- PHP 8.0 або новіші (PHP атрибути вимагають PHP 8+).
- Пакунок
open-telemetry/apiвстановлений у вашому додатку. OTEL_PHP_ATTR_HOOKS_ENABLED=trueвстановлено в середовищі (стандартно вимкнено).
Увімкнення
export OTEL_PHP_ATTR_HOOKS_ENABLED=true
Або в php.ini:
opentelemetry_distro.attr_hooks_enabled=true
Базове використання
use OpenTelemetry\API\Instrumentation\WithSpan;
class OrderService
{
#[WithSpan]
public function processOrder(int $orderId): string
{
// Відрізок з іменем "OrderService::processOrder" створюється автоматично.
return "processed-{$orderId}";
}
}
Опції #[WithSpan]
#[WithSpan(
span_name: 'custom.span.name', // типово: "ClassName::methodName"
span_kind: SpanKind::KIND_SERVER, // типово: KIND_INTERNAL
attributes: ['key' => 'value'], // статичні атрибути, додані до відрізка
)]
Усі аргументи опціональні і можуть передаватися позиційно або по імені:
// Позиційно
#[WithSpan('payment.charge', SpanKind::KIND_CLIENT, ['db.system' => 'redis'])]
// По імені — будь-яка підмножина
#[WithSpan(span_kind: SpanKind::KIND_PRODUCER)]
#[WithSpan(span_name: 'message.publish', span_kind: SpanKind::KIND_PRODUCER)]
Захоплення значень параметрів за допомогою #[SpanAttribute]
Додайте #[SpanAttribute] до параметрів функції, щоб включити їхні runtime значення як атрибути відрізка:
use OpenTelemetry\API\Instrumentation\WithSpan;
use OpenTelemetry\API\Instrumentation\SpanAttribute;
class UserService
{
#[WithSpan]
public function createUser(
#[SpanAttribute] string $username, // ключ атрибуту = "username"
string $password, // не захоплюється
#[SpanAttribute('user.email')] string $email, // ключ атрибуту = "user.email"
): int {
// ...
}
}
Захоплення значень властивостей за допомогою #[SpanAttribute]
Застосуйте #[SpanAttribute] до властивостей класу, щоб захопити їхнє значення в момент виклику методу:
class InvoiceService
{
#[SpanAttribute]
public string $customerId = '';
#[SpanAttribute('invoice.currency')]
public string $currency = 'EUR';
#[WithSpan('invoice.generate')]
public function generate(): string
{
// Атрибути відрізка включають: customerId, invoice.currency
}
}
Запис помилок
Якщо анотований метод повідомляє про помилку, відрізок автоматично записує помилку і встановлює статус на ERROR. Помилка поширюється нормально.
#[WithSpan]
public function riskyOperation(): void
{
throw new \RuntimeException('something went wrong');
// Відрізок завершується з STATUS_ERROR та прикріпленим event помилки.
}
Вкладені відрізки
Виклик одного #[WithSpan] методу з іншого створює вкладені відрізки автоматично:
class Pipeline
{
#[WithSpan('pipeline.run')]
public function run(): void
{
$this->step1(); // child span: "pipeline.step1"
$this->step2(); // child span: "pipeline.step2"
}
#[WithSpan('pipeline.step1')]
private function step1(): void {}
#[WithSpan('pipeline.step2')]
private function step2(): void {}
}
Standalone-функції
#[WithSpan] працює на standalone-функціях, а не тільки на методах:
#[WithSpan('compute.result')]
function computeResult(#[SpanAttribute] int $input): int
{
return $input * 2;
}
Стандартні атрибути відрізка
Кожен #[WithSpan] відрізок включає ці атрибути з місця декларації:
| Атрибут | Значення |
|---|---|
code.function | Імʼя функції або методу |
code.namespace | Імʼя класу (порожнє для standalone-функцій) |
code.filepath | Шлях до вихідного файлу |
code.lineno | Номер рядка декларації |
Сумісність
#[WithSpan] та #[SpanAttribute] — це ті самі атрибути, що використовують офіційне розширення opentelemetry-php-instrumentation. Застосунки, що вже використовують це розширення, можуть увімкнути цю функцію без зміни коду.
Зворотний зв’язок
Чи була ця сторінка корисною?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!