summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php')
-rw-r--r--vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php176
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;
+ }
+}