Line data Source code
1 : #pragma once 2 : 3 : #include "envoy/extensions/request_id/uuid/v3/uuid.pb.h" 4 : #include "envoy/extensions/request_id/uuid/v3/uuid.pb.validate.h" 5 : #include "envoy/http/request_id_extension.h" 6 : #include "envoy/server/request_id_extension_config.h" 7 : 8 : namespace Envoy { 9 : namespace Extensions { 10 : namespace RequestId { 11 : 12 : // UUIDRequestIDExtension is the default implementation if no other extension is explicitly 13 : // configured. 14 : class UUIDRequestIDExtension : public Envoy::Http::RequestIDExtension { 15 : public: 16 : UUIDRequestIDExtension(const envoy::extensions::request_id::uuid::v3::UuidRequestIdConfig& config, 17 : Random::RandomGenerator& random) 18 : : random_(random), 19 : pack_trace_reason_(PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, pack_trace_reason, true)), 20 : use_request_id_for_trace_sampling_( 21 310 : PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, use_request_id_for_trace_sampling, true)) {} 22 : 23 170 : static Envoy::Http::RequestIDExtensionSharedPtr defaultInstance(Random::RandomGenerator& random) { 24 170 : return std::make_shared<UUIDRequestIDExtension>( 25 170 : envoy::extensions::request_id::uuid::v3::UuidRequestIdConfig(), random); 26 170 : } 27 : 28 0 : bool packTraceReason() { return pack_trace_reason_; } 29 : 30 : // Envoy::Http::RequestIDExtension 31 : void set(Envoy::Http::RequestHeaderMap& request_headers, bool force) override; 32 : void setInResponse(Envoy::Http::ResponseHeaderMap& response_headers, 33 : const Envoy::Http::RequestHeaderMap& request_headers) override; 34 : absl::optional<absl::string_view> 35 : get(const Envoy::Http::RequestHeaderMap& request_headers) const override; 36 : absl::optional<uint64_t> 37 : getInteger(const Envoy::Http::RequestHeaderMap& request_headers) const override; 38 : Tracing::Reason getTraceReason(const Envoy::Http::RequestHeaderMap& request_headers) override; 39 : void setTraceReason(Envoy::Http::RequestHeaderMap& request_headers, 40 : Tracing::Reason status) override; 41 0 : bool useRequestIdForTraceSampling() const override { return use_request_id_for_trace_sampling_; } 42 : 43 : private: 44 : Envoy::Random::RandomGenerator& random_; 45 : const bool pack_trace_reason_; 46 : const bool use_request_id_for_trace_sampling_; 47 : 48 : // Byte on this position has predefined value of 4 for UUID4. 49 : static const int TRACE_BYTE_POSITION = 14; 50 : 51 : // Value of '9' is chosen randomly to distinguish between freshly generated uuid4 and the 52 : // one modified because we sample trace. 53 : static const char TRACE_SAMPLED = '9'; 54 : 55 : // Value of 'a' is chosen randomly to distinguish between freshly generated uuid4 and the 56 : // one modified because we force trace. 57 : static const char TRACE_FORCED = 'a'; 58 : 59 : // Value of 'b' is chosen randomly to distinguish between freshly generated uuid4 and the 60 : // one modified because of client trace. 61 : static const char TRACE_CLIENT = 'b'; 62 : 63 : // Initial value for freshly generated uuid4. 64 : static const char NO_TRACE = '4'; 65 : }; 66 : 67 : // Factory for the UUID request ID extension. 68 : class UUIDRequestIDExtensionFactory : public Server::Configuration::RequestIDExtensionFactory { 69 : public: 70 177 : std::string name() const override { return "envoy.request_id.uuid"; } 71 153 : ProtobufTypes::MessagePtr createEmptyConfigProto() override { 72 153 : return std::make_unique<envoy::extensions::request_id::uuid::v3::UuidRequestIdConfig>(); 73 153 : } 74 : Envoy::Http::RequestIDExtensionSharedPtr 75 : createExtensionInstance(const Protobuf::Message& config, 76 140 : Server::Configuration::FactoryContext& context) override { 77 140 : return std::make_shared<UUIDRequestIDExtension>( 78 140 : MessageUtil::downcastAndValidate< 79 140 : const envoy::extensions::request_id::uuid::v3::UuidRequestIdConfig&>( 80 140 : config, context.messageValidationVisitor()), 81 140 : context.serverFactoryContext().api().randomGenerator()); 82 140 : } 83 : }; 84 : 85 : DECLARE_FACTORY(UUIDRequestIDExtensionFactory); 86 : 87 : } // namespace RequestId 88 : } // namespace Extensions 89 : } // namespace Envoy