diff options
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php new file mode 100644 index 0000000..0a5abda --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php @@ -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; + } +} |