blob: 2c3f98e6f6684662efa35c6933d489425e87a5d6 [file]
// 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_SCOPED_TRACER_FACTORY_H_
#define THIRD_PARTY_CREDENTIO_TRACING_SCOPED_TRACER_FACTORY_H_
#include <memory>
#include "absl/base/nullability.h"
#include "tracing/tracer_factory.h"
namespace credentio_tracing {
// RAII guard that installs a TracerFactory for the current thread during its
// lifetime and restores the previous one upon destruction.
//
// Installing and clearing a thread-local factory by hand is error prone: the
// two calls must run on the same thread, which is easy to get wrong when the
// work in between hops to a callback or a dispatch queue. This guard makes
// that mistake unrepresentable for synchronous scopes.
//
// It only covers work performed on the calling thread. To scope tracing to an
// asynchronous operation, carry the factory on the operation's
// `credentio::AsyncContext` instead.
class ScopedTracerFactory {
public:
// Installs `factory` as the calling thread's factory.
explicit ScopedTracerFactory(
absl_nullable std::shared_ptr<TracerFactory> factory);
// Restores the previously installed thread-local factory.
~ScopedTracerFactory();
ScopedTracerFactory(const ScopedTracerFactory&) = delete;
ScopedTracerFactory& operator=(const ScopedTracerFactory&) = delete;
ScopedTracerFactory(ScopedTracerFactory&&) = delete;
ScopedTracerFactory& operator=(ScopedTracerFactory&&) = delete;
private:
absl_nullable std::shared_ptr<TracerFactory> previous_factory_;
};
} // namespace credentio_tracing
#endif // THIRD_PARTY_CREDENTIO_TRACING_SCOPED_TRACER_FACTORY_H_