1
#pragma once
2

            
3
#include <memory>
4
#include <string>
5

            
6
#include "envoy/common/pure.h"
7
#include "envoy/http/header_map.h"
8
#include "envoy/tracing/trace_reason.h"
9

            
10
namespace Envoy {
11
namespace Http {
12

            
13
/**
14
 * Abstract request id utilities for getting/setting the request IDs and tracing status of requests
15
 */
16
class RequestIDExtension {
17
public:
18
21254
  virtual ~RequestIDExtension() = default;
19

            
20
  /**
21
   *  Get the request ID from the request headers.
22
   * @param request_headers supplies the incoming request headers for retrieving the request ID.
23
   * @return the string view or nullopt if the request ID is invalid.
24
   */
25
  virtual absl::optional<absl::string_view>
26
  get(const Http::RequestHeaderMap& request_headers) const PURE;
27

            
28
  /**
29
   * Get and convert the request ID to a 64-bit integer representation for using in modulo, etc.
30
   * calculations.
31
   * @param request_headers supplies the incoming request headers for retrieving the request ID.
32
   * @return the integer or nullopt if the request ID is invalid.
33
   */
34
  virtual absl::optional<uint64_t>
35
  getInteger(const Http::RequestHeaderMap& request_headers) const PURE;
36

            
37
  /**
38
   * Directly set a request ID into the provided request headers. Override any previous request ID
39
   * if any.
40
   * @param request_headers supplies the incoming request headers for setting a request ID.
41
   * @param edge_request whether the request is an edge request.
42
   * @param keep_external_id whether to preserve the request ID from external requests.
43
   */
44
  virtual void set(Http::RequestHeaderMap& request_headers, bool edge_request,
45
                   bool keep_external_id) PURE;
46

            
47
  /**
48
   * Preserve request ID in response headers if any is set in the request headers.
49
   * @param response_headers supplies the downstream response headers for setting the request ID.
50
   * @param request_headers supplies the incoming request headers for retrieving the request ID.
51
   */
52
  virtual void setInResponse(Http::ResponseHeaderMap& response_headers,
53
                             const Http::RequestHeaderMap& request_headers) PURE;
54

            
55
  /**
56
   * Get the current tracing reason of a request given its headers.
57
   * @param request_headers supplies the incoming request headers for retrieving the request ID.
58
   * @return trace reason of the request based on the given headers.
59
   */
60
  virtual Tracing::Reason getTraceReason(const Http::RequestHeaderMap& request_headers) PURE;
61

            
62
  /**
63
   * Set the tracing status of a request.
64
   * @param request_headers supplies the incoming request headers for setting the trace reason.
65
   * @param status the trace reason that should be set for this request.
66
   */
67
  virtual void setTraceReason(Http::RequestHeaderMap& request_headers, Tracing::Reason reason) PURE;
68

            
69
  /**
70
   * Get whether to use request_id based sampling policy or not.
71
   * @return whether to use request_id based sampling policy or not.
72
   */
73
  virtual bool useRequestIdForTraceSampling() const PURE;
74
};
75

            
76
using RequestIDExtensionSharedPtr = std::shared_ptr<RequestIDExtension>;
77

            
78
} // namespace Http
79
} // namespace Envoy