Cloud Native 13 min read

Building a Cloud‑Native Distributed Tracing System with Jaeger

This article explains why Jaeger is a popular cloud‑native tracing solution, describes its architecture, sampling options, and deployment strategies on Kubernetes—including DaemonSet and Sidecar modes—followed by a step‑by‑step Django integration example and guidance on monitoring, alerting, and resource cleanup.

Sohu Tech Products
Sohu Tech Products
Sohu Tech Products
Building a Cloud‑Native Distributed Tracing System with Jaeger

The article introduces Jaeger as an open‑source, CNCF‑graduated project for cloud‑native distributed tracing, highlighting its advantages such as OpenTracing support, extensible storage back‑ends, and native Kubernetes deployment, as well as drawbacks like limited logging features and the need for external monitoring.

It outlines Jaeger’s architecture components (client library, Agent, Collector, Query UI, storage) and explains the four sampling strategies (const, probabilistic, ratelimiting, remote) with configuration examples.

Deployment practices are covered in detail: first, a full Jaeger stack is installed on a Kubernetes cluster using YAML manifests, then the article compares DaemonSet versus Sidecar deployment of the Agent, describing network considerations and resource implications.

Example YAML for a DaemonSet deployment:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: jaeger-agent
  labels:
    app: jaeger-agent
spec:
  selector:
    matchLabels:
      app: jaeger-agent
  template:
    metadata:
      labels:
        app: jaeger-agent
    spec:
      containers:
        - name: jaeger-agent
          image: jaegertracing/jaeger-agent:1.12.0
          env:
            - name: REPORTER_GRPC_HOST_PORT
              value: "jaeger-collector:14250"
          resources: {}
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      restartPolicy: Always

For a Sidecar deployment, a Deployment manifest adds a second container running the Jaeger Agent alongside the application container.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: example/myapp:version
        - name: jaeger-agent
          image: jaegertracing/jaeger-agent:1.12.0
          env:
            - name: REPORTER_GRPC_HOST_PORT
              value: "jaeger-collector:14250"

The article then provides a concrete Python/Django integration: installing jaeger-client and django_opentracing , initializing a Jaeger tracer with a configuration block, and adding django_opentracing.OpenTracingMiddleware to the Django MIDDLEWARE list.

from jaeger_client import Config

def init_jaeger_tracer(service_name='your-app-name'):
    config = Config(
        config={
            'sampler': {'type': 'const', 'param': 1},
            'local_agent': {
                'reporting_host': settings.JAEGER_REPORTING_HOST,
                'reporting_port': settings.JAEGER_REPORTING_PORT,
            },
            'logging': True,
        },
        service_name='django-example',
        validate=True,
    )
    return config.initialize_tracer()

jaeger_tracer = init_jaeger_tracer(service_name='example')

After configuring the tracer, the Django settings file is updated to enable global tracing, trace‑all requests, and specify traced attributes such as path and method.

import django_opentracing
MIDDLEWARE = [
    'django_opentracing.OpenTracingMiddleware',
    # other middleware classes
]
OPENTRACING_SET_GLOBAL_TRACER = True
OPENTRACING_TRACE_ALL = True
OPENTRACING_TRACED_ATTRIBUTES = ['path', 'method']
OPENTRACING_TRACER = django_opentracing.DjangoTracing(jaeger_tracer)

Monitoring and alerting are addressed by exposing Jaeger’s Prometheus metrics and using Grafana dashboards; the article notes that Jaeger itself lacks built‑in alerting but can be combined with Elasticsearch‑based storage for custom alerts.

Finally, a cleanup section lists kubectl delete commands to remove the Jaeger stack, Spark dependencies job, example services, and related Kubernetes resources.

Cloud NativePythonobservabilityKubernetesDistributed TracingDjangoJaeger
Sohu Tech Products
Written by

Sohu Tech Products

A knowledge-sharing platform for Sohu's technology products. As a leading Chinese internet brand with media, video, search, and gaming services and over 700 million users, Sohu continuously drives tech innovation and practice. We’ll share practical insights and tech news here.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.