1
#pragma once
2

            
3
#include "envoy/api/api.h"
4
#include "envoy/config/trace/v3/opentelemetry.pb.h"
5
#include "envoy/thread_local/thread_local.h"
6
#include "envoy/tracing/trace_driver.h"
7

            
8
#include "source/common/common/logger.h"
9
#include "source/common/singleton/const_singleton.h"
10
#include "source/extensions/tracers/common/factory_base.h"
11
#include "source/extensions/tracers/opentelemetry/grpc_trace_exporter.h"
12
#include "source/extensions/tracers/opentelemetry/resource_detectors/resource_provider.h"
13
#include "source/extensions/tracers/opentelemetry/tracer.h"
14

            
15
namespace Envoy {
16
namespace Extensions {
17
namespace Tracers {
18
namespace OpenTelemetry {
19

            
20
/**
21
 * OpenTelemetry tracing driver.
22
 */
23
class Driver : Logger::Loggable<Logger::Id::tracing>, public Tracing::Driver {
24
public:
25
  Driver(const envoy::config::trace::v3::OpenTelemetryConfig& opentelemetry_config,
26
         Server::Configuration::TracerFactoryContext& context);
27

            
28
  Driver(const envoy::config::trace::v3::OpenTelemetryConfig& opentelemetry_config,
29
         Server::Configuration::TracerFactoryContext& context,
30
         const ResourceProvider& resource_provider);
31

            
32
  // Tracing::Driver
33
  Tracing::SpanPtr startSpan(const Tracing::Config& config, Tracing::TraceContext& trace_context,
34
                             const StreamInfo::StreamInfo& stream_info,
35
                             const std::string& operation_name,
36
                             Tracing::Decision tracing_decision) override;
37

            
38
private:
39
  class TlsTracer : public ThreadLocal::ThreadLocalObject {
40
  public:
41
    TlsTracer(TracerPtr tracer);
42

            
43
    Tracer& tracer();
44

            
45
  private:
46
    TracerPtr tracer_;
47
  };
48

            
49
  const envoy::config::trace::v3::OpenTelemetryConfig opentelemetry_config_;
50
  ThreadLocal::SlotPtr tls_slot_ptr_;
51
  OpenTelemetryTracerStats tracing_stats_;
52
};
53

            
54
} // namespace OpenTelemetry
55
} // namespace Tracers
56
} // namespace Extensions
57
} // namespace Envoy