| // Copyright 2026 Google LLC | |
| // | |
| // 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 | |
| // | |
| // https://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. | |
| // | |
| #ifndef THIRD_PARTY_CREDENTIO_TRACING_TRACER_FACTORY_H_ | |
| #define THIRD_PARTY_CREDENTIO_TRACING_TRACER_FACTORY_H_ | |
| #include <memory> | |
| #include "absl/base/nullability.h" | |
| #include "absl/strings/string_view.h" | |
| #include "async/async_context.h" | |
| #include "tracing/tracer.h" | |
| namespace credentio_tracing { | |
| // Abstract factory interface and registry for obtaining Tracer instances. | |
| // | |
| // A factory can be installed at three scopes, consulted in this order: | |
| // | |
| // 1. Per operation, by attaching it to the `credentio::AsyncContext` passed | |
| // to the | |
| // operation (`context.SetExtension<TracerFactory>(factory)`). This is the | |
| // only scope that isolates concurrent operations from one another, and the | |
| // only one that follows the work across executor hops. Prefer it for any | |
| // tracer that accumulates per-operation state. | |
| // 2. Per thread, via `SetThreadLocalFactory` (or the `ScopedTracerFactory` | |
| // guard). Suitable for synchronous callers that cannot thread a context | |
| // through; it does *not* follow work handed to another thread. | |
| // 3. Process-wide, via `RegisterGlobalFactory`. Suitable for a tracer that | |
| // is safe to share across all operations, such as one exporting to a | |
| // metrics backend. | |
| // | |
| // If none is installed the no-op factory is used. | |
| class TracerFactory { | |
| public: | |
| virtual ~TracerFactory() = default; | |
| // Obtains a Tracer associated with the specified component or module name. | |
| virtual absl_nonnull std::shared_ptr<Tracer> GetTracer( | |
| absl::string_view tracer_name) const = 0; | |
| // Registers the global TracerFactory instance. If passed nullptr, resets to | |
| // the default NoopTracerFactory instance. Thread-safe. | |
| static void RegisterGlobalFactory( | |
| absl_nullable std::shared_ptr<TracerFactory> factory); | |
| // Returns the current global TracerFactory instance. Thread-safe. | |
| static absl_nonnull std::shared_ptr<TracerFactory> GetGlobalFactory(); | |
| // Installs `factory` for the calling thread only, shadowing the global | |
| // factory. Passing nullptr clears it. Prefer `ScopedTracerFactory`, which | |
| // guarantees the factory is cleared on the same thread that installed it. | |
| static void SetThreadLocalFactory( | |
| absl_nullable std::shared_ptr<TracerFactory> factory); | |
| // Returns the factory installed for the calling thread, or nullptr. | |
| static absl_nullable std::shared_ptr<TracerFactory> GetThreadLocalFactory(); | |
| // Returns the thread-local factory if one is installed, otherwise the global | |
| // one. Never returns nullptr. | |
| static absl_nonnull std::shared_ptr<TracerFactory> Get(); | |
| }; | |
| // Returns the factory that should be used for work performed under `context`: | |
| // the factory carried by the context if it has one, otherwise the thread-local | |
| // factory, otherwise the global one. Never returns nullptr. | |
| absl_nonnull std::shared_ptr<TracerFactory> ResolveTracerFactory( | |
| const credentio::AsyncContext& context); | |
| // Returns a tracer named `tracer_name` from the factory resolved for | |
| // `context`. This is the form instrumentation should use: passing the context | |
| // keeps spans with the operation they belong to. | |
| absl_nonnull std::shared_ptr<Tracer> GetTracer( | |
| absl::string_view tracer_name, const credentio::AsyncContext& context); | |
| // As above, for synchronous code with no context to hand. Resolves against the | |
| // thread-local factory, then the global one. | |
| absl_nonnull std::shared_ptr<Tracer> GetTracer(absl::string_view tracer_name); | |
| } // namespace credentio_tracing | |
| #endif // THIRD_PARTY_CREDENTIO_TRACING_TRACER_FACTORY_H_ |