Jaeger distributed tracing¶
The Skyscrapers Kubernetes reference solution has built-in traceability and observability features, based on Jaeger and its Jaeger Operator. These functions can be enabled as an optional add-on. Note that as of now, this is only available for EKS clusters. AKS clusters will follow in the near future, depending on customer demand.
If you think this could be useful for your team, get in touch with us so we can enable it on your cluster(s).
Introduction¶
Jaeger is an open-source observability tool for distributed tracing. It helps developers troubleshoot, debug and monitor their applications and workflows.
When enabled, one or more Jaeger instances can be deployed on a Kubernetes cluster. Normally a single Jaeger should be enough, but for those customers that run multiple environments on the same cluster and want to keep the traces separated, a different Jaeger per environment can be deployed as well. All Jaeger instances will be deployed in the observability
namespace.
How to use it¶
Your applications must be instrumented before they can send tracing data to Jaeger. Jaeger recommends using the OpenTelemetry instrumentation and SDKs.
After your applications are instrumented properly, you simply add the Jaeger injection annotation (sidecar.jaegertracing.io/inject
) to your Deployment(s)
and the Jaeger Operator will automatically inject a Jaeger agent into the application Pod(s)
. This agent will automatically forward the application traces to the Jaeger instance.
The values can be either "true"
(as string), or the Jaeger instance name, as returned by kubectl get jaegers -n observability
. Note that "true"
can only be used when there's exactly one Jaeger instance deployed.
Example:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
annotations:
"sidecar.jaegertracing.io/inject": "true"
spec:
...
You can read more about how the auto-injection mechanism works in the Jaeger Operator documentation.
Our managed Jaeger instances already come with an Ingress
configured to access their UI. Check them out with kubectl get ingresses -n observability
.
Deployment strategies¶
Jaeger can be deployed in two different strategies: allinone
or production
. Note that the official documentation mentions a streaming
strategy, but that's not yet supported in our platforms.
The default allinone
strategy combines all Jaeger components (agent, collector and query service) into a single executable running in a single Pod
, and it uses in-memory storage, so there's no persistance. allinone
is only intended for development / staging environments.
For production and other critical environments, the production
strategy should be used, which deploys each Jaeger component separately, and uses Elasticsearch for persistance. By default, our platform automatically provisions an AWS Opensearch cluster (in the same VPC as the EKS cluster) for those Jaeger instances that use the production
deployment strategy, but it's also possible to configure a custom Elasticsearch endpoint if needed.