xds: update to envoy commit id b16ce6d5ea0d2da73e764d145623e7367dc59ed3 (#6871)

This commit is contained in:
sanjaypujare 2020-03-30 12:16:29 -07:00 committed by GitHub
parent a4275b63f4
commit 1bf5ad1527
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 583 additions and 90 deletions

View File

@ -149,6 +149,7 @@ subprojects {
opencensus_contrib_grpc_metrics: "io.opencensus:opencensus-contrib-grpc-metrics:${opencensusVersion}", opencensus_contrib_grpc_metrics: "io.opencensus:opencensus-contrib-grpc-metrics:${opencensusVersion}",
opencensus_impl: "io.opencensus:opencensus-impl:${opencensusVersion}", opencensus_impl: "io.opencensus:opencensus-impl:${opencensusVersion}",
opencensus_impl_lite: "io.opencensus:opencensus-impl-lite:${opencensusVersion}", opencensus_impl_lite: "io.opencensus:opencensus-impl-lite:${opencensusVersion}",
opencensus_proto: "io.opencensus:opencensus-proto:0.2.0",
instrumentation_api: 'com.google.instrumentation:instrumentation-api:0.4.3', instrumentation_api: 'com.google.instrumentation:instrumentation-api:0.4.3',
perfmark: 'io.perfmark:perfmark-api:0.19.0', perfmark: 'io.perfmark:perfmark-api:0.19.0',
protobuf: "com.google.protobuf:protobuf-java:${protobufVersion}", protobuf: "com.google.protobuf:protobuf-java:${protobufVersion}",

View File

@ -23,7 +23,8 @@ dependencies {
project(':grpc-stub'), project(':grpc-stub'),
project(':grpc-core'), project(':grpc-core'),
project(':grpc-services'), project(':grpc-services'),
project(path: ':grpc-alts', configuration: 'shadow') project(path: ':grpc-alts', configuration: 'shadow'),
libraries.opencensus_proto
def nettyDependency = compile project(':grpc-netty') def nettyDependency = compile project(':grpc-netty')
compile (libraries.protobuf_util) { compile (libraries.protobuf_util) {

View File

@ -149,6 +149,7 @@ class XdsClientTestHelper {
return clusterBuilder.build(); return clusterBuilder.build();
} }
@SuppressWarnings("deprecation")
static ClusterLoadAssignment buildClusterLoadAssignment(String clusterName, static ClusterLoadAssignment buildClusterLoadAssignment(String clusterName,
List<io.envoyproxy.envoy.api.v2.endpoint.LocalityLbEndpoints> localityLbEndpoints, List<io.envoyproxy.envoy.api.v2.endpoint.LocalityLbEndpoints> localityLbEndpoints,
List<Policy.DropOverload> dropOverloads) { List<Policy.DropOverload> dropOverloads) {

View File

@ -18,7 +18,7 @@
set -e set -e
BRANCH=master BRANCH=master
# import VERSION from one of the google internal CLs # import VERSION from one of the google internal CLs
VERSION=c0ab3a4374144728c1e193fc2d43951ed36ccdb7 VERSION=b16ce6d5ea0d2da73e764d145623e7367dc59ed3
GIT_REPO="https://github.com/envoyproxy/envoy.git" GIT_REPO="https://github.com/envoyproxy/envoy.git"
GIT_BASE_DIR=envoy GIT_BASE_DIR=envoy
SOURCE_PROTO_BASE_DIR=envoy/api SOURCE_PROTO_BASE_DIR=envoy/api
@ -33,12 +33,14 @@ envoy/api/v2/cluster/circuit_breaker.proto
envoy/api/v2/cluster/filter.proto envoy/api/v2/cluster/filter.proto
envoy/api/v2/cluster/outlier_detection.proto envoy/api/v2/cluster/outlier_detection.proto
envoy/api/v2/core/address.proto envoy/api/v2/core/address.proto
envoy/api/v2/core/backoff.proto
envoy/api/v2/core/base.proto envoy/api/v2/core/base.proto
envoy/api/v2/core/config_source.proto envoy/api/v2/core/config_source.proto
envoy/api/v2/core/grpc_service.proto envoy/api/v2/core/grpc_service.proto
envoy/api/v2/core/health_check.proto envoy/api/v2/core/health_check.proto
envoy/api/v2/core/http_uri.proto envoy/api/v2/core/http_uri.proto
envoy/api/v2/core/protocol.proto envoy/api/v2/core/protocol.proto
envoy/api/v2/core/socket_option.proto
envoy/api/v2/discovery.proto envoy/api/v2/discovery.proto
envoy/api/v2/eds.proto envoy/api/v2/eds.proto
envoy/api/v2/endpoint.proto envoy/api/v2/endpoint.proto
@ -59,6 +61,7 @@ envoy/api/v2/srds.proto
envoy/config/filter/accesslog/v2/accesslog.proto envoy/config/filter/accesslog/v2/accesslog.proto
envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.proto envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.proto
envoy/config/listener/v2/api_listener.proto envoy/config/listener/v2/api_listener.proto
envoy/config/trace/v2/trace.proto
envoy/service/discovery/v2/ads.proto envoy/service/discovery/v2/ads.proto
envoy/service/discovery/v2/sds.proto envoy/service/discovery/v2/sds.proto
envoy/service/load_stats/v2/lrs.proto envoy/service/load_stats/v2/lrs.proto

View File

@ -296,8 +296,8 @@ message CertificateValidationContext {
// //
// .. code-block:: yaml // .. code-block:: yaml
// //
// match_subject_alt_names: // match_subject_alt_names:
// exact: "api.example.com" // exact: "api.example.com"
// //
// .. attention:: // .. attention::
// //

View File

@ -643,9 +643,6 @@ message Cluster {
// other than :ref:`STRICT_DNS<envoy_api_enum_value_Cluster.DiscoveryType.STRICT_DNS>` and // other than :ref:`STRICT_DNS<envoy_api_enum_value_Cluster.DiscoveryType.STRICT_DNS>` and
// :ref:`LOGICAL_DNS<envoy_api_enum_value_Cluster.DiscoveryType.LOGICAL_DNS>` this setting is // :ref:`LOGICAL_DNS<envoy_api_enum_value_Cluster.DiscoveryType.LOGICAL_DNS>` this setting is
// ignored. // ignored.
//
// Note: Currently, DNS failures and empty DNS responses are not treated differently and this
// configuration is applied in both situations.
RefreshRate dns_failure_refresh_rate = 44; RefreshRate dns_failure_refresh_rate = 44;
// Optional configuration for setting cluster's DNS refresh rate. If the value is set to true, // Optional configuration for setting cluster's DNS refresh rate. If the value is set to true,
@ -734,7 +731,7 @@ message Cluster {
// cluster. It can be used for stats, logging, and varying filter behavior. // cluster. It can be used for stats, logging, and varying filter behavior.
// Fields should use reverse DNS notation to denote which entity within Envoy // Fields should use reverse DNS notation to denote which entity within Envoy
// will need the information. For instance, if the metadata is intended for // will need the information. For instance, if the metadata is intended for
// the Router filter, the filter name should be specified as *envoy.router*. // the Router filter, the filter name should be specified as *envoy.filters.http.router*.
core.Metadata metadata = 25; core.Metadata metadata = 25;
// Determines how Envoy selects the protocol used to speak to upstream hosts. // Determines how Envoy selects the protocol used to speak to upstream hosts.

View File

@ -2,7 +2,7 @@ syntax = "proto3";
package envoy.api.v2.core; package envoy.api.v2.core;
import "envoy/api/v2/core/base.proto"; import "envoy/api/v2/core/socket_option.proto";
import "google/protobuf/wrappers.proto"; import "google/protobuf/wrappers.proto";
@ -82,7 +82,7 @@ message TcpKeepalive {
// The number of seconds a connection needs to be idle before keep-alive probes // The number of seconds a connection needs to be idle before keep-alive probes
// start being sent. Default is to use the OS level configuration (unless // start being sent. Default is to use the OS level configuration (unless
// overridden, Linux defaults to 7200s (ie 2 hours.) // overridden, Linux defaults to 7200s (i.e., 2 hours.)
google.protobuf.UInt32Value keepalive_time = 2; google.protobuf.UInt32Value keepalive_time = 2;
// The number of seconds between keep-alive probes. Default is to use the OS // The number of seconds between keep-alive probes. Default is to use the OS

View File

@ -0,0 +1,33 @@
syntax = "proto3";
package envoy.api.v2.core;
import "google/protobuf/duration.proto";
import "udpa/annotations/migrate.proto";
import "validate/validate.proto";
option java_package = "io.envoyproxy.envoy.api.v2.core";
option java_outer_classname = "BackoffProto";
option java_multiple_files = true;
option (udpa.annotations.file_migrate).move_to_package = "envoy.config.core.v3";
// [#protodoc-title: Backoff Strategy]
// Configuration defining a jittered exponential back off strategy.
message BackoffStrategy {
// The base interval to be used for the next back off computation. It should
// be greater than zero and less than or equal to :ref:`max_interval
// <envoy_api_field_core.BackoffStrategy.max_interval>`.
google.protobuf.Duration base_interval = 1 [(validate.rules).duration = {
required: true
gte {nanos: 1000000}
}];
// Specifies the maximum interval between retries. This parameter is optional,
// but must be greater than or equal to the :ref:`base_interval
// <envoy_api_field_core.BackoffStrategy.base_interval>` if set. The default
// is 10 times the :ref:`base_interval
// <envoy_api_field_core.BackoffStrategy.base_interval>`.
google.protobuf.Duration max_interval = 2 [(validate.rules).duration = {gt {}}];
}

View File

@ -2,17 +2,22 @@ syntax = "proto3";
package envoy.api.v2.core; package envoy.api.v2.core;
import "envoy/api/v2/core/address.proto";
import "envoy/api/v2/core/backoff.proto";
import "envoy/api/v2/core/http_uri.proto"; import "envoy/api/v2/core/http_uri.proto";
import "envoy/type/percent.proto"; import "envoy/type/percent.proto";
import "envoy/type/semantic_version.proto"; import "envoy/type/semantic_version.proto";
import "google/protobuf/any.proto"; import "google/protobuf/any.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto"; import "google/protobuf/struct.proto";
import "google/protobuf/wrappers.proto"; import "google/protobuf/wrappers.proto";
import "udpa/annotations/migrate.proto"; import "udpa/annotations/migrate.proto";
import "validate/validate.proto"; import "validate/validate.proto";
import public "envoy/api/v2/core/socket_option.proto";
option java_package = "io.envoyproxy.envoy.api.v2.core"; option java_package = "io.envoyproxy.envoy.api.v2.core";
option java_outer_classname = "BaseProto"; option java_outer_classname = "BaseProto";
option java_multiple_files = true; option java_multiple_files = true;
@ -94,7 +99,7 @@ message BuildVersion {
// [#next-free-field: 6] // [#next-free-field: 6]
message Extension { message Extension {
// This is the name of the Envoy filter as specified in the Envoy // This is the name of the Envoy filter as specified in the Envoy
// configuration, e.g. envoy.router, com.acme.widget. // configuration, e.g. envoy.filters.http.router, com.acme.widget.
string name = 1; string name = 1;
// Category of the extension. // Category of the extension.
@ -121,7 +126,7 @@ message Extension {
// Identifies a specific Envoy instance. The node identifier is presented to the // Identifies a specific Envoy instance. The node identifier is presented to the
// management server, which may use this identifier to distinguish per Envoy // management server, which may use this identifier to distinguish per Envoy
// configuration for serving. // configuration for serving.
// [#next-free-field: 11] // [#next-free-field: 12]
message Node { message Node {
// An opaque node identifier for the Envoy node. This also provides the local // An opaque node identifier for the Envoy node. This also provides the local
// service node name. It should be set if any of the following features are // service node name. It should be set if any of the following features are
@ -180,6 +185,12 @@ message Node {
// See :ref:`the list of features <client_features>` that xDS client may // See :ref:`the list of features <client_features>` that xDS client may
// support. // support.
repeated string client_features = 10; repeated string client_features = 10;
// Known listening ports on the node as a generic hint to the management server
// for filtering :ref:`listeners <config_listeners>` to be returned. For example,
// if there is a listener bound to port 80, the list can optionally contain the
// SocketAddress `(0.0.0.0,80)`. The field is optional and just a hint.
repeated Address listening_addresses = 11;
} }
// Metadata provides additional inputs to filters based on matched listeners, // Metadata provides additional inputs to filters based on matched listeners,
@ -233,14 +244,18 @@ message RuntimeFeatureFlag {
// Header name/value pair. // Header name/value pair.
message HeaderValue { message HeaderValue {
// Header name. // Header name.
string key = 1 [(validate.rules).string = {min_bytes: 1 max_bytes: 16384}]; string key = 1
[(validate.rules).string =
{min_bytes: 1 max_bytes: 16384 well_known_regex: HTTP_HEADER_NAME strict: false}];
// Header value. // Header value.
// //
// The same :ref:`format specifier <config_access_log_format>` as used for // The same :ref:`format specifier <config_access_log_format>` as used for
// :ref:`HTTP access logging <config_access_log>` applies here, however // :ref:`HTTP access logging <config_access_log>` applies here, however
// unknown header values are replaced with the empty string instead of `-`. // unknown header values are replaced with the empty string instead of `-`.
string value = 2 [(validate.rules).string = {max_bytes: 16384}]; string value = 2 [
(validate.rules).string = {max_bytes: 16384 well_known_regex: HTTP_HEADER_VALUE strict: false}
];
} }
// Header name/value pair plus option to control append behavior. // Header name/value pair plus option to control append behavior.
@ -274,6 +289,18 @@ message DataSource {
} }
} }
// The message specifies the retry policy of remote data source when fetching fails.
message RetryPolicy {
// Specifies parameters that control :ref:`retry backoff strategy <envoy_api_msg_core.BackoffStrategy>`.
// This parameter is optional, in which case the default base interval is 1000 milliseconds. The
// default maximum interval is 10 times the base interval.
BackoffStrategy retry_back_off = 1;
// Specifies the allowed number of retries. This parameter is optional and
// defaults to 1.
google.protobuf.UInt32Value num_retries = 2;
}
// The message specifies how to fetch data from remote and how to verify it. // The message specifies how to fetch data from remote and how to verify it.
message RemoteDataSource { message RemoteDataSource {
// The HTTP URI to fetch the remote data. // The HTTP URI to fetch the remote data.
@ -281,6 +308,9 @@ message RemoteDataSource {
// SHA256 string for verifying data. // SHA256 string for verifying data.
string sha256 = 2 [(validate.rules).string = {min_bytes: 1}]; string sha256 = 2 [(validate.rules).string = {min_bytes: 1}];
// Retry policy for fetching remote data.
RetryPolicy retry_policy = 3;
} }
// Async data source which support async data fetch. // Async data source which support async data fetch.
@ -314,46 +344,6 @@ message TransportSocket {
} }
} }
// Generic socket option message. This would be used to set socket options that
// might not exist in upstream kernels or precompiled Envoy binaries.
// [#next-free-field: 7]
message SocketOption {
enum SocketState {
// Socket options are applied after socket creation but before binding the socket to a port
STATE_PREBIND = 0;
// Socket options are applied after binding the socket to a port but before calling listen()
STATE_BOUND = 1;
// Socket options are applied after calling listen()
STATE_LISTENING = 2;
}
// An optional name to give this socket option for debugging, etc.
// Uniqueness is not required and no special meaning is assumed.
string description = 1;
// Corresponding to the level value passed to setsockopt, such as IPPROTO_TCP
int64 level = 2;
// The numeric name as passed to setsockopt
int64 name = 3;
oneof value {
option (validate.required) = true;
// Because many sockopts take an int value.
int64 int_value = 4;
// Otherwise it's a byte buffer.
bytes buf_value = 5;
}
// The state in which the option will be applied. When used in BindConfig
// STATE_PREBIND is currently the only valid value.
SocketState state = 6 [(validate.rules).enum = {defined_only: true}];
}
// Runtime derived FractionalPercent with defaults for when the numerator or denominator is not // Runtime derived FractionalPercent with defaults for when the numerator or denominator is not
// specified via a runtime key. // specified via a runtime key.
// //

View File

@ -221,6 +221,6 @@ message GrpcService {
// Additional metadata to include in streams initiated to the GrpcService. // Additional metadata to include in streams initiated to the GrpcService.
// This can be used for scenarios in which additional ad hoc authorization // This can be used for scenarios in which additional ad hoc authorization
// headers (e.g. `x-foo-bar: baz-key`) are to be injected. // headers (e.g. ``x-foo-bar: baz-key``) are to be injected.
repeated HeaderValue initial_metadata = 5; repeated HeaderValue initial_metadata = 5;
} }

View File

@ -59,6 +59,12 @@ message HttpProtocolOptions {
// maximum number of request headers allowed is 100. Requests that exceed this limit will receive // maximum number of request headers allowed is 100. Requests that exceed this limit will receive
// a 431 response for HTTP/1.x and cause a stream reset for HTTP/2. // a 431 response for HTTP/1.x and cause a stream reset for HTTP/2.
google.protobuf.UInt32Value max_headers_count = 2 [(validate.rules).uint32 = {gte: 1}]; google.protobuf.UInt32Value max_headers_count = 2 [(validate.rules).uint32 = {gte: 1}];
// Total duration to keep alive an HTTP request/response stream. If the time limit is reached the stream will be
// reset independent of any other timeouts. If not specified, this value is not set.
// The current implementation implements this timeout on downstream connections only.
// [#comment:TODO(shikugawa): add this functionality to upstream.]
google.protobuf.Duration max_stream_duration = 4;
} }
// [#next-free-field: 6] // [#next-free-field: 6]
@ -112,8 +118,21 @@ message Http1ProtocolOptions {
bool enable_trailers = 5; bool enable_trailers = 5;
} }
// [#next-free-field: 13] // [#next-free-field: 14]
message Http2ProtocolOptions { message Http2ProtocolOptions {
// Defines a parameter to be sent in the SETTINGS frame.
// See `RFC7540, sec. 6.5.1 <https://tools.ietf.org/html/rfc7540#section-6.5.1>`_ for details.
message SettingsParameter {
// The 16 bit parameter identifier.
google.protobuf.UInt32Value identifier = 1 [
(validate.rules).uint32 = {lte: 65536 gte: 1},
(validate.rules).message = {required: true}
];
// The 32 bit parameter value.
google.protobuf.UInt32Value value = 2 [(validate.rules).message = {required: true}];
}
// `Maximum table size <https://httpwg.org/specs/rfc7541.html#rfc.section.4.2>`_ // `Maximum table size <https://httpwg.org/specs/rfc7541.html#rfc.section.4.2>`_
// (in octets) that the encoder is permitted to use for the dynamic HPACK table. Valid values // (in octets) that the encoder is permitted to use for the dynamic HPACK table. Valid values
// range from 0 to 4294967295 (2^32 - 1) and defaults to 4096. 0 effectively disables header // range from 0 to 4294967295 (2^32 - 1) and defaults to 4096. 0 effectively disables header
@ -216,6 +235,34 @@ message Http2ProtocolOptions {
// //
// See `RFC7540, sec. 8.1 <https://tools.ietf.org/html/rfc7540#section-8.1>`_ for details. // See `RFC7540, sec. 8.1 <https://tools.ietf.org/html/rfc7540#section-8.1>`_ for details.
bool stream_error_on_invalid_http_messaging = 12; bool stream_error_on_invalid_http_messaging = 12;
// [#not-implemented-hide:]
// Specifies SETTINGS frame parameters to be sent to the peer, with two exceptions:
//
// 1. SETTINGS_ENABLE_PUSH (0x2) is not configurable as HTTP/2 server push is not supported by
// Envoy.
//
// 2. SETTINGS_ENABLE_CONNECT_PROTOCOL (0x8) is only configurable through the named field
// 'allow_connect'.
//
// Note that custom parameters specified through this field can not also be set in the
// corresponding named parameters:
//
// .. code-block:: text
//
// ID Field Name
// ----------------
// 0x1 hpack_table_size
// 0x3 max_concurrent_streams
// 0x4 initial_stream_window_size
//
// Collisions will trigger config validation failure on load/update. Likewise, inconsistencies
// between custom parameters with the same identifier will trigger a failure.
//
// See `IANA HTTP/2 Settings
// <https://www.iana.org/assignments/http2-parameters/http2-parameters.xhtml#settings>`_ for
// standardized identifiers.
repeated SettingsParameter custom_settings_parameters = 13;
} }
// [#not-implemented-hide:] // [#not-implemented-hide:]

View File

@ -0,0 +1,53 @@
syntax = "proto3";
package envoy.api.v2.core;
import "udpa/annotations/migrate.proto";
import "validate/validate.proto";
option java_package = "io.envoyproxy.envoy.api.v2.core";
option java_outer_classname = "SocketOptionProto";
option java_multiple_files = true;
option (udpa.annotations.file_migrate).move_to_package = "envoy.config.core.v3";
// [#protodoc-title: Socket Option ]
// Generic socket option message. This would be used to set socket options that
// might not exist in upstream kernels or precompiled Envoy binaries.
// [#next-free-field: 7]
message SocketOption {
enum SocketState {
// Socket options are applied after socket creation but before binding the socket to a port
STATE_PREBIND = 0;
// Socket options are applied after binding the socket to a port but before calling listen()
STATE_BOUND = 1;
// Socket options are applied after calling listen()
STATE_LISTENING = 2;
}
// An optional name to give this socket option for debugging, etc.
// Uniqueness is not required and no special meaning is assumed.
string description = 1;
// Corresponding to the level value passed to setsockopt, such as IPPROTO_TCP
int64 level = 2;
// The numeric name as passed to setsockopt
int64 name = 3;
oneof value {
option (validate.required) = true;
// Because many sockopts take an int value.
int64 int_value = 4;
// Otherwise it's a byte buffer.
bytes buf_value = 5;
}
// The state in which the option will be applied. When used in BindConfig
// STATE_PREBIND is currently the only valid value.
SocketState state = 6 [(validate.rules).enum = {defined_only: true}];
}

View File

@ -94,9 +94,8 @@ message ClusterLoadAssignment {
// localities as endpoints become unhealthy. Otherwise Envoy will perform // localities as endpoints become unhealthy. Otherwise Envoy will perform
// graceful failover as :ref:`overprovisioning factor // graceful failover as :ref:`overprovisioning factor
// <arch_overview_load_balancing_overprovisioning_factor>` suggests. // <arch_overview_load_balancing_overprovisioning_factor>` suggests.
// [#next-major-version: Unify with overprovisioning config as a single message.]
// [#not-implemented-hide:] // [#not-implemented-hide:]
bool disable_overprovisioning = 5; bool disable_overprovisioning = 5 [deprecated = true];
} }
// Name of the cluster. This will be the :ref:`service_name // Name of the cluster. This will be the :ref:`service_name

View File

@ -4,6 +4,7 @@ package envoy.api.v2;
import "envoy/api/v2/core/address.proto"; import "envoy/api/v2/core/address.proto";
import "envoy/api/v2/core/base.proto"; import "envoy/api/v2/core/base.proto";
import "envoy/api/v2/core/socket_option.proto";
import "envoy/api/v2/listener/listener_components.proto"; import "envoy/api/v2/listener/listener_components.proto";
import "envoy/api/v2/listener/udp_listener_config.proto"; import "envoy/api/v2/listener/udp_listener_config.proto";
import "envoy/config/listener/v2/api_listener.proto"; import "envoy/config/listener/v2/api_listener.proto";

View File

@ -136,7 +136,7 @@ message FilterChainMatch {
// Suggested values include: // Suggested values include:
// //
// * ``raw_buffer`` - default, used when no transport protocol is detected, // * ``raw_buffer`` - default, used when no transport protocol is detected,
// * ``tls`` - set by :ref:`envoy.listener.tls_inspector <config_listener_filters_tls_inspector>` // * ``tls`` - set by :ref:`envoy.filters.listener.tls_inspector <config_listener_filters_tls_inspector>`
// when TLS protocol is detected. // when TLS protocol is detected.
string transport_protocol = 9; string transport_protocol = 9;
@ -146,9 +146,9 @@ message FilterChainMatch {
// //
// Suggested values include: // Suggested values include:
// //
// * ``http/1.1`` - set by :ref:`envoy.listener.tls_inspector // * ``http/1.1`` - set by :ref:`envoy.filters.listener.tls_inspector
// <config_listener_filters_tls_inspector>`, // <config_listener_filters_tls_inspector>`,
// * ``h2`` - set by :ref:`envoy.listener.tls_inspector <config_listener_filters_tls_inspector>` // * ``h2`` - set by :ref:`envoy.filters.listener.tls_inspector <config_listener_filters_tls_inspector>`
// //
// .. attention:: // .. attention::
// //

View File

@ -43,7 +43,9 @@ message RouteConfiguration {
// will consider to be internal only. If they are found on external requests they will be cleaned // will consider to be internal only. If they are found on external requests they will be cleaned
// prior to filter invocation. See :ref:`config_http_conn_man_headers_x-envoy-internal` for more // prior to filter invocation. See :ref:`config_http_conn_man_headers_x-envoy-internal` for more
// information. // information.
repeated string internal_only_headers = 3; repeated string internal_only_headers = 3 [
(validate.rules).repeated = {items {string {well_known_regex: HTTP_HEADER_NAME strict: false}}}
];
// Specifies a list of HTTP headers that should be added to each response that // Specifies a list of HTTP headers that should be added to each response that
// the connection manager encodes. Headers specified at this level are applied // the connection manager encodes. Headers specified at this level are applied
@ -56,7 +58,9 @@ message RouteConfiguration {
// Specifies a list of HTTP headers that should be removed from each response // Specifies a list of HTTP headers that should be removed from each response
// that the connection manager encodes. // that the connection manager encodes.
repeated string response_headers_to_remove = 5; repeated string response_headers_to_remove = 5 [
(validate.rules).repeated = {items {string {well_known_regex: HTTP_HEADER_NAME strict: false}}}
];
// Specifies a list of HTTP headers that should be added to each request // Specifies a list of HTTP headers that should be added to each request
// routed by the HTTP connection manager. Headers specified at this level are // routed by the HTTP connection manager. Headers specified at this level are
@ -69,7 +73,9 @@ message RouteConfiguration {
// Specifies a list of HTTP headers that should be removed from each request // Specifies a list of HTTP headers that should be removed from each request
// routed by the HTTP connection manager. // routed by the HTTP connection manager.
repeated string request_headers_to_remove = 8; repeated string request_headers_to_remove = 8 [
(validate.rules).repeated = {items {string {well_known_regex: HTTP_HEADER_NAME strict: false}}}
];
// By default, headers that should be added/removed are evaluated from most to least specific: // By default, headers that should be added/removed are evaluated from most to least specific:
// //

View File

@ -32,7 +32,7 @@ option (udpa.annotations.file_migrate).move_to_package = "envoy.config.route.v3"
// host header. This allows a single listener to service multiple top level domain path trees. Once // host header. This allows a single listener to service multiple top level domain path trees. Once
// a virtual host is selected based on the domain, the routes are processed in order to see which // a virtual host is selected based on the domain, the routes are processed in order to see which
// upstream cluster to route to or whether to perform a redirect. // upstream cluster to route to or whether to perform a redirect.
// [#next-free-field: 19] // [#next-free-field: 21]
message VirtualHost { message VirtualHost {
enum TlsRequirementType { enum TlsRequirementType {
// No TLS requirement for the virtual host. // No TLS requirement for the virtual host.
@ -69,7 +69,12 @@ message VirtualHost {
// The longest wildcards match first. // The longest wildcards match first.
// Only a single virtual host in the entire route configuration can match on ``*``. A domain // Only a single virtual host in the entire route configuration can match on ``*``. A domain
// must be unique across all virtual hosts or the config will fail to load. // must be unique across all virtual hosts or the config will fail to load.
repeated string domains = 2 [(validate.rules).repeated = {min_items: 1}]; //
// Domains cannot contain control characters. This is validated by the well_known_regex HTTP_HEADER_VALUE.
repeated string domains = 2 [(validate.rules).repeated = {
min_items: 1
items {string {well_known_regex: HTTP_HEADER_VALUE strict: false}}
}];
// The list of routes that will be matched, in order, for incoming requests. // The list of routes that will be matched, in order, for incoming requests.
// The first route that matches will be used. // The first route that matches will be used.
@ -118,14 +123,14 @@ message VirtualHost {
// The per_filter_config field can be used to provide virtual host-specific // The per_filter_config field can be used to provide virtual host-specific
// configurations for filters. The key should match the filter name, such as // configurations for filters. The key should match the filter name, such as
// *envoy.buffer* for the HTTP buffer filter. Use of this field is filter // *envoy.filters.http.buffer* for the HTTP buffer filter. Use of this field is filter
// specific; see the :ref:`HTTP filter documentation <config_http_filters>` // specific; see the :ref:`HTTP filter documentation <config_http_filters>`
// for if and how it is utilized. // for if and how it is utilized.
map<string, google.protobuf.Struct> per_filter_config = 12 [deprecated = true]; map<string, google.protobuf.Struct> per_filter_config = 12 [deprecated = true];
// The per_filter_config field can be used to provide virtual host-specific // The per_filter_config field can be used to provide virtual host-specific
// configurations for filters. The key should match the filter name, such as // configurations for filters. The key should match the filter name, such as
// *envoy.buffer* for the HTTP buffer filter. Use of this field is filter // *envoy.filters.http.buffer* for the HTTP buffer filter. Use of this field is filter
// specific; see the :ref:`HTTP filter documentation <config_http_filters>` // specific; see the :ref:`HTTP filter documentation <config_http_filters>`
// for if and how it is utilized. // for if and how it is utilized.
map<string, google.protobuf.Any> typed_per_filter_config = 15; map<string, google.protobuf.Any> typed_per_filter_config = 15;
@ -138,13 +143,32 @@ message VirtualHost {
// This header is unaffected by the // This header is unaffected by the
// :ref:`suppress_envoy_headers // :ref:`suppress_envoy_headers
// <envoy_api_field_config.filter.http.router.v2.Router.suppress_envoy_headers>` flag. // <envoy_api_field_config.filter.http.router.v2.Router.suppress_envoy_headers>` flag.
//
// [#next-major-version: rename to include_attempt_count_in_request.]
bool include_request_attempt_count = 14; bool include_request_attempt_count = 14;
// Decides whether the :ref:`x-envoy-attempt-count
// <config_http_filters_router_x-envoy-attempt-count>` header should be included
// in the downstream response. Setting this option will cause the router to override any existing header
// value, so in the case of two Envoys on the request path with this option enabled, the downstream
// will see the attempt count as perceived by the Envoy closest upstream from itself. Defaults to false.
// This header is unaffected by the
// :ref:`suppress_envoy_headers
// <envoy_api_field_config.filter.http.router.v2.Router.suppress_envoy_headers>` flag.
bool include_attempt_count_in_response = 19;
// Indicates the retry policy for all routes in this virtual host. Note that setting a // Indicates the retry policy for all routes in this virtual host. Note that setting a
// route level entry will take precedence over this config and it'll be treated // route level entry will take precedence over this config and it'll be treated
// independently (e.g.: values are not inherited). // independently (e.g.: values are not inherited).
RetryPolicy retry_policy = 16; RetryPolicy retry_policy = 16;
// [#not-implemented-hide:]
// Specifies the configuration for retry policy extension. Note that setting a route level entry
// will take precedence over this config and it'll be treated independently (e.g.: values are not
// inherited). :ref:`Retry policy <envoy_api_field_route.VirtualHost.retry_policy>` should not be
// set if this field is used.
google.protobuf.Any retry_policy_typed_config = 20;
// Indicates the hedge policy for all routes in this virtual host. Note that setting a // Indicates the hedge policy for all routes in this virtual host. Note that setting a
// route level entry will take precedence over this config and it'll be treated // route level entry will take precedence over this config and it'll be treated
// independently (e.g.: values are not inherited). // independently (e.g.: values are not inherited).
@ -200,7 +224,7 @@ message Route {
// about the route. It can be used for configuration, stats, and logging. // about the route. It can be used for configuration, stats, and logging.
// The metadata should go under the filter namespace that will need it. // The metadata should go under the filter namespace that will need it.
// For instance, if the metadata is intended for the Router filter, // For instance, if the metadata is intended for the Router filter,
// the filter name should be specified as *envoy.router*. // the filter name should be specified as *envoy.filters.http.router*.
core.Metadata metadata = 4; core.Metadata metadata = 4;
// Decorator for the matched route. // Decorator for the matched route.
@ -208,14 +232,14 @@ message Route {
// The per_filter_config field can be used to provide route-specific // The per_filter_config field can be used to provide route-specific
// configurations for filters. The key should match the filter name, such as // configurations for filters. The key should match the filter name, such as
// *envoy.buffer* for the HTTP buffer filter. Use of this field is filter // *envoy.filters.http.buffer* for the HTTP buffer filter. Use of this field is filter
// specific; see the :ref:`HTTP filter documentation <config_http_filters>` for // specific; see the :ref:`HTTP filter documentation <config_http_filters>` for
// if and how it is utilized. // if and how it is utilized.
map<string, google.protobuf.Struct> per_filter_config = 8 [deprecated = true]; map<string, google.protobuf.Struct> per_filter_config = 8 [deprecated = true];
// The per_filter_config field can be used to provide route-specific // The typed_per_filter_config field can be used to provide route-specific
// configurations for filters. The key should match the filter name, such as // configurations for filters. The key should match the filter name, such as
// *envoy.buffer* for the HTTP buffer filter. Use of this field is filter // *envoy.filters.http.buffer* for the HTTP buffer filter. Use of this field is filter
// specific; see the :ref:`HTTP filter documentation <config_http_filters>` for // specific; see the :ref:`HTTP filter documentation <config_http_filters>` for
// if and how it is utilized. // if and how it is utilized.
map<string, google.protobuf.Any> typed_per_filter_config = 13; map<string, google.protobuf.Any> typed_per_filter_config = 13;
@ -314,14 +338,14 @@ message WeightedCluster {
// The per_filter_config field can be used to provide weighted cluster-specific // The per_filter_config field can be used to provide weighted cluster-specific
// configurations for filters. The key should match the filter name, such as // configurations for filters. The key should match the filter name, such as
// *envoy.buffer* for the HTTP buffer filter. Use of this field is filter // *envoy.filters.http.buffer* for the HTTP buffer filter. Use of this field is filter
// specific; see the :ref:`HTTP filter documentation <config_http_filters>` // specific; see the :ref:`HTTP filter documentation <config_http_filters>`
// for if and how it is utilized. // for if and how it is utilized.
map<string, google.protobuf.Struct> per_filter_config = 8 [deprecated = true]; map<string, google.protobuf.Struct> per_filter_config = 8 [deprecated = true];
// The per_filter_config field can be used to provide weighted cluster-specific // The per_filter_config field can be used to provide weighted cluster-specific
// configurations for filters. The key should match the filter name, such as // configurations for filters. The key should match the filter name, such as
// *envoy.buffer* for the HTTP buffer filter. Use of this field is filter // *envoy.filters.http.buffer* for the HTTP buffer filter. Use of this field is filter
// specific; see the :ref:`HTTP filter documentation <config_http_filters>` // specific; see the :ref:`HTTP filter documentation <config_http_filters>`
// for if and how it is utilized. // for if and how it is utilized.
map<string, google.protobuf.Any> typed_per_filter_config = 10; map<string, google.protobuf.Any> typed_per_filter_config = 10;
@ -530,7 +554,7 @@ message CorsPolicy {
core.RuntimeFractionalPercent shadow_enabled = 10; core.RuntimeFractionalPercent shadow_enabled = 10;
} }
// [#next-free-field: 32] // [#next-free-field: 34]
message RouteAction { message RouteAction {
enum ClusterNotFoundResponseCode { enum ClusterNotFoundResponseCode {
// HTTP status code - 503 Service Unavailable. // HTTP status code - 503 Service Unavailable.
@ -588,16 +612,21 @@ message RouteAction {
// number is <= the value of the numerator N, or if the key is not present, the default // number is <= the value of the numerator N, or if the key is not present, the default
// value, the request will be mirrored. // value, the request will be mirrored.
core.RuntimeFractionalPercent runtime_fraction = 3; core.RuntimeFractionalPercent runtime_fraction = 3;
// Determines if the trace span should be sampled. Defaults to true.
google.protobuf.BoolValue trace_sampled = 4;
} }
// Specifies the route's hashing policy if the upstream cluster uses a hashing :ref:`load balancer // Specifies the route's hashing policy if the upstream cluster uses a hashing :ref:`load balancer
// <arch_overview_load_balancing_types>`. // <arch_overview_load_balancing_types>`.
// [#next-free-field: 6] // [#next-free-field: 7]
message HashPolicy { message HashPolicy {
message Header { message Header {
// The name of the request header that will be used to obtain the hash // The name of the request header that will be used to obtain the hash
// key. If the request header is not present, no hash will be produced. // key. If the request header is not present, no hash will be produced.
string header_name = 1 [(validate.rules).string = {min_bytes: 1}]; string header_name = 1 [
(validate.rules).string = {min_bytes: 1 well_known_regex: HTTP_HEADER_NAME strict: false}
];
} }
// Envoy supports two types of cookie affinity: // Envoy supports two types of cookie affinity:
@ -642,6 +671,13 @@ message RouteAction {
string name = 1 [(validate.rules).string = {min_bytes: 1}]; string name = 1 [(validate.rules).string = {min_bytes: 1}];
} }
message FilterState {
// The name of the Object in the per-request filterState, which is an
// Envoy::Http::Hashable object. If there is no data associated with the key,
// or the stored object is not Envoy::Http::Hashable, no hash will be produced.
string key = 1 [(validate.rules).string = {min_bytes: 1}];
}
oneof policy_specifier { oneof policy_specifier {
option (validate.required) = true; option (validate.required) = true;
@ -656,6 +692,9 @@ message RouteAction {
// Query parameter hash policy. // Query parameter hash policy.
QueryParameter query_parameter = 5; QueryParameter query_parameter = 5;
// Filter state hash policy.
FilterState filter_state = 6;
} }
// The flag that short-circuits the hash computing. This field provides a // The flag that short-circuits the hash computing. This field provides a
@ -690,7 +729,8 @@ message RouteAction {
// The case-insensitive name of this upgrade, e.g. "websocket". // The case-insensitive name of this upgrade, e.g. "websocket".
// For each upgrade type present in upgrade_configs, requests with // For each upgrade type present in upgrade_configs, requests with
// Upgrade: [upgrade_type] will be proxied upstream. // Upgrade: [upgrade_type] will be proxied upstream.
string upgrade_type = 1; string upgrade_type = 1
[(validate.rules).string = {well_known_regex: HTTP_HEADER_VALUE strict: false}];
// Determines if upgrades are available on this route. Defaults to true. // Determines if upgrades are available on this route. Defaults to true.
google.protobuf.BoolValue enabled = 2; google.protobuf.BoolValue enabled = 2;
@ -714,7 +754,8 @@ message RouteAction {
// //
// Internally, Envoy always uses the HTTP/2 *:authority* header to represent the HTTP/1 // Internally, Envoy always uses the HTTP/2 *:authority* header to represent the HTTP/1
// *Host* header. Thus, if attempting to match on *Host*, match on *:authority* instead. // *Host* header. Thus, if attempting to match on *Host*, match on *:authority* instead.
string cluster_header = 2 [(validate.rules).string = {min_bytes: 1}]; string cluster_header = 2
[(validate.rules).string = {min_bytes: 1 well_known_regex: HTTP_HEADER_NAME strict: false}];
// Multiple upstream clusters can be specified for a given route. The // Multiple upstream clusters can be specified for a given route. The
// request is routed to one of the upstream clusters based on weights // request is routed to one of the upstream clusters based on weights
@ -742,6 +783,10 @@ message RouteAction {
// place the original path before rewrite into the :ref:`x-envoy-original-path // place the original path before rewrite into the :ref:`x-envoy-original-path
// <config_http_filters_router_x-envoy-original-path>` header. // <config_http_filters_router_x-envoy-original-path>` header.
// //
// Only one of *prefix_rewrite* or
// :ref:`regex_rewrite <envoy_api_field_route.RouteAction.regex_rewrite>`
// may be specified.
//
// .. attention:: // .. attention::
// //
// Pay careful attention to the use of trailing slashes in the // Pay careful attention to the use of trailing slashes in the
@ -763,12 +808,46 @@ message RouteAction {
// //
// Having above entries in the config, requests to */prefix* will be stripped to */*, while // Having above entries in the config, requests to */prefix* will be stripped to */*, while
// requests to */prefix/etc* will be stripped to */etc*. // requests to */prefix/etc* will be stripped to */etc*.
string prefix_rewrite = 5; string prefix_rewrite = 5
[(validate.rules).string = {well_known_regex: HTTP_HEADER_VALUE strict: false}];
// Indicates that during forwarding, portions of the path that match the
// pattern should be rewritten, even allowing the substitution of capture
// groups from the pattern into the new path as specified by the rewrite
// substitution string. This is useful to allow application paths to be
// rewritten in a way that is aware of segments with variable content like
// identifiers. The router filter will place the original path as it was
// before the rewrite into the :ref:`x-envoy-original-path
// <config_http_filters_router_x-envoy-original-path>` header.
//
// Only one of :ref:`prefix_rewrite <envoy_api_field_route.RouteAction.prefix_rewrite>`
// or *regex_rewrite* may be specified.
//
// Examples using Google's `RE2 <https://github.com/google/re2>`_ engine:
//
// * The path pattern ``^/service/([^/]+)(/.*)$`` paired with a substitution
// string of ``\2/instance/\1`` would transform ``/service/foo/v1/api``
// into ``/v1/api/instance/foo``.
//
// * The pattern ``one`` paired with a substitution string of ``two`` would
// transform ``/xxx/one/yyy/one/zzz`` into ``/xxx/two/yyy/two/zzz``.
//
// * The pattern ``^(.*?)one(.*)$`` paired with a substitution string of
// ``\1two\2`` would replace only the first occurrence of ``one``,
// transforming path ``/xxx/one/yyy/one/zzz`` into ``/xxx/two/yyy/one/zzz``.
//
// * The pattern ``(?i)/xxx/`` paired with a substitution string of ``/yyy/``
// would do a case-insensitive match and transform path ``/aaa/XxX/bbb`` to
// ``/aaa/yyy/bbb``.
type.matcher.RegexMatchAndSubstitute regex_rewrite = 32;
oneof host_rewrite_specifier { oneof host_rewrite_specifier {
// Indicates that during forwarding, the host header will be swapped with // Indicates that during forwarding, the host header will be swapped with
// this value. // this value.
string host_rewrite = 6 [(udpa.annotations.field_migrate).rename = "host_rewrite_literal"]; string host_rewrite = 6 [
(validate.rules).string = {well_known_regex: HTTP_HEADER_VALUE strict: false},
(udpa.annotations.field_migrate).rename = "host_rewrite_literal"
];
// Indicates that during forwarding, the host header will be swapped with // Indicates that during forwarding, the host header will be swapped with
// the hostname of the upstream host chosen by the cluster manager. This // the hostname of the upstream host chosen by the cluster manager. This
@ -785,8 +864,10 @@ message RouteAction {
// //
// Pay attention to the potential security implications of using this option. Provided header // Pay attention to the potential security implications of using this option. Provided header
// must come from trusted source. // must come from trusted source.
string auto_host_rewrite_header = 29 string auto_host_rewrite_header = 29 [
[(udpa.annotations.field_migrate).rename = "host_rewrite_header"]; (validate.rules).string = {well_known_regex: HTTP_HEADER_NAME strict: false},
(udpa.annotations.field_migrate).rename = "host_rewrite_header"
];
} }
// Specifies the upstream timeout for the route. If not specified, the default is 15s. This // Specifies the upstream timeout for the route. If not specified, the default is 15s. This
@ -827,6 +908,13 @@ message RouteAction {
// (e.g.: policies are not merged, most internal one becomes the enforced policy). // (e.g.: policies are not merged, most internal one becomes the enforced policy).
RetryPolicy retry_policy = 9; RetryPolicy retry_policy = 9;
// [#not-implemented-hide:]
// Specifies the configuration for retry policy extension. Note that if this is set, it'll take
// precedence over the virtual host level retry policy entirely (e.g.: policies are not merged,
// most internal one becomes the enforced policy). :ref:`Retry policy <envoy_api_field_route.VirtualHost.retry_policy>`
// should not be set if this field is used.
google.protobuf.Any retry_policy_typed_config = 33;
// Indicates that the route has a request mirroring policy. // Indicates that the route has a request mirroring policy.
// //
// .. attention:: // .. attention::
@ -877,6 +965,15 @@ message RouteAction {
// :ref:`timeout <envoy_api_field_route.RouteAction.timeout>` or its default. // :ref:`timeout <envoy_api_field_route.RouteAction.timeout>` or its default.
// This can be used to prevent unexpected upstream request timeouts due to potentially long // This can be used to prevent unexpected upstream request timeouts due to potentially long
// time gaps between gRPC request and response in gRPC streaming mode. // time gaps between gRPC request and response in gRPC streaming mode.
//
// .. note::
//
// If a timeout is specified using :ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms`, it takes
// precedence over `grpc-timeout header <https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md>`_, when
// both are present. See also
// :ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms`,
// :ref:`config_http_filters_router_x-envoy-upstream-rq-per-try-timeout-ms`, and the
// :ref:`retry overview <arch_overview_http_routing_retry>`.
google.protobuf.Duration max_grpc_timeout = 23; google.protobuf.Duration max_grpc_timeout = 23;
// If present, Envoy will adjust the timeout provided by the `grpc-timeout` header by subtracting // If present, Envoy will adjust the timeout provided by the `grpc-timeout` header by subtracting
@ -1070,14 +1167,16 @@ message RedirectAction {
} }
// The host portion of the URL will be swapped with this value. // The host portion of the URL will be swapped with this value.
string host_redirect = 1; string host_redirect = 1
[(validate.rules).string = {well_known_regex: HTTP_HEADER_VALUE strict: false}];
// The port value of the URL will be swapped with this value. // The port value of the URL will be swapped with this value.
uint32 port_redirect = 8; uint32 port_redirect = 8;
oneof path_rewrite_specifier { oneof path_rewrite_specifier {
// The path portion of the URL will be swapped with this value. // The path portion of the URL will be swapped with this value.
string path_redirect = 2; string path_redirect = 2
[(validate.rules).string = {well_known_regex: HTTP_HEADER_VALUE strict: false}];
// Indicates that during redirection, the matched prefix (or path) // Indicates that during redirection, the matched prefix (or path)
// should be swapped with this value. This option allows redirect URLs be dynamically created // should be swapped with this value. This option allows redirect URLs be dynamically created
@ -1087,7 +1186,8 @@ message RedirectAction {
// //
// Pay attention to the use of trailing slashes as mentioned in // Pay attention to the use of trailing slashes as mentioned in
// :ref:`RouteAction's prefix_rewrite <envoy_api_field_route.RouteAction.prefix_rewrite>`. // :ref:`RouteAction's prefix_rewrite <envoy_api_field_route.RouteAction.prefix_rewrite>`.
string prefix_rewrite = 5; string prefix_rewrite = 5
[(validate.rules).string = {well_known_regex: HTTP_HEADER_VALUE strict: false}];
} }
// The HTTP status code to use in the redirect response. The default response // The HTTP status code to use in the redirect response. The default response
@ -1263,7 +1363,9 @@ message RateLimit {
// The header name to be queried from the request headers. The headers // The header name to be queried from the request headers. The headers
// value is used to populate the value of the descriptor entry for the // value is used to populate the value of the descriptor entry for the
// descriptor_key. // descriptor_key.
string header_name = 1 [(validate.rules).string = {min_bytes: 1}]; string header_name = 1 [
(validate.rules).string = {min_bytes: 1 well_known_regex: HTTP_HEADER_NAME strict: false}
];
// The key to use in the descriptor entry. // The key to use in the descriptor entry.
string descriptor_key = 2 [(validate.rules).string = {min_bytes: 1}]; string descriptor_key = 2 [(validate.rules).string = {min_bytes: 1}];
@ -1384,7 +1486,8 @@ message HeaderMatcher {
reserved 2, 3; reserved 2, 3;
// Specifies the name of the header in the request. // Specifies the name of the header in the request.
string name = 1 [(validate.rules).string = {min_bytes: 1}]; string name = 1
[(validate.rules).string = {min_bytes: 1 well_known_regex: HTTP_HEADER_NAME strict: false}];
// Specifies how the header match will be performed to route the request. // Specifies how the header match will be performed to route the request.
oneof header_match_specifier { oneof header_match_specifier {

View File

@ -7,6 +7,7 @@ import "envoy/api/v2/core/protocol.proto";
import "envoy/api/v2/route.proto"; import "envoy/api/v2/route.proto";
import "envoy/api/v2/scoped_route.proto"; import "envoy/api/v2/scoped_route.proto";
import "envoy/config/filter/accesslog/v2/accesslog.proto"; import "envoy/config/filter/accesslog/v2/accesslog.proto";
import "envoy/config/trace/v2/trace.proto";
import "envoy/type/percent.proto"; import "envoy/type/percent.proto";
import "envoy/type/tracing/v2/custom_tag.proto"; import "envoy/type/tracing/v2/custom_tag.proto";
@ -89,7 +90,7 @@ message HttpConnectionManager {
ALWAYS_FORWARD_ONLY = 4; ALWAYS_FORWARD_ONLY = 4;
} }
// [#next-free-field: 9] // [#next-free-field: 10]
message Tracing { message Tracing {
enum OperationName { enum OperationName {
// The HTTP listener is used for ingress/incoming requests. // The HTTP listener is used for ingress/incoming requests.
@ -156,6 +157,12 @@ message HttpConnectionManager {
// A list of custom tags with unique tag name to create tags for the active span. // A list of custom tags with unique tag name to create tags for the active span.
repeated type.tracing.v2.CustomTag custom_tags = 8; repeated type.tracing.v2.CustomTag custom_tags = 8;
// Configuration for an external tracing provider.
// If not specified, Envoy will fall back to using tracing provider configuration
// from the bootstrap config.
// [#not-implemented-hide:]
trace.v2.Tracing.Http provider = 9;
} }
message InternalAddressConfig { message InternalAddressConfig {

View File

@ -0,0 +1,224 @@
syntax = "proto3";
package envoy.config.trace.v2;
import "envoy/api/v2/core/grpc_service.proto";
import "google/protobuf/any.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/wrappers.proto";
import "opencensus/proto/trace/v1/trace_config.proto";
import "envoy/annotations/deprecation.proto";
import "validate/validate.proto";
option java_package = "io.envoyproxy.envoy.config.trace.v2";
option java_outer_classname = "TraceProto";
option java_multiple_files = true;
// [#protodoc-title: Tracing]
// Tracing :ref:`architecture overview <arch_overview_tracing>`.
// The tracing configuration specifies global
// settings for the HTTP tracer used by Envoy. The configuration is defined by
// the :ref:`Bootstrap <envoy_api_msg_config.bootstrap.v2.Bootstrap>` :ref:`tracing
// <envoy_api_field_config.bootstrap.v2.Bootstrap.tracing>` field. Envoy may support other tracers
// in the future, but right now the HTTP tracer is the only one supported.
message Tracing {
message Http {
// The name of the HTTP trace driver to instantiate. The name must match a
// supported HTTP trace driver. Built-in trace drivers:
//
// - *envoy.tracers.lightstep*
// - *envoy.tracers.zipkin*
// - *envoy.tracers.dynamic_ot*
// - *envoy.tracers.datadog*
// - *envoy.tracers.opencensus*
// - *envoy.tracers.xray*
string name = 1 [(validate.rules).string = {min_bytes: 1}];
// Trace driver specific configuration which depends on the driver being instantiated.
// See the trace drivers for examples:
//
// - :ref:`LightstepConfig <envoy_api_msg_config.trace.v2.LightstepConfig>`
// - :ref:`ZipkinConfig <envoy_api_msg_config.trace.v2.ZipkinConfig>`
// - :ref:`DynamicOtConfig <envoy_api_msg_config.trace.v2.DynamicOtConfig>`
// - :ref:`DatadogConfig <envoy_api_msg_config.trace.v2.DatadogConfig>`
// - :ref:`OpenCensusConfig <envoy_api_msg_config.trace.v2.OpenCensusConfig>`
// - :ref:`AWS X-Ray <envoy_api_msg_config.trace.v2alpha.XRayConfig>`
oneof config_type {
google.protobuf.Struct config = 2 [deprecated = true];
google.protobuf.Any typed_config = 3;
}
}
// Provides configuration for the HTTP tracer.
Http http = 1;
}
// Configuration for the LightStep tracer.
// [#extension: envoy.tracers.lightstep]
message LightstepConfig {
// The cluster manager cluster that hosts the LightStep collectors.
string collector_cluster = 1 [(validate.rules).string = {min_bytes: 1}];
// File containing the access token to the `LightStep
// <https://lightstep.com/>`_ API.
string access_token_file = 2 [(validate.rules).string = {min_bytes: 1}];
}
// Configuration for the Zipkin tracer.
// [#extension: envoy.tracers.zipkin]
// [#next-free-field: 6]
message ZipkinConfig {
// Available Zipkin collector endpoint versions.
enum CollectorEndpointVersion {
// Zipkin API v1, JSON over HTTP.
// [#comment: The default implementation of Zipkin client before this field is added was only v1
// and the way user configure this was by not explicitly specifying the version. Consequently,
// before this is added, the corresponding Zipkin collector expected to receive v1 payload.
// Hence the motivation of adding HTTP_JSON_V1 as the default is to avoid a breaking change when
// user upgrading Envoy with this change. Furthermore, we also immediately deprecate this field,
// since in Zipkin realm this v1 version is considered to be not preferable anymore.]
HTTP_JSON_V1 = 0 [deprecated = true, (envoy.annotations.disallowed_by_default_enum) = true];
// Zipkin API v2, JSON over HTTP.
HTTP_JSON = 1;
// Zipkin API v2, protobuf over HTTP.
HTTP_PROTO = 2;
// [#not-implemented-hide:]
GRPC = 3;
}
// The cluster manager cluster that hosts the Zipkin collectors. Note that the
// Zipkin cluster must be defined in the :ref:`Bootstrap static cluster
// resources <envoy_api_field_config.bootstrap.v2.Bootstrap.StaticResources.clusters>`.
string collector_cluster = 1 [(validate.rules).string = {min_bytes: 1}];
// The API endpoint of the Zipkin service where the spans will be sent. When
// using a standard Zipkin installation, the API endpoint is typically
// /api/v1/spans, which is the default value.
string collector_endpoint = 2 [(validate.rules).string = {min_bytes: 1}];
// Determines whether a 128bit trace id will be used when creating a new
// trace instance. The default value is false, which will result in a 64 bit trace id being used.
bool trace_id_128bit = 3;
// Determines whether client and server spans will share the same span context.
// The default value is true.
google.protobuf.BoolValue shared_span_context = 4;
// Determines the selected collector endpoint version. By default, the ``HTTP_JSON_V1`` will be
// used.
CollectorEndpointVersion collector_endpoint_version = 5;
}
// DynamicOtConfig is used to dynamically load a tracer from a shared library
// that implements the `OpenTracing dynamic loading API
// <https://github.com/opentracing/opentracing-cpp>`_.
// [#extension: envoy.tracers.dynamic_ot]
message DynamicOtConfig {
// Dynamic library implementing the `OpenTracing API
// <https://github.com/opentracing/opentracing-cpp>`_.
string library = 1 [(validate.rules).string = {min_bytes: 1}];
// The configuration to use when creating a tracer from the given dynamic
// library.
google.protobuf.Struct config = 2;
}
// Configuration for the Datadog tracer.
// [#extension: envoy.tracers.datadog]
message DatadogConfig {
// The cluster to use for submitting traces to the Datadog agent.
string collector_cluster = 1 [(validate.rules).string = {min_bytes: 1}];
// The name used for the service when traces are generated by envoy.
string service_name = 2 [(validate.rules).string = {min_bytes: 1}];
}
// Configuration for the OpenCensus tracer.
// [#next-free-field: 15]
// [#extension: envoy.tracers.opencensus]
message OpenCensusConfig {
enum TraceContext {
// No-op default, no trace context is utilized.
NONE = 0;
// W3C Trace-Context format "traceparent:" header.
TRACE_CONTEXT = 1;
// Binary "grpc-trace-bin:" header.
GRPC_TRACE_BIN = 2;
// "X-Cloud-Trace-Context:" header.
CLOUD_TRACE_CONTEXT = 3;
// X-B3-* headers.
B3 = 4;
}
reserved 7;
// Configures tracing, e.g. the sampler, max number of annotations, etc.
opencensus.proto.trace.v1.TraceConfig trace_config = 1;
// Enables the stdout exporter if set to true. This is intended for debugging
// purposes.
bool stdout_exporter_enabled = 2;
// Enables the Stackdriver exporter if set to true. The project_id must also
// be set.
bool stackdriver_exporter_enabled = 3;
// The Cloud project_id to use for Stackdriver tracing.
string stackdriver_project_id = 4;
// (optional) By default, the Stackdriver exporter will connect to production
// Stackdriver. If stackdriver_address is non-empty, it will instead connect
// to this address, which is in the gRPC format:
// https://github.com/grpc/grpc/blob/master/doc/naming.md
string stackdriver_address = 10;
// (optional) The gRPC server that hosts Stackdriver tracing service. Only
// Google gRPC is supported. If :ref:`target_uri <envoy_v3_api_field_config.core.v3.GrpcService.GoogleGrpc.target_uri>`
// is not provided, the default production Stackdriver address will be used.
api.v2.core.GrpcService stackdriver_grpc_service = 13;
// Enables the Zipkin exporter if set to true. The url and service name must
// also be set.
bool zipkin_exporter_enabled = 5;
// The URL to Zipkin, e.g. "http://127.0.0.1:9411/api/v2/spans"
string zipkin_url = 6;
// Enables the OpenCensus Agent exporter if set to true. The ocagent_address or
// ocagent_grpc_service must also be set.
bool ocagent_exporter_enabled = 11;
// The address of the OpenCensus Agent, if its exporter is enabled, in gRPC
// format: https://github.com/grpc/grpc/blob/master/doc/naming.md
// [#comment:TODO: deprecate this field]
string ocagent_address = 12;
// (optional) The gRPC server hosted by the OpenCensus Agent. Only Google gRPC is supported.
// This is only used if the ocagent_address is left empty.
api.v2.core.GrpcService ocagent_grpc_service = 14;
// List of incoming trace context headers we will accept. First one found
// wins.
repeated TraceContext incoming_trace_context = 8;
// List of outgoing trace context headers we will produce.
repeated TraceContext outgoing_trace_context = 9;
}
// Configuration structure.
message TraceServiceConfig {
// The upstream gRPC cluster that hosts the metrics service.
api.v2.core.GrpcService grpc_service = 1 [(validate.rules).message = {required: true}];
}

View File

@ -35,3 +35,29 @@ message RegexMatcher {
// The regex match string. The string must be supported by the configured engine. // The regex match string. The string must be supported by the configured engine.
string regex = 2 [(validate.rules).string = {min_bytes: 1}]; string regex = 2 [(validate.rules).string = {min_bytes: 1}];
} }
// Describes how to match a string and then produce a new string using a regular
// expression and a substitution string.
message RegexMatchAndSubstitute {
// The regular expression used to find portions of a string (hereafter called
// the "subject string") that should be replaced. When a new string is
// produced during the substitution operation, the new string is initially
// the same as the subject string, but then all matches in the subject string
// are replaced by the substitution string. If replacing all matches isn't
// desired, regular expression anchors can be used to ensure a single match,
// so as to replace just one occurrence of a pattern. Capture groups can be
// used in the pattern to extract portions of the subject string, and then
// referenced in the substitution string.
RegexMatcher pattern = 1;
// The string that should be substituted into matching portions of the
// subject string during a substitution operation to produce a new string.
// Capture groups in the pattern can be referenced in the substitution
// string. Note, however, that the syntax for referring to capture groups is
// defined by the chosen regular expression engine. Google's `RE2
// <https://github.com/google/re2>`_ regular expression engine uses a
// backslash followed by the capture group number to denote a numbered
// capture group. E.g., ``\1`` refers to capture group 1, and ``\2`` refers
// to capture group 2.
string substitution = 2;
}

View File

@ -35,7 +35,8 @@ message CustomTag {
// Header type custom tag with header name and default value. // Header type custom tag with header name and default value.
message Header { message Header {
// Header name to obtain the value to populate the tag value. // Header name to obtain the value to populate the tag value.
string name = 1 [(validate.rules).string = {min_bytes: 1}]; string name = 1
[(validate.rules).string = {min_bytes: 1 well_known_regex: HTTP_HEADER_NAME strict: false}];
// When the header does not exist, // When the header does not exist,
// the tag value will be populated with this default value if specified, // the tag value will be populated with this default value if specified,