diff --git a/src/OpenTelemetryServiceProvider.php b/src/OpenTelemetryServiceProvider.php index f51c377..a20b5e0 100644 --- a/src/OpenTelemetryServiceProvider.php +++ b/src/OpenTelemetryServiceProvider.php @@ -12,10 +12,13 @@ use OpenTelemetry\API\Globals; use OpenTelemetry\API\Metrics\MeterInterface; use OpenTelemetry\API\Trace\TracerInterface; +use OpenTelemetry\SDK\Metrics\MeterProviderFactory; +use OpenTelemetry\SDK\Resource\Detectors\Sdk; use Overtrue\LaravelOpenTelemetry\Console\Commands\TestCommand; use Overtrue\LaravelOpenTelemetry\Facades\Measure; use Overtrue\LaravelOpenTelemetry\Http\Middleware\AddTraceId; use Overtrue\LaravelOpenTelemetry\Http\Middleware\TraceRequest; +use Overtrue\LaravelOpenTelemetry\Support\Metric; class OpenTelemetryServiceProvider extends ServiceProvider { @@ -62,9 +65,13 @@ public function register(): void }); $this->app->alias(Support\Metric::class, 'opentelemetry.metric'); + // register custom meter $this->app->singleton(MeterInterface::class, function () { - return Globals::meterProvider() - ->getMeter(config('otel.meter_name', 'overtrue.laravel-open-telemetry')); + $resourceInfo = (new Sdk)->getResource(); + $meterProvider = (new MeterProviderFactory)->create($resourceInfo); + Metric::setProvider($meterProvider); + + return $meterProvider->getMeter(config('otel.meter_name', 'overtrue.laravel-open-telemetry')); }); $this->app->alias(MeterInterface::class, 'opentelemetry.meter'); diff --git a/src/Support/Metric.php b/src/Support/Metric.php index c3f28d5..b2475bd 100644 --- a/src/Support/Metric.php +++ b/src/Support/Metric.php @@ -4,11 +4,11 @@ use Illuminate\Contracts\Foundation\Application; use Illuminate\Support\Facades\Log; -use OpenTelemetry\API\Globals; use OpenTelemetry\API\Metrics\CounterInterface; use OpenTelemetry\API\Metrics\GaugeInterface; use OpenTelemetry\API\Metrics\HistogramInterface; use OpenTelemetry\API\Metrics\MeterInterface; +use OpenTelemetry\API\Metrics\MeterProviderInterface; use OpenTelemetry\API\Metrics\Noop\NoopMeter; use OpenTelemetry\API\Metrics\ObservableGaugeInterface; use Throwable; @@ -17,6 +17,8 @@ class Metric { private static ?bool $enabled = null; + private static ?MeterProviderInterface $meterProvider = null; + public function __construct(protected Application $app) {} // ======================= Enable/Disable Management ======================= @@ -45,7 +47,17 @@ public function isEnabled(): bool */ public function flush(): void { - Globals::meterProvider()?->forceFlush(); + self::$meterProvider?->forceFlush(); + } + + public static function getProvider(): MeterProviderInterface + { + return self::$meterProvider; + } + + public static function setProvider(MeterProviderInterface $meterProvider): void + { + self::$meterProvider = $meterProvider; } // ======================= Core OpenTelemetry API =======================