File: GeckoTrace.h

package info (click to toggle)
firefox 145.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,653,528 kB
  • sloc: cpp: 7,594,999; javascript: 6,459,658; ansic: 3,752,909; python: 1,403,455; xml: 629,809; asm: 438,679; java: 186,421; sh: 67,287; makefile: 19,169; objc: 13,086; perl: 12,982; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (135 lines) | stat: -rw-r--r-- 3,580 bytes parent folder | download | duplicates (2)
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
130
131
132
133
134
135
/* 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 "mozilla/GeckoTraceEvents.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

#ifdef GECKO_TRACE_ENABLE
extern "C" {
void recv_gecko_trace_export(const uint8_t* buffer, uintptr_t length);
}
#else
inline constexpr void recv_gecko_trace_export(const uint8_t* /*buffer*/,
                                              uintptr_t /*length*/) {}
#endif

#endif  // GECKO_TRACE_H