It's very difficult to track a request accross the system when we are working with microservices. We came out a solution for that. We generate a unique version 4 uuid for every request and every service passes this id via request header to other services. We call this correlation ID.
- proemergotech/correlate-php-laravel
- Middleware for Laravel and Lumen frameworks.
- proemergotech/correlate-php-psr-7
- Middleware for any PSR-7 compatible frameworks like Slim Framework.
- proemergotech/correlate-php-monolog
- Monolog processor for correlate middlewares (you don't have to use this directly).
- proemergotech/correlate-php-guzzle
- Guzzle middleware to add correlation id to every requests.
- proemergotech/correlate-php-core
- Common package for correlate id middlewares to provide consistent header naming accross projects.
- Install via composer
composer require proemergotech/correlate-php-guzzle
This example assumes you are already using proemergotech/correlate-php-psr-7 middleware!
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use ProEmergotech\Correlate\Correlate;
use ProEmergotech\Correlate\Guzzle\GuzzleCorrelateMiddleware;
use Monolog\Logger;
$app = new \Slim\App();
$container = $app->getContainer();
$container['logger'] = function($container) {
return new Logger();
};
$container['httpClient'] = function ($container) {
$cid = $container['request']->getAttribute(
Correlate::getParamName()
);
$stack = HandlerStack::create(new CurlHandler());
$stack->push(new GuzzleCorrelateMiddleware($cid));
return new Client(['handler' => $stack]);
};
// See "proemergotech/correlate-php-psr-7" project
$app->add(new \ProEmergotech\Correlate\Psr7\Psr7CorrelateMiddleware($container['logger']));
/**
* Example GET route
*
* @param \Psr\Http\Message\ServerRequestInterface $req PSR7 request
* @param \Psr\Http\Message\ResponseInterface $res PSR7 response
* @param array $args Route parameters
*
* @return \Psr\Http\Message\ResponseInterface
*/
$app->get('/foo', function ($req, $res, $args) {
$httpClient = $this->get('httpClient');
$httpClient->request('GET', 'http://httpbin.org/');
// You can override correlation id here
$httpClient->request('GET', 'http://httpbin.org/', [
'headers' => [
Correlate::getHeaderName() => Correlate::id()
],
]);
return $res;
});
Write a service provider to register a guzzle instance for future usage. Create a handler stack and push the middleware to it.
This example assumes you are already using proemergotech/correlate-php-laravel middleware!
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use ProEmergotech\Correlate\Correlate;
use ProEmergotech\Correlate\Guzzle\GuzzleCorrelateMiddleware;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
class GuzzleHttpClientProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('guzzle', function () {
// Determine correlation id.
$cid = $this->app['request']->getCorrelationId(); // If you use proemergotech/correlate-php-laravel middleware
// identical but without macros
$cid = $this->app['request']->headers->get(Correlate::getHeaderName());
$stack = HandlerStack::create(new CurlHandler());
$stack->push(new GuzzleCorrelateMiddleware($cid));
$config = isset($this->app['config']['guzzle']) ? $this->app['config']['guzzle'] : [];
$config['handler'] = $stack;
return new Client($config);
});
}
}
Add serverice provider to config/app.php in your Laravel project.
// config/app.php
'providers' => [
...
\App\Providers\GuzzleHttpClientProvider::class,
],
Write a service provider to register a guzzle instance for future usage. Create a handler stack and push the middleware to it.
This example assumes you are already using proemergotech/correlate-php-laravel middleware!
// bootstrap/app.php
// ...
$app->bind('guzzle', function () use ($app) {
// Determine correlation id.
$cid = $app['request']->getCorrelationId(); // If you use proemergotech/correlate-php-laravel middleware
// identical but without macros
$cid = $this->app['request']->headers->get(
\ProEmergotech\Correlate\Correlate::getHeaderName()
);
$stack = HandlerStack::create(new CurlHandler());
$stack->push(new \ProEmergotech\Correlate\Guzzle\GuzzleCorrelateMiddleware($cid));
return new Client([
'handler' => $stack
]);
});
// ...
See CONTRIBUTING.md
file.
This package developed by Soma Szélpál at Pro Emergotech Ltd..
This project is released under the MIT License.