<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Introduction on Grafana Labs</title><link>https://grafana.com/docs/tempo/v3.0.x/introduction/</link><description>Recent content in Introduction on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v3.0.x/introduction/index.xml" rel="self" type="application/rss+xml"/><item><title>Traces and telemetry</title><link>https://grafana.com/docs/tempo/v3.0.x/introduction/telemetry/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/introduction/telemetry/</guid><content><![CDATA[&lt;h1 id=&#34;traces-and-telemetry&#34;&gt;Traces and telemetry&lt;/h1&gt;
&lt;p&gt;Metrics, logs, traces, and profiles form the pillars of observability.
Correlating between the four pillars of observability helps create a holistic view of your application and infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/intro/four-pillars-observe.png.png&#34;
  alt=&#34;The four pillars of observability&#34; width=&#34;766&#34;
     height=&#34;491&#34;/&gt;&lt;/p&gt;
&lt;h2 id=&#34;metrics&#34;&gt;Metrics&lt;/h2&gt;
&lt;p&gt;Metrics provide a high level picture of the state of a system.
Metrics are the foundation of alerts because metrics are numeric values and can be compared against known thresholds.
Alerts constantly run in the background and trigger when a value is outside of an expected range.
This is typically the first sign that something is going on and are where discovery first starts.
Metrics indicate that something is happening.&lt;/p&gt;
&lt;h2 id=&#34;logs&#34;&gt;Logs&lt;/h2&gt;
&lt;p&gt;Logs provide an audit trail of activity from a single process that create informational context.
Logs act as atomic events, detailing what&amp;rsquo;s occurring in the services in your application.
Whereas metrics are quantitative (numeric) and structured, logs are qualitative (textual) and unstructured or semi-structured.
They offer a higher degree of detail, but also at the expense of creating significantly higher data volumes.
Logs let you know what&amp;rsquo;s happening to your application.&lt;/p&gt;
&lt;h2 id=&#34;traces&#34;&gt;Traces&lt;/h2&gt;
&lt;p&gt;Traces add further to the observability picture by telling you what happens at each step or action in a data pathway. Traces provide the map&amp;ndash;the where&amp;ndash;something is going wrong.
A trace provides a graphic representation of how long each step in the data flow pathway takes to complete. For example, how long a HTTP request, a database lookup, or a call to a third party service takes.
It can show where requests initiate and finish, as well as how your system responds.
This data helps you locate problem areas and assess their impact, often in places you never would have anticipated or found without this ability to trace the request flow.&lt;/p&gt;
&lt;h2 id=&#34;profiles&#34;&gt;Profiles&lt;/h2&gt;
&lt;p&gt;Profiles help you understand how your applications utilize compute resources such as CPU time and memory.
This helps identify specific lines of code or functions to optimize and improve performance and efficiency.&lt;/p&gt;
&lt;h2 id=&#34;why-traces&#34;&gt;Why traces?&lt;/h2&gt;
&lt;p&gt;Metrics in themselves aren&amp;rsquo;t sufficient to find the root cause and solve complex issues.
The same can be said for logs, which can contain a significant amount of information but lack the context of the interactions and dependencies between the different components of your complex environment.
Each pillar of observability—metrics, logs, traces, profiles—has its own unique strength when it comes to root causing issues.
To get the most value of your observability strategy, you need to be able to correlate them.&lt;/p&gt;
&lt;p&gt;Traces have the unique ability to show relationships between services.
They help identify which services are upstream from your service, which is helpful when you want to understand which services might be negatively impacted by problems in your service.
Traces also help identify which services are downstream from your service.
This is valuable since your application relies on their downstream services, and problems with those services may be the cause of elevated errors or latency reported by your service.
For example, you can directly see the failing database and all impacted failing edge endpoints.&lt;/p&gt;
&lt;p&gt;Using traces and &lt;a href=&#34;/docs/grafana/next/fundamentals/exemplars/&#34;&gt;exemplars&lt;/a&gt;, you can go from a metric data point and get to an associated trace.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/intro/exemplar-metric-totrace.png&#34;
  alt=&#34;Use exemplars to go from a metric data point to a trace&#34; width=&#34;1917&#34;
     height=&#34;812&#34;/&gt;&lt;/p&gt;
&lt;p&gt;Or from traces to logs:&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/intro/tempo-logs-to-traces.png&#34;
  alt=&#34;Use traces to go to a log entry&#34; width=&#34;1031&#34;
     height=&#34;544&#34;/&gt;&lt;/p&gt;
&lt;p&gt;And vice versa, from logs to traces.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/intro/loki-trace-to-logspng.png&#34;
  alt=&#34;Use logs to go to a span&#34; width=&#34;1038&#34;
     height=&#34;762&#34;/&gt;&lt;/p&gt;
]]></content><description>&lt;h1 id="traces-and-telemetry">Traces and telemetry&lt;/h1>
&lt;p>Metrics, logs, traces, and profiles form the pillars of observability.
Correlating between the four pillars of observability helps create a holistic view of your application and infrastructure.&lt;/p></description></item><item><title>Trace structure</title><link>https://grafana.com/docs/tempo/v3.0.x/introduction/trace-structure/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/introduction/trace-structure/</guid><content><![CDATA[&lt;h1 id=&#34;trace-structure&#34;&gt;Trace structure&lt;/h1&gt;


&lt;div data-shared=&#34;trace-structure.md&#34;&gt;
            &lt;!--  Trace structure --&gt;
&lt;p&gt;Traces are telemetry data structured as trees.
Traces are made of spans (for example, a span tree); there is a root span that can have zero to multiple branches that are called child spans.
Each child span can itself be a parent span of one or multiple child spans, and so on so forth.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/traceql/trace-tree-structures-and-spans.png&#34;
  alt=&#34;Trace_and_spans_in_tree_structure&#34; width=&#34;1600&#34;
     height=&#34;706&#34;/&gt;&lt;/p&gt;
&lt;p&gt;In the specific context of Tempo and 
    &lt;a href=&#34;/docs/tempo/v3.0.x/traceql/&#34;&gt;TraceQL query language&lt;/a&gt;, a span has the following associated fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;name&lt;/strong&gt;: the span name&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;duration&lt;/strong&gt;: difference between the end time and start time of the span&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;status&lt;/strong&gt;: enum: &lt;code&gt;{ok, error, unset}&lt;/code&gt;. For details, refer to &lt;a href=&#34;https://opentelemetry.io/docs/concepts/signals/traces/#span-status&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OTel span status&lt;/a&gt; documentation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kind&lt;/strong&gt;: enum: &lt;code&gt;{server, client, producer, consumer, internal, unspecified}&lt;/code&gt;. For more details, refer to &lt;a href=&#34;https://opentelemetry.io/docs/concepts/signals/traces/#span-kind&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OTel span kind&lt;/a&gt; documentation.&lt;/li&gt;
&lt;li&gt;Attributes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first four properties are &lt;em&gt;intrinsics&lt;/em&gt;.
Intrinsics are the core, built-in fields that are fundamental to the identity and lifecycle of spans and traces.
These fields are defined by the OpenTelemetry specification and are always present.
They describe the essential structure of distributed tracing data.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Attributes&lt;/em&gt; are custom span metadata in the form of key-value pairs.
There are four types of attributes: span attributes, resource attributes, event attributes, and link attributes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Span attributes&lt;/em&gt; are key-value pairs that contain metadata that you can use to annotate a span to carry information about the operation it&amp;rsquo;s tracking.
For example, in an eCommerce application, if a span tracks an operation that adds an item to a user’s shopping cart, the user ID, added item ID and cart ID can be captured and attached to the span as span attributes.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;resource attribute&lt;/em&gt; represents information about an entity producing the span.
For example, a span created by a process running in a container deployed by Kubernetes could link a resource that specifies the cluster name, namespace, pod, and container name.
Resource attributes are resource-related metadata (key-value pairs) that are describing the Resource.&lt;/p&gt;
&lt;p&gt;An &lt;em&gt;event attribute&lt;/em&gt; represents a unique point in the time during the span&amp;rsquo;s duration. For more information, refer to &lt;a href=&#34;/blog/2024/08/15/all-about-span-events-what-they-are-and-how-to-query-them/#how-to-query-span-events-with-traceql&#34;&gt;All about span events&lt;/a&gt; and &lt;a href=&#34;https://opentelemetry.io/docs/concepts/signals/traces/#span-events&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Span events&lt;/a&gt; in the OTEL documentation.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;link attribute&lt;/em&gt; lets you query link data in a span.
A span link associates one span with one or more other spans that are a causal relationship. For more information on span links, refer to the &lt;a href=&#34;https://opentelemetry.io/docs/concepts/signals/traces/#span-links&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Span Links&lt;/a&gt; documentation in the Open Telemetry project.&lt;/p&gt;
&lt;p&gt;The OpenTelemetry specification defines Semantic Attributes for Spans and for Resources.
Semantic Span Attributes are a set of naming schemes for attributes shared across languages, frameworks, and runtimes.
For more details, refer to &lt;a href=&#34;https://opentelemetry.io/docs/specs/semconv/general/trace/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Trace Semantic Conventions&lt;/a&gt; and &lt;a href=&#34;https://opentelemetry.io/docs/specs/semconv/resource/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Resource Semantic Conventions&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

        
]]></content><description>&lt;h1 id="trace-structure">Trace structure&lt;/h1>
&lt;div data-shared="trace-structure.md">
&lt;!-- Trace structure -->
&lt;p>Traces are telemetry data structured as trees.
Traces are made of spans (for example, a span tree); there is a root span that can have zero to multiple branches that are called child spans.
Each child span can itself be a parent span of one or multiple child spans, and so on so forth.&lt;/p></description></item><item><title>Tempo architecture</title><link>https://grafana.com/docs/tempo/v3.0.x/introduction/architecture/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/introduction/architecture/</guid><content><![CDATA[&lt;h1 id=&#34;tempo-architecture&#34;&gt;Tempo architecture&lt;/h1&gt;
&lt;p&gt;The journey of a trace is usually from an instrumented application, to a trace receiver/collector,
to a trace backend store, and then those traces being retrieved and visualized in a tool like Grafana.&lt;/p&gt;
&lt;p&gt;Grafana Tempo acts in two major capacities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ingesting trace spans, sorting the span resources and attributes into columns in an Apache Parquet schema,
before sending them to object storage for long-term retention.&lt;/li&gt;
&lt;li&gt;Retrieving trace data from storage, either by specific trace ID or by search parameters via TraceQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tempo has a microservices-based architecture.
All components are compiled into the same binary, and the &lt;code&gt;-target&lt;/code&gt; parameter controls which component is started.
This allows Tempo to run in two modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monolithic mode&lt;/strong&gt;: All components run in a single process. Recommended for getting started.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microservices mode&lt;/strong&gt;: Each component runs as a separate process, allowing independent scaling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/example-demo-app/&#34;&gt;example setups&lt;/a&gt;
or 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/&#34;&gt;deployment options&lt;/a&gt; for help deploying.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/tempo_arch_3.0.png&#34;
  alt=&#34;Tempo architecture diagram&#34; width=&#34;885&#34;
     height=&#34;779&#34;/&gt;&lt;/p&gt;
&lt;h2 id=&#34;components&#34;&gt;Components&lt;/h2&gt;
&lt;p&gt;Tempo is made up of the following components.&lt;/p&gt;
&lt;h3 id=&#34;distributor&#34;&gt;Distributor&lt;/h3&gt;
&lt;p&gt;The distributor accepts spans in multiple formats including Jaeger, OpenTelemetry, Zipkin.
It uses the receiver layer from the &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry Collector&lt;/a&gt;.
For best performance, it&amp;rsquo;s recommended to ingest &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-proto&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry Proto&lt;/a&gt;.
For this reason, &lt;a href=&#34;https://github.com/grafana/alloy/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Alloy&lt;/a&gt; uses the OTLP exporter/receiver to send spans to Tempo.&lt;/p&gt;
&lt;p&gt;Once data is received, the distributor validates the request against limits, shards traces by hashing the &lt;code&gt;traceID&lt;/code&gt;, and writes records to Kafka.
The distributor uses the partition ring to determine which partitions are active and routes data accordingly.
A write is only acknowledged to the client after Kafka has confirmed receipt of the data.&lt;/p&gt;
&lt;h3 id=&#34;kafka-compatible-system&#34;&gt;Kafka-compatible system&lt;/h3&gt;
&lt;p&gt;Tempo uses a Kafka-compatible system (such as Apache Kafka or WarpStream) as a durable queue between distributors and downstream components.
This serves as a write-ahead log (WAL) that enables the decoupling of write and read paths.&lt;/p&gt;
&lt;p&gt;When distributors receive trace data, they shard traces by trace ID and write records to Kafka partitions.
Once Kafka acknowledges the write, the distributor returns a response to the client.
From this point, the write and read paths diverge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block-builders&lt;/strong&gt; consume from Kafka to build blocks for long-term object storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live-stores&lt;/strong&gt; consume from Kafka to serve recent data queries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because traces are sharded by trace ID to specific partitions, both block-builders and live-stores consume unique data without requiring deduplication.
This enables Tempo to operate with a replication factor of 1 (RF1) while maintaining durability through Kafka.&lt;/p&gt;
&lt;h3 id=&#34;block-builder&#34;&gt;Block-builder&lt;/h3&gt;
&lt;p&gt;The Block-builder is responsible for building blocks which are sent to long-term storage.
It does so by consuming from one or more Kafka partitions where distributors have sent trace spans to.
The Block-builder organizes spans into blocks based on a configurable time window, for example, 5 minutes.&lt;/p&gt;
&lt;h3 id=&#34;live-store&#34;&gt;Live-store&lt;/h3&gt;
&lt;p&gt;The live-store is a read-path component responsible for serving recent trace data.
It consumes trace data from Kafka and makes it available for queries, typically covering the last 30 minutes to 1 hour of data depending on configuration.&lt;/p&gt;
&lt;p&gt;Live-stores own the partition lifecycle within Tempo.
While Kafka has its own concept of partitions, Tempo maintains a separate partition ring that tracks which Tempo
partitions are active and which live-stores own them.
Tempo partitions map to Kafka partitions, but they are logically distinct.
The partition ring lets Tempo control partition states and ownership independently of Kafka&amp;rsquo;s internal partition management.&lt;/p&gt;
&lt;p&gt;Partitions have three states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pending: No writes or reads. This is the initial state when a new partition is created, waiting for live-stores to be added as owners.&lt;/li&gt;
&lt;li&gt;Active: Normal read-write mode. Distributors send data to active partitions, and queriers read from them.&lt;/li&gt;
&lt;li&gt;Inactive: Read-only mode. Inactive partitions are eventually deleted after a configured period of time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a live-store starts, it checks if its partition already exists. If it does, the live-store joins as an owner. If not, it creates a new partition in pending state, waits for memberlist to propagate, then switches it to active.
Scaling down requires first marking the partition as inactive while the live-store is still running. After enough
time has passed for data to be available in object storage, the partition and live-store can be removed.&lt;/p&gt;
&lt;p&gt;For high availability, live-stores are typically deployed across multiple availability zones.
Each Tempo partition is owned by one live-store per zone, so if a live-store in one zone becomes unavailable, the
live-store in the other zone can continue serving queries.
While this setup replicates data across zones (RF2), the read quorum is 1—queriers only need a response from one
live-store per partition.
This provides high availability without requiring data deduplication on the read path.&lt;/p&gt;
&lt;h3 id=&#34;query-frontend&#34;&gt;Query Frontend&lt;/h3&gt;
&lt;p&gt;The Query Frontend is the component called by, for example, Grafana when a user wishes to retrieve a specific trace via a trace ID, or carry out a search via a TraceQL filter (for example, all incoming requests for traces).
The Query Frontend is responsible for calling one or more Queriers to carry out examination of potential blocks of data where span data for matching traces may exist in parallel, to speed up result response time (dependent on multiple Queriers being configured).
Requests by the Query Frontend can be split across multiple Queriers, which all work in parallel to retrieve results quickly.
The more Queriers available, generally the quicker a result response.
When Queriers have returned enough responses, the Query Frontend is responsible for concatenating all of the span data returned by each individual Querier together to send a response to the requester.&lt;/p&gt;
&lt;p&gt;The Query Frontend is responsible for sharding the search space for an incoming query.&lt;/p&gt;
&lt;p&gt;A simple HTTP endpoint exposes traces:
&lt;code&gt;GET /api/traces/&amp;lt;traceID&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Internally, the Query Frontend splits the blockID space into a configurable number of shards and queues these requests.
Queriers connect to the Query Frontend via a streaming gRPC connection to process these sharded queries.&lt;/p&gt;
&lt;h3 id=&#34;querier&#34;&gt;Querier&lt;/h3&gt;
&lt;p&gt;Queriers carry out the actual examination of block data in object storage to find any relevant span data based on the trace ID or TraceQL query given.
As well as object storage, they also query live-stores for any recent span data that may have been processed but not
yet sent to object storage.
This ensures that both historical and recent trace data is always available.&lt;/p&gt;
&lt;p&gt;The querier finds the requested trace ID in either the live-stores or the backend storage.
Depending on parameters, the querier queries the live-stores for recently ingested traces and pulls the bloom
filters and indexes from the backend storage to efficiently locate the traces within object storage blocks.&lt;/p&gt;
&lt;p&gt;The querier exposes an HTTP endpoint at:
&lt;code&gt;GET /querier/api/traces/&amp;lt;traceID&amp;gt;&lt;/code&gt;, but it&amp;rsquo;s not intended for direct use.&lt;/p&gt;
&lt;p&gt;Queries should be sent to the Query Frontend.&lt;/p&gt;
&lt;h3 id=&#34;compactor&#34;&gt;Compactor&lt;/h3&gt;
&lt;p&gt;The compactor is responsible for ensuring that the stored data is both compressed and deduplicated (more on deduplication in the advanced course).
The compactor is also responsible for expiring data after the retention period for that data has been reached.
Compactors run on scheduled frequent intervals to deal with data that is not compacted and has been stored by the
block-builders.
Compaction takes into account the data stored for specific traces to minimize search space on queries.&lt;/p&gt;
&lt;h3 id=&#34;backend-scheduler-and-worker&#34;&gt;Backend scheduler and worker&lt;/h3&gt;
&lt;p&gt;The scheduler is a forward-looking re-architecture of the compaction process, with the goal of improving the determinism and removing the duplication present in the current compaction process. The scheduler is responsible for the scheduling and tracking jobs which are assigned to workers for processing. The scheduler component, in combination with the worker, will eventually replace the current compactor component.&lt;/p&gt;
&lt;p&gt;The worker connects to the scheduler via gRPC to receive jobs for processing. Workers are responsible for executing jobs assigned to them by the scheduler and updating the job status back to the scheduler. These jobs currently include compaction and retention, but will likely include other kinds of jobs in the future.&lt;/p&gt;
&lt;p&gt;The workers currently have the additional responsibility of maintaining the blocklist for all tenants, which was previously handled by the compactor. The determination of which tenants to poll is coordinated through the ring, just as it is with the compactor.&lt;/p&gt;
&lt;p&gt;When transitioning from the compactor to the scheduler and worker architecture, some considerations need to be kept in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only one scheduler should be running at a time.&lt;/li&gt;
&lt;li&gt;Workers should be scaled up at the same time the compactor is scaled to 0. This is to avoid conflicts between the two systems attempting to compact the same blocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since the worker is taking the role of the compactor when it comes to polling, some documentation may reference the compactor, and can instead be interpreted as the worker for environments where the worker has replaced the compactor.&lt;/p&gt;
&lt;h3 id=&#34;object-storage&#34;&gt;Object storage&lt;/h3&gt;
&lt;p&gt;Tempo uses object storage for storing all tracing data. It supports three major object storage APIs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon Simple Storage Service (S3)&lt;/li&gt;
&lt;li&gt;Google Cloud Storage (GCS)&lt;/li&gt;
&lt;li&gt;Microsoft Azure Storage (AS)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;metrics-generator&#34;&gt;Metrics-generator&lt;/h3&gt;
&lt;p&gt;This is an optional component that derives metrics from ingested traces and writes them to a metrics storage.
Like live-stores, metrics-generators consume trace data from Kafka.
Refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/metrics-from-traces/metrics-generator/&#34;&gt;metrics-generator documentation&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;h2 id=&#34;lifecycle-of-a-write&#34;&gt;Lifecycle of a write&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Trace data is sent from the tracing pipeline (OpenTelemetry Collector, Grafana Alloy) to a &lt;strong&gt;distributor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The distributor validates the request, shards traces by trace ID, and writes to &lt;strong&gt;Kafka&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Kafka acknowledges the write&lt;/li&gt;
&lt;li&gt;And the distributor returns a response to the client.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live-stores&lt;/strong&gt; consume from Kafka and make data available for recent queries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block-builders&lt;/strong&gt; consume from Kafka and build blocks for long-term object storage.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/lifecycle-of-a-write.png&#34;
  alt=&#34;Lifecycle of a write diagram&#34; width=&#34;1000&#34;
     height=&#34;200&#34;/&gt;&lt;/p&gt;
&lt;h2 id=&#34;lifecycle-of-a-read&#34;&gt;Lifecycle of a read&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;query frontend&lt;/strong&gt; receives a TraceQL query and shards it into jobs for recent data and long-term storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queriers&lt;/strong&gt; retrieve recent data from &lt;strong&gt;live-stores&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For older data, queriers fetch blocks from &lt;strong&gt;object storage&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Results are aggregated and returned to the user.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;things-to-keep-in-mind&#34;&gt;Things to keep in mind&lt;/h2&gt;
&lt;p&gt;There are three fundamentally important things to keep in mind with traces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There is no concept of the &amp;rsquo;end&amp;rsquo; of a trace. A trace can start with any span which holds a unique trace ID that hasn&amp;rsquo;t been seen by Tempo previously. However, spans can be continually added at any point in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When a trace ID is queried in Tempo, it returns all of the currently stored/ingested spans that belong to that trace and present them in a mapped response (that is, a graph of parent/child/sibling relationships between spans) that allow, for example, Grafana to then visually render those traces.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TraceQL queries return all matching traces from Tempo for the filters presented to it. This does not necessarily mean in chronological order, as some Queriers may return results more promptly than others. When the max trace limit for a TraceQL query has been hit, the Query Frontend will return a response with all the current traces and their spans at that point and ignore/cancel all outstanding Queriers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="tempo-architecture">Tempo architecture&lt;/h1>
&lt;p>The journey of a trace is usually from an instrumented application, to a trace receiver/collector,
to a trace backend store, and then those traces being retrieved and visualized in a tool like Grafana.&lt;/p></description></item><item><title>Glossary</title><link>https://grafana.com/docs/tempo/v3.0.x/introduction/glossary/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/introduction/glossary/</guid><content><![CDATA[&lt;h1 id=&#34;glossary&#34;&gt;Glossary&lt;/h1&gt;
&lt;p&gt;The following terms are often used when discussing traces.&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Active series&lt;/dt&gt;
&lt;dd&gt;A time series that receives new data points or samples.&lt;/dd&gt;
&lt;dt&gt;Cardinality&lt;/dt&gt;
&lt;dd&gt;The total combination of key/value pairs, such as labels and label values for a given metric series or log stream, and how many unique combinations they generate.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add child span to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Child span&lt;/dt&gt;
&lt;dd&gt;A span that is nested within a parent span. Each child span represents a sub-operation or downstream call within the broader operation represented by its parent. A child span can itself be a parent of other child spans.&lt;/dd&gt;
&lt;dt&gt;Data source&lt;/dt&gt;
&lt;dd&gt;A basic storage for data such as a database, a flat file, or even live references or measurements from a device.
A file, database, or service that provides data. For example, trace data is imported into Grafana by configuring and enabling a Tempo data source.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add event attribute to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Event attribute&lt;/dt&gt;
&lt;dd&gt;A key-value pair attached to a span event, which represents a unique point in time during the span&amp;rsquo;s duration. For more information, refer to &lt;a href=&#34;https://opentelemetry.io/docs/concepts/signals/traces/#span-events&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Span events&lt;/a&gt; in the OpenTelemetry documentation.&lt;/dd&gt;
&lt;dt&gt;Exemplar&lt;/dt&gt;
&lt;dd&gt;Any data that serves as a detailed example of one of the observations aggregated into a metric.
An exemplar contains the observed value together with an optional timestamp and arbitrary trace IDs, which are typically used to reference a trace.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add intrinsics to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Intrinsics&lt;/dt&gt;
&lt;dd&gt;The core, built-in fields that are fundamental to the identity and lifecycle of spans and traces. Intrinsic fields include name, duration, status, and kind. These fields are defined by the OpenTelemetry specification and are always present.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add link attribute to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Link attribute&lt;/dt&gt;
&lt;dd&gt;A key-value pair attached to a span link. A span link associates one span with one or more causally related spans. For more information, refer to &lt;a href=&#34;https://opentelemetry.io/docs/concepts/signals/traces/#span-links&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Span Links&lt;/a&gt; in the OpenTelemetry documentation.&lt;/dd&gt;
&lt;dt&gt;Log&lt;/dt&gt;
&lt;dd&gt;Chronological events, usually text-based, allowing for the diagnosis of problems.
Logs can provide informational context, such as detailed records of all events during user interactions, for example, when events happen, who used the system, status messages, etc.&lt;/dd&gt;
&lt;dt&gt;Metric&lt;/dt&gt;
&lt;dd&gt;A number that helps an operator understand the state of a system, such as the number of active users, error count, average response time, and more.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add resource attribute to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Resource attribute&lt;/dt&gt;
&lt;dd&gt;A key-value pair that represents information about the entity producing a span, such as the cluster name, namespace, Pod, or container name.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add root span to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Root span&lt;/dt&gt;
&lt;dd&gt;The first span in a trace, representing the initial request or operation. A root span has no parent span and serves as the top of the span tree.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add semantic attribute to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Semantic attribute&lt;/dt&gt;
&lt;dd&gt;A standardized naming scheme for attributes shared across languages, frameworks, and runtimes, as defined by the OpenTelemetry specification. For more information, refer to &lt;a href=&#34;https://opentelemetry.io/docs/specs/semconv/general/trace/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Trace Semantic Conventions&lt;/a&gt; in the OpenTelemetry documentation.&lt;/dd&gt;
&lt;dt&gt;Span&lt;/dt&gt;
&lt;dd&gt;A unit of work done within a trace.&lt;/dd&gt;
&lt;/dl&gt;
&lt;!-- TODO: Add span attribute to the website glossary (data/glossary.yaml) and replace with shortcode. --&gt;
&lt;dl&gt;
&lt;dt&gt;Span attribute&lt;/dt&gt;
&lt;dd&gt;A key-value pair that contains metadata to annotate a span with information about the operation it tracks. For example, a span tracking an &amp;ldquo;add to cart&amp;rdquo; operation might include the user ID, item ID, and cart ID as span attributes.&lt;/dd&gt;
&lt;dt&gt;Spanset&lt;/dt&gt;
&lt;dd&gt;The group of spans for each individual trace returned from a TraceQL query.&lt;/dd&gt;
&lt;dt&gt;Trace&lt;/dt&gt;
&lt;dd&gt;A trace represents the whole journey of a request or an action as it moves through all the nodes of a distributed system, especially containerized applications or microservices architectures. Traces are composed of spans. For more information, refer to &lt;a href=&#34;https://opentracing.io/docs/overview/what-is-tracing/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;What is Distributed Tracing?&lt;/a&gt;.&lt;/dd&gt;
&lt;/dl&gt;
]]></content><description>&lt;h1 id="glossary">Glossary&lt;/h1>
&lt;p>The following terms are often used when discussing traces.&lt;/p>
&lt;dl>
&lt;dt>Active series&lt;/dt>
&lt;dd>A time series that receives new data points or samples.&lt;/dd>
&lt;dt>Cardinality&lt;/dt>
&lt;dd>The total combination of key/value pairs, such as labels and label values for a given metric series or log stream, and how many unique combinations they generate.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add child span to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Child span&lt;/dt>
&lt;dd>A span that is nested within a parent span. Each child span represents a sub-operation or downstream call within the broader operation represented by its parent. A child span can itself be a parent of other child spans.&lt;/dd>
&lt;dt>Data source&lt;/dt>
&lt;dd>A basic storage for data such as a database, a flat file, or even live references or measurements from a device.
A file, database, or service that provides data. For example, trace data is imported into Grafana by configuring and enabling a Tempo data source.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add event attribute to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Event attribute&lt;/dt>
&lt;dd>A key-value pair attached to a span event, which represents a unique point in time during the span&amp;rsquo;s duration. For more information, refer to &lt;a href="https://opentelemetry.io/docs/concepts/signals/traces/#span-events" target="_blank" rel="noopener noreferrer">Span events&lt;/a> in the OpenTelemetry documentation.&lt;/dd>
&lt;dt>Exemplar&lt;/dt>
&lt;dd>Any data that serves as a detailed example of one of the observations aggregated into a metric.
An exemplar contains the observed value together with an optional timestamp and arbitrary trace IDs, which are typically used to reference a trace.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add intrinsics to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Intrinsics&lt;/dt>
&lt;dd>The core, built-in fields that are fundamental to the identity and lifecycle of spans and traces. Intrinsic fields include name, duration, status, and kind. These fields are defined by the OpenTelemetry specification and are always present.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add link attribute to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Link attribute&lt;/dt>
&lt;dd>A key-value pair attached to a span link. A span link associates one span with one or more causally related spans. For more information, refer to &lt;a href="https://opentelemetry.io/docs/concepts/signals/traces/#span-links" target="_blank" rel="noopener noreferrer">Span Links&lt;/a> in the OpenTelemetry documentation.&lt;/dd>
&lt;dt>Log&lt;/dt>
&lt;dd>Chronological events, usually text-based, allowing for the diagnosis of problems.
Logs can provide informational context, such as detailed records of all events during user interactions, for example, when events happen, who used the system, status messages, etc.&lt;/dd>
&lt;dt>Metric&lt;/dt>
&lt;dd>A number that helps an operator understand the state of a system, such as the number of active users, error count, average response time, and more.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add resource attribute to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Resource attribute&lt;/dt>
&lt;dd>A key-value pair that represents information about the entity producing a span, such as the cluster name, namespace, Pod, or container name.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add root span to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Root span&lt;/dt>
&lt;dd>The first span in a trace, representing the initial request or operation. A root span has no parent span and serves as the top of the span tree.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add semantic attribute to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Semantic attribute&lt;/dt>
&lt;dd>A standardized naming scheme for attributes shared across languages, frameworks, and runtimes, as defined by the OpenTelemetry specification. For more information, refer to &lt;a href="https://opentelemetry.io/docs/specs/semconv/general/trace/" target="_blank" rel="noopener noreferrer">Trace Semantic Conventions&lt;/a> in the OpenTelemetry documentation.&lt;/dd>
&lt;dt>Span&lt;/dt>
&lt;dd>A unit of work done within a trace.&lt;/dd>
&lt;/dl>
&lt;!-- TODO: Add span attribute to the website glossary (data/glossary.yaml) and replace with shortcode. -->
&lt;dl>
&lt;dt>Span attribute&lt;/dt>
&lt;dd>A key-value pair that contains metadata to annotate a span with information about the operation it tracks. For example, a span tracking an &amp;ldquo;add to cart&amp;rdquo; operation might include the user ID, item ID, and cart ID as span attributes.&lt;/dd>
&lt;dt>Spanset&lt;/dt>
&lt;dd>The group of spans for each individual trace returned from a TraceQL query.&lt;/dd>
&lt;dt>Trace&lt;/dt>
&lt;dd>A trace represents the whole journey of a request or an action as it moves through all the nodes of a distributed system, especially containerized applications or microservices architectures. Traces are composed of spans. For more information, refer to &lt;a href="https://opentracing.io/docs/overview/what-is-tracing/" target="_blank" rel="noopener noreferrer">What is Distributed Tracing?&lt;/a>.&lt;/dd>
&lt;/dl></description></item></channel></rss>