1
#pragma once
2

            
3
#include "envoy/common/exception.h"
4
#include "envoy/tracing/tracer.h"
5

            
6
#include "source/common/http/header_map_impl.h"
7
#include "source/extensions/tracers/opentelemetry/span_context_extractor.h"
8

            
9
namespace Envoy {
10
namespace Extensions {
11
namespace Tracers {
12
namespace Zipkin {
13

            
14
class SpanContext;
15

            
16
struct ExtractorException : public EnvoyException {
17
31
  ExtractorException(const std::string& what) : EnvoyException(what) {}
18
};
19

            
20
/**
21
 * This class is used to SpanContext extracted from the Http header
22
 */
23
class SpanContextExtractor {
24
public:
25
  SpanContextExtractor(Tracing::TraceContext& trace_context, bool w3c_fallback_enabled = false);
26
  ~SpanContextExtractor();
27
  absl::optional<bool> extractSampled();
28
  std::pair<SpanContext, bool> extractSpanContext(bool is_sampled);
29

            
30
private:
31
  /*
32
   * Use to SpanContext extracted from B3 single format Http header
33
   * b3: {x-b3-traceid}-{x-b3-spanid}-{if x-b3-flags 'd' else x-b3-sampled}-{x-b3-parentspanid}
34
   * See: "https://github.com/openzipkin/b3-propagation
35
   */
36
  std::pair<SpanContext, bool> extractSpanContextFromB3SingleFormat(bool is_sampled);
37

            
38
  /*
39
   * Convert W3C span context to Zipkin span context format
40
   */
41
  std::pair<SpanContext, bool>
42
  convertW3CToZipkin(const Extensions::Tracers::OpenTelemetry::SpanContext& w3c_context,
43
                     bool fallback_sampled);
44

            
45
  bool tryExtractSampledFromB3SingleFormat();
46
  const Tracing::TraceContext& trace_context_;
47
  bool w3c_fallback_enabled_;
48
};
49

            
50
} // namespace Zipkin
51
} // namespace Tracers
52
} // namespace Extensions
53
} // namespace Envoy