diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9b6b7d9..2e9bb34 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ name: Bug Report -description: Report an Issue or Bug with the Laravel Telemetry Package +description: Report an Issue or Bug with the Laravel Request Tracker Package labels: [ "bug" ] body: @@ -23,9 +23,9 @@ body: validations: required: true - type: input - id: laravel-telemetry-version + id: laravel-request-tracker-version attributes: - label: Laravel Telemetry Version + label: Laravel Request Tracker Version description: What version of our Package are you running? Please be as specific as possible placeholder: 1.0.0 - type: input diff --git a/README.md b/README.md index c79607b..a66026d 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,25 @@ -# 🪢 Laravel Telemetry +# 🪢 Laravel Request Tracker -![the dragon code laravel telemetry](https://preview.dragon-code.pro/the%20dragon%20code/telemetry.svg?brand=laravel&mode=auto) +![the dragon code laravel request tracker](https://preview.dragon-code.pro/the%20dragon%20code/request-tracker.svg?brand=laravel&mode=auto) [![Stable Version][badge_stable]][link_packagist] [![Total Downloads][badge_downloads]][link_packagist] [![License][badge_license]][link_license] -End-to-end telemetry of inter-service communication. +Laravel adapter for dragon-code/request-tracker to trace inter-service request chains. ## Installation -You can install the **Laravel Telemetry** package via [Composer](https://getcomposer.org): +You can install the **Laravel Request Tracker** package via [Composer](https://getcomposer.org): ```Bash -composer require dragon-code/laravel-telemetry +composer require dragon-code/laravel-request-tracker ``` You can publish the config file with: ```bash -php artisan vendor:publish --tag="telemetry" +php artisan vendor:publish --tag="tracker" ``` ## Basic Usage @@ -27,11 +27,11 @@ php artisan vendor:publish --tag="telemetry" Register the middleware: ```php -use DragonCode\LaravelTracker\Http\Middleware\TelemetryMiddleware; +use DragonCode\LaravelRequestTracker\Http\Middleware\RequestTrackerMiddleware; use Illuminate\Foundation\Configuration\Middleware; ->withMiddleware(function (Middleware $middleware): void { - $middleware->prepend(TelemetryMiddleware::class); + $middleware->prepend(RequestTrackerMiddleware::class); }) ``` @@ -39,7 +39,7 @@ That's all 🙂 ## How It Works -The middleware monitors telemetry headers in incoming requests and, when present, +The middleware monitors request tracker headers in incoming requests and, when present, automatically injects them into the application context. This makes it possible to build chains of inter-service requests with filtering by an identifier. @@ -49,12 +49,12 @@ This makes it possible to build chains of inter-service requests with filtering This package is licensed under the [MIT License](LICENSE). -[badge_downloads]: https://img.shields.io/packagist/dt/dragon-code/laravel-telemetry.svg?style=flat-square +[badge_downloads]: https://img.shields.io/packagist/dt/dragon-code/laravel-request-tracker.svg?style=flat-square -[badge_license]: https://img.shields.io/packagist/l/dragon-code/laravel-telemetry.svg?style=flat-square +[badge_license]: https://img.shields.io/packagist/l/dragon-code/laravel-request-tracker.svg?style=flat-square -[badge_stable]: https://img.shields.io/github/v/release/TheDragonCode/laravel-telemetry?label=packagist&style=flat-square +[badge_stable]: https://img.shields.io/github/v/release/TheDragonCode/laravel-request-tracker?label=packagist&style=flat-square [link_license]: LICENSE -[link_packagist]: https://packagist.org/packages/dragon-code/laravel-telemetry +[link_packagist]: https://packagist.org/packages/dragon-code/laravel-request-tracker diff --git a/composer.json b/composer.json index dcdc530..88378c3 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { - "name": "dragon-code/laravel-telemetry", - "description": "End-to-end telemetry of inter-service communication", + "name": "dragon-code/laravel-request-tracker", + "description": "Laravel adapter for dragon-code/request-tracker to trace inter-service request chains", "license": "MIT", "type": "library", "authors": [ @@ -11,7 +11,7 @@ ], "require": { "php": "^8.2", - "dragon-code/telemetry": "^1.0", + "dragon-code/request-tracker": "^1.1", "illuminate/http": "^11.0 || ^12.0", "illuminate/support": "^11.0 || ^12.0" }, @@ -25,7 +25,7 @@ "minimum-stability": "stable", "autoload": { "psr-4": { - "DragonCode\\LaravelTracker\\": "src/" + "DragonCode\\LaravelRequestTracker\\": "src/" } }, "autoload-dev": { @@ -43,7 +43,7 @@ "extra": { "laravel": { "providers": [ - "DragonCode\\LaravelTracker\\LaravelTelemetryServiceProvider" + "DragonCode\\LaravelRequestTracker\\LaravelRequestTrackerServiceProvider" ] } }, diff --git a/config/telemetry.php b/config/request-tracker.php similarity index 83% rename from config/telemetry.php rename to config/request-tracker.php index 56a28d5..e905c9e 100644 --- a/config/telemetry.php +++ b/config/request-tracker.php @@ -4,10 +4,10 @@ /* |-------------------------------------------------------------------------- -| Laravel Telemetry — configuration +| Laravel Request Tracker |-------------------------------------------------------------------------- | -| Here you can configure the behavior of the telemetry collection package. +| Here you can configure the behavior of the request tracking package. | The file reads your code at runtime and is not cached separately. | If necessary, publish the configuration file and adjust the values to | your needs. @@ -26,7 +26,7 @@ | */ 'context' => [ - 'key' => 'telemetry', + 'key' => 'tracker', ], /* @@ -41,14 +41,13 @@ | */ 'headers' => [ - // Authenticated user's identifier (if any) - 'user_id' => 'X-Telemetry-User-Id', + 'user_id' => 'X-Tracker-User-Id', // Client IP address captured on ingress - 'ip' => 'X-Telemetry-Ip', + 'ip' => 'X-Tracker-Ip', // Request trace identifier (trace/span) - 'trace_id' => 'X-Telemetry-Trace-Id', + 'trace_id' => 'X-Tracker-Trace-Id', ], ]; diff --git a/src/Http/Middleware/RequestTrackerMiddleware.php b/src/Http/Middleware/RequestTrackerMiddleware.php new file mode 100644 index 0000000..a5d1d4f --- /dev/null +++ b/src/Http/Middleware/RequestTrackerMiddleware.php @@ -0,0 +1,69 @@ +tracker($request); + + $this->trace($tracker); + $this->context($tracker); + + return $this->modify($tracker, $next); + } + + protected function modify(TrackerRequest $tracker, Closure $next): Response + { + return $next( + $tracker->getRequest() + ); + } + + protected function trace(TrackerRequest $tracker): void + { + $tracker->userId($tracker->getRequest()?->user()?->getKey()); + $tracker->ip(); + $tracker->traceId(); + } + + protected function tracker(Request $request): TrackerRequest + { + return new TrackerRequest($request, $this->headers()); + } + + protected function headers(): TrackerHeader + { + return new TrackerHeader( + userId : config()?->string('request-tracker.headers.user_id'), + ip : config()?->string('request-tracker.headers.ip'), + traceId: config()?->string('request-tracker.headers.trace_id'), + ); + } + + protected function context(TrackerRequest $request): void + { + Context::add($this->key(), [ + 'userId' => $request->getUserId(), + 'ip' => $request->getIp(), + 'traceId' => $request->getTraceId(), + ]); + } + + protected function key(): string + { + return config('request-tracker.context.key'); + } +} diff --git a/src/Http/Middleware/TelemetryMiddleware.php b/src/Http/Middleware/TelemetryMiddleware.php deleted file mode 100644 index 3695870..0000000 --- a/src/Http/Middleware/TelemetryMiddleware.php +++ /dev/null @@ -1,69 +0,0 @@ -telemetry($request); - - $this->trace($telemetry); - $this->context($telemetry); - - return $this->modify($telemetry, $next); - } - - protected function modify(TelemetryRequest $telemetry, Closure $next): Response - { - return $next( - $telemetry->getRequest() - ); - } - - protected function trace(TelemetryRequest $telemetry): void - { - $telemetry->userId($telemetry->getRequest()?->user()?->getKey()); - $telemetry->ip(); - $telemetry->traceId(); - } - - protected function telemetry(Request $request): TelemetryRequest - { - return new TelemetryRequest($request, $this->headers()); - } - - protected function headers(): TelemetryHeader - { - return new TelemetryHeader( - userId : config()?->string('telemetry.headers.user_id'), - ip : config()?->string('telemetry.headers.ip'), - traceId: config()?->string('telemetry.headers.trace_id'), - ); - } - - protected function context(TelemetryRequest $request): void - { - Context::add($this->key(), [ - 'userId' => $request->getUserId(), - 'ip' => $request->getIp(), - 'traceId' => $request->getTraceId(), - ]); - } - - protected function key(): string - { - return config('telemetry.context.key'); - } -} diff --git a/src/LaravelRequestTrackerServiceProvider.php b/src/LaravelRequestTrackerServiceProvider.php new file mode 100644 index 0000000..455cd95 --- /dev/null +++ b/src/LaravelRequestTrackerServiceProvider.php @@ -0,0 +1,22 @@ +publishes([ + __DIR__ . '/../config/request-tracker.php' => $this->app->configPath('request-tracker.php'), + ], ['config', 'tracker']); + } + + public function register(): void + { + $this->mergeConfigFrom(__DIR__ . '/../config/request-tracker.php', 'request-tracker'); + } +} diff --git a/src/LaravelTelemetryServiceProvider.php b/src/LaravelTelemetryServiceProvider.php deleted file mode 100644 index 6d036a9..0000000 --- a/src/LaravelTelemetryServiceProvider.php +++ /dev/null @@ -1,22 +0,0 @@ -publishes([ - __DIR__ . '/../config/telemetry.php' => $this->app->configPath('telemetry.php'), - ], ['config', 'telemetry']); - } - - public function register(): void - { - $this->mergeConfigFrom(__DIR__ . '/../config/telemetry.php', 'telemetry'); - } -} diff --git a/tests/Feature/TelemetryMiddlewareTest.php b/tests/Feature/MiddlewareTest.php similarity index 68% rename from tests/Feature/TelemetryMiddlewareTest.php rename to tests/Feature/MiddlewareTest.php index 5f9d442..ba5f7e9 100644 --- a/tests/Feature/TelemetryMiddlewareTest.php +++ b/tests/Feature/MiddlewareTest.php @@ -2,13 +2,13 @@ declare(strict_types=1); -use DragonCode\LaravelTracker\Http\Middleware\TelemetryMiddleware; +use DragonCode\LaravelRequestTracker\Http\Middleware\RequestTrackerMiddleware; use Illuminate\Http\Request; use Illuminate\Support\Str; use Symfony\Component\HttpFoundation\Response; it('sets headers and context for guest user', function () { - $middleware = new TelemetryMiddleware; + $middleware = new RequestTrackerMiddleware; $captured = null; @@ -23,16 +23,15 @@ function (Request $request) use (&$captured): Response { expect($response->getStatusCode())->toBe(200); - $userId = $captured->headers->get('X-Telemetry-User-Id'); - $ip = $captured->headers->get('X-Telemetry-Ip'); - $trace = $captured->headers->get('X-Telemetry-Trace-Id'); + $userId = $captured->headers->get('X-Tracker-User-Id'); + $ip = $captured->headers->get('X-Tracker-Ip'); + $trace = $captured->headers->get('X-Tracker-Trace-Id'); expect($userId)->toBe('0'); expect($ip)->toBe('198.51.100.42'); expect($trace)->not()->toBeEmpty()->and(Str::isUuid($trace))->toBeTrue(); - // context('telemetry') is added by middleware - $context = context('telemetry'); + $context = context('tracker'); expect($context) ->toBeArray() @@ -44,7 +43,7 @@ function (Request $request) use (&$captured): Response { }); it('uses authenticated user id when available', function () { - $middleware = new TelemetryMiddleware; + $middleware = new RequestTrackerMiddleware; $user = new class { public function getKey(): int @@ -64,22 +63,22 @@ function (Request $request) use (&$captured): Response { } ); - $userId = $captured->headers->get('X-Telemetry-User-Id'); + $userId = $captured->headers->get('X-Tracker-User-Id'); expect($userId)->toBe('123'); - $context = context('telemetry'); + $context = context('tracker'); expect($context['userId'])->toBe('123'); }); -it('respects existing telemetry headers', function () { - $middleware = new TelemetryMiddleware; +it('respects existing tracker headers', function () { + $middleware = new RequestTrackerMiddleware; $existing = [ - 'X-Telemetry-User-Id' => '777', - 'X-Telemetry-Ip' => '192.0.2.55', - 'X-Telemetry-Trace-Id' => (string) Str::uuid(), + 'X-Tracker-User-Id' => '777', + 'X-Tracker-Ip' => '192.0.2.55', + 'X-Tracker-Trace-Id' => (string) Str::uuid(), ]; $captured = null; @@ -97,9 +96,9 @@ function (Request $request) use (&$captured): Response { expect($captured->headers->get($key))->toBe($value); } - $context = context('telemetry'); + $context = context('tracker'); expect($context['userId'])->toBe('777'); expect($context['ip'])->toBe('192.0.2.55'); - expect($context['traceId'])->toBe($existing['X-Telemetry-Trace-Id']); + expect($context['traceId'])->toBe($existing['X-Tracker-Trace-Id']); }); diff --git a/tests/TestCase.php b/tests/TestCase.php index 910933d..c8dfb7d 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -4,7 +4,7 @@ namespace Tests; -use DragonCode\LaravelTracker\LaravelTelemetryServiceProvider; +use DragonCode\LaravelRequestTracker\LaravelRequestTrackerServiceProvider; use Orchestra\Testbench\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase @@ -12,7 +12,7 @@ abstract class TestCase extends BaseTestCase protected function getPackageProviders($app): array { return [ - LaravelTelemetryServiceProvider::class, + LaravelRequestTrackerServiceProvider::class, ]; } }