diff --git a/Core/composer.json b/Core/composer.json index edae4f42383..7ad4bed1091 100644 --- a/Core/composer.json +++ b/Core/composer.json @@ -12,7 +12,8 @@ "guzzlehttp/psr7": "^2.6.3||^3.0", "monolog/monolog": "^2.9||^3.0", "psr/http-message": "^1.0||^2.0", - "google/gax": "^1.38.0" + "google/gax": "^1.38.0", + "open-telemetry/api": "^1.0" }, "require-dev": { "phpunit/phpunit": "^9.0", diff --git a/Core/src/Telemetry/TelemetryConfiguration.php b/Core/src/Telemetry/TelemetryConfiguration.php new file mode 100644 index 00000000000..d2ac6f66446 --- /dev/null +++ b/Core/src/Telemetry/TelemetryConfiguration.php @@ -0,0 +1,74 @@ +originalTracingEnabled = getenv('GOOGLE_SDK_PHP_TRACING_ENABLED'); + $this->originalLoggingEnabled = getenv('GOOGLE_SDK_PHP_LOGGING_ENABLED'); + $this->originalMetricsEnabled = getenv('GOOGLE_SDK_PHP_METRICS_ENABLED'); + $this->originalLegacyTelemetry = getenv('GOOGLE_API_ENABLE_TELEMETRY'); + putenv('GOOGLE_SDK_PHP_TRACING_ENABLED'); + putenv('GOOGLE_SDK_PHP_LOGGING_ENABLED'); + putenv('GOOGLE_SDK_PHP_METRICS_ENABLED'); + putenv('GOOGLE_API_ENABLE_TELEMETRY'); + } + + public function tearDown(): void + { + if ($this->originalTracingEnabled !== false) { + putenv("GOOGLE_SDK_PHP_TRACING_ENABLED={$this->originalTracingEnabled}"); + } + if ($this->originalLoggingEnabled !== false) { + putenv("GOOGLE_SDK_PHP_LOGGING_ENABLED={$this->originalLoggingEnabled}"); + } + if ($this->originalMetricsEnabled !== false) { + putenv("GOOGLE_SDK_PHP_METRICS_ENABLED={$this->originalMetricsEnabled}"); + } + if ($this->originalLegacyTelemetry !== false) { + putenv("GOOGLE_API_ENABLE_TELEMETRY={$this->originalLegacyTelemetry}"); + } + } + + public function testIsTracingEnabledDefaultFalse() + { + $this->assertFalse(TelemetryConfiguration::isTracingEnabled()); + } + + public function testIsTracingEnabledWithSpecificEnv() + { + putenv('GOOGLE_SDK_PHP_TRACING_ENABLED=true'); + $this->assertTrue(TelemetryConfiguration::isTracingEnabled()); + + putenv('GOOGLE_SDK_PHP_TRACING_ENABLED=false'); + $this->assertFalse(TelemetryConfiguration::isTracingEnabled()); + } + + public function testIsTracingEnabledWithLegacyEnv() + { + putenv('GOOGLE_API_ENABLE_TELEMETRY=true'); + $this->assertTrue(TelemetryConfiguration::isTracingEnabled()); + + putenv('GOOGLE_API_ENABLE_TELEMETRY=false'); + $this->assertFalse(TelemetryConfiguration::isTracingEnabled()); + } + + public function testIsTracingEnabledPrecedence() + { + // Specific flag takes precedence over legacy flag + putenv('GOOGLE_SDK_PHP_TRACING_ENABLED=false'); + putenv('GOOGLE_API_ENABLE_TELEMETRY=true'); + $this->assertFalse(TelemetryConfiguration::isTracingEnabled()); + + putenv('GOOGLE_SDK_PHP_TRACING_ENABLED=true'); + putenv('GOOGLE_API_ENABLE_TELEMETRY=false'); + $this->assertTrue(TelemetryConfiguration::isTracingEnabled()); + } + + public function testIsLoggingEnabledPrecedence() + { + putenv('GOOGLE_SDK_PHP_LOGGING_ENABLED=false'); + putenv('GOOGLE_API_ENABLE_TELEMETRY=true'); + $this->assertFalse(TelemetryConfiguration::isLoggingEnabled()); + + putenv('GOOGLE_SDK_PHP_LOGGING_ENABLED=true'); + putenv('GOOGLE_API_ENABLE_TELEMETRY=false'); + $this->assertTrue(TelemetryConfiguration::isLoggingEnabled()); + } + + public function testIsMetricsEnabledPrecedence() + { + putenv('GOOGLE_SDK_PHP_METRICS_ENABLED=false'); + putenv('GOOGLE_API_ENABLE_TELEMETRY=true'); + $this->assertFalse(TelemetryConfiguration::isMetricsEnabled()); + + putenv('GOOGLE_SDK_PHP_METRICS_ENABLED=true'); + putenv('GOOGLE_API_ENABLE_TELEMETRY=false'); + $this->assertTrue(TelemetryConfiguration::isMetricsEnabled()); + } +} diff --git a/Gax/composer.json b/Gax/composer.json index d2b521c8139..de5ce31f11d 100644 --- a/Gax/composer.json +++ b/Gax/composer.json @@ -17,7 +17,8 @@ "guzzlehttp/psr7": "^2.6.3||^3.0", "google/common-protos": "^4.9", "google/longrunning": "~0.4", - "ramsey/uuid": "^4.0" + "ramsey/uuid": "^4.0", + "open-telemetry/api": "^1.0" }, "require-dev": { "phpunit/phpunit": "^9.6", diff --git a/Gax/src/Options/ClientOptions.php b/Gax/src/Options/ClientOptions.php index b9677fe2039..bbaabd135d8 100644 --- a/Gax/src/Options/ClientOptions.php +++ b/Gax/src/Options/ClientOptions.php @@ -1,4 +1,5 @@ setUniverseDomain($arr['universeDomain'] ?? null); $this->setApiKey($arr['apiKey'] ?? null); $this->setLogger($arr['logger'] ?? null); + $this->setTracerProvider($arr['tracerProvider'] ?? null); + $this->setLoggerProvider($arr['loggerProvider'] ?? null); } /** @@ -418,4 +433,44 @@ public function setLogger(null|false|LoggerInterface $logger): self return $this; } + + /** + * @param TracerProviderInterface|null $tracerProvider + * + * @return $this + */ + public function setTracerProvider($tracerProvider): self + { + $this->tracerProvider = $tracerProvider; + + return $this; + } + + /** + * @param LoggerProviderInterface|null $loggerProvider + * + * @return $this + */ + public function setLoggerProvider($loggerProvider): self + { + $this->loggerProvider = $loggerProvider; + + return $this; + } + + /** + * @return TracerProviderInterface|null + */ + public function getTracerProvider() + { + return $this->tracerProvider; + } + + /** + * @return LoggerProviderInterface|null + */ + public function getLoggerProvider() + { + return $this->loggerProvider; + } } diff --git a/Gax/tests/Unit/Options/ClientOptionsTest.php b/Gax/tests/Unit/Options/ClientOptionsTest.php new file mode 100644 index 00000000000..60dbe7fcca1 --- /dev/null +++ b/Gax/tests/Unit/Options/ClientOptionsTest.php @@ -0,0 +1,56 @@ +createMock(TracerProviderInterface::class); + $options = new ClientOptions([]); + $options->setTracerProvider($tracerProvider); + $this->assertSame($tracerProvider, $options->getTracerProvider()); + } + + public function testSetAndGetLoggerProvider() + { + $loggerProvider = $this->createMock(LoggerProviderInterface::class); + $options = new ClientOptions([]); + $options->setLoggerProvider($loggerProvider); + $this->assertSame($loggerProvider, $options->getLoggerProvider()); + } + + public function testConstructorInjection() + { + $tracerProvider = $this->createMock(TracerProviderInterface::class); + $loggerProvider = $this->createMock(LoggerProviderInterface::class); + + $options = new ClientOptions([ + 'tracerProvider' => $tracerProvider, + 'loggerProvider' => $loggerProvider, + ]); + + $this->assertSame($tracerProvider, $options->getTracerProvider()); + $this->assertSame($loggerProvider, $options->getLoggerProvider()); + } +} diff --git a/composer.json b/composer.json index 783100ad9f9..4f93074da54 100644 --- a/composer.json +++ b/composer.json @@ -69,7 +69,8 @@ "google/protobuf": "^4.31||^5.34", "google/grpc-gcp": "^0.4", "ramsey/uuid": "^4.0", - "open-telemetry/sdk": "^1.13" + "open-telemetry/sdk": "^1.13", + "open-telemetry/api": "^1.0" }, "require-dev": { "phpunit/phpunit": "^9.6",