Інструментування на основі атрибутів

Автоматичне створення відрізків за допомогою PHP 8 атрибутів з OpenTelemetry PHP Distro.

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. Застосунки, що вже використовують це розширення, можуть увімкнути цю функцію без зміни коду.


Востаннє змінено July 12, 2026: [uk] Ukrainian documentation for OpenTelemetry (83a19542)