diff --git a/src/ConfigConfigurationResolver.php b/src/ConfigConfigurationResolver.php index 0773d1c..7a1e6dc 100644 --- a/src/ConfigConfigurationResolver.php +++ b/src/ConfigConfigurationResolver.php @@ -4,22 +4,28 @@ namespace Worksome\LaravelTelemetry; -use Illuminate\Contracts\Config\Repository; use OpenTelemetry\SDK\Common\Configuration\Resolver\ResolverInterface; /** * Resolves Open Telemetry configuration via Laravel config. + * + * The `config()` function is intentionally used to ensure that the latest config is always used. */ class ConfigConfigurationResolver implements ResolverInterface { private const PREFIX = 'telemetry'; - public function __construct( - private readonly Repository $config, - ) { + public function retrieveValue(string $variableName) + { + return config()->get($this->variableNameToConfigKey($variableName)); } - private function getKey(string $variableName): string + public function hasVariable(string $variableName): bool + { + return config()->has($this->variableNameToConfigKey($variableName)); + } + + private function variableNameToConfigKey(string $variableName): string { $names = collect(explode('_', $variableName)) ->map(fn(string $key) => strtolower($key)) @@ -28,14 +34,4 @@ private function getKey(string $variableName): string return implode('.', [self::PREFIX, ...$names]); } - - public function retrieveValue(string $variableName) - { - return $this->config->get($this->getKey($variableName)); - } - - public function hasVariable(string $variableName): bool - { - return $this->config->has($this->getKey($variableName)); - } } diff --git a/src/LaravelTelemetryServiceProvider.php b/src/LaravelTelemetryServiceProvider.php index 36bdbe4..5fd2344 100644 --- a/src/LaravelTelemetryServiceProvider.php +++ b/src/LaravelTelemetryServiceProvider.php @@ -88,10 +88,10 @@ private function prepareConfigResolver(): void { /** @var LoggerInterface $logger */ $logger = $this->app->get(LoggerInterface::class); - /** @var ConfigConfigurationResolver $configResolver */ - $configResolver = $this->app->get(ConfigConfigurationResolver::class); LoggerHolder::set($logger); - CompositeResolver::instance()->addResolver($configResolver); + CompositeResolver::instance()->addResolver( + new ConfigConfigurationResolver() + ); } } diff --git a/tests/ExampleTest.php b/tests/ExampleTest.php deleted file mode 100644 index 5d36321..0000000 --- a/tests/ExampleTest.php +++ /dev/null @@ -1,5 +0,0 @@ -toBeTrue(); -}); diff --git a/tests/Feature/LaravelTelemetryServiceProviderTest.php b/tests/Feature/LaravelTelemetryServiceProviderTest.php new file mode 100644 index 0000000..d25fd94 --- /dev/null +++ b/tests/Feature/LaravelTelemetryServiceProviderTest.php @@ -0,0 +1,105 @@ +app->get(ConfigRepository::class); + + expect($config->get('telemetry')) + ->sdk->disabled->toBeFalse() + ->exporter->otlp->endpoint->toBe('http://localhost:4318'); +}); + +it('can update the config at runtime', function () { + /** @var ConfigRepository $config */ + $config = $this->app->get(ConfigRepository::class); + + expect(Sdk::isDisabled())->toBeFalse(); + + $config->set('telemetry.sdk.disabled', true); + + expect(Sdk::isDisabled())->toBeTrue(); +}); + +it('registers the logger provider', function () { + expect( + $this->app->get(LoggerProviderInterface::class) + ) + ->toBeInstanceOf(LoggerProviderInterface::class) + ->toBeInstanceOf(LoggerProviderSdkInterface::class); +}); + +it('registers the metric provider', function () { + expect( + $this->app->get(MeterProviderInterface::class) + ) + ->toBeInstanceOf(MeterProviderInterface::class) + ->toBeInstanceOf(MeterProviderSdkInterface::class); +}); + +it('registers the tracer provider', function () { + expect( + $this->app->get(TracerProviderInterface::class) + ) + ->toBeInstanceOf(TracerProviderInterface::class) + ->toBeInstanceOf(TracerProviderSdkInterface::class); +}); + +it('can get a logger from the logger provider', function () { + expect( + $this->app->get(LoggerProviderInterface::class)->getLogger('test') + ) + ->toBeInstanceOf(LoggerInterface::class); +}); + +it('can get a meter from the meter provider', function () { + expect( + $this->app->get(MeterProviderInterface::class)->getMeter('test') + ) + ->toBeInstanceOf(MeterInterface::class); +}); + +it('can get a tracer from the tracer provider', function () { + expect( + $this->app->get(TracerProviderInterface::class)->getTracer('test') + ) + ->toBeInstanceOf(TracerInterface::class); +}); + +it('returns no-op instances when the SDK is disabled', function () { + /** @var ConfigRepository $config */ + $config = $this->app->get(ConfigRepository::class); + + $config->set('telemetry.sdk.disabled', true); + + expect( + $this->app->get(LoggerProviderInterface::class)->getLogger('test') + ) + ->toBeInstanceOf(NoopLogger::class); + + expect( + $this->app->get(MeterProviderInterface::class)->getLogger('test') + ) + ->toBeInstanceOf(NoopMeter::class); + + expect( + $this->app->get(TracerProviderInterface::class)->getLogger('test') + ) + ->toBeInstanceOf(NoopTracer::class); +}); diff --git a/tests/Pest.php b/tests/Pest.php index 2f77994..d4eee48 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -1,5 +1,7 @@ in(__DIR__); +uses(TestCase::class)->in('Feature'); diff --git a/tests/TestCase.php b/tests/TestCase.php index 4172b5f..383a4a5 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -1,38 +1,18 @@ 'Worksome\\LaravelTelemetry\\Database\\Factories\\' . class_basename( - $modelName - ) . 'Factory' - ); - } - - protected function getPackageProviders($app) + protected function getPackageProviders($app): array { return [ LaravelTelemetryServiceProvider::class, ]; } - - public function getEnvironmentSetUp($app) - { - config()->set('database.default', 'testing'); - - /* - $migration = include __DIR__.'/../database/migrations/create_laravel-telemetry_table.php.stub'; - $migration->up(); - */ - } }