site/content/docs/main/config/tracing.md
Envoy has rich support for distributed tracing,and supports exporting data to third-party providers (Zipkin, Jaeger, Datadog, etc.)
OpenTelemetry is a CNCF project which is working to become a standard in the space. It was formed as a merger of the OpenTracing and OpenCensus projects.
Contour supports configuring envoy to export data to OpenTelemetry, and allows users to customize some configurations.
contour.100.256.In order to use this feature, you must first select and deploy an opentelemetry-collector to receive the tracing data exported by envoy.
First we should deploy an opentelemetry-collector to receive the tracing data exported by envoy
# install operator
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
Install an otel collector instance, with verbose logging exporter enabled:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: simplest
namespace: projectcontour
spec:
config: |
receivers:
otlp:
protocols:
grpc:
http:
exporters:
logging:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
exporters: [logging]
EOF
Define extension service:
kubectl apply -f - <<EOF
apiVersion: projectcontour.io/v1alpha1
kind: ExtensionService
metadata:
name: otel-collector
namespace: projectcontour
spec:
protocol: h2c
services:
- name: simplest-collector
port: 4317
EOF
Update Contour config (needs a Contour deployment restart afterwards):
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: contour
namespace: projectcontour
data:
contour.yaml: |
tracing:
# Whether to send the namespace and instance where envoy is located to open, the default is true.
includePodDetail: true
# The extensionService and namespace and name defined above in the format of namespace/name.
extensionService: projectcontour/otel-collector
# The service name that envoy sends to openTelemetry-collector, the default is contour.
serviceName: some-service-name
# A custom set of tags.
customTags:
# envoy will send the tagName to the collector.
- tagName: custom-tag
# fixed tag value.
literal: foo
- tagName: header-tag
# The tag value obtained from the request header,
# if the request header does not exist, this tag will not be sent.
requestHeaderName: X-Custom-Header
EOF
Install httpbin and test it:
kubectl apply -f https://projectcontour.io/examples/httpbin.yaml
Access the api and view the logs of simplest:
kubectl logs deploy/simplest-collector -n projectcontour
Now you should be able to see traces in the logs of the otel collector.