LCOV - code coverage report
Current view: top level - source/extensions/request_id/uuid - config.h (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 16 18 88.9 %
Date: 2024-01-05 06:35:25 Functions: 5 7 71.4 %

          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

Generated by: LCOV version 1.15