1
#pragma once
2

            
3
#include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.h"
4
#include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.h"
5
#include "envoy/protobuf/message_validator.h"
6
#include "envoy/server/tracer_config.h"
7

            
8
#include "source/common/formatter/substitution_formatter.h"
9
#include "source/common/tracing/custom_tag_impl.h"
10

            
11
namespace Envoy {
12
namespace Tracing {
13

            
14
using ConnectionManagerTracingConfigProto =
15
    envoy::extensions::filters::network::http_connection_manager::v3::HttpConnectionManager_Tracing;
16

            
17
class TracerFactoryContextImpl : public Server::Configuration::TracerFactoryContext {
18
public:
19
  TracerFactoryContextImpl(Server::Configuration::ServerFactoryContext& server_factory_context,
20
                           ProtobufMessage::ValidationVisitor& validation_visitor)
21
9625
      : server_factory_context_(server_factory_context), validation_visitor_(validation_visitor) {}
22
227
  Server::Configuration::ServerFactoryContext& serverFactoryContext() override {
23
227
    return server_factory_context_;
24
227
  }
25
100
  ProtobufMessage::ValidationVisitor& messageValidationVisitor() override {
26
100
    return validation_visitor_;
27
100
  }
28

            
29
private:
30
  Server::Configuration::ServerFactoryContext& server_factory_context_;
31
  ProtobufMessage::ValidationVisitor& validation_visitor_;
32
};
33

            
34
class ConnectionManagerTracingConfig {
35
public:
36
  ConnectionManagerTracingConfig(envoy::config::core::v3::TrafficDirection traffic_direction,
37
                                 const ConnectionManagerTracingConfigProto& tracing_config,
38
                                 const Formatter::CommandParserPtrVector& command_parsers = {});
39

            
40
  ConnectionManagerTracingConfig(Tracing::OperationName operation_name,
41
                                 Tracing::CustomTagMap custom_tags,
42
                                 envoy::type::v3::FractionalPercent client_sampling,
43
                                 envoy::type::v3::FractionalPercent random_sampling,
44
                                 envoy::type::v3::FractionalPercent overall_sampling,
45
                                 Formatter::FormatterPtr operation,
46
                                 Formatter::FormatterPtr upstream_operation,
47
                                 uint32_t max_path_tag_length, bool verbose,
48
                                 bool no_context_propagation = false)
49
343
      : operation_name_(operation_name), custom_tags_(std::move(custom_tags)),
50
343
        client_sampling_(std::move(client_sampling)), random_sampling_(std::move(random_sampling)),
51
343
        overall_sampling_(std::move(overall_sampling)), operation_(std::move(operation)),
52
343
        upstream_operation_(std::move(upstream_operation)),
53
343
        max_path_tag_length_(max_path_tag_length), verbose_(verbose),
54
343
        no_context_propagation_(no_context_propagation) {}
55

            
56
133
  ConnectionManagerTracingConfig() = default;
57

            
58
2
  const envoy::type::v3::FractionalPercent& getClientSampling() const { return client_sampling_; }
59
4
  const envoy::type::v3::FractionalPercent& getRandomSampling() const { return random_sampling_; }
60
2
  const envoy::type::v3::FractionalPercent& getOverallSampling() const { return overall_sampling_; }
61
4
  const Tracing::CustomTagMap& getCustomTags() const { return custom_tags_; }
62

            
63
4
  Tracing::OperationName operationName() const { return operation_name_; }
64
4
  bool verbose() const { return verbose_; }
65
4
  uint32_t maxPathTagLength() const { return max_path_tag_length_; }
66
2
  bool spawnUpstreamSpan() const { return spawn_upstream_span_; }
67
3
  bool noContextPropagation() const { return no_context_propagation_; }
68

            
69
  // TODO(wbpcode): keep this field be public for compatibility. Then the HCM needn't change much
70
  // code to use this config.
71
  Tracing::OperationName operation_name_{};
72
  Tracing::CustomTagMap custom_tags_;
73
  envoy::type::v3::FractionalPercent client_sampling_;
74
  envoy::type::v3::FractionalPercent random_sampling_;
75
  envoy::type::v3::FractionalPercent overall_sampling_;
76
  Formatter::FormatterPtr operation_;
77
  Formatter::FormatterPtr upstream_operation_;
78
  uint32_t max_path_tag_length_{};
79
  bool verbose_{};
80
  bool spawn_upstream_span_{};
81
  bool no_context_propagation_{};
82
};
83

            
84
using ConnectionManagerTracingConfigPtr = std::unique_ptr<ConnectionManagerTracingConfig>;
85

            
86
} // namespace Tracing
87
} // namespace Envoy