Какой лучший способ получить продолжительность вызова API с помощью Guzzle 6

В настоящее время с Guzzle 6 кажется, что нет готового способа получить продолжительность вызова API. Каков наилучший способ получить эту статистику с помощью любого обычного звонка, используя приведенный ниже код.

Я использую следующий код из Как вы регистрируете все вызовы API с использованием Guzzle 6

use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\MessageFormatter;
use Monolog\Logger;

$stack = HandlerStack::create();
$stack->push(
    Middleware::log(
        new Logger('Logger'),
        new MessageFormatter('{req_body} - {res_body}')
    )
);
$client = new \GuzzleHttp\Client(
    [
        'base_uri' => 'http://httpbin.org',
        'handler' => $stack,
    ]
);

echo (string) $client->get('ip')->getBody();

person KingKongFrog    schedule 22.09.2015    source источник


Ответы (2)


Я отсылаю вас к опции запроса 'on_stats' Guzzle Docs - Параметры запроса и объект TransferStats

Чтобы реализовать это, вы должны изменить свой запрос на получение, чтобы использовать параметры запроса. Это будет что-то вроде следующего:

// get($uri, $options) proxies to request($method, $uri, $options)
// request($method, $uri, $options) proxies to requestAsync($method, $uri, $options)
// and sets the $options[RequestOptions::SYNCHRONOUS] to true
// and then waits for promises to resolve returning a Psr7\http-message\ResponseInterface instance

$response = $client->get($uri, [
    'on_stats'  => function (TransferStats $stats) use ($logger) {
        // do something inside the callable.
        echo $stats->getTransferTime() . "\n";
        $logger->debug('Request' . $stats->getRequest() . 
                       'Response' . $stat->getResponse() .
                       'Tx Time' . $stat->getTransferTime()
        );
    },
]);
echo $response->getBody();

**Примечание: я уверен, что есть способы сделать журнал лучше отформатированным, однако это должно было служить доказательством концепции.

TransferStats генерируются и используются в отдельных обработчиках, и в настоящее время обработчик не делает их доступными для стека. В результате они недоступны для использования в отдельных промежуточных слоях, размещенных в стеке.

person Shaun Bramley    schedule 23.09.2015
comment
Любая идея, как использовать приведенный выше код для реализации статистики передачи? - person KingKongFrog; 25.09.2015
comment
Я до сих пор не понимаю, как я могу отправить время передачи обработчику, чтобы оно могло быть на том же выходе? Например: new MessageFormatter('{req_body} - {res_body} - {REQUEST_TIME}') - person KingKongFrog; 14.10.2015

У меня недостаточно репутации, чтобы комментировать, а просто улучшить этот ответ

$response = $client->post($uri, [
    RequestOptions::JSON => $postData,
    RequestOptions::ON_STATS => function (TransferStats $stats) use ($logger) {
        $formatter = new MessageFormatter('{"request":{"uri":"{uri}","body":{req_body}},"response":{"code":{code},"body":{res_body}},"time":'.$stats->getTransferTime().'}');
        $message = $formatter->format($stats->getRequest(), $stats->getResponse());

        $logger->info($message);
    },
]);

P.S.: Этот код для Guzzle 7

person MathObsessed    schedule 05.11.2020