lockfile again

This commit is contained in:
Tim Bendt
2025-11-26 11:50:55 -05:00
parent af3c23cb6e
commit 6ceecaa69e
4461 changed files with 641349 additions and 10 deletions

View File

@@ -0,0 +1,138 @@
<?php
/**
* Copyright 2024 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Google\Auth\Logging;
use Psr\Log\LogLevel;
/**
* A trait used to call a PSR-3 logging interface.
*
* @internal
*/
trait LoggingTrait
{
/**
* @param RpcLogEvent $event
*/
private function logRequest(RpcLogEvent $event): void
{
$debugEvent = [
'timestamp' => $event->timestamp,
'severity' => strtoupper(LogLevel::DEBUG),
'processId' => $event->processId ?? null,
'requestId' => $event->requestId ?? null,
'rpcName' => $event->rpcName ?? null,
];
$debugEvent = array_filter($debugEvent, fn ($value) => !is_null($value));
$jsonPayload = [
'request.method' => $event->method,
'request.url' => $event->url,
'request.headers' => $event->headers,
'request.payload' => $this->truncatePayload($event->payload),
'request.jwt' => $this->getJwtToken($event->headers ?? []),
'retryAttempt' => $event->retryAttempt
];
// Remove null values
$debugEvent['jsonPayload'] = array_filter($jsonPayload, fn ($value) => !is_null($value));
$stringifiedEvent = json_encode($debugEvent, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
// There was an error stringifying the event, return to not break execution
if ($stringifiedEvent === false) {
return;
}
$this->logger->debug($stringifiedEvent);
}
/**
* @param RpcLogEvent $event
*/
private function logResponse(RpcLogEvent $event): void
{
$debugEvent = [
'timestamp' => $event->timestamp,
'severity' => strtoupper(LogLevel::DEBUG),
'processId' => $event->processId ?? null,
'requestId' => $event->requestId ?? null,
'jsonPayload' => [
'response.status' => $event->status,
'response.headers' => $event->headers,
'response.payload' => $this->truncatePayload($event->payload),
'latencyMillis' => $event->latency,
]
];
// Remove null values
$debugEvent = array_filter($debugEvent, fn ($value) => !is_null($value));
$debugEvent['jsonPayload'] = array_filter(
$debugEvent['jsonPayload'],
fn ($value) => !is_null($value)
);
$stringifiedEvent = json_encode($debugEvent, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
// There was an error stringifying the event, return to not break execution
if ($stringifiedEvent !== false) {
$this->logger->debug($stringifiedEvent);
}
}
/**
* @param array<mixed> $headers
* @return null|array<string, string|false>
*/
private function getJwtToken(array $headers): null|array
{
if (empty($headers)) {
return null;
}
$tokenHeader = $headers['Authorization'] ?? '';
$token = str_replace('Bearer ', '', $tokenHeader);
if (substr_count($token, '.') !== 2) {
return null;
}
[$header, $token, $_] = explode('.', $token);
return [
'header' => base64_decode($header),
'token' => base64_decode($token)
];
}
/**
* @param null|string $payload
* @return string
*/
private function truncatePayload(null|string $payload): null|string
{
$maxLength = 500;
if (is_null($payload) || strlen($payload) <= $maxLength) {
return $payload;
}
return substr($payload, 0, $maxLength) . '...';
}
}

View File

@@ -0,0 +1,136 @@
<?php
/**
* Copyright 2024 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Google\Auth\Logging;
/**
* A class that contains all the required information for logging.
*
* @internal
*/
class RpcLogEvent
{
/**
* Timestamp in format RFC3339 representing when this event ocurred
*
* @var string
*/
public string $timestamp;
/**
* The time in milliseconds at time on creation for calculating latency
*
* @var float
*/
public float $milliseconds;
/**
* Rest method type
*
* @var null|string
*/
public null|string $method = null;
/**
* URL representing the rest URL endpoint
*
* @var null|string
*/
public null|string $url = null;
/**
* An array that contains the headers for the response or request
*
* @var null|array<mixed>
*/
public null|array $headers = null;
/**
* An array representation of JSON for the response or request
*
* @var null|string
*/
public null|string $payload = null;
/**
* Status code for REST or gRPC methods
*
* @var null|int|string
*/
public null|int|string $status = null;
/**
* The latency in milliseconds
*
* @var null|int
*/
public null|int $latency = null;
/**
* The retry attempt number
*
* @var null|int
*/
public null|int $retryAttempt = null;
/**
* The name of the gRPC method being called
*
* @var null|string
*/
public null|string $rpcName = null;
/**
* The Service Name of the gRPC
*
* @var null|string $serviceName
*/
public null|string $serviceName = null;
/**
* The Process ID for tracing logs
*
* @var null|int $processId
*/
public null|int $processId = null;
/**
* The Request id for tracing logs
*
* @var null|int $requestId;
*/
public null|int $requestId = null;
/**
* Creates an object with all the fields required for logging
* Passing a string representation of a timestamp calculates the difference between
* these two times and sets the latency field with the result.
*
* @param null|float $startTime (Optional) Parameter to calculate the latency
*/
public function __construct(null|float $startTime = null)
{
$this->timestamp = date(DATE_RFC3339);
// Takes the micro time and convets it to millis
$this->milliseconds = round(microtime(true) * 1000);
if ($startTime) {
$this->latency = (int) round($this->milliseconds - $startTime);
}
}
}

View File

@@ -0,0 +1,85 @@
<?php
/**
* Copyright 2024 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Google\Auth\Logging;
use InvalidArgumentException;
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerTrait;
use Psr\Log\LogLevel;
use Stringable;
/**
* A basic logger class to log into stdOut for GCP logging.
*
* @internal
*/
class StdOutLogger implements LoggerInterface
{
use LoggerTrait;
/**
* @var array<string,int>
*/
private array $levelMapping = [
LogLevel::EMERGENCY => 7,
LogLevel::ALERT => 6,
LogLevel::CRITICAL => 5,
LogLevel::ERROR => 4,
LogLevel::WARNING => 3,
LogLevel::NOTICE => 2,
LogLevel::INFO => 1,
LogLevel::DEBUG => 0,
];
private int $level;
/**
* Constructs a basic PSR-3 logger class that logs into StdOut for GCP Logging
*
* @param string $level The level of the logger instance.
*/
public function __construct(string $level = LogLevel::DEBUG)
{
$this->level = $this->getLevelFromName($level);
}
/**
* {@inheritdoc}
*/
public function log($level, string|Stringable $message, array $context = []): void
{
if ($this->getLevelFromName($level) < $this->level) {
return;
}
print($message . "\n");
}
/**
* @param string $levelName
* @return int
* @throws InvalidArgumentException
*/
private function getLevelFromName(string $levelName): int
{
if (!array_key_exists($levelName, $this->levelMapping)) {
throw new InvalidArgumentException('The level supplied to the Logger is not valid');
}
return $this->levelMapping[$levelName];
}
}