File: GeckoTrace.h

package info (click to toggle)
thunderbird 1%3A143.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,703,968 kB
  • sloc: cpp: 7,770,492; javascript: 5,943,842; ansic: 3,918,754; python: 1,418,263; xml: 653,354; asm: 474,045; java: 183,079; sh: 111,238; makefile: 20,410; perl: 14,359; objc: 13,059; yacc: 4,583; pascal: 3,405; lex: 1,720; ruby: 999; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 69; csh: 10
file content (129 lines) | stat: -rw-r--r-- 3,357 bytes parent folder | download | duplicates (3)
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