1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
#ifndef GECKO_TRACE_H
#define GECKO_TRACE_H
#include "mozilla/Logging.h"
#include <memory>
#include <string_view>
#include "mozilla/gecko_trace/SpanEvent.h"
#define GECKO_TRACE_SCOPE(component, span_name) \
auto GECKO_TRACE_SCOPE_##__COUNTER__ = \
mozilla::gecko_trace::TracerProvider::GetTracer(component) \
->StartSpan(span_name) \
->Enter();
namespace mozilla::gecko_trace {
using string_view = std::string_view;
#ifdef GECKO_TRACE_ENABLE
class Scope {
public:
virtual ~Scope() = default;
};
class Span {
public:
virtual ~Span() = default;
virtual void AddEvent(const SpanEvent& aEvent) = 0;
[[nodiscard]] virtual std::shared_ptr<Scope> Enter() = 0;
};
class Tracer {
public:
virtual ~Tracer() = default;
[[nodiscard]] virtual std::shared_ptr<Span> StartSpan(string_view aName) = 0;
[[nodiscard]] static std::shared_ptr<Span> GetCurrentSpan();
};
class TracerProvider {
public:
[[nodiscard]] static std::shared_ptr<Tracer> GetTracer(string_view /*aName*/);
};
/**
* Sets the OpenTelemetry internal log level to match the Mozilla logging
* system.
*/
void SetOpenTelemetryInternalLogLevel(LogLevel aLogLevel);
/**
* Initializes the GeckoTrace component and sets up OpenTelemetry integration.
*/
void Init();
#else // !GECKO_TRACE_ENABLE
// Minimal, no-op implementation for when gecko-trace is disabled.
// Only provides API compatibility for when gecko-trace is disabled.
class Scope {
public:
constexpr Scope() = default;
};
class Span {
public:
constexpr Span() = default;
constexpr void AddEvent(const SpanEvent&) const {}
[[nodiscard]] inline std::shared_ptr<Scope> Enter() const {
// Use thread_local to ensure each thread gets its own instance, avoiding
// reference counting and contention on a global control block.
//
// https://github.com/open-telemetry/opentelemetry-cpp/pull/3037#issuecomment-2380002451
static thread_local auto sNoopScope = std::make_shared<Scope>();
return sNoopScope;
}
};
class Tracer {
public:
constexpr Tracer() = default;
[[nodiscard]] inline std::shared_ptr<Span> StartSpan(
string_view /*aName*/) const {
return GetNoopSpan();
}
[[nodiscard]] inline std::shared_ptr<Span> GetCurrentSpan() const {
return GetNoopSpan();
}
private:
static std::shared_ptr<Span> GetNoopSpan() {
static thread_local auto sNoopSpan =
std::make_shared<Span>(); // See comment above regarding thread_local
// usage
return sNoopSpan;
}
};
class TracerProvider {
public:
[[nodiscard]] static inline std::shared_ptr<Tracer> GetTracer(
string_view /*aName*/) {
static thread_local auto sNoopTracer =
std::make_shared<Tracer>(); // See comment above regarding thread_local
// usage
return sNoopTracer;
}
};
constexpr void SetOpenTelemetryInternalLogLevel(LogLevel /*aLogLevel*/) {}
constexpr void Init() {}
#endif // GECKO_TRACE_ENABLE
} // namespace mozilla::gecko_trace
#endif // GECKO_TRACE_H
|