// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 #pragma once #ifndef ENABLE_METRICS_PREVIEW # include # include "opentelemetry/common/spin_lock_mutex.h" # include "opentelemetry/metrics/meter_provider.h" # include "opentelemetry/metrics/noop.h" # include "opentelemetry/nostd/shared_ptr.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace metrics { /** * Stores the singleton global MeterProvider. */ class Provider { public: /** * Returns the singleton MeterProvider. * * By default, a no-op MeterProvider is returned. This will never return a * nullptr MeterProvider. */ static nostd::shared_ptr GetMeterProvider() noexcept { std::lock_guard guard(GetLock()); return nostd::shared_ptr(GetProvider()); } /** * Changes the singleton MeterProvider. */ static void SetMeterProvider(nostd::shared_ptr tp) noexcept { std::lock_guard guard(GetLock()); GetProvider() = tp; } private: static nostd::shared_ptr &GetProvider() noexcept { static nostd::shared_ptr provider(new NoopMeterProvider); return provider; } static common::SpinLockMutex &GetLock() noexcept { static common::SpinLockMutex lock; return lock; } }; } // namespace metrics OPENTELEMETRY_END_NAMESPACE #endif