mirror of
https://github.com/SociallyDev/Spaces-API.git
synced 2025-07-16 10:03:01 -07:00
v2: Updates
* Simplifies & beautifies everything * Introduces a new Class system. * Errors are defaulted to AWS's handler. * New function names & more efficient handling. * Should fix a majority of the errors. Please read the README for more!
This commit is contained in:
parent
ad0726e41e
commit
e6d7753dc8
1095 changed files with 45088 additions and 2911 deletions
176
aws/Aws/ClientSideMonitoring/ApiCallMonitoringMiddleware.php
Normal file
176
aws/Aws/ClientSideMonitoring/ApiCallMonitoringMiddleware.php
Normal file
|
@ -0,0 +1,176 @@
|
|||
<?php
|
||||
|
||||
namespace Aws\ClientSideMonitoring;
|
||||
|
||||
use Aws\CommandInterface;
|
||||
use Aws\Exception\AwsException;
|
||||
use Aws\MonitoringEventsInterface;
|
||||
use Aws\ResultInterface;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class ApiCallMonitoringMiddleware extends AbstractMonitoringMiddleware
|
||||
{
|
||||
|
||||
/**
|
||||
* Api Call Attempt event keys for each Api Call event key
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $eventKeys = [
|
||||
'FinalAwsException' => 'AwsException',
|
||||
'FinalAwsExceptionMessage' => 'AwsExceptionMessage',
|
||||
'FinalSdkException' => 'SdkException',
|
||||
'FinalSdkExceptionMessage' => 'SdkExceptionMessage',
|
||||
'FinalHttpStatusCode' => 'HttpStatusCode',
|
||||
];
|
||||
|
||||
/**
|
||||
* Standard middleware wrapper function with CSM options passed in.
|
||||
*
|
||||
* @param callable $credentialProvider
|
||||
* @param mixed $options
|
||||
* @param string $region
|
||||
* @param string $service
|
||||
* @return callable
|
||||
*/
|
||||
public static function wrap(
|
||||
callable $credentialProvider,
|
||||
$options,
|
||||
$region,
|
||||
$service
|
||||
) {
|
||||
return function (callable $handler) use (
|
||||
$credentialProvider,
|
||||
$options,
|
||||
$region,
|
||||
$service
|
||||
) {
|
||||
return new static(
|
||||
$handler,
|
||||
$credentialProvider,
|
||||
$options,
|
||||
$region,
|
||||
$service
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getRequestData(RequestInterface $request)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getResponseData($klass)
|
||||
{
|
||||
if ($klass instanceof ResultInterface) {
|
||||
$data = [
|
||||
'AttemptCount' => self::getResultAttemptCount($klass),
|
||||
'MaxRetriesExceeded' => 0,
|
||||
];
|
||||
} elseif ($klass instanceof \Exception) {
|
||||
$data = [
|
||||
'AttemptCount' => self::getExceptionAttemptCount($klass),
|
||||
'MaxRetriesExceeded' => self::getMaxRetriesExceeded($klass),
|
||||
];
|
||||
} else {
|
||||
throw new \InvalidArgumentException('Parameter must be an instance of ResultInterface or Exception.');
|
||||
}
|
||||
|
||||
return $data + self::getFinalAttemptData($klass);
|
||||
}
|
||||
|
||||
private static function getResultAttemptCount(ResultInterface $result) {
|
||||
if (isset($result['@metadata']['transferStats']['http'])) {
|
||||
return count($result['@metadata']['transferStats']['http']);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
private static function getExceptionAttemptCount(\Exception $e) {
|
||||
$attemptCount = 0;
|
||||
if ($e instanceof MonitoringEventsInterface) {
|
||||
foreach ($e->getMonitoringEvents() as $event) {
|
||||
if (isset($event['Type']) &&
|
||||
$event['Type'] === 'ApiCallAttempt') {
|
||||
$attemptCount++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return $attemptCount;
|
||||
}
|
||||
|
||||
private static function getFinalAttemptData($klass)
|
||||
{
|
||||
$data = [];
|
||||
if ($klass instanceof MonitoringEventsInterface) {
|
||||
$finalAttempt = self::getFinalAttempt($klass->getMonitoringEvents());
|
||||
|
||||
if (!empty($finalAttempt)) {
|
||||
foreach (self::$eventKeys as $callKey => $attemptKey) {
|
||||
if (isset($finalAttempt[$attemptKey])) {
|
||||
$data[$callKey] = $finalAttempt[$attemptKey];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
private static function getFinalAttempt(array $events)
|
||||
{
|
||||
for (end($events); key($events) !== null; prev($events)) {
|
||||
$current = current($events);
|
||||
if (isset($current['Type'])
|
||||
&& $current['Type'] === 'ApiCallAttempt'
|
||||
) {
|
||||
return $current;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static function getMaxRetriesExceeded($klass)
|
||||
{
|
||||
if ($klass instanceof AwsException && $klass->isMaxRetriesExceeded()) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function populateRequestEventData(
|
||||
CommandInterface $cmd,
|
||||
RequestInterface $request,
|
||||
array $event
|
||||
) {
|
||||
$event = parent::populateRequestEventData($cmd, $request, $event);
|
||||
$event['Type'] = 'ApiCall';
|
||||
return $event;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function populateResultEventData(
|
||||
$result,
|
||||
array $event
|
||||
) {
|
||||
$event = parent::populateResultEventData($result, $event);
|
||||
$event['Latency'] = (int) (floor(microtime(true) * 1000) - $event['Timestamp']);
|
||||
return $event;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue