<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Distributed-Tracing on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/distributed-tracing/</link><description>Recent content in Distributed-Tracing on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 01 Jan 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/tags/distributed-tracing/index.xml" rel="self" type="application/rss+xml"/><item><title>Jaeger</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/observability/jaeger/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/observability/jaeger/</guid><description>&lt;p&gt;Metrics tell you something is wrong. Logs tell you what happened on one service. Distributed tracing tells you what happened across all the services involved in a single request — where the time went, which service called which, and where a failure or latency spike originated.&lt;/p&gt;
&lt;p&gt;Jaeger is an open source distributed tracing system originally from Uber, now a CNCF graduated project. It collects trace data from instrumented services, stores it, and provides a UI for querying and visualising traces. A trace is a tree of spans — each span represents one operation (an HTTP request, a database query, a cache lookup), with start time, duration, and metadata. Jaeger assembles the spans from all services involved in a request into a single trace and lets you follow a request from the frontend through every microservice it touched.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works
&lt;/h2&gt;&lt;p&gt;Services emit spans using the OpenTelemetry SDK (the modern standard) or the legacy Jaeger client libraries. Spans are sent to a Jaeger Collector, stored in a backend (Elasticsearch, Cassandra, or in-memory for development), and queried via the Jaeger UI or API.&lt;/p&gt;
&lt;p&gt;The typical deployment in Kubernetes uses the Jaeger Operator:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/jaegertracing/jaeger-operator/releases/latest/download/jaeger-operator.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A minimal all-in-one instance (suitable for development):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jaegertracing.io/v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Jaeger&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jaeger&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;strategy&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;allInOne&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For production, use the &lt;code&gt;production&lt;/code&gt; strategy with a separate Collector, Query, and storage backend.&lt;/p&gt;
&lt;h2 id="opentelemetry"&gt;OpenTelemetry
&lt;/h2&gt;&lt;p&gt;Jaeger is increasingly used as a backend rather than as the instrumentation library. OpenTelemetry (OTel) is the standard for instrumenting applications — language SDKs, auto-instrumentation agents, and a Collector that receives, processes, and exports telemetry. OTel exports traces to Jaeger (or Tempo, Zipkin, or any OTLP-compatible backend) via the OTLP protocol. The practical consequence: instrument once with OTel, route to whichever backend fits.&lt;/p&gt;
&lt;h2 id="in-the-observability-stack"&gt;In the observability stack
&lt;/h2&gt;&lt;p&gt;Jaeger covers the tracing pillar alongside &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/observability/prometheus/" &gt;Prometheus&lt;/a&gt; (metrics) and &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/observability/loki/" &gt;Loki&lt;/a&gt; (logs). &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/observability/grafana/" &gt;Grafana&lt;/a&gt; can query Jaeger directly — a trace ID in a log line becomes a clickable link that opens the trace in Grafana&amp;rsquo;s trace explorer, connecting all three pillars in a single investigation workflow. Grafana Tempo is an alternative tracing backend that integrates more tightly with the Grafana stack, but Jaeger remains the standalone tracing solution with the longest track record.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jaegertracing.io/docs/" target="_blank" rel="noopener"
 &gt;Jaeger documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://opentelemetry.io/docs/" target="_blank" rel="noopener"
 &gt;OpenTelemetry documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/jaegertracing/jaeger-operator" target="_blank" rel="noopener"
 &gt;Jaeger Operator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>