proemergotech / correlate-php-guzzle by shakahl

Adds correlation ID to Guzzle requests.
2,777
1
4
Package Data
Maintainer Username: shakahl
Maintainer Contact: support@proemergotech.com (ProEmergotech Kft)
Package Create Date: 2017-06-16
Package Last Update: 2017-06-20
Language: PHP
License: MIT
Last Refreshed: 2024-02-25 15:11:47
Package Statistics
Total Downloads: 2,777
Monthly Downloads: 0
Daily Downloads: 0
Total Stars: 1
Total Watchers: 4
Total Forks: 1
Total Open Issues: 0

correlate-php-guzzle


Overview

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.

Packages

Installation

  • Install via composer
composer require proemergotech/correlate-php-guzzle

Setup for Slim Framework

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;
});

Setup for Laravel 5

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,
    ],

Setup for Lumen 5

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
    ]);
  });
// ...

Contributing

See CONTRIBUTING.md file.

Credits

This package developed by Soma Szélpál at Pro Emergotech Ltd..

License

This project is released under the MIT License.