adata-team / php-jaeger
Laravel/Lumen wrapper for Jaeger distributed tracing. PHP 7.3 compatible.
Requires
- php: ^7.3|^8.0
- ext-json: *
- illuminate/console: ^8.0
- illuminate/contracts: ^8.0
- illuminate/database: ^8.0
- illuminate/http: ^8.0
- illuminate/queue: ^8.0
- illuminate/support: ^8.0
- jonahgeorge/jaeger-client-php: ^1.0
- opentracing/opentracing: ^1.0
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-24 05:26:15 UTC
README
Laravel и Lumen обёртка над Jaeger-клиентом для распределённой трассировки.
Форк идеи chocofamilyme/laravel-jaeger, адаптированный под PHP 7.3.
Требования
- PHP
^7.3(совместим с^8.0) - Laravel / Lumen
^8.0 jonahgeorge/jaeger-client-php^1.0- ext-json
- запущенный jaeger-agent (по умолчанию
jaeger:5775, Zipkin over Compact UDP)
Установка
composer require adata/laravel-jaeger
Laravel
Service provider регистрируется автоматически через extra.laravel.providers.
Опубликуйте конфиг:
php artisan vendor:publish --provider="Adata\LaravelJaeger\LaravelJaegerServiceProvider" --tag=config
Lumen
Добавьте в bootstrap/app.php:
$app->configure('jaeger'); $app->register(\Adata\LaravelJaeger\LumenJaegerServiceProvider::class); // Для HTTP-трейсинга дополнительно: $app->middleware([\Adata\LaravelJaeger\JaegerMiddleware::class]);
Файл config/jaeger.php скопируйте вручную из vendor/adata/laravel-jaeger/config/jaeger.php.
Переменные окружения
| Переменная | По умолчанию | Назначение |
|---|---|---|
JAEGER_SAMPLE_RATE |
0.1 |
Доля трейсов от 0 до 1 |
JAEGER_AGENT_HOST |
jaeger |
Хост jaeger-agent |
JAEGER_AGENT_PORT |
5775 |
Порт jaeger-agent |
JAEGER_HTTP_LISTENER_ENABLED |
false |
Автоспан на каждый HTTP-запрос |
JAEGER_CONSOLE_LISTENER_ENABLED |
false |
Автоспан на каждую artisan-команду |
JAEGER_QUERY_LISTENER_ENABLED |
false |
Автоспан на каждый SQL-запрос |
JAEGER_JOB_LISTENER_ENABLED |
false |
Автоспан на каждый выполняемый job |
Базовое использование
use Adata\LaravelJaeger\Jaeger; class OrderService { private $jaeger; public function __construct(Jaeger $jaeger) { $this->jaeger = $jaeger; } public function place(array $order) { $this->jaeger->start('order.place', ['order.id' => $order['id']]); // ... бизнес-логика ... $this->jaeger->stop('order.place', ['order.status' => 'paid']); } }
Незакрытые спаны финишируются автоматически при terminating().
Проброс контекста в другой сервис
$carrier = []; $this->jaeger->startWithInject('http.call.billing', ['peer' => 'billing'], $carrier); // carrier теперь содержит uber-trace-id и т.п. — прокидываем в HTTP-заголовки. $response = $http->request('POST', $url, ['headers' => $carrier]); $this->jaeger->stop('http.call.billing', ['http.status_code' => $response->getStatusCode()]);
Приём контекста из входящего запроса
JaegerMiddleware делает это автоматически. Если инструментируете вручную:
$this->jaeger->initServerContext($_SERVER); $this->jaeger->start('cli.import'); // ... $this->jaeger->stop('cli.import');
Автолистенеры
| Слушатель | События | Класс |
|---|---|---|
http |
входящие HTTP запросы | Adata\LaravelJaeger\JaegerMiddleware |
console |
CommandStarting, CommandFinished |
Adata\LaravelJaeger\Listeners\CommandListener |
query |
QueryExecuted |
Adata\LaravelJaeger\Listeners\QueryListener |
job |
JobProcessing, JobProcessed, JobFailed, JobExceptionOccurred |
Adata\LaravelJaeger\Listeners\JobListener |
Каждый listener можно переопределить своим классом в config/jaeger.php — сигнатуры методов совпадают с встроенными.
Лицензия
MIT.