Linux ip-172-26-7-228 5.4.0-1103-aws #111~18.04.1-Ubuntu SMP Tue May 23 20:04:10 UTC 2023 x86_64
Your IP : 13.59.36.4
<?php
namespace Aws\ClientSideMonitoring;
use Aws\CommandInterface;
use Aws\Credentials\CredentialsInterface;
use Aws\Exception\AwsException;
use Aws\ResponseContainerInterface;
use Aws\ResultInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
/**
* @internal
*/
class ApiCallAttemptMonitoringMiddleware extends AbstractMonitoringMiddleware
{
/**
* 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 [
'Fqdn' => $request->getUri()->getHost(),
];
}
/**
* {@inheritdoc}
*/
public static function getResponseData($klass)
{
if ($klass instanceof ResultInterface) {
return [
'AttemptLatency' => self::getResultAttemptLatency($klass),
'DestinationIp' => self::getResultDestinationIp($klass),
'DnsLatency' => self::getResultDnsLatency($klass),
'HttpStatusCode' => self::getResultHttpStatusCode($klass),
'XAmzId2' => self::getResultHeader($klass, 'x-amz-id-2'),
'XAmzRequestId' => self::getResultHeader($klass, 'x-amz-request-id'),
'XAmznRequestId' => self::getResultHeader($klass, 'x-amzn-RequestId'),
];
}
if ($klass instanceof AwsException) {
return [
'AttemptLatency' => self::getAwsExceptionAttemptLatency($klass),
'AwsException' => substr(
self::getAwsExceptionErrorCode($klass),
0,
128
),
'AwsExceptionMessage' => substr(
self::getAwsExceptionMessage($klass),
0,
512
),
'DestinationIp' => self::getAwsExceptionDestinationIp($klass),
'DnsLatency' => self::getAwsExceptionDnsLatency($klass),
'HttpStatusCode' => self::getAwsExceptionHttpStatusCode($klass),
'XAmzId2' => self::getAwsExceptionHeader($klass, 'x-amz-id-2'),
'XAmzRequestId' => self::getAwsExceptionHeader(
$klass,
'x-amz-request-id'
),
'XAmznRequestId' => self::getAwsExceptionHeader(
$klass,
'x-amzn-RequestId'
),
];
}
if ($klass instanceof \Exception) {
return [
'HttpStatusCode' => self::getExceptionHttpStatusCode($klass),
'SdkException' => substr(
self::getExceptionCode($klass),
0,
128
),
'SdkExceptionMessage' => substr(
self::getExceptionMessage($klass),
0,
512
),
'XAmzId2' => self::getExceptionHeader($klass, 'x-amz-id-2'),
'XAmzRequestId' => self::getExceptionHeader($klass, 'x-amz-request-id'),
'XAmznRequestId' => self::getExceptionHeader($klass, 'x-amzn-RequestId'),
];
}
throw new \InvalidArgumentException('Parameter must be an instance of ResultInterface, AwsException or Exception.');
}
private static function getResultAttemptLatency(ResultInterface $result)
{
if (isset($result['@metadata']['transferStats']['http'])) {
$attempt = end($result['@metadata']['transferStats']['http']);
if (isset($attempt['total_time'])) {
return (int) floor($attempt['total_time'] * 1000);
}
}
return null;
}
private static function getResultDestinationIp(ResultInterface $result)
{
if (isset($result['@metadata']['transferStats']['http'])) {
$attempt = end($result['@metadata']['transferStats']['http']);
if (isset($attempt['primary_ip'])) {
return $attempt['primary_ip'];
}
}
return null;
}
private static function getResultDnsLatency(ResultInterface $result)
{
if (isset($result['@metadata']['transferStats']['http'])) {
$attempt = end($result['@metadata']['transferStats']['http']);
if (isset($attempt['namelookup_time'])) {
return (int) floor($attempt['namelookup_time'] * 1000);
}
}
return null;
}
private static function getResultHttpStatusCode(ResultInterface $result)
{
return $result['@metadata']['statusCode'];
}
private static function getAwsExceptionAttemptLatency(AwsException $e) {
$attempt = $e->getTransferInfo();
if (isset($attempt['total_time'])) {
return (int) floor($attempt['total_time'] * 1000);
}
return null;
}
private static function getAwsExceptionErrorCode(AwsException $e) {
return $e->getAwsErrorCode();
}
private static function getAwsExceptionMessage(AwsException $e) {
return $e->getAwsErrorMessage();
}
private static function getAwsExceptionDestinationIp(AwsException $e) {
$attempt = $e->getTransferInfo();
if (isset($attempt['primary_ip'])) {
return $attempt['primary_ip'];
}
return null;
}
private static function getAwsExceptionDnsLatency(AwsException $e) {
$attempt = $e->getTransferInfo();
if (isset($attempt['namelookup_time'])) {
return (int) floor($attempt['namelookup_time'] * 1000);
}
return null;
}
private static function getAwsExceptionHttpStatusCode(AwsException $e) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode();
}
return null;
}
private static function getExceptionHttpStatusCode(\Exception $e) {
if ($e instanceof ResponseContainerInterface) {
$response = $e->getResponse();
if ($response instanceof ResponseInterface) {
return $response->getStatusCode();
}
}
return null;
}
private static function getExceptionCode(\Exception $e) {
if (!($e instanceof AwsException)) {
return get_class($e);
}
return null;
}
private static function getExceptionMessage(\Exception $e) {
if (!($e instanceof AwsException)) {
return $e->getMessage();
}
return null;
}
/**
* {@inheritdoc}
*/
protected function populateRequestEventData(
CommandInterface $cmd,
RequestInterface $request,
array $event
) {
$event = parent::populateRequestEventData($cmd, $request, $event);
$event['Type'] = 'ApiCallAttempt';
return $event;
}
/**
* {@inheritdoc}
*/
protected function populateResultEventData(
$result,
array $event
) {
$event = parent::populateResultEventData($result, $event);
$provider = $this->credentialProvider;
/** @var CredentialsInterface $credentials */
$credentials = $provider()->wait();
$event['AccessKey'] = $credentials->getAccessKeyId();
$sessionToken = $credentials->getSecurityToken();
if ($sessionToken !== null) {
$event['SessionToken'] = $sessionToken;
}
if (empty($event['AttemptLatency'])) {
$event['AttemptLatency'] = (int) (floor(microtime(true) * 1000) - $event['Timestamp']);
}
return $event;
}
}
|