diff --git a/website/source/api/discovery-chain.html.md b/website/source/api/discovery-chain.html.md
new file mode 100644
index 000000000..8c4f48968
--- /dev/null
+++ b/website/source/api/discovery-chain.html.md
@@ -0,0 +1,567 @@
+---
+layout: api
+page_title: Discovery Chain - HTTP API
+sidebar_current: api-discovery-chain
+description: |-
+ The /discovery-chain endpoints are for interacting with the discovery chain.
+---
+
+# Discovery Chain HTTP Endpoint beta
+
+~> This is a low-level API primarily targeted at developers building external
+[Connect proxy integrations](/docs/connect/proxies/integrate.html). Future
+high-level proxy integration APIs may obviate the need for this API over time.
+
+The `/discovery-chain` endpoint returns the compiled [discovery
+chain](/docs/internals/discovery-chain.html) for a service.
+
+This will fetch all related [configuration
+entries](/docs/agent/config_entries.html) and render them into a form suitable
+for use by a [connect proxy] (/docs/connect/proxies.html) implementation. This
+is a key component of [L7 Traffic
+Management](/docs/connect/l7-traffic-management.html).
+
+## Read Compiled Discovery Chain
+
+If overrides are needed they are passed as the JSON-encoded request body and
+the `POST` method must be used, otherwise `GET` is sufficient.
+
+| Method | Path | Produces |
+| ------------------ | ---------------------------- | -------------------------- |
+| `GET` | `/discovery-chain/:service` | `application/json` |
+| `POST`1 | `/discovery-chain/:service` | `application/json` |
+
+1 Both GET and POST are for **read** operations. GET requests do not
+permit request bodies so a POST is required if override parameters are needed.
+
+The table below shows this endpoint's support for
+[blocking queries](/api/features/blocking.html),
+[consistency modes](/api/features/consistency.html),
+[agent caching](/api/features/caching.html), and
+[required ACLs](/api/index.html#authentication).
+
+| Blocking Queries | Consistency Modes | Agent Caching | ACL Required |
+| ---------------- | ----------------- | -------------------- | -------------- |
+| `YES` | `all` | `background refresh` | `service:read` |
+
+### URL Parameters
+
+- `service` `(string: )` - Specifies the service to query when
+ compiling the discovery chain. This is provided as part of the URL.
+
+- `compile-dc` `(string: "")` - Specifies the datacenter to use as the basis of
+ compilation. This will default to the datacenter of the agent being queried.
+ This is specified as part of the URL as a query parameter.
+
+ This value comes from an [upstream
+ configuration](/docs/connect/registration/service-registration.html#upstream-configuration-reference)
+ [`datacenter`](/docs/connect/registration/service-registration.html#datacenter)
+ parameter.
+
+### POST Body Parameters
+
+- `OverrideConnectTimeout` `(duration: 0s)` - Overrides the final [connect
+ timeout](/docs/agent/config-entries/service-resolver.html#connecttimeout) for
+ any service resolved in the compiled chain.
+
+ This value comes from the `connect_timeout_ms` key in an [upstream
+ configuration](/docs/connect/registration/service-registration.html#upstream-configuration-reference)
+ opaque
+ [`config`](/docs/connect/registration/service-registration.html#config-1)
+ parameter.
+
+- `OverrideProtocol` `(string: "")` - Overrides the final
+ [protocol](/docs/agent/config-entries/service-defaults.html#protocol) used in
+ the compiled discovery chain.
+
+ If the chain ordinarily would be TCP and an L7 protocol is passed here the
+ chain will still not include Routers or Splitters. If the chain ordinarily
+ would be L7 and TCP is passed here the chain will not include Routers or
+ Splitters.
+
+ This value comes from the `protocol` key in an [upstream
+ configuration](/docs/connect/registration/service-registration.html#upstream-configuration-reference)
+ opaque
+ [`config`](/docs/connect/registration/service-registration.html#config-1)
+ parameter.
+
+- `OverrideMeshGateway` `(MeshGatewayConfig: )` - Overrides the final
+ [mesh gateway configuration](/docs/connect/mesh_gateway.html#connect-proxy-configuration)
+ for this any service resolved in the compiled chain.
+
+ This value comes from either the [proxy
+ configuration](/docs/connect/registration/service-registration.html#complete-configuration-example)
+ [`mesh_gateway`](/docs/connect/registration/service-registration.html#mesh_gateway)
+ parameter or an [upstream
+ configuration](/docs/connect/registration/service-registration.html#upstream-configuration-reference)
+ [`mesh_gateway`](/docs/connect/registration/service-registration.html#mesh_gateway-1)
+ parameter. If both are present the value defined on the upstream is used.
+
+ - `Mode` `(string: "")` - One of `none`, `local`, or `remote`.
+
+### Sample Compilations
+
+Full documentation for the output fields is found on the [discovery chain
+internals](http://localhost:4567/docs/internals/discovery-chain.html#compileddiscoverychain)
+page.
+
+#### Multi-Datacenter Failover
+
+Config entries defined:
+
+```hcl
+kind = "service-resolver"
+name = "web"
+connect_timeout = "15s"
+failover = {
+ "*" = {
+ datacenters = ["dc3", "dc4"]
+ }
+}
+```
+
+Request:
+
+```text
+$ curl http://127.0.0.1:8500/v1/discovery-chain/web
+```
+
+Response:
+
+```json
+{
+ "Chain": {
+ "ServiceName": "web",
+ "Namespace": "default",
+ "Datacenter": "dc1",
+ "Protocol": "tcp",
+ "StartNode": "resolver:web.default.dc1",
+ "Nodes": {
+ "resolver:web.default.dc1": {
+ "Type": "resolver",
+ "Name": "web.default.dc1",
+ "Resolver": {
+ "ConnectTimeout": "15s",
+ "Target": "web.default.dc1",
+ "Failover": {
+ "Targets": [
+ "web.default.dc3",
+ "web.default.dc4"
+ ]
+ }
+ }
+ }
+ },
+ "Targets": {
+ "web.default.dc1": {
+ "ID": "web.default.dc1",
+ "Service": "web",
+ "Namespace": "default",
+ "Datacenter": "dc1",
+ "MeshGateway": {},
+ "Subset": {},
+ "SNI": "web.default.dc1.internal.47e25151-6212-ba25-8b7e-81adbbbab461.consul",
+ "Name": "web.default.dc1.internal.47e25151-6212-ba25-8b7e-81adbbbab461.consul"
+ },
+ "web.default.dc3": {
+ "ID": "web.default.dc3",
+ "Service": "web",
+ "Namespace": "default",
+ "Datacenter": "dc3",
+ "MeshGateway": {},
+ "Subset": {},
+ "SNI": "web.default.dc3.internal.47e25151-6212-ba25-8b7e-81adbbbab461.consul",
+ "Name": "web.default.dc3.internal.47e25151-6212-ba25-8b7e-81adbbbab461.consul"
+ },
+ "web.default.dc4": {
+ "ID": "web.default.dc4",
+ "Service": "web",
+ "Namespace": "default",
+ "Datacenter": "dc4",
+ "MeshGateway": {},
+ "Subset": {},
+ "SNI": "web.default.dc4.internal.47e25151-6212-ba25-8b7e-81adbbbab461.consul",
+ "Name": "web.default.dc4.internal.47e25151-6212-ba25-8b7e-81adbbbab461.consul"
+ }
+ }
+ }
+}
+```
+
+#### Datacenter Redirect with Overrides
+
+Config entries defined:
+
+```hcl
+kind = "service-resolver"
+name = "web"
+redirect {
+ datacenter = "dc2"
+}
+```
+
+Request:
+
+```text
+$ curl -X POST \
+ -d'
+{
+ "OverrideConnectTimeout": "7s",
+ "OverrideProtocol": "grpc",
+ "OverrideMeshGateway": {
+ "Mode": "remote"
+ }
+}
+' http://127.0.0.1:8500/v1/discovery-chain/web
+```
+
+Response:
+
+```json
+{
+ "Chain": {
+ "ServiceName": "web",
+ "Namespace": "default",
+ "Datacenter": "dc1",
+ "CustomizationHash": "b94f529a",
+ "Protocol": "grpc",
+ "StartNode": "resolver:web.default.dc2",
+ "Nodes": {
+ "resolver:web.default.dc2": {
+ "Type": "resolver",
+ "Name": "web.default.dc2",
+ "Resolver": {
+ "ConnectTimeout": "7s",
+ "Target": "web.default.dc2"
+ }
+ }
+ },
+ "Targets": {
+ "web.default.dc2": {
+ "ID": "web.default.dc2",
+ "Service": "web",
+ "Namespace": "default",
+ "Datacenter": "dc2",
+ "MeshGateway": {
+ "Mode": "remote"
+ },
+ "Subset": {},
+ "SNI": "web.default.dc2.internal.59c17fd4-8dfa-f54a-ae71-855b26faf637.consul",
+ "Name": "web.default.dc2.internal.59c17fd4-8dfa-f54a-ae71-855b26faf637.consul"
+ }
+ }
+ }
+}
+```
+
+#### Version Split For Alternate Datacenter
+
+Config entries defined:
+
+```hcl
+kind = "service-resolver"
+name = "web"
+default_subset = "v1"
+subsets = {
+ "v1" = {
+ filter = "Service.Meta.version == v1"
+ }
+ "v2" = {
+ filter = "Service.Meta.version == v2"
+ }
+}
+# ---------------------------
+kind = "service-defaults"
+name = "web"
+protocol = "http"
+# ---------------------------
+kind = "service-splitter"
+name = "web"
+splits = [
+ {
+ weight = 90
+ service_subset = "v1"
+ },
+ {
+ weight = 10
+ service_subset = "v2"
+ },
+]
+```
+
+Request:
+
+```text
+$ curl http://127.0.0.1:8500/v1/discovery-chain/web?compile-dc=dc2
+```
+
+Response:
+
+```json
+{
+ "Chain": {
+ "ServiceName": "web",
+ "Namespace": "default",
+ "Datacenter": "dc2",
+ "Protocol": "http",
+ "StartNode": "splitter:web",
+ "Nodes": {
+ "resolver:v1.web.default.dc2": {
+ "Type": "resolver",
+ "Name": "v1.web.default.dc2",
+ "Resolver": {
+ "ConnectTimeout": "5s",
+ "Target": "v1.web.default.dc2"
+ }
+ },
+ "resolver:v2.web.default.dc2": {
+ "Type": "resolver",
+ "Name": "v2.web.default.dc2",
+ "Resolver": {
+ "ConnectTimeout": "5s",
+ "Target": "v2.web.default.dc2"
+ }
+ },
+ "splitter:web": {
+ "Type": "splitter",
+ "Name": "web",
+ "Splits": [
+ {
+ "Weight": 90,
+ "NextNode": "resolver:v1.web.default.dc2"
+ },
+ {
+ "Weight": 10,
+ "NextNode": "resolver:v2.web.default.dc2"
+ }
+ ]
+ }
+ },
+ "Targets": {
+ "v1.web.default.dc2": {
+ "ID": "v1.web.default.dc2",
+ "Service": "web",
+ "ServiceSubset": "v1",
+ "Namespace": "default",
+ "Datacenter": "dc2",
+ "MeshGateway": {},
+ "Subset": {
+ "Filter": "Service.Meta.version == v1"
+ },
+ "SNI": "v1.web.default.dc2.internal.6c9594ec-d798-28b9-d084-aa03e81cf078.consul",
+ "Name": "v1.web.default.dc2.internal.6c9594ec-d798-28b9-d084-aa03e81cf078.consul"
+ },
+ "v2.web.default.dc2": {
+ "ID": "v2.web.default.dc2",
+ "Service": "web",
+ "ServiceSubset": "v2",
+ "Namespace": "default",
+ "Datacenter": "dc2",
+ "MeshGateway": {},
+ "Subset": {
+ "Filter": "Service.Meta.version == v2"
+ },
+ "SNI": "v2.web.default.dc2.internal.6c9594ec-d798-28b9-d084-aa03e81cf078.consul",
+ "Name": "v2.web.default.dc2.internal.6c9594ec-d798-28b9-d084-aa03e81cf078.consul"
+ }
+ }
+ }
+}
+```
+
+#### HTTP Path Routing
+
+Config entries defined:
+
+```hcl
+kind = "service-resolver"
+name = "web"
+subsets = {
+ "canary" = {
+ filter = "Service.Meta.flavor == canary"
+ }
+}
+# ---------------------------
+kind = "proxy-defaults"
+name = "web"
+config {
+ protocol = "http"
+}
+# ---------------------------
+kind = "service-router"
+name = "web"
+routes = [
+ {
+ match {
+ http {
+ path_prefix = "/admin"
+ }
+ }
+ destination {
+ service = "admin"
+ prefix_rewrite = "/"
+ request_timeout = "15s"
+ }
+ },
+ {
+ match {
+ http {
+ header = [
+ {
+ name = "x-debug"
+ exact = "1"
+ },
+ ]
+ }
+ }
+ destination {
+ service = "web"
+ service_subset = "canary"
+ num_retries = 5
+ retry_on_connect_failure = true
+ retry_on_status_codes = [401, 409]
+ }
+ },
+]
+```
+
+Request:
+
+```text
+$ curl http://127.0.0.1:8500/v1/discovery-chain/web
+```
+
+Response:
+
+```json
+{
+ "Chain": {
+ "ServiceName": "web",
+ "Namespace": "default",
+ "Datacenter": "dc1",
+ "Protocol": "http",
+ "StartNode": "router:web",
+ "Nodes": {
+ "resolver:admin.default.dc1": {
+ "Type": "resolver",
+ "Name": "admin.default.dc1",
+ "Resolver": {
+ "ConnectTimeout": "5s",
+ "Default": true,
+ "Target": "admin.default.dc1"
+ }
+ },
+ "resolver:canary.web.default.dc1": {
+ "Type": "resolver",
+ "Name": "canary.web.default.dc1",
+ "Resolver": {
+ "ConnectTimeout": "5s",
+ "Target": "canary.web.default.dc1"
+ }
+ },
+ "resolver:web.default.dc1": {
+ "Type": "resolver",
+ "Name": "web.default.dc1",
+ "Resolver": {
+ "ConnectTimeout": "5s",
+ "Target": "web.default.dc1"
+ }
+ },
+ "router:web": {
+ "Type": "router",
+ "Name": "web",
+ "Routes": [
+ {
+ "Definition": {
+ "Match": {
+ "HTTP": {
+ "PathPrefix": "/admin"
+ }
+ },
+ "Destination": {
+ "RequestTimeout": "15s",
+ "Service": "admin",
+ "PrefixRewrite": "/"
+ }
+ },
+ "NextNode": "resolver:admin.default.dc1"
+ },
+ {
+ "Definition": {
+ "Match": {
+ "HTTP": {
+ "Header": [
+ {
+ "Name": "x-debug",
+ "Exact": "1"
+ }
+ ]
+ }
+ },
+ "Destination": {
+ "Service": "web",
+ "ServiceSubset": "canary",
+ "NumRetries": 5,
+ "RetryOnConnectFailure": true,
+ "RetryOnStatusCodes": [
+ 401,
+ 409
+ ]
+ }
+ },
+ "NextNode": "resolver:canary.web.default.dc1"
+ },
+ {
+ "Definition": {
+ "Match": {
+ "HTTP": {
+ "PathPrefix": "/"
+ }
+ },
+ "Destination": {
+ "Service": "web"
+ }
+ },
+ "NextNode": "resolver:web.default.dc1"
+ }
+ ]
+ }
+ },
+ "Targets": {
+ "admin.default.dc1": {
+ "ID": "admin.default.dc1",
+ "Service": "admin",
+ "Namespace": "default",
+ "Datacenter": "dc1",
+ "MeshGateway": {},
+ "Subset": {},
+ "SNI": "admin.default.dc1.internal.fce8a058-0981-2c04-d23c-b7375af64ce8.consul",
+ "Name": "admin.default.dc1.internal.fce8a058-0981-2c04-d23c-b7375af64ce8.consul"
+ },
+ "canary.web.default.dc1": {
+ "ID": "canary.web.default.dc1",
+ "Service": "web",
+ "ServiceSubset": "canary",
+ "Namespace": "default",
+ "Datacenter": "dc1",
+ "MeshGateway": {},
+ "Subset": {
+ "Filter": "Service.Meta.flavor == canary"
+ },
+ "SNI": "canary.web.default.dc1.internal.fce8a058-0981-2c04-d23c-b7375af64ce8.consul",
+ "Name": "canary.web.default.dc1.internal.fce8a058-0981-2c04-d23c-b7375af64ce8.consul"
+ },
+ "web.default.dc1": {
+ "ID": "web.default.dc1",
+ "Service": "web",
+ "Namespace": "default",
+ "Datacenter": "dc1",
+ "MeshGateway": {},
+ "Subset": {},
+ "SNI": "web.default.dc1.internal.fce8a058-0981-2c04-d23c-b7375af64ce8.consul",
+ "Name": "web.default.dc1.internal.fce8a058-0981-2c04-d23c-b7375af64ce8.consul"
+ }
+ }
+ }
+}
+```
diff --git a/website/source/docs/agent/config-entries/service-defaults.html.md b/website/source/docs/agent/config-entries/service-defaults.html.md
index 411a7e408..c0fb09a3b 100644
--- a/website/source/docs/agent/config-entries/service-defaults.html.md
+++ b/website/source/docs/agent/config-entries/service-defaults.html.md
@@ -41,6 +41,11 @@ Protocol = "http"
- `Mode` `(string: "")` - One of `none`, `local`, or `remote`.
+- `ExternalSNI` (beta) `(string: "")` - This is an optional setting
+ that allows for the TLS
+ [SNI](https://en.wikipedia.org/wiki/Server_Name_Indication) value to be
+ changed to a non-connect value when federating with an external system.
+
## ACLs
Configuration entries may be protected by
diff --git a/website/source/docs/connect/proxies/integrate.html.md b/website/source/docs/connect/proxies/integrate.html.md
index dbf3e7f74..908df08c4 100644
--- a/website/source/docs/connect/proxies/integrate.html.md
+++ b/website/source/docs/connect/proxies/integrate.html.md
@@ -53,6 +53,15 @@ root certificates from the
## Configuration Discovery
Any proxy can discover proxy configuration registered with a local service
-instance using the [agent/service/:service_id
-endpoint](/api/agent/service.html#get-service-configuration).
+instance using the
+[`/v1/agent/service/:service_id`](/api/agent/service.html#get-service-configuration)
+API endpoint.
+The [discovery chain](/docs/internals/discovery-chain.html) for each upstream
+service should be fetched from the
+[`/v1/discovery-chain/:service_id`](/api/discovery-chain.html) API endpoint.
+
+For each [target](/docs/internals/discovery-chain.html#targets) in the
+resulting discovery chain, a list of healthy endpoints can be fetched from the
+[`/v1/health/connect/:service_id`](/api/health.html#list-nodes-for-connect-capable-service)
+API endpoint.
diff --git a/website/source/docs/internals/discovery-chain.html.md b/website/source/docs/internals/discovery-chain.html.md
new file mode 100644
index 000000000..53296dfed
--- /dev/null
+++ b/website/source/docs/internals/discovery-chain.html.md
@@ -0,0 +1,229 @@
+---
+layout: "docs"
+page_title: "Discovery Chain"
+sidebar_current: "docs-internals-discovery-chain"
+description: |-
+ The service discovery process can be modeled as a "discovery chain" which passes through three distinct stages: routing, splitting, and resolution. Each of these stages is controlled by a set of configuration entries.
+---
+
+# Discovery Chain beta
+
+~> This topic is part of a [low-level API](/api/discovery-chain.html)
+primarily targeted at developers building external [Connect proxy
+integrations](/docs/connect/proxies/integrate.html).
+
+The service discovery process can be modeled as a "discovery chain" which
+passes through three distinct stages: routing, splitting, and resolution. Each
+of these stages is controlled by a set of [configuration
+entries](/docs/agent/config_entries.html). By configuring different phases of
+the discovery chain a user can control how proxy upstreams are ultimately
+resolved to specific instances for load balancing.
+
+-> **Note:** The discovery chain is currently only used to discover
+[Connect](/docs/connect/index.html) proxy upstreams.
+
+## Configuration
+
+The configuration entries used in the discovery chain are designed to be simple
+to read and modify for narrowly tailored changes, but at discovery-time the
+various configuration entries interact in more complex ways. For example:
+
+* If a [`service-resolver`](/docs/agent/config-entries/service-resolver.html)
+ is created with a [service
+ redirect](/docs/agent/config-entries/service-resolver.html#service) defined,
+ then all references made to the original service in any other configuration
+ entry is replaced with the redirect destination.
+
+* If a [`service-resolver`](/docs/agent/config-entries/service-resolver.html)
+ is created with a [default
+ subset](/docs/agent/config-entries/service-resolver.html#defaultsubset)
+ defined then all references made to the original service in any other
+ configuration entry that did not specify a subset will be replaced with the
+ default.
+
+* If a [`service-splitter`](/docs/agent/config-entries/service-splitter.html)
+ is created with a [service
+ split](/docs/agent/config-entries/service-splitter.html#splits), and the target service has its
+ own `service-splitter` then the overall effect is flattened and only a single
+ aggregate traffic split is ultimately configured in the proxy.
+
+* [`service-resolver`](/docs/agent/config-entries/service-resolver.html)
+ redirect loops must be rejected as invalid.
+
+* [`service-router`](/docs/agent/config-entries/service-router.html) and
+ [`service-splitter`](/docs/agent/config-entries/service-splitter.html)
+ configuration entries require an L7 compatible protocol be set for the
+ service via either a
+ [`service-defaults`](/docs/agent/config-entries/service-defaults.html) or
+ [`proxy-defaults`](/docs/agent/config-entries/proxy-defaults.html) config
+ entry. Violations must be rejected as invalid.
+
+* If an [upstream
+ configuration](/docs/connect/registration/service-registration.html#upstream-configuration-reference)
+ [`datacenter`](/docs/connect/registration/service-registration.html#datacenter)
+ parameter is defined then any configuration entry that does not explicitly
+ refer to a desired datacenter should use that value from the upstream.
+
+## Compilation
+
+To correctly interpret a collection of configuration entries as a valid
+discovery chain, we first compile them into a form more directly usable by the
+layers responsible for configuring Connect sidecar proxies.
+
+You can interact with the compiler directly using the [discovery-chain
+API](/api/discovery-chain.html).
+
+### Compilation Parameters
+
+* **Service Name** - The service being discovered by name.
+* **Datacenter** - The datacenter to use as the basis of compilation.
+* **Overrides** - Discovery-time tweaks to apply when compiling. These should
+ be derived from either the
+ [proxy](/docs/connect/registration/service-registration.html#complete-configuration-example)
+ or
+ [upstream](/docs/connect/registration/service-registration.html#upstream-configuration-reference)
+ configurations if either are set.
+
+### Compilation Results
+
+The response is a single wrapped `CompiledDiscoveryChain` field:
+
+```json
+{
+ "Chain": {......}
+}
+```
+
+#### `CompiledDiscoveryChain`
+
+The chain encodes a digraph of [nodes](#discoverygraphnode) and
+[targets](#discoverytarget). Nodes are the compiled representation of various
+discovery chain stages and targets are instructions on how to use the [health
+API](/api/health.html#list-nodes-for-connect-capable-service) to retrieve
+relevant service instance lists.
+
+You should traverse the nodes starting with [`StartNode`](#startnode). The
+nodes can be resolved by name using the [`Nodes`](#nodes) field. Targets can be
+resolved by name using the [`Targets`](#targets) field.
+
+- `ServiceName` `(string)` - The requested service.
+- `Namespace` `(string)` - The requested namespace.
+- `Datacenter` `(string)` - The requested datacenter.
+
+- `CustomizationHash` `(string: )` - A unique hash of any overrides
+ that affected the compilation of the discovery chain.
+
+ If set, this value should be used to prefix/suffix any generated load
+ balancer data plane objects to avoid sharing customized and non-customized
+ versions.
+
+- `Protocol` `(string)` - The overall protocol shared by everything in the
+ chain.
+
+- `StartNode` `(string)` - The first key into the `Nodes` map that should be
+ followed when traversing the discovery chain.
+
+- `Nodes` `(map)` - All nodes available for traversal in
+ the chain keyed by a unique name. You can walk this by starting with
+ `StartNode`.
+
+ -> The names should be treated as opaque values and are only guaranteed to be
+ consistent within a single compilation.
+
+- `Targets` `(map)` - A list of all targets used in this chain.
+
+ -> The names should be treated as opaque values and are only guaranteed to be
+ consistent within a single compilation.
+
+#### `DiscoveryGraphNode`
+
+A single node in the compiled discovery chain.
+
+- `Type` `(string)` - The type of the node. Valid values are: `router`,
+ `splitter`, and `resolver`.
+
+- `Name` `(string)` - The unique name of the node.
+
+- `Routes` `(array)` - Only set for `Type:router`. List of routes to
+ render.
+
+ - `Definition` `(ServiceRoute)` - Relevant portion of underlying
+ `service-router`
+ [route](/docs/agent/config-entries/service-router.html#routes).
+
+ - `NextNode` `(string)` - The name of the next node in the chain in [`Nodes`](#nodes).
+
+- `Splits` `(array)` - Only set for `Type:splitter`. List of traffic
+ splits.
+
+ - `Weight` `(float32)` - Copy of underlying `service-splitter`
+ [`weight`](/docs/agent/config-entries/service-splitter.html#weight) field.
+
+ - `NextNode` `(string)` - The name of the next node in the chain in [`Nodes`](#nodes).
+
+- `Resolver` `(DiscoveryResolver: )` - Only set for `Type:resolver`. How
+ to resolve the service instances.
+
+ - `Default` `(bool)` - Set to true if no `service-resolver` config entry is
+ defined for this node and the default was synthesized.
+
+ - `ConnectTimeout` `(duration)` - Copy of the underlying `service-resolver`
+ [`ConnectTimeout`](/docs/agent/config-entries/service-resolver.html#connecttimeout)
+ field. If one is not defined the default of `5s` is returned.
+
+ - `Target` `(string)` - The name of the target to use found in [`Targets`](#targets).
+
+ - `Failover` `(DiscoveryFailover: )` - Compiled form of the
+ underlying `service-resolver`
+ [`Failover`](/docs/agent/config-entries/service-resolver.html#failover)
+ definition to use for this request.
+
+ - `Targets` `(array)` - List of targets found in
+ [`Targets`](#targets) to failover to in order of preference.
+
+#### `DiscoveryTarget`
+
+- `ID` `(string)` - The unique name of this target.
+
+- `Service` `(string)` - The service to query when resolving a list of service instances.
+
+- `ServiceSubset` `(string: )` - The
+ [subset](/docs/agent/config-entries/service-resolver.html#service-subsets) of
+ the service to resolve.
+
+- `Namespace` `(string)` - The namespace to use when resolving a list of service instances.
+
+- `Datacenter` `(string)` - The datacenter to use when resolving a list of service instances.
+
+- `Subset` `(ServiceResolverSubset)` - Copy of the underlying
+ `service-resolver`
+ [`Subsets`](/docs/agent/config-entries/service-resolver.html#subsets)
+ definition for this target.
+
+ - `Filter` `(string: "")` - The
+ [filter expression](/api/features/filtering.html) to be used for selecting
+ instances of the requested service. If empty all healthy instances are
+ returned.
+
+ - `OnlyPassing` `(bool: false)` - Specifies the behavior of the resolver's
+ health check interpretation. If this is set to false, instances with checks
+ in the passing as well as the warning states will be considered healthy. If
+ this is set to true, only instances with checks in the passing state will
+ be considered healthy.
+
+- `MeshGateway` `(MeshGatewayConfig)` - The [mesh gateway
+ configuration](/docs/connect/mesh_gateway.html#connect-proxy-configuration)
+ to use when connecting to this target's service instances.
+
+ - `Mode` `(string: "")` - One of `none`, `local`, or `remote`.
+
+- `External` `(bool: false)` - True if this target is outside of this consul cluster.
+
+- `SNI` `(string)` - This value should be used as the
+ [SNI](https://en.wikipedia.org/wiki/Server_Name_Indication) value when
+ connecting to this set of endpoints over TLS.
+
+- `Name` `(string)` - The unique name for this target for use when generating
+ load balancer objects. This has a structure similar to [SNI](#sni), but will
+ not be affected by SNI customizations such as
+ [`ExternalSNI`](/docs/agent/config-entries/service-defaults.html#externalsni).
diff --git a/website/source/docs/internals/index.html.md b/website/source/docs/internals/index.html.md
index 524c44c56..9ddf171e5 100644
--- a/website/source/docs/internals/index.html.md
+++ b/website/source/docs/internals/index.html.md
@@ -20,6 +20,7 @@ Please review the following documentation to understand how Consul works.
* [Sessions](/docs/internals/sessions.html)
* [Anti-Entropy](/docs/internals/anti-entropy.html)
* [Security Model](/docs/internals/security.html)
+* [Discovery Chain beta](/docs/internals/discovery-chain.html)
You should also be familiar with [Jepsen testing](/docs/internals/jepsen.html), before deploying
a production datacenter.
diff --git a/website/source/layouts/api.erb b/website/source/layouts/api.erb
index 0056070ed..8dbec5b68 100644
--- a/website/source/layouts/api.erb
+++ b/website/source/layouts/api.erb
@@ -81,6 +81,9 @@
>
Coordinates
+ >
+ Discovery Chain (beta)
+
>
Events
diff --git a/website/source/layouts/docs.erb b/website/source/layouts/docs.erb
index 0063822e1..d3ac8f16e 100644
--- a/website/source/layouts/docs.erb
+++ b/website/source/layouts/docs.erb
@@ -62,6 +62,9 @@
>
Jepsen Testing
+ >
+ Discovery Chain beta
+