1
#pragma once
2

            
3
#include "envoy/config/trace/v3/skywalking.pb.h"
4
#include "envoy/server/tracer_config.h"
5
#include "envoy/thread_local/thread_local.h"
6
#include "envoy/tracing/trace_driver.h"
7

            
8
#include "source/extensions/tracers/skywalking/tracer.h"
9
#include "source/tracing_context_impl.h"
10

            
11
#include "cpp2sky/exception.h"
12

            
13
namespace Envoy {
14
namespace Extensions {
15
namespace Tracers {
16
namespace SkyWalking {
17

            
18
using cpp2sky::TracerConfig;
19
using cpp2sky::TracingContextFactory;
20
using cpp2sky::TracingContextSharedPtr;
21

            
22
class Driver : public Tracing::Driver, public Logger::Loggable<Logger::Id::tracing> {
23
public:
24
  explicit Driver(const envoy::config::trace::v3::SkyWalkingConfig& config,
25
                  Server::Configuration::TracerFactoryContext& context);
26

            
27
  // Tracing::Driver
28
  Tracing::SpanPtr startSpan(const Tracing::Config& config, Tracing::TraceContext& trace_context,
29
                             const StreamInfo::StreamInfo& stream_info,
30
                             const std::string& operation_name,
31
                             Tracing::Decision tracing_decision) override;
32

            
33
private:
34
  void loadConfig(const envoy::config::trace::v3::ClientConfig& client_config,
35
                  Server::Configuration::ServerFactoryContext& server_factory_context);
36

            
37
  class TlsTracer : public ThreadLocal::ThreadLocalObject {
38
  public:
39
    TlsTracer(TracerPtr tracer);
40

            
41
    Tracer& tracer();
42

            
43
  private:
44
    TracerPtr tracer_;
45
  };
46

            
47
  TracerConfig config_;
48
  SkyWalkingTracerStatsSharedPtr tracing_stats_;
49
  ThreadLocal::SlotPtr tls_slot_ptr_;
50
  std::unique_ptr<TracingContextFactory> tracing_context_factory_;
51
};
52

            
53
using DriverPtr = std::unique_ptr<Driver>;
54

            
55
} // namespace SkyWalking
56
} // namespace Tracers
57
} // namespace Extensions
58
} // namespace Envoy