File: GeckoTrace.cpp

package info (click to toggle)
firefox 142.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,591,884 kB
  • sloc: cpp: 7,451,570; javascript: 6,392,463; ansic: 3,712,584; python: 1,388,569; xml: 629,223; asm: 426,919; java: 184,857; sh: 63,439; makefile: 19,150; objc: 13,059; perl: 12,983; yacc: 4,583; cs: 3,846; pascal: 3,352; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (111 lines) | stat: -rw-r--r-- 3,719 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
/* 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/. */

#include <vector>

#include "mozilla/CmdLineAndEnvUtils.h"
#include "mozilla/Logging.h"

#ifdef DEBUG
#  include "opentelemetry/exporters/ostream/span_exporter_factory.h"
#endif
#include "opentelemetry/sdk/common/global_log_handler.h"
#include "opentelemetry/sdk/trace/simple_processor_factory.h"
#include "opentelemetry/sdk/trace/tracer_provider_factory.h"
#include "opentelemetry/trace/provider.h"

#include "GeckoTrace.h"

namespace mozilla::gecko_trace {

namespace otel_trace_api = opentelemetry::trace;
namespace otel_trace_sdk = opentelemetry::sdk::trace;
namespace otel_internal_log = opentelemetry::sdk::common::internal_log;

namespace {
static mozilla::LazyLogModule sOpenTelemetryLog("opentelemetry");

class OtelLogHandler final : public otel_internal_log::LogHandler {
 public:
  void Handle(otel_internal_log::LogLevel aLevel, const char* aFile, int aLine,
              const char* aMsg,
              const opentelemetry::sdk::common::AttributeMap&
                  aAttributes) noexcept override {
    mozilla::LogLevel mozLogLevel;

    switch (aLevel) {
      case otel_internal_log::LogLevel::Error:
        mozLogLevel = mozilla::LogLevel::Error;
        break;
      case otel_internal_log::LogLevel::Warning:
        mozLogLevel = mozilla::LogLevel::Warning;
        break;
      case otel_internal_log::LogLevel::Info:
        mozLogLevel = mozilla::LogLevel::Info;
        break;
      case otel_internal_log::LogLevel::Debug:
        mozLogLevel = mozilla::LogLevel::Debug;
        break;
      default:
        mozLogLevel = mozilla::LogLevel::Disabled;
        break;
    }

    MOZ_LOG(sOpenTelemetryLog, mozLogLevel, ("%s", aMsg));
  };
};
}  // namespace

void SetOpenTelemetryInternalLogLevel(mozilla::LogLevel aLogLevel) {
  otel_internal_log::LogLevel otelLogLevel;

  switch (aLogLevel) {
    case mozilla::LogLevel::Error:
      otelLogLevel = otel_internal_log::LogLevel::Error;
      break;
    case mozilla::LogLevel::Warning:
      otelLogLevel = otel_internal_log::LogLevel::Warning;
      break;
    case mozilla::LogLevel::Info:
      otelLogLevel = otel_internal_log::LogLevel::Info;
      break;
    case mozilla::LogLevel::Debug:
      [[fallthrough]];
    case mozilla::LogLevel::Verbose:
      // OpenTelemetry does not differentiate between debug and verbose
      otelLogLevel = otel_internal_log::LogLevel::Debug;
      break;
    case LogLevel::Disabled:
      otelLogLevel = otel_internal_log::LogLevel::None;
      break;
  }

  otel_internal_log::GlobalLogHandler::SetLogLevel(otelLogLevel);
}

void Init() {
  otel_internal_log::GlobalLogHandler::SetLogHandler(
      std::make_shared<OtelLogHandler>(OtelLogHandler()));

  std::vector<std::unique_ptr<otel_trace_sdk::SpanProcessor>> processors;

#ifdef DEBUG
  if (mozilla::EnvHasValue("GECKO_TRACE_EXPORT_SPANS_TO_STDOUT")) {
    auto ostreamExporter =
        opentelemetry::exporter::trace::OStreamSpanExporterFactory::Create();
    auto ostreamProcessor = otel_trace_sdk::SimpleSpanProcessorFactory::Create(
        std::move(ostreamExporter));
    processors.push_back(std::move(ostreamProcessor));
  }
#endif

  // We should overload the `otel_trace_sdk::TracerProviderFactory::Create`
  // here once the implementation and testing are more complete.
  std::shared_ptr<otel_trace_api::TracerProvider> provider =
      otel_trace_sdk::TracerProviderFactory::Create(std::move(processors));

  otel_trace_api::Provider::SetTracerProvider(std::move(provider));
}

}  // namespace mozilla::gecko_trace