Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/common/tracing/tracer_config_impl.h
Line
Count
Source (jump to first uncovered line)
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/tracing/custom_tag_impl.h"
9
10
namespace Envoy {
11
namespace Tracing {
12
13
using ConnectionManagerTracingConfigProto =
14
    envoy::extensions::filters::network::http_connection_manager::v3::HttpConnectionManager_Tracing;
15
16
class TracerFactoryContextImpl : public Server::Configuration::TracerFactoryContext {
17
public:
18
  TracerFactoryContextImpl(Server::Configuration::ServerFactoryContext& server_factory_context,
19
                           ProtobufMessage::ValidationVisitor& validation_visitor)
20
5.35k
      : server_factory_context_(server_factory_context), validation_visitor_(validation_visitor) {}
21
0
  Server::Configuration::ServerFactoryContext& serverFactoryContext() override {
22
0
    return server_factory_context_;
23
0
  }
24
0
  ProtobufMessage::ValidationVisitor& messageValidationVisitor() override {
25
0
    return validation_visitor_;
26
0
  }
27
28
private:
29
  Server::Configuration::ServerFactoryContext& server_factory_context_;
30
  ProtobufMessage::ValidationVisitor& validation_visitor_;
31
};
32
33
class ConnectionManagerTracingConfigImpl : public ConnectionManagerTracingConfig {
34
public:
35
  ConnectionManagerTracingConfigImpl(envoy::config::core::v3::TrafficDirection traffic_direction,
36
845
                                     const ConnectionManagerTracingConfigProto& tracing_config) {
37
38
    // Listener level traffic direction overrides the operation name
39
845
    switch (traffic_direction) {
40
0
      PANIC_ON_PROTO_ENUM_SENTINEL_VALUES;
41
845
    case envoy::config::core::v3::UNSPECIFIED:
42
      // Continuing legacy behavior; if unspecified, we treat this as ingress.
43
845
      operation_name_ = Tracing::OperationName::Ingress;
44
845
      break;
45
0
    case envoy::config::core::v3::INBOUND:
46
0
      operation_name_ = Tracing::OperationName::Ingress;
47
0
      break;
48
0
    case envoy::config::core::v3::OUTBOUND:
49
0
      operation_name_ = Tracing::OperationName::Egress;
50
0
      break;
51
845
    }
52
53
845
    spawn_upstream_span_ =
54
845
        PROTOBUF_GET_WRAPPED_OR_DEFAULT(tracing_config, spawn_upstream_span, false);
55
56
845
    for (const auto& tag : tracing_config.custom_tags()) {
57
519
      custom_tags_.emplace(tag.tag(), Tracing::CustomTagUtility::createCustomTag(tag));
58
519
    }
59
60
845
    client_sampling_.set_numerator(
61
845
        tracing_config.has_client_sampling() ? tracing_config.client_sampling().value() : 100);
62
63
    // TODO: Random sampling historically was an integer and default to out of 10,000. We should
64
    // deprecate that and move to a straight fractional percent config.
65
845
    uint64_t random_sampling_numerator{PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT(
66
845
        tracing_config, random_sampling, 10000, 10000)};
67
845
    random_sampling_.set_numerator(random_sampling_numerator);
68
845
    random_sampling_.set_denominator(envoy::type::v3::FractionalPercent::TEN_THOUSAND);
69
70
845
    uint64_t overall_sampling_numerator{PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT(
71
845
        tracing_config, overall_sampling, 10000, 10000)};
72
845
    overall_sampling_.set_numerator(overall_sampling_numerator);
73
845
    overall_sampling_.set_denominator(envoy::type::v3::FractionalPercent::TEN_THOUSAND);
74
75
845
    verbose_ = tracing_config.verbose();
76
845
    max_path_tag_length_ = PROTOBUF_GET_WRAPPED_OR_DEFAULT(tracing_config, max_path_tag_length,
77
845
                                                           Tracing::DefaultMaxPathTagLength);
78
845
  }
79
80
  ConnectionManagerTracingConfigImpl(Tracing::OperationName operation_name,
81
                                     Tracing::CustomTagMap custom_tags,
82
                                     envoy::type::v3::FractionalPercent client_sampling,
83
                                     envoy::type::v3::FractionalPercent random_sampling,
84
                                     envoy::type::v3::FractionalPercent overall_sampling,
85
                                     bool verbose, uint32_t max_path_tag_length)
86
      : operation_name_(operation_name), custom_tags_(custom_tags),
87
        client_sampling_(client_sampling), random_sampling_(random_sampling),
88
        overall_sampling_(overall_sampling), verbose_(verbose),
89
0
        max_path_tag_length_(max_path_tag_length) {}
90
91
  ConnectionManagerTracingConfigImpl() = default;
92
93
0
  const envoy::type::v3::FractionalPercent& getClientSampling() const override {
94
0
    return client_sampling_;
95
0
  }
96
0
  const envoy::type::v3::FractionalPercent& getRandomSampling() const override {
97
0
    return random_sampling_;
98
0
  }
99
0
  const envoy::type::v3::FractionalPercent& getOverallSampling() const override {
100
0
    return overall_sampling_;
101
0
  }
102
0
  const Tracing::CustomTagMap& getCustomTags() const override { return custom_tags_; }
103
104
0
  Tracing::OperationName operationName() const override { return operation_name_; }
105
0
  bool verbose() const override { return verbose_; }
106
0
  uint32_t maxPathTagLength() const override { return max_path_tag_length_; }
107
0
  bool spawnUpstreamSpan() const override { return spawn_upstream_span_; }
108
109
  // TODO(wbpcode): keep this field be public for compatibility. Then the HCM needn't change much
110
  // code to use this config.
111
  Tracing::OperationName operation_name_{};
112
  Tracing::CustomTagMap custom_tags_;
113
  envoy::type::v3::FractionalPercent client_sampling_;
114
  envoy::type::v3::FractionalPercent random_sampling_;
115
  envoy::type::v3::FractionalPercent overall_sampling_;
116
  bool verbose_{};
117
  uint32_t max_path_tag_length_{};
118
  bool spawn_upstream_span_{};
119
};
120
121
} // namespace Tracing
122
} // namespace Envoy