Repository: envoyproxy/gateway
Pull request #3676 (2024-06-25 21:46:27)

docs: fix GATEWAY_HOST address for v1.0.2 and latest docs

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/envoyproxy/gateway/pull/3676?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=envoyproxy) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 68.27%. Comparing base [(`68463d2`)](https://app.codecov.io/gh/envoyproxy/gateway/commit/68463d2a376a342bdda3f4245f5ae82a405d90f6?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=envoyproxy) to head [(`9f73b2b`)](https://app.codecov.io/gh/envoyproxy/gateway/commit/9f73b2b5df5228b3f53cb4b03e212e7ba0ec62b5?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=envoyproxy).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #3676      +/-   ##
==========================================
- Coverage   68.28%   68.27%   -0.01%     
==========================================
  Files         170      170              
  Lines       20760    20760              
==========================================
- Hits        14175    14174       -1     
  Misses       5566     5566              
- Partials     1019     1020       +1     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/envoyproxy/gateway/pull/3676?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=envoyproxy).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=envoyproxy).


Patch:
diff --git a/examples/kubernetes/tracing/zipkin.yaml b/examples/kubernetes/tracing/zipkin.yaml
new file mode 100644
index 000000000..6a2b99f63
--- /dev/null
+++ b/examples/kubernetes/tracing/zipkin.yaml
@@ -0,0 +1,47 @@
+apiVersion: gateway.networking.k8s.io/v1
+kind: GatewayClass
+metadata:
+  name: eg
+spec:
+  controllerName: gateway.envoyproxy.io/gatewayclass-controller
+  parametersRef:
+    group: gateway.envoyproxy.io
+    kind: EnvoyProxy
+    name: zipkin-tracing
+    namespace: envoy-gateway-system
+---
+apiVersion: gateway.envoyproxy.io/v1alpha1
+kind: EnvoyProxy
+metadata:
+  name: zipkin-tracing
+  namespace: envoy-gateway-system
+spec:
+  telemetry:
+    tracing:
+      # sample 100% of requests
+      samplingRate: 100
+      provider:
+        host: otel-collector.monitoring.svc.cluster.local
+        port: 9411
+        type: Zipkin
+        # zipkin specific configuration
+        zipkin:
+          enable128BitTraceId: true
+      customTags:
+        # This is an example of using a literal as a tag value
+        key1:
+          type: Literal
+          literal:
+            value: "val1"
+        # This is an example of using an environment variable as a tag value
+        env1:
+          type: Environment
+          environment:
+            name: ENV1
+            defaultValue: "-"
+        # This is an example of using a header value as a tag value
+        header1:
+          type: RequestHeader
+          requestHeader:
+            name: X-Header-1
+            defaultValue: "-"
diff --git a/internal/gatewayapi/listener.go b/internal/gatewayapi/listener.go
index 8957874cb..6978d806a 100644
--- a/internal/gatewayapi/listener.go
+++ b/internal/gatewayapi/listener.go
@@ -353,6 +353,7 @@ func (t *Translator) processTracing(gw *gwapiv1.Gateway, envoyproxy *egv1a1.Envo
 			Name:     "tracing", // TODO: rename this, so that we can share backend with accesslog?
 			Settings: ds,
 		},
+		Provider: tracing.Provider,
 	}, nil
 }
 
diff --git a/internal/ir/xds.go b/internal/ir/xds.go
index cab235895..d3eb48d85 100644
--- a/internal/ir/xds.go
+++ b/internal/ir/xds.go
@@ -1684,6 +1684,7 @@ type Tracing struct {
 	SamplingRate float64                     `json:"samplingRate,omitempty"`
 	CustomTags   map[string]egv1a1.CustomTag `json:"customTags,omitempty"`
 	Destination  RouteDestination            `json:"destination,omitempty"`
+	Provider     egv1a1.TracingProvider      `json:"provider"`
 }
 
 // Metrics defines the configuration for metrics generated by Envoy
diff --git a/internal/ir/zz_generated.deepcopy.go b/internal/ir/zz_generated.deepcopy.go
index 459c21ef1..f4882032c 100644
--- a/internal/ir/zz_generated.deepcopy.go
+++ b/internal/ir/zz_generated.deepcopy.go
@@ -2631,6 +2631,7 @@ func (in *Tracing) DeepCopyInto(out *Tracing) {
 		}
 	}
 	in.Destination.DeepCopyInto(&out.Destination)
+	in.Provider.DeepCopyInto(&out.Provider)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Tracing.
diff --git a/internal/xds/translator/tracing.go b/internal/xds/translator/tracing.go
index c31d25b72..b2a52ec6a 100644
--- a/internal/xds/translator/tracing.go
+++ b/internal/xds/translator/tracing.go
@@ -15,7 +15,9 @@ import (
 	hcm "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3"
 	tracingtype "github.com/envoyproxy/go-control-plane/envoy/type/tracing/v3"
 	xdstype "github.com/envoyproxy/go-control-plane/envoy/type/v3"
+	"google.golang.org/protobuf/types/known/anypb"
 	"google.golang.org/protobuf/types/known/wrapperspb"
+	"k8s.io/utils/ptr"
 
 	egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1"
 	"github.com/envoyproxy/gateway/internal/ir"
@@ -23,26 +25,61 @@ import (
 	"github.com/envoyproxy/gateway/internal/xds/types"
 )
 
+const (
+	envoyOpenTelemetry = "envoy.tracers.opentelemetry"
+	envoyZipkin        = "envoy.traces.zipkin"
+)
+
+type typConfigGen func() (*anypb.Any, error)
+
 func buildHCMTracing(tracing *ir.Tracing) (*hcm.HttpConnectionManager_Tracing, error) {
 	if tracing == nil {
 		return nil, nil
 	}
 
-	oc := &tracecfg.OpenTelemetryConfig{
-		GrpcService: &corev3.GrpcService{
-			TargetSpecifier: &corev3.GrpcService_EnvoyGrpc_{
-				EnvoyGrpc: &corev3.GrpcService_EnvoyGrpc{
-					ClusterName: tracing.Destination.Name,
-					Authority:   tracing.Authority,
+	var providerName string
+	var providerConfig typConfigGen
+
+	switch tracing.Provider.Type {
+	case egv1a1.TracingProviderTypeOpenTelemetry:
+		providerName = envoyOpenTelemetry
+
+		providerConfig = func() (*anypb.Any, error) {
+			config := &tracecfg.OpenTelemetryConfig{
+				GrpcService: &corev3.GrpcService{
+					TargetSpecifier: &corev3.GrpcService_EnvoyGrpc_{
+						EnvoyGrpc: &corev3.GrpcService_EnvoyGrpc{
+							ClusterName: tracing.Destination.Name,
+							Authority:   tracing.Authority,
+						},
+					},
 				},
-			},
-		},
-		ServiceName: tracing.ServiceName,
+				ServiceName: tracing.ServiceName,
+			}
+
+			return protocov.ToAnyWithError(config)
+		}
+	case egv1a1.TracingProviderTypeZipkin:
+		providerName = envoyZipkin
+
+		providerConfig = func() (*anypb.Any, error) {
+			config := &tracecfg.ZipkinConfig{
+				CollectorCluster:         tracing.Destination.Name,
+				CollectorEndpoint:        "/api/v2/spans",
+				TraceId_128Bit:           ptr.Deref(tracing.Provider.Zipkin.Enable128BitTraceID, false),
+				SharedSpanContext:        wrapperspb.Bool(!ptr.Deref(tracing.Provider.Zipkin.DisableSharedSpanContext, false)),
+				CollectorEndpointVersion: tracecfg.ZipkinConfig_HTTP_JSON,
+			}
+
+			return protocov.ToAnyWithError(config)
+		}
+	default:
+		return nil, fmt.Errorf("unknown tracing provider type: %s", tracing.Provider.Type)
 	}
 
-	ocAny, err := protocov.ToAnyWithError(oc)
+	ocAny, err := providerConfig()
 	if err != nil {
-		return nil, fmt.Errorf("failed to marshal OpenTelemetryConfig: %w", err)
+		return nil, fmt.Errorf("failed to marshal tracing configuration: %w", err)
 	}
 
 	tags := make([]*tracingtype.CustomTag, 0, len(tracing.CustomTags))
@@ -108,7 +145,7 @@ func buildHCMTracing(tracing *ir.Tracing) (*hcm.HttpConnectionManager_Tracing, e
 			Value: tracing.SamplingRate,
 		},
 		Provider: &tracecfg.Tracing_Http{
-			Name: "envoy.tracers.opentelemetry",
+			Name: providerName,
 			ConfigType: &tracecfg.Tracing_Http_TypedConfig{
 				TypedConfig: ocAny,
 			},
diff --git a/site/content/en/v1.0.2/_index.md b/site/content/en/v1.0.2/_index.md
index ea08d244d..92ae85868 100644
--- a/site/content/en/v1.0.2/_index.md
+++ b/site/content/en/v1.0.2/_index.md
@@ -7,12 +7,6 @@ description = "Envoy Gateway Documents"
 type = "docs"
 +++
 
-{{% alert title="Note" color="primary" %}}
-
-This project is under **active** development. Many features are not complete. We would love for you to [Get Involved](/contributions)!
-
-{{% /alert %}}
-
 Envoy Gateway is an open source project for managing [Envoy Proxy](https://www.envoyproxy.io/) as a standalone or Kubernetes-based application
 gateway. [Gateway API](https://gateway-api.sigs.k8s.io/) resources are used to dynamically provision and configure the managed Envoy Proxies.
 
diff --git a/site/content/en/v1.0.2/tasks/quickstart.md b/site/content/en/v1.0.2/tasks/quickstart.md
index 5cf407d2e..b898b5e98 100644
--- a/site/content/en/v1.0.2/tasks/quickstart.md
+++ b/site/content/en/v1.0.2/tasks/quickstart.md
@@ -4,7 +4,7 @@ weight: 1
 description: Get started with Envoy Gateway in a few simple steps.
 ---
 
-This guide will help you get started with Envoy Gateway in a few simple steps.
+This "quick start" will help you get started with Envoy Gateway in a few simple steps.
 
 ## Prerequisites
 
@@ -47,42 +47,49 @@ consideration when debugging.
 
 ## Testing the Configuration
 
-Get the name of the Envoy service created the by the example Gateway:
+{{< tabpane text=true >}}
+{{% tab header="With External LoadBalancer Support" %}}
 
-```shell
-export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsonpath='{.items[0].metadata.name}')
-```
-
-Port forward to the Envoy service:
+You can also test the same functionality by sending traffic to the External IP. To get the external IP of the
+Envoy service, run:
 
 ```shell
-kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 8888:80 &
+export GATEWAY_HOST=$(kubectl get gateway/eg -o jsonpath='{.status.addresses[0].value}')
 ```
 
+In certain environments, the load balancer may be exposed using a hostname, instead of an IP address. If so, replace
+`ip` in the above command with `hostname`.
+
 Curl the example app through Envoy proxy:
 
 ```shell
-curl --verbose --header "Host: www.example.com" http://localhost:8888/get
+curl --verbose --header "Host: www.example.com" http://$GATEWAY_HOST/get
 ```
 
-### External LoadBalancer Support
+{{% /tab %}}
+{{% tab header="Without LoadBalancer Support" %}}
 
-You can also test the same functionality by sending traffic to the External IP. To get the external IP of the
-Envoy service, run:
+Get the name of the Envoy service created the by the example Gateway:
 
 ```shell
-export GATEWAY_HOST=$(kubectl get svc/${ENVOY_SERVICE} -n envoy-gateway-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsonpath='{.items[0].metadata.name}')
 ```
 
-In certain environments, the load balancer may be exposed using a hostname, instead of an IP address. If so, replace
-`ip` in the above command with `hostname`.
+Port forward to the Envoy service:
+
+```shell
+kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 8888:80 &
+```
 
 Curl the example app through Envoy proxy:
 
 ```shell
-curl --verbose --header "Host: www.example.com" http://$GATEWAY_HOST/get
+curl --verbose --header "Host: www.example.com" http://localhost:8888/get
 ```
 
+{{% /tab %}}
+{{< /tabpane >}}
+
 ## What to explore next?
 
 In this quickstart, you have:


Test patch:
diff --git a/internal/gatewayapi/testdata/envoyproxy-tracing-backend.out.yaml b/internal/gatewayapi/testdata/envoyproxy-tracing-backend.out.yaml
index 8393d9c4f..f413abe86 100644
--- a/internal/gatewayapi/testdata/envoyproxy-tracing-backend.out.yaml
+++ b/internal/gatewayapi/testdata/envoyproxy-tracing-backend.out.yaml
@@ -146,5 +146,11 @@ xdsIR:
           - host: 8.7.6.5
             port: 4317
           protocol: GRPC
+      provider:
+        backendRefs:
+        - name: otel-collector
+          namespace: monitoring
+          port: 4317
+        type: OpenTelemetry
       samplingRate: 100
       serviceName: gateway-1.envoy-gateway
diff --git a/internal/gatewayapi/testdata/gateway-with-infrastructure-parametersref.out.yaml b/internal/gatewayapi/testdata/gateway-with-infrastructure-parametersref.out.yaml
index 1e47494ff..56d748563 100644
--- a/internal/gatewayapi/testdata/gateway-with-infrastructure-parametersref.out.yaml
+++ b/internal/gatewayapi/testdata/gateway-with-infrastructure-parametersref.out.yaml
@@ -159,5 +159,9 @@ xdsIR:
             port: 4317
           protocol: GRPC
           weight: 1
+      provider:
+        host: otel-collector.monitoring.svc.cluster.local
+        port: 4317
+        type: OpenTelemetry
       samplingRate: 100
       serviceName: gateway-1.envoy-gateway
diff --git a/internal/gatewayapi/testdata/gateway-with-invalid-infrastructure-parametersref-fallback.out.yaml b/internal/gatewayapi/testdata/gateway-with-invalid-infrastructure-parametersref-fallback.out.yaml
index 8a477792a..554b61893 100644
--- a/internal/gatewayapi/testdata/gateway-with-invalid-infrastructure-parametersref-fallback.out.yaml
+++ b/internal/gatewayapi/testdata/gateway-with-invalid-infrastructure-parametersref-fallback.out.yaml
@@ -159,5 +159,9 @@ xdsIR:
             port: 4317
           protocol: GRPC
           weight: 1
+      provider:
+        host: otel-collector.monitoring.svc.cluster.local
+        port: 4317
+        type: OpenTelemetry
       samplingRate: 100
       serviceName: gateway-1.envoy-gateway
diff --git a/internal/gatewayapi/testdata/tracing-merged-multiple-routes.out.yaml b/internal/gatewayapi/testdata/tracing-merged-multiple-routes.out.yaml
index 9fd0cc12b..0a230d17d 100644
--- a/internal/gatewayapi/testdata/tracing-merged-multiple-routes.out.yaml
+++ b/internal/gatewayapi/testdata/tracing-merged-multiple-routes.out.yaml
@@ -301,5 +301,9 @@ xdsIR:
             port: 4317
           protocol: GRPC
           weight: 1
+      provider:
+        host: otel-collector.monitoring.svc.cluster.local
+        port: 4317
+        type: OpenTelemetry
       samplingRate: 100
       serviceName: envoy-gateway-class
diff --git a/internal/gatewayapi/testdata/tracing-multiple-routes.out.yaml b/internal/gatewayapi/testdata/tracing-multiple-routes.out.yaml
index 90f8dc6a2..6e848009b 100644
--- a/internal/gatewayapi/testdata/tracing-multiple-routes.out.yaml
+++ b/internal/gatewayapi/testdata/tracing-multiple-routes.out.yaml
@@ -291,6 +291,10 @@ xdsIR:
             port: 4317
           protocol: GRPC
           weight: 1
+      provider:
+        host: otel-collector.monitoring.svc.cluster.local
+        port: 4317
+        type: OpenTelemetry
       samplingRate: 100
       serviceName: gateway-1.envoy-gateway
   envoy-gateway/gateway-2:
@@ -343,5 +347,9 @@ xdsIR:
             port: 4317
           protocol: GRPC
           weight: 1
+      provider:
+        host: otel-collector.monitoring.svc.cluster.local
+        port: 4317
+        type: OpenTelemetry
       samplingRate: 100
       serviceName: gateway-2.envoy-gateway
diff --git a/internal/xds/translator/testdata/in/xds-ir/tracing-endpoint-stats.yaml b/internal/xds/translator/testdata/in/xds-ir/tracing-endpoint-stats.yaml
index f57949f2c..b5ee8b57d 100644
--- a/internal/xds/translator/testdata/in/xds-ir/tracing-endpoint-stats.yaml
+++ b/internal/xds/translator/testdata/in/xds-ir/tracing-endpoint-stats.yaml
@@ -27,6 +27,10 @@ tracing:
           - host: "otel-collector.default.svc.cluster.local"
             port: 4317
         protocol: "GRPC"
+  provider:
+    host: otel-collector.monitoring.svc.cluster.local
+    port: 4317
+    type: OpenTelemetry
 http:
   - name: "first-listener"
     address: "0.0.0.0"
diff --git a/internal/xds/translator/testdata/in/xds-ir/tracing-unknown-provider-type.yaml b/internal/xds/translator/testdata/in/xds-ir/tracing-unknown-provider-type.yaml
new file mode 100644
index 000000000..45f669ef6
--- /dev/null
+++ b/internal/xds/translator/testdata/in/xds-ir/tracing-unknown-provider-type.yaml
@@ -0,0 +1,51 @@
+name: "tracing"
+tracing:
+  serviceName: "fake-name.fake-ns"
+  samplingRate: 90
+  customTags:
+    "literal1":
+      type: Literal
+      literal:
+        value: "value1"
+    "env1":
+      type: Environment
+      environment:
+        name: "env1"
+        defaultValue: "-"
+    "req1":
+      type: RequestHeader
+      requestHeader:
+        name: "X-Request-Id"
+        defaultValue: "-"
+  authority: "datadog-agent.default.svc.cluster.local"
+  destination:
+    name: "tracing-0"
+    settings:
+      - endpoints:
+          - host: "datadog-agent.default.svc.cluster.local"
+            port: 8126
+  provider:
+    host: datadog-agent.monitoring.svc.cluster.local
+    port: 8126
+    type: Datadog
+http:
+  - name: "first-listener"
+    address: "0.0.0.0"
+    port: 10080
+    hostnames:
+      - "*"
+    path:
+      mergeSlashes: true
+      escapedSlashesAction: UnescapeAndRedirect
+    routes:
+      - name: "direct-route"
+        hostname: "*"
+        destination:
+          name: "direct-route-dest"
+          settings:
+            - endpoints:
+                - host: "1.2.3.4"
+                  port: 50000
+        directResponse:
+          body: "Unknown custom filter type: UnsupportedType"
+          statusCode: 500
diff --git a/internal/xds/translator/testdata/in/xds-ir/tracing-zipkin.yaml b/internal/xds/translator/testdata/in/xds-ir/tracing-zipkin.yaml
new file mode 100644
index 000000000..a60183dd2
--- /dev/null
+++ b/internal/xds/translator/testdata/in/xds-ir/tracing-zipkin.yaml
@@ -0,0 +1,55 @@
+name: "tracing"
+tracing:
+  serviceName: "fake-name.fake-ns"
+  samplingRate: 90
+  customTags:
+    "literal1":
+      type: Literal
+      literal:
+        value: "value1"
+    "env1":
+      type: Environment
+      environment:
+        name: "env1"
+        defaultValue: "-"
+    "req1":
+      type: RequestHeader
+      requestHeader:
+        name: "X-Request-Id"
+        defaultValue: "-"
+  authority: "zipkin.default.svc.cluster.local"
+  destination:
+    name: "tracing-0"
+    settings:
+    - endpoints:
+      - host: "zipkin.default.svc.cluster.local"
+        port: 9411
+      protocol: "GRPC"
+  provider:
+    host: zipkin.default.svc.cluster.local
+    port: 9411
+    type: Zipkin
+    zipkin:
+      enable128BitTraceId: true
+      disableSharedSpanContext: true
+http:
+- name: "first-listener"
+  address: "0.0.0.0"
+  port: 10080
+  hostnames:
+  - "*"
+  path:
+    mergeSlashes: true
+    escapedSlashesAction: UnescapeAndRedirect
+  routes:
+  - name: "direct-route"
+    hostname: "*"
+    destination:
+      name: "direct-route-dest"
+      settings:
+      - endpoints:
+        - host: "1.2.3.4"
+          port: 50000
+    directResponse:
+      body: "Unknown custom filter type: UnsupportedType"
+      statusCode: 500
diff --git a/internal/xds/translator/testdata/in/xds-ir/tracing.yaml b/internal/xds/translator/testdata/in/xds-ir/tracing.yaml
index fd5a29672..0f3555524 100644
--- a/internal/xds/translator/testdata/in/xds-ir/tracing.yaml
+++ b/internal/xds/translator/testdata/in/xds-ir/tracing.yaml
@@ -25,6 +25,10 @@ tracing:
       - host: "otel-collector.default.svc.cluster.local"
         port: 4317
       protocol: "GRPC"
+  provider:
+    host: otel-collector.monitoring.svc.cluster.local
+    port: 4317
+    type: OpenTelemetry
 http:
 - name: "first-listener"
   address: "0.0.0.0"
diff --git a/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.clusters.yaml b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.clusters.yaml
new file mode 100644
index 000000000..b8a1ac3df
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.clusters.yaml
@@ -0,0 +1,49 @@
+- circuitBreakers:
+    thresholds:
+    - maxRetries: 1024
+  commonLbConfig:
+    localityWeightedLbConfig: {}
+  connectTimeout: 10s
+  dnsLookupFamily: V4_ONLY
+  edsClusterConfig:
+    edsConfig:
+      ads: {}
+      resourceApiVersion: V3
+    serviceName: direct-route-dest
+  lbPolicy: LEAST_REQUEST
+  name: direct-route-dest
+  outlierDetection: {}
+  perConnectionBufferLimitBytes: 32768
+  type: EDS
+- circuitBreakers:
+    thresholds:
+    - maxRetries: 1024
+  commonLbConfig:
+    localityWeightedLbConfig: {}
+  connectTimeout: 10s
+  dnsLookupFamily: V4_ONLY
+  dnsRefreshRate: 30s
+  lbPolicy: LEAST_REQUEST
+  loadAssignment:
+    clusterName: tracing-0
+    endpoints:
+    - lbEndpoints:
+      - endpoint:
+          address:
+            socketAddress:
+              address: zipkin.default.svc.cluster.local
+              portValue: 9411
+        loadBalancingWeight: 1
+      loadBalancingWeight: 1
+      locality:
+        region: tracing-0/backend/0
+  name: tracing-0
+  outlierDetection: {}
+  perConnectionBufferLimitBytes: 32768
+  respectDnsTtl: true
+  type: STRICT_DNS
+  typedExtensionProtocolOptions:
+    envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
+      '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
+      explicitHttpConfig:
+        http2ProtocolOptions: {}
diff --git a/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.endpoints.yaml b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.endpoints.yaml
new file mode 100644
index 000000000..20c80b3aa
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.endpoints.yaml
@@ -0,0 +1,12 @@
+- clusterName: direct-route-dest
+  endpoints:
+  - lbEndpoints:
+    - endpoint:
+        address:
+          socketAddress:
+            address: 1.2.3.4
+            portValue: 50000
+      loadBalancingWeight: 1
+    loadBalancingWeight: 1
+    locality:
+      region: direct-route-dest/backend/0
diff --git a/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.listeners.yaml b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.listeners.yaml
new file mode 100644
index 000000000..25b3e9e4d
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.listeners.yaml
@@ -0,0 +1,64 @@
+- address:
+    socketAddress:
+      address: 0.0.0.0
+      portValue: 10080
+  defaultFilterChain:
+    filters:
+    - name: envoy.filters.network.http_connection_manager
+      typedConfig:
+        '@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
+        commonHttpProtocolOptions:
+          headersWithUnderscoresAction: REJECT_REQUEST
+        http2ProtocolOptions:
+          initialConnectionWindowSize: 1048576
+          initialStreamWindowSize: 65536
+          maxConcurrentStreams: 100
+        httpFilters:
+        - name: envoy.filters.http.router
+          typedConfig:
+            '@type': type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
+            suppressEnvoyHeaders: true
+        mergeSlashes: true
+        normalizePath: true
+        pathWithEscapedSlashesAction: UNESCAPE_AND_REDIRECT
+        rds:
+          configSource:
+            ads: {}
+            resourceApiVersion: V3
+          routeConfigName: first-listener
+        serverHeaderTransformation: PASS_THROUGH
+        statPrefix: http
+        tracing:
+          clientSampling:
+            value: 100
+          customTags:
+          - environment:
+              defaultValue: '-'
+              name: env1
+            tag: env1
+          - literal:
+              value: value1
+            tag: literal1
+          - requestHeader:
+              defaultValue: '-'
+              name: X-Request-Id
+            tag: req1
+          overallSampling:
+            value: 100
+          provider:
+            name: envoy.traces.zipkin
+            typedConfig:
+              '@type': type.googleapis.com/envoy.config.trace.v3.ZipkinConfig
+              collectorCluster: tracing-0
+              collectorEndpoint: /api/v2/spans
+              collectorEndpointVersion: HTTP_JSON
+              sharedSpanContext: false
+              traceId128bit: true
+          randomSampling:
+            value: 90
+          spawnUpstreamSpan: true
+        useRemoteAddress: true
+    name: first-listener
+  drainType: MODIFY_ONLY
+  name: first-listener
+  perConnectionBufferLimitBytes: 32768
diff --git a/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.routes.yaml b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.routes.yaml
new file mode 100644
index 000000000..d4a7fa5ae
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/tracing-zipkin.routes.yaml
@@ -0,0 +1,14 @@
+- ignorePortInHostMatching: true
+  name: first-listener
+  virtualHosts:
+  - domains:
+    - '*'
+    name: first-listener/*
+    routes:
+    - directResponse:
+        body:
+          inlineString: 'Unknown custom filter type: UnsupportedType'
+        status: 500
+      match:
+        prefix: /
+      name: direct-route
diff --git a/internal/xds/translator/translator_test.go b/internal/xds/translator/translator_test.go
index 4e559dda2..81563abf0 100644
--- a/internal/xds/translator/translator_test.go
+++ b/internal/xds/translator/translator_test.go
@@ -94,6 +94,9 @@ func TestTranslateXds(t *testing.T) {
 		"tracing-invalid": {
 			errMsg: "validation failed for xds resource",
 		},
+		"tracing-unknown-provider-type": {
+			errMsg: "unknown tracing provider type: Datadog",
+		},
 	}
 
 	inputFiles, err := filepath.Glob(filepath.Join("testdata", "in", "xds-ir", "*.yaml"))
diff --git a/site/content/en/latest/_index.md b/site/content/en/latest/_index.md
index ea08d244d..92ae85868 100644
--- a/site/content/en/latest/_index.md
+++ b/site/content/en/latest/_index.md
@@ -7,12 +7,6 @@ description = "Envoy Gateway Documents"
 type = "docs"
 +++
 
-{{% alert title="Note" color="primary" %}}
-
-This project is under **active** development. Many features are not complete. We would love for you to [Get Involved](/contributions)!
-
-{{% /alert %}}
-
 Envoy Gateway is an open source project for managing [Envoy Proxy](https://www.envoyproxy.io/) as a standalone or Kubernetes-based application
 gateway. [Gateway API](https://gateway-api.sigs.k8s.io/) resources are used to dynamically provision and configure the managed Envoy Proxies.
 
diff --git a/site/content/en/latest/tasks/quickstart.md b/site/content/en/latest/tasks/quickstart.md
index 4f345fa28..c48fec6f8 100644
--- a/site/content/en/latest/tasks/quickstart.md
+++ b/site/content/en/latest/tasks/quickstart.md
@@ -54,7 +54,7 @@ You can also test the same functionality by sending traffic to the External IP.
 Envoy service, run:
 
 ```shell
-export GATEWAY_HOST=$(kubectl get svc/${ENVOY_SERVICE} -n envoy-gateway-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+export GATEWAY_HOST=$(kubectl get gateway/eg -o jsonpath='{.status.addresses[0].value}')
 ```
 
 In certain environments, the load balancer may be exposed using a hostname, instead of an IP address. If so, replace