<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Release notes on Grafana Labs</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/</link><description>Recent content in Release notes on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v2.10.x/release-notes/index.xml" rel="self" type="application/rss+xml"/><item><title>Version 2.10 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-10/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-10/</guid><content><![CDATA[&lt;h1 id=&#34;version-210-release-notes&#34;&gt;Version 2.10 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.10.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New TraceQL features including minInt/maxInt constants and support for attribute = nil queries&lt;/li&gt;
&lt;li&gt;Enhanced metrics generator capabilities with entity-based limiting and overflow series&lt;/li&gt;
&lt;li&gt;Performance improvements and bug fixes across the platform&lt;/li&gt;
&lt;li&gt;Released vParquet5 encoding format as production-ready&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These release notes highlight the most important features and bug fixes. For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases/tag/v2.10.0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To learn more about this release, refer to the &lt;a href=&#34;/blog/tempo-2-10-release-all-the-latest-features/&#34;&gt;Tempo 2.10 blog post&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/5aX3NxSVwMw&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;traceql&#34;&gt;TraceQL&lt;/h2&gt;
&lt;p&gt;Tempo 2.10 introduces three TraceQL enhancements that help you query trace structure and data quality more precisely.&lt;/p&gt;
&lt;p&gt;These features extend TraceQL&amp;rsquo;s ability to query both data completeness and trace structure—without requiring preprocessing or custom instrumentation. The &lt;code&gt;= nil&lt;/code&gt; check and &lt;code&gt;span:childCount&lt;/code&gt; intrinsic are useful for observability teams focused on instrumentation quality and performance optimization.&lt;/p&gt;
&lt;h3 id=&#34;find-traces-with-missing-attributes--nil&#34;&gt;Find traces with missing attributes (&lt;code&gt;= nil&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;You can identify gaps in your instrumentation by finding spans where expected attributes are absent.
For example, you can use &lt;code&gt;nil&lt;/code&gt; to check for attributes that are missing or null and &lt;code&gt;!= nil&lt;/code&gt; to ensure an attribute is present with a non-null value. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/4905&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4905&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/construct-traceql-queries/#comparison-operators&#34;&gt;documentation&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;You can use this to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auditing instrumentation coverage to find services that haven&amp;rsquo;t set required attributes like &lt;code&gt;service.version&lt;/code&gt; or &lt;code&gt;deployment.environment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Detecting data quality issues to spot spans missing critical context before they cause blind spots in production&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To audit instrumentation coverage, you could use the example query to find traces with missing attributes and identify the offending services:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;traceql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-traceql&#34;&gt;{ resource.service.version = nil || resource.deployment.environment = nil } | select(resource.service.name)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;= nil&lt;/code&gt; operator to matches spans where either &lt;code&gt;service.version&lt;/code&gt; or &lt;code&gt;deployment.environment&lt;/code&gt; is absent at the resource level.
The &lt;code&gt;select()&lt;/code&gt; operator returns the service name to identify which services need instrumentation updates.&lt;/p&gt;
&lt;p&gt;The next example catches a common data quality issue: HTTP operations that were instrumented enough to capture the method but not the response status. This can create blind spots when analyzing error rates or latency by status code in production.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;traceql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-traceql&#34;&gt;{ span.http.method != nil &amp;amp;&amp;amp; span.http.status_code = nil } | select(resource.service.name, span.http.route)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;!= nil&lt;/code&gt; operator verifies the span has an HTTP method set.
The &lt;code&gt;= nil&lt;/code&gt; operator finds HTTP spans that lack a status code.
The &lt;code&gt;select()&lt;/code&gt; operator shows the service and route.&lt;/p&gt;
&lt;h3 id=&#34;analyze-trace-structure-with-spanchildcount&#34;&gt;Analyze trace structure with &lt;code&gt;span:childCount&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Query spans based on how many direct child operations they trigger.
[&lt;a href=&#34;https://github.com/grafana/tempo/pull/6126&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6126&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/construct-traceql-queries/#find-spans-by-child-count&#34;&gt;documentation&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;This is useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finding leaf spans (operations with no children), such as database queries or external API calls&lt;/li&gt;
&lt;li&gt;Detecting spans that spawn unusually many child operations, which can indicate &lt;code&gt;N&#43;1&lt;/code&gt; query problems or inefficient batch processing&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;traceql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-traceql&#34;&gt;{ span:childCount &amp;gt; 10 }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This query returns spans that trigger more than 10 child operations. A single request handler spawning dozens of database calls, for example, often points to an &lt;code&gt;N&#43;1&lt;/code&gt; query problem where a loop issues one query per item instead of fetching all items in a single call.&lt;/p&gt;
&lt;h3 id=&#34;reference-integer-boundaries-with-minint-and-maxint&#34;&gt;Reference integer boundaries with &lt;code&gt;minInt&lt;/code&gt; and &lt;code&gt;maxInt&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Use the named constants &lt;code&gt;minInt&lt;/code&gt; and &lt;code&gt;maxInt&lt;/code&gt; to represent the minimum and maximum integer values supported by TraceQL. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5982&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5982&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;This query finds spans where counter exists and is an integer.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;traceql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-traceql&#34;&gt;{ span.foo &amp;gt;= minInt }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;metrics-generator&#34;&gt;Metrics-generator&lt;/h2&gt;
&lt;p&gt;Tempo 2.10 introduces improved cardinality management for the metrics-generator. Entity-based limiting is a new alternative to series-based limiting.
It preserves complete metrics data for each logical entity rather than randomly dropping series when limits are reached. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5788&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5788&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;When limits are hit, the metrics-generator now produces overflow series labeled &lt;code&gt;metric_overflow=&amp;quot;true&amp;quot;&lt;/code&gt; instead of discarding data. This ensures no trace-derived metrics are lost. As stale series are pruned, new series automatically emerge from the overflow bucket. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5954&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5954&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;A new metric, &lt;code&gt;tempo_metrics_generator_registry_active_series_demand_estimate&lt;/code&gt;, helps with capacity planning. It uses HyperLogLog estimation to report true cardinality demand even when limits cap the standard active series metric. The estimate has approximately 3% accuracy with minimal memory overhead. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5710&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5710&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;additional-metrics-generator-improvements&#34;&gt;Additional metrics-generator improvements&lt;/h3&gt;
&lt;p&gt;This release also includes these metrics-generator updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Drop and metric invalid UTF-8 for all metrics in metrics-generator instead of sending invalid data. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5980&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5980&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;database_name_attributes&lt;/code&gt; configuration to the service graph processor to support the new &lt;code&gt;db.namespace&lt;/code&gt; attribute. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5398&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5398&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Enhanced observability of collection failures in the metrics-generator with better error categorization. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5936&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5936&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added validation for metrics-generator histogram buckets to prevent invalid configurations. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5991&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5991&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added configuration to enable instance label for span metrics series, improving observability. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5706&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5706&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;vparquet5&#34;&gt;vParquet5&lt;/h2&gt;
&lt;p&gt;vParquet5 is now production-ready. vParquet4 remains the default block format in this release.&lt;/p&gt;
&lt;p&gt;vParquet5 improves query speed and reduces memory usage with these changes.
Dedicated columns now support array values, enabling efficient storage for multi-valued attributes like HTTP headers. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5760&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5760&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/dedicated_columns/#array-valued-attributes&#34;&gt;documentation&lt;/a&gt;]
Virtual span row numbers speed up queries that filter only on resource attributes. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5943&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5943&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Dedicated columns now support event-level attributes.
A new &amp;ldquo;blob&amp;rdquo; detection system identifies high-cardinality attributes like UUIDs and stack traces, then applies optimized encoding to reduce memory pressure and improve performance.
The format automatically removes unused dedicated columns to save storage. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5946&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5946&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/dedicated_columns/#blob-attributes&#34;&gt;documentation&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Flexible dedicated column defaults replace the previous well-known attribute columns. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5696&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5696&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/dedicated_columns/&#34;&gt;documentation&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;tempo-cli&lt;/code&gt; &lt;code&gt;analyse block(s)&lt;/code&gt; command reports on integer attributes to help identify candidates for dedicated columns. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6103&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6103&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/tempo_cli/#analyse-block&#34;&gt;documentation&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;vParquet5 also adds native storage for the &lt;code&gt;span:childCount&lt;/code&gt; TraceQL intrinsic. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6126&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6126&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/construct-traceql-queries/#find-spans-by-child-count&#34;&gt;documentation&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;additional-vparquet5-updates&#34;&gt;Additional vParquet5 updates&lt;/h3&gt;
&lt;p&gt;This release also includes these vParquet5 improvements and fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Converted &lt;code&gt;ServiceStats&lt;/code&gt; data from map to list and updated encoding and compression to enable sorted output and small reduction in file size. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6216&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6216&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed issue with orphaned group nodes in vParquet5-preview6. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6095&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6095&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed issues related to integer dedicated columns in vParquet5-preview2: [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5716&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5716&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed disappearing dedicated event attributes in trace view and dedicated blob column validation in vParquet5-preview6. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6100&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6100&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed dedicated column array handling to better support attributes with mixed array and non-array values. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6199&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6199&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;llm-optimized-api-responses&#34;&gt;LLM-optimized API responses&lt;/h2&gt;
&lt;p&gt;Tempo 2.10 introduces an LLM-optimized response format that improves how AI assistants process and understand trace data.
When you send the &lt;code&gt;Accept: application/vnd.grafana.llm&lt;/code&gt; header to supported endpoints, Tempo returns a simplified JSON structure that flattens the complex OpenTelemetry format into a more readable representation with computed values like duration in milliseconds.
The 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/mcp-server/&#34;&gt;Tempo MCP server&lt;/a&gt; (introduced in 2.9) uses this format automatically, so users querying traces through AI assistants like Claude Code or Cursor receive more accurate and useful responses without any configuration changes.
This format is currently supported by the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/#query&#34;&gt;trace by ID&lt;/a&gt; and 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/#search-tag-values-v2&#34;&gt;tag values&lt;/a&gt; endpoints.
[&lt;a href=&#34;https://github.com/grafana/tempo/pull/5962&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5962&lt;/a&gt;]&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;This response format is experimental and subject to change. It&amp;rsquo;s intended for LLM consumption only and shouldn&amp;rsquo;t be relied on for programmatic use.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;The most important features and enhancements in Tempo 2.10 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;traceql-correctness&#34;&gt;TraceQL correctness&lt;/h3&gt;
&lt;p&gt;Tempo 2.10 adds new TraceQL functions, query capabilities, and related API improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed incorrect results in TraceQL &lt;code&gt;compare()&lt;/code&gt; caused by potential hash collision of string array attributes. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5835&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5835&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed search by &lt;code&gt;trace:id&lt;/code&gt; for short IDs with leading zeros. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5587&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5587&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed rare bug where the TraceQL metrics could return an empty response when max series was hit. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6099&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6099&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Made &lt;code&gt;top/bottomk&lt;/code&gt; deterministic by breaking ties with label values. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5846&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5846&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed metrics streaming to release intermediate or incomplete results. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5937&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5937&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;performance-improvements&#34;&gt;Performance improvements&lt;/h3&gt;
&lt;p&gt;Tempo 2.10 includes these performance improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enhanced TraceQL query performance through various optimizations. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5773&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5773&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improved performance for &lt;code&gt;quantile_over_time()&lt;/code&gt; function in TraceQL metrics queries. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5996&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5996&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improved shutdown time in the first 30 seconds for faster graceful shutdowns. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5725&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5725&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added metric for tracking added latency to write requests. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5781&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5781&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improved error message when overrides fail to parse for better debugging. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5787&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5787&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;user-configurable-overrides&#34;&gt;User-configurable overrides&lt;/h3&gt;
&lt;p&gt;The user-configurable overrides API now validates inputs more strictly (for example, rejecting duplicate labels) and exposes more metrics-generator settings for runtime configuration.
This helps catch configuration mistakes earlier and fine-tune metrics generation per-tenant without restarts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added stricter validation to user-configurable overrides API, such as refusing duplicate labels. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6008&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6008&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6104&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6104&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exposed metrics-generator configuration options to the user-configurable overrides API, including &lt;code&gt;dimension_mappings&lt;/code&gt;, &lt;code&gt;intrinsic_dimensions&lt;/code&gt;, &lt;code&gt;trace_id_label_name&lt;/code&gt;, and &lt;code&gt;ingestion_time_range_slack&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5989&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5989&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5974&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5974&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5972&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5972&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5958&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5958&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5973&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5973&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exposed &lt;code&gt;metrics_generator.native_histogram_bucket_factor&lt;/code&gt; and &lt;code&gt;metrics_generator.native_histogram_min_reset_duration&lt;/code&gt; to the user-configurable overrides API. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5973&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5973&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added ability to disable RetryInfo in per-tenant overrides. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5741&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5741&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-enhancements&#34;&gt;Other enhancements&lt;/h3&gt;
&lt;p&gt;This release also includes these enhancements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added support for &lt;code&gt;application/protobuf&lt;/code&gt; content type in frontend endpoints for improved efficiency. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5865&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5865&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added support for external storage to trace by id endpoint. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6185&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6185&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added validation mode and tests for &lt;code&gt;tempo-vulture&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5605&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5605&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added SSE-C encryption support to S3 backend. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5789&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5789&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added secure connection support to &lt;code&gt;tempo-cli&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5692&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5692&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;default_spans_per_span_set&lt;/code&gt; configuration option to control default spans returned per trace in search results. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5858&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5858&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Increased weight for heavy TraceQL queries. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5782&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5782&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Updated list of intrinsics returned by search tags endpoint. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5857&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5857&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Removed &lt;code&gt;MustNewConstMetric&lt;/code&gt; to prevent panic and added validation for usage tracker configuration. Added &lt;code&gt;tempo_distributor_usage_tracker_errors_total&lt;/code&gt; to surface errors in usage tracker. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5981&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5981&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;maxKeys = 1&lt;/code&gt; for Amazon S3 confirm list operation. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6114&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6114&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.10, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;search-default-result-limit-changed-in-2102&#34;&gt;Search default result limit changed in 2.10.2&lt;/h3&gt;
&lt;p&gt;Tempo 2.10.2 sets the default &lt;code&gt;max_result_limit&lt;/code&gt; for search to &lt;code&gt;256*1024&lt;/code&gt;. This helps prevent unbounded search responses from returning excessive data by default. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6525&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6525&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If your existing workflows rely on larger search result sets, explicitly configure &lt;code&gt;max_result_limit&lt;/code&gt; to match your environment and query patterns.&lt;/p&gt;
&lt;h3 id=&#34;busybox-removed-from-tempo-image&#34;&gt;Busybox removed from Tempo image&lt;/h3&gt;
&lt;p&gt;The Tempo container image no longer includes busybox. This change reduces the image size and attack surface, preventing future busybox-related vulnerabilities from affecting Tempo deployments. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5717&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5717&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;The image switched from &lt;code&gt;gcr.io/distroless/static-debian12:debug&lt;/code&gt;, which includes busybox, to &lt;code&gt;gcr.io/distroless/static-debian12&lt;/code&gt;, which doesn&amp;rsquo;t. The busybox shell and utilities are no longer available inside the running container.&lt;/p&gt;
&lt;p&gt;You can no longer &lt;code&gt;exec&lt;/code&gt; into the Tempo container with a shell. Commands like &lt;code&gt;kubectl exec -it &amp;lt;pod&amp;gt; -- sh&lt;/code&gt; or &lt;code&gt;docker exec -it &amp;lt;container&amp;gt; sh&lt;/code&gt; will fail.&lt;/p&gt;
&lt;p&gt;To debug a running Tempo container, use one of these alternatives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes ephemeral debug containers (&lt;code&gt;kubectl debug&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Docker Desktop or other container runtime tools that support shell injection for distroless images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have custom Docker Compose files or scripts that use the Tempo image for shell operations (such as running &lt;code&gt;chown&lt;/code&gt; in an init container), update them to use a separate &lt;code&gt;busybox:latest&lt;/code&gt; image for those tasks.&lt;/p&gt;
&lt;p&gt;Tempo&amp;rsquo;s runtime behavior, configuration options, and APIs are unchanged.&lt;/p&gt;
&lt;h3 id=&#34;vparquet-format-changes&#34;&gt;vParquet format changes&lt;/h3&gt;
&lt;p&gt;This release includes breaking changes to vParquet block format support and deprecates older formats ahead of Tempo 3.0.&lt;/p&gt;
&lt;p&gt;In preparation for Tempo 3.0, make sure you&amp;rsquo;re using vParquet4 or higher.&lt;/p&gt;
&lt;h4 id=&#34;enable-vparquet5-optional&#34;&gt;Enable vParquet5 (optional)&lt;/h4&gt;
&lt;p&gt;vParquet5 is now production-ready and available as an optional upgrade. vParquet4 remains the default block format. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6219&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6219&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;To enable vParquet5, set the block version in your 
    &lt;a href=&#34;/docs/tempo/v2.10.x/configuration/parquet/&#34;&gt;storage configuration&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage:
  trace:
    block:
      version: vParquet5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once enabled, Tempo writes new blocks in vParquet5 format while continuing to read existing vParquet4 blocks. No migration of existing data is required.&lt;/p&gt;
&lt;h4 id=&#34;vparquet2-removed&#34;&gt;vParquet2 removed&lt;/h4&gt;
&lt;p&gt;vParquet2 encoding has been completely removed from Tempo 2.10. Tempo can no longer read vParquet2 blocks. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6071&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6071&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;No action is required if you&amp;rsquo;ve used default settings. The default block format migrated away from vParquet2 several releases ago.&lt;/p&gt;
&lt;p&gt;Action is required if your storage configuration explicitly specifies vParquet2. Before upgrading, verify your configuration doesn&amp;rsquo;t specify vParquet2. If it does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update to a previous Tempo release (2.9 or earlier) configured for vParquet3 or higher&lt;/li&gt;
&lt;li&gt;Wait for all existing vParquet2 blocks to expire and be deleted from backend storage&lt;/li&gt;
&lt;li&gt;Then upgrade to Tempo 2.10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Upgrading to 2.10 while vParquet2 blocks still exist in storage will cause read errors.&lt;/p&gt;
&lt;h4 id=&#34;vparquet3-and-vparquet2-schemas-deprecated&#34;&gt;vParquet3 and vParquet2 schemas deprecated&lt;/h4&gt;
&lt;p&gt;TempoDB schemas vParquet3 and vParquet2 are now deprecated and will be removed in Tempo 3.0. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6198&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6198&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using vParquet3, plan your migration to vParquet4 or higher before upgrading to Tempo 3.0.&lt;/p&gt;
&lt;h3 id=&#34;breaking-changes&#34;&gt;Breaking changes&lt;/h3&gt;
&lt;p&gt;Be aware of these breaking changes when upgrading to Tempo 2.10:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tenant ID validation: Tempo now validates tenant IDs in the frontend and distributor components, using the same validation rules as Grafana Mimir. Previously, Tempo accepted any tenant ID value. Valid tenant IDs may only contain alphanumeric characters (a-z, A-Z, 0-9) and special characters (&lt;code&gt;!&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;_&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;&#39;&lt;/code&gt;, &lt;code&gt;(&lt;/code&gt;, &lt;code&gt;)&lt;/code&gt;), with a maximum length of 150 characters. Empty tenant IDs and the values &lt;code&gt;.&lt;/code&gt; or &lt;code&gt;..&lt;/code&gt; are rejected. Requests with invalid tenant IDs return an error. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5786&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5786&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;SearchTagsV2WithRange API change: The Tempo HTTP client &lt;code&gt;SearchTagsV2WithRange&lt;/code&gt; function signature has changed. The function previously accepted only &lt;code&gt;start&lt;/code&gt; and &lt;code&gt;end&lt;/code&gt; parameters. It now requires two additional parameters: &lt;code&gt;scope&lt;/code&gt; and &lt;code&gt;query&lt;/code&gt;. This change affects Go code that imports the &lt;code&gt;pkg/httpclient&lt;/code&gt; package. To maintain existing behavior, pass empty strings for the new parameters: &lt;code&gt;SearchTagsV2WithRange(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, start, end)&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6088&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6088&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Go version upgrade: Tempo 2.10 upgrades to Go 1.25.5, which may affect custom builds or deployments with specific Go version requirements. (PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/5939&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#5939&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/6001&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6001&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6096&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6096&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6089&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6089&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;project-rhythm-new-tempo-architecture&#34;&gt;Project Rhythm: New Tempo architecture&lt;/h2&gt;
&lt;p&gt;Project Rhythm is the codename for the new architecture project for Tempo. The main objective of this project is to address certain trade-offs of the current design that are limiting the ability of Tempo to grow and support new functionalities.&lt;/p&gt;
&lt;p&gt;The goals of this project are to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eliminate the requirement for replication factor 3 (RF3) -&amp;gt; Support high availability and improve reliability of TraceQL metrics&lt;/li&gt;
&lt;li&gt;Decouple the read and write path -&amp;gt; Scalability and reliability&lt;/li&gt;
&lt;li&gt;Lay out the foundation to significantly reduce total cost of ownership (TCO) -&amp;gt; Room for growth&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Project Rhythm has been discussed in the Tempo Community Calls for several months. Refer to the &lt;a href=&#34;https://www.youtube.com/watch?v=CdYwfspTOjc&amp;amp;list=PLDGkOdUX1Ujqe8WZ8T1h2pNjpll0t-KLw&amp;amp;index=4&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo Community Calls&lt;/a&gt; on YouTube to learn more.&lt;/p&gt;
&lt;p&gt;While the new architecture is available in Tempo, it is still considered experimental.&lt;/p&gt;
&lt;h3 id=&#34;tempo-rearchitecture-experimental&#34;&gt;Tempo rearchitecture (experimental)&lt;/h3&gt;
&lt;p&gt;Refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases/tag/v2.10.0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo rearchitecture&lt;/a&gt; section in the Tempo 2.10 CHANGELOG for the list of pull requests that are part of this project.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow to configure WAL for livestore. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6093&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6093&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added a single binary 3.0 mode &lt;code&gt;--target=all-3.0&lt;/code&gt; to begin testing single binary 3.0 and updating integration tests. This will be removed in 3.0 and become the standard single binary mode. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6021&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6021&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Kafka KIP-714 telemetry is enabled by default. Added &lt;code&gt;disable_kafka_telemetry&lt;/code&gt; configuration flag to opt out. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6046&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6046&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;query_end_cutoff&lt;/code&gt; setting to clamp near-“now” queries (default 30s) for consistent Tempo results. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5682&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5682&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improve dashboards for livestore. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5755&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5755&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;On startup, the first record for live store to consume is not older than two complete block timeouts. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5693&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5693&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add endpoints for partition downscaling for &lt;code&gt;live-store&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5600&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5600&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5738&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5738&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5805&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5805&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5829&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5829&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add new livestore alert to the &lt;code&gt;tempo-mixin&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5752&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5752&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add partition ownership metric to live-store. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5815&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5815&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Simplify block-builder partition assignment with configuration parameter &lt;code&gt;partitions_per_instance&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6022&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6022&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix block-builder to more precisely validate block encoding on startup. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6037&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6037&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Correctly track and reject too large traces in live stores. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5757&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5757&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Jsonnet: Correctly add &lt;code&gt;tempo-gossip-member: true&lt;/code&gt; labels to block-builders and live-stores. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6125&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6125&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix wrong sleep duration in block-builder if one of partitions is inactive. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5855&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5855&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;security-fixes&#34;&gt;Security fixes&lt;/h2&gt;
&lt;p&gt;The following updates were made to address security issues.&lt;/p&gt;
&lt;h3 id=&#34;2103&#34;&gt;2.10.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3 SSE-C &lt;code&gt;encryption_key&lt;/code&gt; is now treated as a secret to prevent exposure in logs, config dumps, and API responses. The field type changed from a plain string to a redacted secret, matching the existing handling of &lt;code&gt;secret_key&lt;/code&gt; and &lt;code&gt;session_token&lt;/code&gt;. This affects deployments using S3 SSE-C encryption, which was introduced in Tempo 2.10.0. Addresses &lt;a href=&#34;https://github.com/advisories/CVE-2026-28377&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2026-28377&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6711&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6711&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2102&#34;&gt;2.10.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed exemplar hint handling in metrics queries to enforce the configured safety cap end-to-end. Addresses CVE-2026-27878. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6559&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6559&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Set the default &lt;code&gt;query_frontend.search.max_result_limit&lt;/code&gt; to &lt;code&gt;256*1024&lt;/code&gt; to avoid unbounded search results by default. Addresses CVE-2026-21728. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6525&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6525&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bug-fixes&#34;&gt;Bug fixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;2102-1&#34;&gt;2.10.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Applied exemplar hints end-to-end and fixed a safety cap bypass in metrics queries. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6559&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6559&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Used frontend &lt;code&gt;MaxExemplars&lt;/code&gt; configuration as the single source of truth for exemplar limits and added a safety cap at TraceQL engine entry points. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6515&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6515&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Set the default search &lt;code&gt;max_result_limit&lt;/code&gt; to &lt;code&gt;256*1024&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6525&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6525&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2101&#34;&gt;2.10.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Corrected &lt;code&gt;avg_over_time&lt;/code&gt; calculation. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6252&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6252&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Corrected instant query calculation for &lt;code&gt;rate()&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6205&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6205&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed query-frontend unable to convert dedicated column blob option. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6377&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6377&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed issue with additional matched spans in queries with only resource attributes. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6432&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6432&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed live-store deadlock occurring after a complete block failure. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6338&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6338&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;query_end_cutoff&lt;/code&gt; parameter for query range. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6360&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6360&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;dimension_mappings&lt;/code&gt; being unconditionally overwritten by overrides, causing them to be set to nil when set through static config but not in overrides. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6390&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6390&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed metrics-generator panic when &lt;code&gt;write_relabel_configs&lt;/code&gt; is set, caused by uninitialized &lt;code&gt;NameValidationScheme&lt;/code&gt; after Prometheus dependency upgrade. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6399&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6399&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2100&#34;&gt;2.10.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Prevent slice panic when truncating series after topk() by adding bounds check in metrics query-range combiner. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6010&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6010&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed compactor to properly consider SSE-KMS information during metadata copy. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5774&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5774&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;spss=0&lt;/code&gt; parameter to properly mean unlimited spans instead of being rejected, and respect &lt;code&gt;max_spans_per_span_set=0&lt;/code&gt; configuration. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5858&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5858&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed handle collisions with job and instance labels when &lt;code&gt;targetInfo&lt;/code&gt; is enabled. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5780&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5780&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed S3 compactor multipart upload to ensure Cloudflare R2 compliance by using uniform chunk sizes. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5838&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5838&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;GetTrace()&lt;/code&gt; in &lt;code&gt;tempo-query&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5864&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5864&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed unsupported nonexistence nil operator for tags lookup. Fixed issue where some tag values/names were not returned due to distinctAttrCollector optimization. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5967&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5967&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed delete implementation for S3, GCS, and Azure backends to account for prefix. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6011&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6011&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed slow pod startup (~90s) in monolithic mode by returning false from &lt;code&gt;isSharded()&lt;/code&gt; when &lt;code&gt;kvstore&lt;/code&gt; is empty or in memory. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6090&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6090&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed metrics generator to cache failed instances and back off when processor validation or instance creation fails, preventing indefinite retry attempts that could cause out-of-memory errors. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6142&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6142&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed panic when trying to compact block with unsupported encodings such as vParquet previews. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6209&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6209&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed leading zero handling in native histograms implementations. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6033&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6033&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="version-210-release-notes">Version 2.10 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.10.&lt;/p></description></item><item><title>Version 2.9 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-9/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-9/</guid><content><![CDATA[&lt;h1 id=&#34;version-29-release-notes&#34;&gt;Version 2.9 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.9.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New MCP (Model Context Protocol) server support for LLM integration with tracing data&lt;/li&gt;
&lt;li&gt;Enhanced TraceQL metrics with sampling capabilities for improved performance&lt;/li&gt;
&lt;li&gt;Significant operational improvements for multi-tenant environments&lt;/li&gt;
&lt;li&gt;Numerous TraceQL performance and correctness improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These release notes highlight the most important features and bug fixes. For a complete list of changes, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To learn more about this release, refer to the &lt;a href=&#34;/blog/2025/10/22/grafana-tempo-2-9-release-mcp-server-support-traceql-metrics-sampling-and-more/&#34;&gt;Tempo 2.9 blog post&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/dUQQwOsIAP4&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;access-tracing-data-with-the-tempo-mcp-server&#34;&gt;Access tracing data with the Tempo MCP server&lt;/h2&gt;



&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Tempo MCP server is an &lt;a href=&#34;/docs/release-life-cycle/&#34;&gt;experimental feature&lt;/a&gt;. Engineering and on-call support is not available. Documentation is either limited or not provided outside of code comments. No SLA is provided. Enable the  feature toggle in Grafana to use this feature. Do not enable this feature in production environments.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;


&lt;p&gt;Tempo 2.9 includes an MCP (Model Context Protocol) server that provides AI assistants and Large Language Models (LLMs) with direct access to distributed tracing data through TraceQL queries and other endpoints. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5212&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5212&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;MCP is a widely adopted protocol, developed by Anthropic, that standardizes how applications provide context to large language models (LLMs).
By integrating MCP with Tempo, you can now leverage LLM-powered tools like &lt;a href=&#34;https://www.anthropic.com/claude-code&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Claude Code&lt;/a&gt; or &lt;a href=&#34;https://cursor.com/en&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Cursor&lt;/a&gt; to analyze and derive value from your tracing data.
This allows you to better understand interactions between your services and investigate and diagnose issues faster.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-warning&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Using this feature will likely cause tracing data to be passed to an LLM or LLM provider. Consider the content of your tracing data and organizational policies when enabling the MCP server.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;The feature is disabled by default and can be enabled per tenant for specific use cases.&lt;/p&gt;
&lt;p&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/mcp-server/&#34;&gt;MCP server&lt;/a&gt; for configuration details and examples.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&#34;/blog/2025/08/13/llm-powered-insights-into-your-tracing-data-introducing-mcp-support-in-grafana-cloud-traces/&#34;&gt;LLM-powered insights into your tracing data: introducing MCP support in Grafana Cloud Traces&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;traceql-metrics-sampling&#34;&gt;TraceQL metrics sampling&lt;/h2&gt;
&lt;p&gt;TraceQL metrics sampling, using &lt;code&gt;with(sample=true)&lt;/code&gt;, dynamically and automatically chooses how to sample your tracing data to give you the highest quality signal with examining as little data as possible. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5469&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5469&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This sampling method uses an adaptive probabilistic approach that responds to how common spans and traces matching the query are.
This sampling is applied at the storage layer, for example, only inspecting &lt;code&gt;xx%&lt;/code&gt; spans, or &lt;code&gt;xx%&lt;/code&gt; traces, depending on the needs of the query.&lt;/p&gt;
&lt;p&gt;When there is a lot of data, it lowers the sampling rate. When matches are rare it keeps the sampling rate higher, possibly never going below 100%. Therefore the performance gain depends on the query.&lt;/p&gt;
&lt;p&gt;This behavior can be overridden to focus more on fixed span sampling using &lt;code&gt;with(span_sample=0.xx)&lt;/code&gt; or fixed trace sampling using &lt;code&gt;with(trace_sample=0.xx)&lt;/code&gt;.(&lt;a href=&#34;https://github.com/grafana/tempo/pull/5469&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5469&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;traceql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-traceql&#34;&gt;{} | rate() with(sample=true)
{} | rate() with(span_sample=0.1)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To learn more, refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/metrics-queries/sampling-guide/&#34;&gt;TraceQL metrics sampling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adaptive sampling was featured in the September 2025 Tempo community call. Watch the &lt;a href=&#34;https://www.youtube.com/watch?v=7H8JX5FUw08&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;recording&lt;/a&gt; starting at the 12:00 minute mark to learn more.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/fdmLmJMlUjI&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;The most important features and enhancements in Tempo 2.9 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;operational-improvements&#34;&gt;Operational improvements&lt;/h3&gt;
&lt;p&gt;These improvements help operators running multi-tenant Tempo deployments improve trace quality and operational visibility.&lt;/p&gt;
&lt;h4 id=&#34;slo-metrics-improvements&#34;&gt;SLO metrics improvements&lt;/h4&gt;
&lt;p&gt;Cached querier responses are now excluded from SLO metrics such as inspected bytes, providing more accurate measurements of actual storage and network I/O. This change ensures that performance metrics reflect real resource consumption rather than cached data access. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5185&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5185&lt;/a&gt;)&lt;/p&gt;
&lt;h4 id=&#34;enhanced-monitoring-and-observability&#34;&gt;Enhanced monitoring and observability&lt;/h4&gt;
&lt;p&gt;Several new metrics and histograms have been added to improve operational visibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added counter &lt;code&gt;query_frontend_bytes_inspected_total&lt;/code&gt; to track total bytes read from disk and object storage. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5310&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5310&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/monitor/query-io-and-timestamp-distance/&#34;&gt;documentation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added histograms &lt;code&gt;spans_distance_in_future_seconds&lt;/code&gt; / &lt;code&gt;spans_distance_in_past_seconds&lt;/code&gt; that count spans with timestamps outside expected ranges. While spans in the future are accepted, they are invalid and may not be found using the Search API. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4936&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4936&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/monitor/query-io-and-timestamp-distance/&#34;&gt;documentation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added support for scope in cost-attribution usage tracker, allowing more precise tracking with &lt;code&gt;resource.&lt;/code&gt; or &lt;code&gt;span.&lt;/code&gt; prefixed attributes. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5646&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5646&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/configuration/usage-tracker/&#34;&gt;documentation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Logging and tracing in the write path now includes tenant information. The &lt;code&gt;distributor.ConsumeTraces&lt;/code&gt; span status is now properly set to error when trace consumption fails. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5436&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5436&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ingress-bytes-monitoring&#34;&gt;Ingress bytes monitoring&lt;/h4&gt;
&lt;p&gt;The new metric &lt;code&gt;tempo_distributor_ingress_bytes_total&lt;/code&gt; measures bytes received before limits are applied, providing better visibility into incoming data volumes and helping with capacity planning. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5601&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5601&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;metrics-generator-improvements&#34;&gt;Metrics-generator improvements&lt;/h3&gt;
&lt;p&gt;The following improvements have been made to the metrics-generator:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The definition of &lt;code&gt;tempo_metrics_generator_processor_service_graphs_expired_edges&lt;/code&gt; has been adjusted to exclude edges that are properly counted in the service graph. This provides more accurate metrics for monitoring service graph health and completeness. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5319&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5319&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/troubleshooting/metrics-generator/#expired-edges&#34;&gt;documentation&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Invalid Prometheus label names are now automatically dropped in the span metrics processor, preventing metric ingestion errors and ensuring compatibility with Prometheus naming conventions. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5122&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5122&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added support for the new &lt;code&gt;db.namespace&lt;/code&gt; attribute for service graph database nodes, aligning with newer OpenTelemetry semantic conventions. This provides better categorization and visualization of database interactions in service graphs. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5602&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5602&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/service_graphs/&#34;&gt;documentation&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Service graph client virtual nodes now use peer attributes to determine client service names, providing more accurate representation of service-to-service communications in distributed systems. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5381&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5381&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/service_graphs/&#34;&gt;documentation&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;traceql-correctness-and-performance-improvements&#34;&gt;TraceQL correctness and performance improvements&lt;/h3&gt;
&lt;p&gt;TraceQL metrics have received several important updates that improve correctness and performance. Refer to &lt;a href=&#34;#upgrade-considerations&#34;&gt;Upgrade considerations&lt;/a&gt; for breaking changes that may affect your deployment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved exemplar selection in &lt;code&gt;quantile_over_time()&lt;/code&gt; function provides better representative samples (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5278&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5278&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed issue preventing very small time steps in metrics queries (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5441&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5441&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed incorrect TraceQL string comparison for strings starting with numbers (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5658&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5658&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed incorrect results in TraceQL &lt;code&gt;compare()&lt;/code&gt; function for spans with array attributes (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5519&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5519&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed structural operator behavior with empty left-hand spansets (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5578&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5578&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;performance-improvements&#34;&gt;Performance improvements&lt;/h4&gt;
&lt;p&gt;The following improvements have been made to TraceQL query performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Performance increase for basic TraceQL metrics queries through reduced overhead in batch processing (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5247&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5247&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;General TraceQL search and metrics performance improvements (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5280&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5280&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;TraceQL performance improvements for complex queries (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5218&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5218&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Optimized &lt;code&gt;compare()&lt;/code&gt; function performance (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5419&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5419&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;TraceQL attribute &lt;code&gt;struct&lt;/code&gt; alignment for better memory performance (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5240&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5240&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.9, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;rpm-and-deb-packages-discontinued&#34;&gt;RPM and DEB packages discontinued&lt;/h3&gt;
&lt;p&gt;Tempo no longer publishes RPM and DEB packages due to an internal change to the handling of signing keys. This can be restored if customers need these packages. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5684&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5684&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;migrated-vulture-and-integration-tests-to-otlp-exporter&#34;&gt;Migrated Vulture and integration tests to OTLP exporter&lt;/h3&gt;
&lt;p&gt;In this release, we&amp;rsquo;ve migrated Tempo Vulture and Integration Tests from the deprecated Jaeger agent/exporter to the standard OTLP exporter. Vulture now pushes traces to the Tempo OTLP GRCP endpoint. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5058&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5058&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;bucket-calculation-changes&#34;&gt;Bucket calculation changes&lt;/h3&gt;
&lt;p&gt;TraceQL metrics buckets are now calculated based on data in the past instead of the future, which aligns behavior with Prometheus. This resolves issues with empty last buckets that were previously encountered. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5366&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5366&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This change may cause differences in existing dashboards and alerts that rely on TraceQL metrics bucket calculations. Review your monitoring and alerting configurations after upgrading.&lt;/p&gt;
&lt;h3 id=&#34;series-label-handling-improvements&#34;&gt;Series label handling improvements&lt;/h3&gt;
&lt;p&gt;Fixed incorrect TraceQL metrics results when series labels include both strings and integers with the same textual representation (such as &lt;code&gt;&amp;quot;500&amp;quot;&lt;/code&gt; vs &lt;code&gt;500&lt;/code&gt;). The &lt;code&gt;prom_labels&lt;/code&gt; field has been removed from TraceQL metrics responses as it was the source of these errors. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5659&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5659&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;There may be brief interruptions to TraceQL metrics queries during rollout while components run different versions. Plan for a coordinated rollout to minimize impact.&lt;/p&gt;
&lt;h3 id=&#34;vparquet5-block-format&#34;&gt;vParquet5 block format&lt;/h3&gt;
&lt;p&gt;Tempo 2.9 introduces a new experimental vParquet5 block format, designed to improve query performance and reduce storage requirements.vParquet5 has two previews: &lt;code&gt;vParquet5-preview1&lt;/code&gt;, low-resolution timestamp columns, and &lt;code&gt;vParquet5-preview2&lt;/code&gt;, dedicated integer columns.&lt;/p&gt;
&lt;p&gt;Breaking changes are expected before the final release. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5495&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5495&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/5639&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5639&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;go-version-upgrade&#34;&gt;Go version upgrade&lt;/h3&gt;
&lt;p&gt;Tempo 2.9 upgrades to Go 1.25.0, which may affect custom builds or deployments with specific Go version requirements. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5548&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5548&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re building Tempo from source or using custom Docker images, ensure your build environment supports Go 1.25.0.&lt;/p&gt;
&lt;h2 id=&#34;project-rhythm-new-tempo-architecture&#34;&gt;Project Rhythm: New Tempo architecture&lt;/h2&gt;
&lt;p&gt;Project Rhythm is the codename for the new architecture project for Tempo.
The main objective of this project is to address certain trade-offs of the current design that are limiting the ability of Tempo to grow and support new functionalities.&lt;/p&gt;
&lt;p&gt;The goals of this project are to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eliminate the requirement for replication factor 3 (RF3) -&amp;gt; Support high availability and improve reliability of TraceQL metrics&lt;/li&gt;
&lt;li&gt;Decouple the read and write path -&amp;gt; Scalability and reliability&lt;/li&gt;
&lt;li&gt;Lay out the foundation to significantly reduce total cost of ownership (TCO) -&amp;gt; Room for growth&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Project Rhythm has been discussed in the Tempo Community Calls for several months. Refer to the &lt;a href=&#34;https://www.youtube.com/watch?v=CdYwfspTOjc&amp;amp;list=PLDGkOdUX1Ujqe8WZ8T1h2pNjpll0t-KLw&amp;amp;index=4&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo Community Calls&lt;/a&gt; on YouTube to learn more.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases/tag/v2.9.0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo Rearchitecture&lt;/a&gt; section in the Tempo 2.9 changelog for the list of pull requests that are part of this project.&lt;/p&gt;
&lt;h3 id=&#34;current-problems&#34;&gt;Current problems&lt;/h3&gt;
&lt;p&gt;The current Tempo architecture has the following problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lack of high-availability&lt;/strong&gt; for reads in TraceQL metric queries: if a generator is down, the data which that generator holds becomes unavailable. This can be improved or mitigated in certain cases, such as rollouts by rolling updates, but never fully solved.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Low write reliability&lt;/strong&gt;: to reduce the impact that the generators have on the read path, generator ingestion is asynchronous and doesn&amp;rsquo;t return errors to the client. While this is important to protect the ingester&amp;rsquo;s write path, it adds unreliability to generator&amp;rsquo;s ingestion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High TCO&lt;/strong&gt;: TraceQL metrics in the generators are based on flushing a new set of blocks of data, in addition to the ingester&amp;rsquo;s blocks. These two sets of blocks remain separated in compaction, making 2 copies the best case scenario in long-term storage—research shows we&amp;rsquo;re closer to 3-3.5 in real world scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;architecture-comparison&#34;&gt;Architecture comparison&lt;/h3&gt;
&lt;p&gt;The current Tempo architecture includes distributors, ingesters, query frontend, queriers, compactors, object storage, and the metrics-generator.&lt;/p&gt;
&lt;p&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/introduction/architecture/&#34;&gt;Tempo architecture&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;The diagram illustrates the current Tempo architecture.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/architecture/Tempo-old-architecture.png&#34;
  alt=&#34;Current Tempo architecture overview&#34; width=&#34;1353&#34;
     height=&#34;606&#34;/&gt;&lt;/p&gt;
&lt;p&gt;Project Rhythm works as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Distributors write incoming requests to Kafka.&lt;/li&gt;
&lt;li&gt;Ingesters are substituted by live-stores, a read-path component, replaying from Kafka. Live-stores responsibility is to serve trace queries&lt;/li&gt;
&lt;li&gt;A new component, the block-builder, is introduced to the write path. This component is tasked with replaying from Kafka to build blocks which are sent to long-term storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/architecture/Rhythm-architecture-overview.png&#34;
  alt=&#34;Project Rhythm architecture overview&#34; width=&#34;2000&#34;
     height=&#34;700&#34;/&gt;&lt;/p&gt;
&lt;h2 id=&#34;security-fixes&#34;&gt;Security fixes&lt;/h2&gt;
&lt;p&gt;The following updates were made to address security issues.&lt;/p&gt;
&lt;h3 id=&#34;291&#34;&gt;2.9.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated Go to version 1.25.5 to address &lt;a href=&#34;https://github.com/advisories/GHSA-7c64-f9jr-v9h2&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-61729&lt;/a&gt;, &lt;a href=&#34;https://github.com/advisories/GHSA-j5pm-7495-qmr3&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-47907&lt;/a&gt;, &lt;a href=&#34;https://github.com/advisories/GHSA-9gcr-gp5f-jw27&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-58183&lt;/a&gt;, and &lt;a href=&#34;https://github.com/advisories/GHSA-5mh9-3jwc-rp59&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-61727&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6089&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6089&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6096&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6096&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6233&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6233&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;golang.org/x/crypto&lt;/code&gt; to address &lt;a href=&#34;https://github.com/advisories/GHSA-f6x5-jh6r-wrfv&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-47914&lt;/a&gt;, and &lt;a href=&#34;https://github.com/advisories/GHSA-j5w8-q4qc-rx2x&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-58181&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6235&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6235&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;github.com/expr-lang/expr&lt;/code&gt; to v1.17.7 to address &lt;a href=&#34;https://github.com/expr-lang/expr/security/advisories/GHSA-cfpf-hrx2-8rv6&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-68156&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6234&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6234&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bug-fixes&#34;&gt;Bug fixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed Tempo configuration options that are always overridden with configuration overrides section. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5202&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5202&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correctly apply trace idle period in ingesters and add the concept of trace live period. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5346&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5346&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed invalid YAML output from &lt;code&gt;/status/runtime_config&lt;/code&gt; endpoint by adding document separator. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5371&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5371&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed panic in &lt;code&gt;query_range&lt;/code&gt; HTTP handling that could be triggered by cancellations or other errors. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5667&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5667&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed cache collision for incomplete query in SearchTagValuesV2 (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5549&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5549&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Deadlock on invalid query to &lt;code&gt;api/v2/search/tags&lt;/code&gt;. (SearchTagsV2) (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5607&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5607&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed incorrect root span detection when spans have a &lt;code&gt;child_of&lt;/code&gt; link but no parent. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5557&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5557&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Prevent metrics-generator WAL deletion when tenant is empty. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5586&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5586&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed docker-compose port configuration for Alloy gRPC (&lt;code&gt;4319&lt;/code&gt; to &lt;code&gt;4317&lt;/code&gt;). (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5536&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5536&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed panic error from empty span id. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5464&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5464&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Return &lt;code&gt;Bad Request&lt;/code&gt; from frontend if the provided tag is invalid in &lt;code&gt;SearchTagValuesV2&lt;/code&gt; endpoint. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5493&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5493&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.GoogleWill = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
&lt;!-- vale Grafana.Parentheses = YES --&gt;
]]></content><description>&lt;h1 id="version-29-release-notes">Version 2.9 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.9.&lt;/p></description></item><item><title>Version 2.8 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-8/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-8/</guid><content><![CDATA[&lt;h1 id=&#34;version-28-release-notes&#34;&gt;Version 2.8 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.8.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New TraceQL features such as &lt;code&gt;most_recent&lt;/code&gt;, parent-span filters, &lt;code&gt;sum_over_time&lt;/code&gt;, and &lt;code&gt;topk&lt;/code&gt;/&lt;code&gt;bottomk&lt;/code&gt; to help surface the exact spans and metrics you need.&lt;/li&gt;
&lt;li&gt;Concurrent block flushing, iterator optimizations, and back-pressure make ingestion and queries leaner and quicker.&lt;/li&gt;
&lt;li&gt;Safer defaults with port 3200, distroless images, Go 1.24, and an upgraded OTLP Collector tighten security and simplify ops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These release notes highlight the most important features and bugfixes.
For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo changelog&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Tempo 2.8 has some major upgrade considerations including changing the default &lt;code&gt;http-listen-port&lt;/code&gt; from 80 to 3200, removing serverless, and enforcing max attribute size at event, link, and instrumentation scopes.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&#34;#upgrade-considerations&#34;&gt;Upgrade considerations&lt;/a&gt; for details.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Read the &lt;a href=&#34;/blog/2025/06/12/grafana-tempo-2.8-release-memory-improvements-new-traceql-features-and-more/&#34;&gt;Tempo 2.8 blog post&lt;/a&gt; for more examples and details about these improvements.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/cI2rmWl8ag0&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;new-language-features-for-traceql&#34;&gt;New language features for TraceQL&lt;/h2&gt;
&lt;p&gt;We’re excited to roll out three powerful enhancements to TraceQL, giving you more flexibility and performance when querying traces in Grafana Cloud with Tempo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rank your metrics with new &lt;code&gt;topk(n)&lt;/code&gt; and &lt;code&gt;bottomk(n)&lt;/code&gt; functions to quickly get your highest and lowest ranking time series.&lt;/li&gt;
&lt;li&gt;Aggregate spans over time using &lt;code&gt;sum_over_time()&lt;/code&gt; for built-in cumulative sums, such as total bytes, error counts.&lt;/li&gt;
&lt;li&gt;Fetch the latest traces first via the experimental &lt;code&gt;most_recent=true&lt;/code&gt; query hint.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ranking-topk-and-bottomk-functions-for-traceql-metrics&#34;&gt;Ranking &lt;code&gt;topk&lt;/code&gt; and &lt;code&gt;bottomk&lt;/code&gt; functions for TraceQL metrics&lt;/h3&gt;
&lt;p&gt;When you’re looking at latency, error rates, or throughput across hundreds or thousands of services or endpoints, it’s easy to get lost in all the data.
Previously, you’d have to pull back the full set of aggregates and then manually inspect or post‑process the results to find your worst offenders or best performers.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;topk(n)&lt;/code&gt; and &lt;code&gt;bottomk(n)&lt;/code&gt;, you can immediately narrow your focus to the top‑ or bottom‑ranked spans in a single, efficient query. This saves time and reduces the data volume you need to scan downstream.&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{} | avg_over_time(span:duration) by (span:name) | topk(10)
{} | count_over_time() by (span:name) | bottomk(10)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These are second stage functions used, where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;topk(n)&lt;/code&gt; returns the &lt;em&gt;n&lt;/em&gt; series with the highest values from a first‑stage aggregation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bottomk(n)&lt;/code&gt; returns the &lt;em&gt;n&lt;/em&gt; series with the lowest values.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/metrics-queries/functions/#topk-and-bottomk-functions&#34;&gt;topk and bottomk documentation&lt;/a&gt; (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4646/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4646&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&#34;the-sum_over_time-function-for-traceql-metrics&#34;&gt;The &lt;code&gt;sum_over_time&lt;/code&gt; function for TraceQL metrics&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;sum_over_time()&lt;/code&gt; function lets you aggregate numerical values by computing the sum value of them. The time interval that the sum is computed over is set by the &lt;code&gt;step&lt;/code&gt; parameter.&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{ span.http.response_content_length &amp;gt; 0 } | sum_over_time(span.http.response_content_length)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With &lt;code&gt;sum_over_time()&lt;/code&gt;, you can directly compute cumulative sums inside TraceQL, like total bytes transferred, total error counts, or resource consumption over time.&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{}  | sum_over_time(span.http.response_content_length)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For each step interval, &lt;code&gt;sum_over_time(attr)&lt;/code&gt; totals the values of &lt;code&gt;attr&lt;/code&gt; across all matching spans.&lt;/p&gt;
&lt;p&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/metrics-queries/functions/#the-sum_over_time-min_over_time-max_over_time-and-avg_over_time--functions&#34;&gt;TraceQL metrics functions&lt;/a&gt; for more information. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4786&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4786&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;experimental-query-hint-most_recenttrue-to-retrieve-the-most-recent-traces&#34;&gt;Experimental query hint &lt;code&gt;most_recent=true&lt;/code&gt; to retrieve the most recent traces&lt;/h3&gt;
&lt;p&gt;When troubleshooting a live incident or monitoring production health, you often need to see the absolute latest traces first. By default, Tempo’s query engine favors speed and returns the first &lt;code&gt;N&lt;/code&gt; matching traces, which may not be the newest.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;most_recent&lt;/code&gt; hint ensures you’re always looking at the freshest data, so you can diagnose recent errors or performance regressions without missing anything due to early row‑limit cuts.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{} with (most_recent=true)
{ span.foo = &amp;#34;bar&amp;#34; } &amp;gt;&amp;gt; { status = error } with (most_recent=true)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With &lt;code&gt;most_recent=true&lt;/code&gt;, Tempo performs a deeper search across data shards, retains the newest candidates, and returns traces sorted by start time rather than stopping at the first limit hit.
(&lt;a href=&#34;https://github.com/grafana/tempo/pull/4238&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4238&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The TraceQL query hint &lt;code&gt;most_recent=true&lt;/code&gt; can be used with any TraceQL selection query to force Tempo to return the most recent results ordered by time.&lt;/p&gt;
&lt;p&gt;For more information, refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/construct-traceql-queries/#retrieve-most-recent-results-experimental&#34;&gt;Retrieve most recent results (experimental)&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;query-by-parent-span-id&#34;&gt;Query by parent span ID&lt;/h3&gt;
&lt;p&gt;In addition, you can query by parent &lt;code&gt;span id&lt;/code&gt;.
Using &lt;code&gt;span:parentID&lt;/code&gt;, you can ensure that you are looking at a child span of a specific parent, which is useful for example in span linking.
Refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/construct-traceql-queries/#intrinsic-fields&#34;&gt;documentation&lt;/a&gt; for more information.
(&lt;a href=&#34;https://github.com/grafana/tempo/pull/4692&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4692&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id=&#34;major-performance-and-memory-usage-improvements&#34;&gt;Major performance and memory usage improvements&lt;/h2&gt;
&lt;p&gt;Tempo 2.8 removes pooling for large traces.
In testing, removing large pooling impacted memory, cutting memory high-water marks to less than half in a high traffic/tenant installation.
Some amount of pooling is needed to keep CPU, throughput, and GC rate maintained.
Now, we have a fixed 1M default allocation size, which covers most traces.&lt;/p&gt;
&lt;p&gt;This graph illustrate the amount of memory used by the compactors.
In one cell, we saw major improvements in compactor memory usage after PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/4985&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;4985&lt;/a&gt; was merged.
Refer to PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/4985&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;4985&lt;/a&gt; for more information, including benchmarks and test results.&lt;/p&gt;
&lt;figure
    class=&#34;figure-wrapper figure-wrapper__lightbox w-100p &#34;
    style=&#34;max-width: 1754px;&#34;
    itemprop=&#34;associatedMedia&#34;
    itemscope=&#34;&#34;
    itemtype=&#34;http://schema.org/ImageObject&#34;
  &gt;&lt;a
        class=&#34;lightbox-link&#34;
        href=&#34;/media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png&#34;
        itemprop=&#34;contentUrl&#34;
      &gt;&lt;div class=&#34;img-wrapper w-100p h-auto&#34;&gt;&lt;img
          class=&#34;lazyload &#34;
          data-src=&#34;/media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png&#34;data-srcset=&#34;/media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png?w=320 320w, /media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png?w=550 550w, /media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png?w=750 750w, /media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png?w=900 900w, /media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png?w=1040 1040w, /media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png?w=1240 1240w, /media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png?w=1920 1920w&#34;data-sizes=&#34;auto&#34;alt=&#34;&#34;width=&#34;1754&#34;height=&#34;922&#34;/&gt;
        &lt;noscript&gt;
          &lt;img
            src=&#34;/media/docs/tempo/tempo-2.8-pr-4985-compactor-memory-graph.png&#34;
            alt=&#34;&#34;width=&#34;1754&#34;height=&#34;922&#34;/&gt;
        &lt;/noscript&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;h3 id=&#34;performance-improvements&#34;&gt;Performance improvements&lt;/h3&gt;
&lt;p&gt;TraceQL and Tempo generally see a number of performance improvements in this release. Refer to benchmarks in the PRs for additional information.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improve TraceQL performance by reverting EqualRowNumber to an inlineable function. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4705&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4705&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Improve iterator performance by using max definition level to ignore parts of the RowNumber while nexting. Nexting is a function multiple in Tempo when you do a big query. Even minor improvements in nexting can have a major impact. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4753&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4753&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Increase query-frontend default batch size. TraceQL performance has improved enough to pass larger batches than before and still complete all jobs on one querier. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4844&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4844&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Improve Tempo build options. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4755&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4755&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Rewrite traces using rebatching. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4690&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4690&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Reorder span iterators. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4754&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4754&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Improve memcached memory usage by pooling buffers. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4970&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4970&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;This section highlights the most important features and enhancements in Tempo 2.8.&lt;/p&gt;
&lt;h3 id=&#34;traceql-correctness&#34;&gt;TraceQL correctness&lt;/h3&gt;
&lt;p&gt;One of our major focuses with this release has been to improve TraceQL’s performance and correctness. The following list summarizes some of the more important improvements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed behavior for queries like &lt;code&gt;{.foo &amp;amp;&amp;amp; true}&lt;/code&gt; and &lt;code&gt;{.foo || false}&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4855&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4855&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Make comparison to nil symmetric. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4869&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4869&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Corrected TraceQL incorrect results for additional spanset filters after a select operation. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4600&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4600&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed TraceQL metrics incorrect results for queries with multiple filters that reside in non-dedicated columns that also group by the same variable. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4887&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4887&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed metrics streaming for all non-trivial metrics. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4624&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4624&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed behavior of &lt;code&gt;{} &amp;gt;&amp;gt; { span.attr-that-doesnt-exist != &amp;quot;foo&amp;quot; }&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5007&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5007&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed various edge cases for query range. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4962&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4962&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Excluded &lt;code&gt;nestedSetParent&lt;/code&gt; and other values from the &lt;code&gt;compare()&lt;/code&gt; function. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5196&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5196&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The query frontend can cache job results for individual blocks when executing TraceQL. These bug fixes impact caching behavior.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TraceQL results caching bug for floats ending in &lt;code&gt;.0&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4539&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4539&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correctly cache frontend jobs for query range in TraceQL metrics. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4771&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4771&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed frontend cache key generation for TraceQL metrics queries to prevent collisions. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5017&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5017&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;traceql-exemplar-improvements-and-bugfixes&#34;&gt;TraceQL exemplar improvements and bugfixes&lt;/h3&gt;
&lt;p&gt;Tempo 2.8 improves exemplars in TraceQL metrics.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Distribute exemplars over time and hard limit the number of exemplars. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5158&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5158&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Right exemplars for histogram and quantiles. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5145&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5145&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed for queried number of exemplars. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5115&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5115&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;improved-error-handling-and-logging&#34;&gt;Improved error handling and logging&lt;/h3&gt;
&lt;p&gt;In addition, we’ve updated how Tempo handles errors so it’s easier to troubleshoot.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated query range error message. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4929&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4929&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Improved rate limit error message when traces size exceeds rate limit. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4986/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4986&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Restored dedicated columns logging for completed blocks in the compactor. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4832&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4832&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Query-frontend logs add a message to the log line. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4975&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4975&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-enhancements-and-improvements&#34;&gt;Other enhancements and improvements&lt;/h3&gt;
&lt;p&gt;This release also has these notable updates.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added throughput SLO and metrics for the &lt;code&gt;TraceByID&lt;/code&gt; endpoint. Configurable via the &lt;code&gt;throughput_bytes_slo&lt;/code&gt; field, and it will populate &lt;code&gt;op=&amp;quot;traces&amp;quot;&lt;/code&gt; label in SLO and throughput metrics. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4668&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4668&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Prevented queries in the ingester from blocking flushing traces to disk and memory spikes. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4483&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4483&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Host Info Processor now tracks host identifying resource attribute in metric (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5152&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5152&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added IPv6 support to the distributor. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4840&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4840&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added default mutex and blocking values. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4979&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4979&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.8, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;changed-the-default-listening-port&#34;&gt;Changed the default listening port&lt;/h3&gt;
&lt;p&gt;With Tempo 2.8, the default &lt;code&gt;http_listen_port&lt;/code&gt; changes from 80 to 3200. Check the configuration options for the &lt;code&gt;server:&lt;/code&gt; block in your Tempo configuration file.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;server:
    # HTTP server listen host
    [http_listen_address: &amp;lt;string&amp;gt;]

    # HTTP server listen port
    [http_listen_port: &amp;lt;int&amp;gt; | default = 3200]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Refer to &lt;a href=&#34;https://github.com/grafana/tempo/discussions/4945&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;issue 4945&lt;/a&gt; for more information for the rationale.
&lt;a href=&#34;https://github.com/grafana/tempo/pull/4960&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4960&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;removed-tempo-serverless&#34;&gt;Removed Tempo serverless&lt;/h3&gt;
&lt;p&gt;Tempo serverless has been removed. The following configuration options are no longer valid and should be removed from your Tempo configuration. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4599/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4599&lt;/a&gt;)&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;querier:
  search:
    prefer_self: &amp;lt;int&amp;gt;
    external_hedge_requests_at: &amp;lt;duration&amp;gt;
    external_hedge_requests_up_to: &amp;lt;duration&amp;gt;
    external_backend: &amp;lt;string&amp;gt;
    google_cloud_run: &amp;lt;string&amp;gt;
    external_endpoints: &amp;lt;array&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In addition, these Tempo serverless related metrics have been removed: &lt;code&gt;tempo_querier_external_endpoint_duration_seconds&lt;/code&gt;, &lt;code&gt;tempo_querier_external_endpoint_hedged_roundtrips_total&lt;/code&gt;, and &lt;code&gt;tempo_feature_enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;updated-removed-or-renamed-configuration-parameters&#34;&gt;Updated, removed, or renamed configuration parameters&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;max_span_attr_byte&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;max_attribute_bytes&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4633&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4633&lt;/a&gt;)&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;tempo_discarded_spans_total&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed &lt;code&gt;internal_error&lt;/code&gt; as a reason from &lt;code&gt;tempo_discarded_spans_total&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4554&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4554&lt;/a&gt;)&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;tempo_receiver_accepted_span&lt;/code&gt; and &lt;code&gt;tempo_receiver_refused_spans&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The &lt;code&gt;name&lt;/code&gt; dimension from &lt;code&gt;tempo_receiver_accepted_span&lt;/code&gt; and &lt;code&gt;tempo_receiver_refused_spans&lt;/code&gt; changes from &lt;code&gt;tempo/jaeger_receiver&lt;/code&gt; to &lt;code&gt;jaeger/jaeger_receiver&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4893&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4893&lt;/a&gt;)&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;other-upgrade-considerations&#34;&gt;Other upgrade considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Upgrade OTEL Collector to v0.122.1. The &lt;code&gt;name&lt;/code&gt; dimension from &lt;code&gt;tempo_receiver_accepted_span&lt;/code&gt; and &lt;code&gt;tempo_receiver_refused_spans&lt;/code&gt; changes from &lt;code&gt;tempo/jaeger_receiver&lt;/code&gt; to &lt;code&gt;jaeger/jaeger_receiver&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4893&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4893&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;opentracing-contrib/go-grpc&lt;/code&gt; by &lt;code&gt;otelgrpc&lt;/code&gt; in Tempo query. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4958&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4958&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Enforce max attribute size at event, link, and instrumentation scope. The configuration is now per-tenant. Renamed &lt;code&gt;max_span_attr_byte&lt;/code&gt; to &lt;code&gt;max_attribute_bytes&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4633&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4633&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Converted SLO metric &lt;code&gt;query_frontend_bytes_processed_per_second&lt;/code&gt; from a histogram to a counter as it&amp;rsquo;s more performant. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4748&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4748&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Removed the OpenTelemetry Jaeger exporter, which has been &lt;a href=&#34;https://pkg.go.dev/go.opentelemetry.io/otel/exporters/jaeger&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;deprecated&lt;/a&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4926&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4926&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;security-fixes&#34;&gt;Security fixes&lt;/h2&gt;
&lt;p&gt;The following updates were made to address security issues.&lt;/p&gt;
&lt;h3 id=&#34;283&#34;&gt;2.8.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated Go to version 1.25.5 to address &lt;a href=&#34;https://github.com/advisories/GHSA-7c64-f9jr-v9h2&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-61729&lt;/a&gt;, &lt;a href=&#34;https://github.com/advisories/GHSA-j5pm-7495-qmr3&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-47907&lt;/a&gt;, &lt;a href=&#34;https://github.com/advisories/GHSA-9gcr-gp5f-jw27&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-58183&lt;/a&gt;, and &lt;a href=&#34;https://github.com/advisories/GHSA-5mh9-3jwc-rp59&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-61727&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6089&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PRs 6089&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6096&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;6096&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6227&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;6227&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;github.com/expr-lang/expr&lt;/code&gt; to v1.17.7 to address &lt;a href=&#34;https://github.com/expr-lang/expr/security/advisories/GHSA-cfpf-hrx2-8rv6&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-68156&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6230&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PRs 6230&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6092&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;6092&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;282&#34;&gt;2.8.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated Go to version 1.24.4. Addresses &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2025-22874&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-22874&lt;/a&gt;, &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2025-4673&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-4673&lt;/a&gt;, &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2025-0913&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2025-0913&lt;/a&gt;, and &lt;a href=&#34;https://www.wiz.io/vulnerability-database/cve/ghsa-fv92-fjc5-jj9h&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;GHSA-FV92-FJC5-JJ9H&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5323&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5323&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;280&#34;&gt;2.8.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Used distroless base container images for improved security. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4556&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4556&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Updated to go 1.24.3. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5110&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5110&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bug-fixes&#34;&gt;Bug fixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;283-1&#34;&gt;2.8.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed deadlock on invalid query to &lt;code&gt;api/v2/search/tags&lt;/code&gt; (SearchTagsV2). [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5607&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PRs 5607&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6228&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;6228&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed panic in &lt;code&gt;query_range&lt;/code&gt; HTTP handling that could be triggered by cancellations or other errors. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5667&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PRs 5667&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6229&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;6229&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed configuration options that were always overridden by runtime overrides, preventing users from setting certain options without using the overrides configuration. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5202&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5202&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed trace idle period in ingesters, which was not being correctly applied. Added a max live trace period (default 30s) to prevent very large traces from being held in memory indefinitely when spans are drip-fed over time. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5346&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5346&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed the &lt;code&gt;SearchTagValuesV2&lt;/code&gt; endpoint to return 400 Bad Request instead of 500 Internal Server Error when an invalid tag name is provided. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5493&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5493&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;282-1&#34;&gt;2.8.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added a nil check to &lt;code&gt;partitionAssignmentVar&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5198&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5198&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Corrected instant query calculation. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5252&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5252&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed tracing context propagation in distributor HTTP write requests. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5312&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5312&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed search by &lt;code&gt;trace:id&lt;/code&gt; with short trace ID. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5331&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5331&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed bug where &lt;code&gt;most_recent=true&lt;/code&gt; wouldn&amp;rsquo;t return most recent results when query overlapped ingesters and few other blocks. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5438&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5438&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed a panic when the counter series was missing during &lt;code&gt;avg_over_time&lt;/code&gt; aggregation. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/5300&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5300&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;281&#34;&gt;2.8.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an ingester issue where a hash collision could lead to spans stored incorrectly. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5276&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5276&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;280-1&#34;&gt;2.8.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Chose a default step for a gRPC streaming query range request if none is provided. Correctly copy exemplars for metrics like &lt;code&gt;| rate()&lt;/code&gt; when gRPC streaming. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4576&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4576&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed distributor issue where a hash collision could lead to spans stored incorrectly (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5186&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5186&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added object name to cache key in ReadRange (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4982&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4982&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed rare panic during compaction (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4915&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4915&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Returned the operand as the only value if the tag is already filtered in the query (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4673&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4673&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Included cost attribution when converting from default configuration to legacy one. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4937&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4937&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;memcached&lt;/code&gt; to respect cancelled context to prevent panic. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5041&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5041&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed setting processors in user configurations overrides via API. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4741&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4741&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed panic on startup. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4744&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4744&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed intrinsic tag lookups dropped when max tag lookup response size is exceeded. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4784&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4784&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed error propagation in the SyncIterator. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5045&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5045&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed mixin to include &lt;code&gt;otlp_v1_traces&lt;/code&gt; HTTP write route (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5072&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5072&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;TempoBlockListRisingQuickly&lt;/code&gt; alert grouping. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4876&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 4876&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed metrics generator host info processor overrides configuration. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5118&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5118&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed metrics generator &lt;code&gt;target_info&lt;/code&gt; to skip attributes with no name to prevent downstream errors. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/5148&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 5148&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="version-28-release-notes">Version 2.8 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.8.&lt;/p></description></item><item><title>Version 2.7 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-7/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-7/</guid><content><![CDATA[&lt;h1 id=&#34;version-27-release-notes&#34;&gt;Version 2.7 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.7.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to precisely track ingested traffic and attribute costs based on custom labels&lt;/li&gt;
&lt;li&gt;A series of enhancements that significantly boost Tempo performance and reduce its overall resource footprint.&lt;/li&gt;
&lt;li&gt;New TraceQL capabilities&lt;/li&gt;
&lt;li&gt;Improvements to TraceQL metrics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read the &lt;a href=&#34;/blog/2025/01/16/grafana-tempo-2.7-release-new-traceql-metrics-functions-operational-improvements-and-more/&#34;&gt;Tempo 2.7 blog post&lt;/a&gt; for more examples and details about these improvements.&lt;/p&gt;
&lt;p&gt;These release notes highlight the most important features and bugfixes.
For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo changelog&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/0jUEvY-pCdw&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;The most important features and enhancements in Tempo 2.7 are highlighted below.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;This release changes gRPC compression to &lt;code&gt;snappy&lt;/code&gt; by default to improve performance.
Refer to &lt;a href=&#34;#grpc-compression-set-to-snappy&#34;&gt;gRPC compression&lt;/a&gt; for more information.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h3 id=&#34;track-ingested-traffic-and-attribute-costs&#34;&gt;Track ingested traffic and attribute costs&lt;/h3&gt;
&lt;p&gt;This new feature lets tenants precisely measure and attribute costs for their ingested trace data by leveraging custom labels.
This functionality provides a more accurate alternative to existing size-based metrics and meets the growing need for detailed cost attribution and billing transparency.&lt;/p&gt;
&lt;p&gt;Modern organizations are increasingly reliant on distributed traces for observability, yet reconciling the costs associated with different teams, services, or departments can be challenging.
The existing size metric isn&amp;rsquo;t accurate enough by missing non-span data and can lead to under- or over-counting.
The new usage tracking feature overcomes these issues by splitting resource-level data fairly and providing up to 99% accuracy—perfect for cost reconciliation.&lt;/p&gt;
&lt;p&gt;Unlike the previous method, this new feature precisely accounts for every byte of trace data in the distributor—the only Tempo component with the original payload.
A new API endpoint, &lt;code&gt;/usage_metrics&lt;/code&gt;, exposes the per-tenant metrics on ingested data and cost attribution, and can be controlled with per-tenant configuration.&lt;/p&gt;
&lt;p&gt;This feature is designed as a foundation for broader usage tracking capabilities, where additional trackers will allow organizations to measure and report on a range of usage metrics. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4162&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4162&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;For additional information, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/#usage-metrics&#34;&gt;Usage metrics documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;major-performance-and-memory-usage-improvements&#34;&gt;Major performance and memory usage improvements&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;re excited to announce a series of enhancements that significantly boost Tempo performance and reduce its overall resource footprint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Better refuse large traces:&lt;/strong&gt; The ingester now reuses generator code to better detect and reject oversized traces.
This change makes trace ingestion more reliable and prevents capacity overloads.
Plus, two new metrics &lt;code&gt;tempo_metrics_generator_live_trace_bytes&lt;/code&gt; and &lt;code&gt;tempo_ingester_live_trace_bytes&lt;/code&gt; provide deeper visibility into per-tenant byte usage. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4365&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4365&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reduced allocations:&lt;/strong&gt; We&amp;rsquo;ve refined how the query-frontend handles incoming traffic to eliminate unnecessary allocations when query demand is low.
As part of these improvements, the &lt;code&gt;querier_forget_delay&lt;/code&gt; configuration option has been removed because it no longer served a practical purpose. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3996&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3996&lt;/a&gt;)
This release also reduces the ingester working set by improving prelloc behavior.
It also adds tunable prealloc env variables &lt;code&gt;PREALLOC_BKT_SIZE&lt;/code&gt;, &lt;code&gt;PREALLOC_NUM_BUCKETS&lt;/code&gt;, &lt;code&gt;PREALLOC_MIN_BUCKET&lt;/code&gt;, and metric &lt;code&gt;tempo_ingester_prealloc_miss_bytes_total&lt;/code&gt; to observe and tune prealloc behavior. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4344&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4344&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/4369&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4369&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faster tag lookups and collector operations:&lt;/strong&gt; Multiple optimizations (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4100&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4100&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/4104&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4104&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/4109&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4109&lt;/a&gt;) make tag lookups and collector tasks more responsive, particularly for distinct value searches. Additionally, enabling disk caching for completed blocks in ingesters significantly cuts down on query latency and lowers overall I/O overhead. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4069&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4069&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reduce goroutines in non-querier components:&lt;/strong&gt; A simplified design across non-querier components lowers the total number of goroutines, making Tempo more efficient and easier to scale—even with high trace volumes. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4484&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4484&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;new-traceql-capabilities&#34;&gt;New TraceQL capabilities&lt;/h3&gt;
&lt;p&gt;New in Tempo 2.7, TraceQL now allows you to query the &lt;a href=&#34;https://opentelemetry.io/docs/concepts/instrumentation-scope/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;instrumentation scope&lt;/a&gt; fields (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3967&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3967&lt;/a&gt;), letting you filter and explore your traces based on where and how they were instrumented.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve extended TraceQL to automatically collect matches from array values (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3867&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3867&lt;/a&gt;), making it easier to parse spans containing arrays of attributes.&lt;/p&gt;
&lt;p&gt;Query times are notably faster, thanks to multiple optimizations (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4114&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4114&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/4163&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4163&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/4438&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4438&lt;/a&gt;).
Whether you&amp;rsquo;re running standard queries or advanced filters, you should see a significant speed boost.&lt;/p&gt;
&lt;p&gt;Tempo now uses the Prometheus &amp;ldquo;fast regex&amp;rdquo; engine to accelerate regular expression-based filtering (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4329&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4329&lt;/a&gt;).
As part of this update, all regular expressions matches are now fully anchored.
This breaking change means &lt;code&gt;span.foo =~ &amp;quot;bar&amp;quot;&lt;/code&gt; is evaluated as &lt;code&gt;span.foo =~ &amp;quot;^bar$&amp;quot;&lt;/code&gt;.
Update any affected queries accordingly.&lt;/p&gt;
&lt;h3 id=&#34;query-improvements&#34;&gt;Query improvements&lt;/h3&gt;
&lt;p&gt;In API v2 queries, Tempo can now return partial traces even when they exceed the max bytes limit (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3941&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3941&lt;/a&gt;).
This ensures you can still retrieve and inspect useful segments of large traces to aid in debugging.
Refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/#query-v2&#34;&gt;query v2 API endpoint&lt;/a&gt; documentation for more information.&lt;/p&gt;
&lt;h3 id=&#34;traceql-metrics-improvements-experimental&#34;&gt;TraceQL metrics improvements (experimental)&lt;/h3&gt;
&lt;p&gt;In TraceQL metrics, we&amp;rsquo;ve added a new &lt;code&gt;avg_over_time&lt;/code&gt; function (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4073&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4073&lt;/a&gt;) to help you compute average values for trace-based metrics over specified time ranges, making it simpler to spot trends and anomalies.&lt;/p&gt;
&lt;p&gt;Tempo now supports &lt;code&gt;min_over_time&lt;/code&gt; (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3975&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3975&lt;/a&gt;) and &lt;code&gt;max_over_time&lt;/code&gt; (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4065&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4065&lt;/a&gt;) queries, giving you more flexibility in analyzing the smallest or largest values across your trace data.&lt;/p&gt;
&lt;p&gt;For more information about TraceQL metrics, refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/metrics-queries/functions/#traceql-metrics-functions&#34;&gt;TraceQL metrics functions&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;other-enhancements-and-improvements&#34;&gt;Other enhancements and improvements&lt;/h3&gt;
&lt;p&gt;This release also has these notable updates.&lt;/p&gt;
&lt;h3 id=&#34;271&#34;&gt;2.7.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Default to snappy compression for all gRPC communications internal to Tempo. We feel this is a nice balance of resource usage and network traffic. For a discussion on alternatives, refer to &lt;a href=&#34;https://github.com/grafana/tempo/discussions/4683&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;this discussion thread&lt;/a&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4696&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4696&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;270&#34;&gt;2.7.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&#34;/docs/tempo/latest/metrics-generator/&#34;&gt;metrics-generator&lt;/a&gt; introduces a generous limit of 100 for failed flush attempts (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4254&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4254&lt;/a&gt;) to prevent constant retries on corrupted blocks. A new metric also tracks these flush failures, offering better visibility into potential issues during ingestion.&lt;/li&gt;
&lt;li&gt;For &lt;a href=&#34;/docs/tempo/latest/metrics-generator/span_metrics/&#34;&gt;span metrics&lt;/a&gt;, the span multiplier now also sources its value from the resource attributes (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4210&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4210&lt;/a&gt;). This makes it possible to adjust and correct metrics using service or environment configuration, ensuring more accurate data reporting.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;tempo-cli&lt;/code&gt; now supports dropping multiple trace IDs in a single command, speeding up administrative tasks and simplifying cleanup operations. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4266&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4266&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An optional log, &lt;code&gt;log_discarded_spans&lt;/code&gt;, tracks spans discarded by Tempo. This improves visibility into data ingestion workflows and helps you quickly diagnose any dropped spans. (&lt;a href=&#34;https://github.com/grafana/tempo/issues/3957&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3957&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;You can now impose limits on tag and tag-value lookups, preventing runaway queries in large-scale deployments and ensuring a smoother user experience. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4320&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4320&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The tags and tag-values endpoints have gained new throughput and SLO-related metrics. Get deeper insights into query performance and reliability straight from Tempo&amp;rsquo;s built-in monitoring. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4148&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4148&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Tempo now exposes a SemVer version in its &lt;code&gt;/api/status/buildinfo&lt;/code&gt; endpoint, providing clear visibility into versioning, particularly useful for cloud deployments and automated pipelines. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4110&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4110&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.7, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;opentelemetry-collector-receiver-listens-on-localhost-by-default&#34;&gt;OpenTelemetry Collector receiver listens on &lt;code&gt;localhost&lt;/code&gt; by default&lt;/h3&gt;
&lt;p&gt;After this change, the OpenTelemetry Collector receiver defaults to binding on &lt;code&gt;localhost&lt;/code&gt; rather than &lt;code&gt;0.0.0.0&lt;/code&gt;. Tempo installations running in Docker or other container environments must update their listener address to continue receiving data. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4465&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4465&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Most Tempo installations use the receivers with the default configuration:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;distributor:
  receivers:
    otlp:
      protocols:
        grpc:
        http:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This used to work fine since the receivers defaulted to &lt;code&gt;0.0.0.0:4317&lt;/code&gt; and &lt;code&gt;0.0.0.0:4318&lt;/code&gt; respectively. With the changes to replace unspecified addresses, the receivers now default to &lt;code&gt;localhost:4317&lt;/code&gt; and &lt;code&gt;localhost:4318&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As a result, connections to Tempo running in a Docker container won&amp;rsquo;t work anymore.&lt;/p&gt;
&lt;p&gt;To workaround this, you need to specify the address you want to bind to explicitly. For instance, if Tempo is running in a container with hostname &lt;code&gt;tempo&lt;/code&gt;, this should work:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;# ...
http:
  endpoint: &amp;#39;tempo:4318&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can also explicitly bind to &lt;code&gt;0.0.0.0&lt;/code&gt; still, but this has potential security risks:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;# ...
http:
  endpoint: &amp;#39;0.0.0.0:4318&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;tempo-serverless-deprecation&#34;&gt;Tempo serverless deprecation&lt;/h3&gt;
&lt;p&gt;Tempo serverless is now officially deprecated and will be removed in an upcoming release.
Prepare to migrate any serverless workflows to alternative deployments. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4017&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4017&lt;/a&gt;, &lt;a href=&#34;/docs/tempo/latest/operations/backend_search/#serverless-environment&#34;&gt;documentation&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;There are no changes to this release for serverless. However, you&amp;rsquo;ll need to remove these configurations before the next release.&lt;/p&gt;
&lt;h3 id=&#34;anchored-regular-expression-matchers-in-traceql&#34;&gt;Anchored regular expression matchers in TraceQL&lt;/h3&gt;
&lt;p&gt;TraceQL now uses the Prometheus &amp;ldquo;fast regex&amp;rdquo; engine to accelerate regular expression-based filtering (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4329&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4329&lt;/a&gt;).
As part of this update, all regular expression matches are now fully anchored.
This breaking change means &lt;code&gt;span.foo =~ &amp;quot;bar&amp;quot;&lt;/code&gt; is evaluated as &lt;code&gt;span.foo =~ &amp;quot;^bar$&amp;quot;&lt;/code&gt;.
Update any affected queries accordingly.&lt;/p&gt;
&lt;p&gt;For more information, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/construct-traceql-queries/#comparison-operators&#34;&gt;Comparison operators TraceQL&lt;/a&gt; documentation.&lt;/p&gt;
&lt;h3 id=&#34;migration-from-opentracing-to-opentelemetry&#34;&gt;Migration from OpenTracing to OpenTelemetry&lt;/h3&gt;
&lt;p&gt;This release removes the &lt;code&gt;use_otel_tracer&lt;/code&gt; option.
Configure your spans via standard OpenTelemetry environment variables.
For Jaeger exporting, set &lt;code&gt;OTEL_TRACES_EXPORTER=jaeger&lt;/code&gt;.For more information, refer to the &lt;a href=&#34;https://www.google.com/url?q=https://opentelemetry.io/docs/languages/sdk-configuration/&amp;amp;sa=D&amp;amp;source=docs&amp;amp;ust=1736460391410238&amp;amp;usg=AOvVaw3bykVWwn34XfhrnFK73uM_&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry documentation&lt;/a&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3646&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3646&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;added-updated-removed-or-renamed-configuration-parameters&#34;&gt;Added, updated, removed, or renamed configuration parameters&lt;/h3&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Parameter&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;querier_forget_delay&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Removed. The &lt;code&gt;querier_forget_delay&lt;/code&gt; setting provided no effective functionality and has been dropped. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3996&#34;&gt;#3996&lt;/a&gt;)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;use_otel_tracer&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Removed. Configure your spans via standard OpenTelemetry environment variables. For Jaeger exporting, set &lt;code&gt;OTEL_TRACES_EXPORTER=jaeger&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3646&#34;&gt;#3646&lt;/a&gt;)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
   &lt;code&gt;
max_spans_per_span_set
   &lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Added to query-frontend configuration. The limit is enabled by default and set to 100. Set it to `0` to restore the old behavior (unlimited). Otherwise, spans beyond the configured max are dropped. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4383&#34;&gt;#4275&lt;/a&gt;)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;use_otel_tracer&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;The &lt;code&gt;use_otel_tracer&lt;/code&gt; option is removed. Configure your spans via standard OpenTelemetry environment variables. For Jaeger exporting, set &lt;code&gt;OTEL_TRACES_EXPORTER=jaeger&lt;/code&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3646&#34;&gt;#3646&lt;/a&gt;)
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h3 id=&#34;grpc-compression-set-to-snappy&#34;&gt;gRPC compression set to snappy&lt;/h3&gt;
&lt;p&gt;Tempo 2.7.1 sets gRPC compression between all components to be &lt;code&gt;snappy&lt;/code&gt;.
Using &lt;code&gt;snappy&lt;/code&gt; provides a balanced approach to compression between components that will work for most installations.&lt;/p&gt;
&lt;p&gt;If you prefer a different balance of CPU/Memory and bandwidth, consider disabling compression or using zstd.&lt;/p&gt;
&lt;p&gt;For a discussion on alternatives, refer to &lt;a href=&#34;https://github.com/grafana/tempo/discussions/4683&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;this discussion thread&lt;/a&gt;. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4696&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4696&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&#34;grpc-compression-disabled&#34;&gt;gRPC compression disabled&lt;/h4&gt;
&lt;p&gt;Tempo 2.7.0 release disabled gRPC compression in the querier and distributor for performance reasons. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4429&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4429&lt;/a&gt;).
Our benchmark suggests that without compression, queriers and distributors use less CPU and memory.&lt;/p&gt;
&lt;p&gt;Tempo 2.7.1 changed the default value to &lt;code&gt;snappy&lt;/code&gt; for internal components.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;While disabling gRPC compression improves performance, it will increase data usage and network traffic, which can impact cloud billing depending on your configuration.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;If you notice increased network traffic or issues, check the gRPC compression settings.
You can enable gRPC compression using &lt;code&gt;snappy&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester_client:
  grpc_client_config:
    grpc_compression: &amp;#39;snappy&amp;#39;
metrics_generator_client:
  grpc_client_config:
    grpc_compression: &amp;#39;snappy&amp;#39;
querier:
  frontend_worker:
    grpc_client_config:
      grpc_compression: &amp;#39;snappy&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/configuration/#grpc-compression&#34;&gt;gRPC compression configuration&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h3 id=&#34;other-upgrade-considerations&#34;&gt;Other upgrade considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The Tempo CLI now targets the &lt;code&gt;/api/v2/traces&lt;/code&gt; endpoint by default. Use the &lt;code&gt;--v1&lt;/code&gt; flag if you still rely on the older &lt;code&gt;/api/traces&lt;/code&gt; endpoint. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4127&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4127&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;If you already set the &lt;code&gt;X-Scope-OrgID&lt;/code&gt; header in per-tenant overrides or global Tempo configuration, it&amp;rsquo;s now honored and not overwritten by Tempo. This may change behavior if you previously depended on automatic injection. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4021&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4021&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The AWS Lambda build output changes from main to bootstrap. Follow the &lt;a href=&#34;https://aws.amazon.com/blogs/compute/migrating-aws-lambda-functions-from-the-go1-x-runtime-to-the-custom-runtime-on-amazon-linux-2/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;AWS migration steps&lt;/a&gt; to ensure your Lambda functions continue to work. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/3852&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3852&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bugfixes&#34;&gt;Bugfixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;272&#34;&gt;2.7.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fix rare panic that occurred when a querier modified results from ingesters and generators while they were being marshalled to proto. This bug also impacted query correctness on recent trace data by returning incomplete results before they were ready. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4790&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4790&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;270-1&#34;&gt;2.7.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;invalid_utf8&lt;/code&gt; to reasons span metrics will discard spans. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4293&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4293&lt;/a&gt;) We now catch values in your tracing data that can&amp;rsquo;t be used as valid metrics labels. If you want span metrics by foo, but foo has illegal prom changes in it, then they won&amp;rsquo;t be written.&lt;/li&gt;
&lt;li&gt;Metrics-generators: Correctly drop from the ring before stopping ingestion to reduce drops during a rollout. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4101&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4101&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correctly handle 400 Bad Request and 404 Not Found in gRPC streaming. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4144&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4144&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correctly handle Authorization header in gRPC streaming. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4419&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4419&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix TraceQL metrics time range handling at the cutoff between recent and backend data. (&lt;a href=&#34;https://github.com/grafana/tempo/issues/4257&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4257&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix several issues with exemplar values for TraceQL metrics. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4366&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4366&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/4404&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4404&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Utilize S3Pass and S3User parameters in &lt;code&gt;tempo-cli&lt;/code&gt; options, which were previously unused in the code. (&lt;a href=&#34;https://github.com/grafana/tempo/pull/4259&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#4259&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.GoogleWill = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
&lt;!-- vale Grafana.Parentheses = YES --&gt;
]]></content><description>&lt;h1 id="version-27-release-notes">Version 2.7 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.7.&lt;/p></description></item><item><title>Version 2.6 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-6/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-6/</guid><content><![CDATA[&lt;h1 id=&#34;version-26-release-notes&#34;&gt;Version 2.6 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.6.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Additions to the TraceQL language, including the ability to search by span events, links, and arrays&lt;/li&gt;
&lt;li&gt;Additions to TraceQL metric query-types including a compare function and the ability to do instant queries (which will return faster than range queries).&lt;/li&gt;
&lt;li&gt;Performance and stability enhancements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read the &lt;a href=&#34;/blog/2024/09/05/grafana-tempo-2.6-release-performance-improvements-and-new-traceql-features/&#34;&gt;Tempo 2.6 blog post&lt;/a&gt; for more examples and details about these improvements.&lt;/p&gt;
&lt;p&gt;These release notes highlight the most important features and bugfixes. For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo changelog&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/aIDkPJ_e3W4&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;The most important features and enhancements in Tempo 2.6 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;additional-traceql-metrics-experimental&#34;&gt;Additional TraceQL metrics (experimental)&lt;/h3&gt;
&lt;p&gt;In this release, we&amp;rsquo;ve added several &lt;a href=&#34;/docs/tempo/latest/operations/traceql-metrics/&#34;&gt;TraceQL metrics&lt;/a&gt;. In Tempo 2.6, TraceQL metrics adds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Exemplars [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3824&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3824&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/metrics-queries/#exemplars&#34;&gt;documentation&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Instant metrics queries using &lt;code&gt;/api/metrics/query&lt;/code&gt; [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3859&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3859&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/#traceql-metrics&#34;&gt;documentation&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;q&lt;/code&gt; parameter to tag-name filtering the search v2 API [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3822&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3822&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/#traceql-metrics&#34;&gt;documentation&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;A new &lt;code&gt;compare()&lt;/code&gt; metrics function [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3695&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3695&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/metrics-queries/functions/&#34;&gt;documentation&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, we&amp;rsquo;re working on refactoring the replication factor. Refer to the &lt;a href=&#34;#operational-change-for-traceql-metrics&#34;&gt;Operational change for TraceQL metrics&lt;/a&gt; section for details.&lt;/p&gt;
&lt;p&gt;Note that using TraceQL metrics may require additional system resources.&lt;/p&gt;
&lt;p&gt;For more information, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/metrics-queries/&#34;&gt;TraceQL metrics queries&lt;/a&gt; and 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/traceql-metrics/&#34;&gt;Configure TraceQL metrics&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;traceql-improvements&#34;&gt;TraceQL improvements&lt;/h3&gt;
&lt;p&gt;Unique to Tempo, TraceQL is a query language that lets you perform custom queries into your tracing data. To learn more about the TraceQL syntax, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/&#34;&gt;TraceQL documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve added event attributes and link scopes. Like spans, they both have instrinsics and attributes.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;event&lt;/code&gt; scope lets you query events that happen within a span. A span event is a unique point in time during the span&amp;rsquo;s duration. While spans help build the structural hierarchy of your services, span events can provide a deeper level of granularity to help debug your application faster and maintain optimal performance. To learn more about how you can use span events, read the &lt;a href=&#34;/blog/2024/08/15/all-about-span-events-what-they-are-and-how-to-query-them/&#34;&gt;What are span events?&lt;/a&gt; blog post. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/3708&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3708&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3748&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3708&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3908&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3908&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve instrumented your traces for span links, you can use the &lt;code&gt;link&lt;/code&gt; scope to search for an attribute within a span link. A span link associates one span with one or more other spans. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/3814&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3814&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3741&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3741&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;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;You can search for an attribute in your link:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;{ link.opentracing.ref_type = &amp;#34;child_of&amp;#34; }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/grafana/data-sources/tempo/query-editor/traceql-link-example.png&#34;
  alt=&#34;A TraceQL example showing link scope&#34; width=&#34;1583&#34;
     height=&#34;750&#34;/&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve also added autocomplete support for &lt;code&gt;events&lt;/code&gt; and &lt;code&gt;links&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3846&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3846&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Tempo 2.6 improves TraceQL performance with these updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Performance improvement for &lt;code&gt;rate() by ()&lt;/code&gt; queries [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3719&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3719&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add caching to query range queries [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3796&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3796&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Only stream diffs on metrics queries [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3808&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3808&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Tag value lookup use protobuf internally for improved latency [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3731&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3731&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;TraceQL metrics queries use protobuf internally for improved latency [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3745&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3745&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;TraceQL search and other endpoints use protobuf internally for improved latency and resource usage [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3944&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3944&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add local disk caching of metrics queries in local-blocks processor [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3799&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3799&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Performance improvement for queries using trace-level intrinsics [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3920&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3920&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Use multiple goroutines to unmarshal responses in parallel in the query frontend. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3713&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3713&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;native-histogram-support&#34;&gt;Native histogram support&lt;/h3&gt;
&lt;p&gt;The metrics-generator can produce native histograms for high-resolution data. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3789&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3789&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Native histograms are a data type in Prometheus that can produce, store, and query high-resolution histograms of observations. It usually offers higher resolution and more straightforward instrumentation than classic histograms.&lt;/p&gt;
&lt;p&gt;To learn more, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/metrics-generator/#native-histograms&#34;&gt;Native histogram&lt;/a&gt; documentation.&lt;/p&gt;
&lt;h3 id=&#34;performance-improvements&#34;&gt;Performance improvements&lt;/h3&gt;
&lt;p&gt;One of our major improvements in Tempo 2.6 is the reduction of memory usage due to polling improvements. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/3950&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3950&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3951&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3951&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3952]&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3952&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/tempo-2-6-poll-improvement.png&#34;
  alt=&#34;Comparison graph showing the reduction of memory usage due to the polling improvements&#34; width=&#34;1130&#34;
     height=&#34;780&#34;/&gt;&lt;/p&gt;
&lt;p&gt;This improvement is a result of some of these changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add data quality metric to measure traces without a root. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3812&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3812&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Reduce memory consumption of query-frontend. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3888&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3888&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Reduce allocations of caching middleware. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3976&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3976&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Reduce allocations building queriers sharded requests. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3932&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3932&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improve trace id lookup from Tempo Vulture by selecting a date range. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3874&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3874&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-enhancements-and-improvements&#34;&gt;Other enhancements and improvements&lt;/h3&gt;
&lt;p&gt;This release also has these notable updates.&lt;/p&gt;
&lt;h4 id=&#34;261&#34;&gt;2.6.1&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Register gRPC health server to tempo-query. &lt;a href=&#34;https://github.com/grafana/tempo/pull/4178&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;[PR 4178]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support Tempo on IBM s390x. &lt;a href=&#34;https://github.com/grafana/tempo/pull/4175&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;[PR 4175]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;tempo-query: Separate TLS settings for server and client. &lt;a href=&#34;https://github.com/grafana/tempo/pull/4177&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;[PR 4177]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Speedup tempo-query trace search by allowing parallel queries. &lt;a href=&#34;https://github.com/grafana/tempo/pull/4159&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;[PR 4159]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;260&#34;&gt;2.6.0&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Bring back OTel receiver metrics. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3917&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3917&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;q&lt;/code&gt; parameter to &lt;code&gt;/api/v2/search/tags&lt;/code&gt; for tag name filtering. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3822&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3822&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add middleware to block matching URLs. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3963&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3963&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add data quality metric to measure traces without a root. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3812&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3812&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Implement polling tenants concurrently. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3647&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3647&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-generator/#native-histograms&#34;&gt;native histograms&lt;/a&gt; for internal metrics [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3870&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3870&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add a Tempo CLI command to drop traces by id by rewriting blocks. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3856&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3856&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/tempo_cli/#drop-trace-by-id&#34;&gt;documentation&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add new OTel compatible Traces API V2. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3912&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3912&lt;/a&gt;, &lt;a href=&#34;/docs/tempo/next/api_docs/#query-v2&#34;&gt;documentation&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Rename &lt;code&gt;Batches&lt;/code&gt; to &lt;code&gt;ResourceSpans&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3895&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3895&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.6, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;operational-change-for-traceql-metrics&#34;&gt;Operational change for TraceQL metrics&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ve changed to an RF1 (Replication Factor 1) pattern for TraceQL metrics as we were unable to hit performance goals for RF3 de-duplication. This requires some operational changes to query TraceQL metrics.&lt;/p&gt;
&lt;p&gt;TraceQL metrics are still considered experimental.
We hope to mark them GA soon when we productionize a complete RF1 write-read path.
[PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/3628&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3628&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3691&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3691&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3723&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3723&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3995&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3995&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For recent data&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The local-blocks processor must be enabled to start using metrics queries like &lt;code&gt;{ } | rate()&lt;/code&gt;.
If not enabled metrics queries fail with the error &lt;code&gt;localblocks processor not found&lt;/code&gt;.
Enabling the local-blocks processor can be done either per tenant or in all tenants.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Per-tenant in the per-tenant overrides:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;overrides:
  &amp;#39;tenantID&amp;#39;:
    metrics_generator_processors:
      - local-blocks&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By default, for all tenants in the main config:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;overrides:
  defaults:
    metrics_generator:
      processors: [local-blocks]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add this configuration to run TraceQL metrics queries against all spans (and not just server spans):&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;metrics_generator:
  processor:
    local_blocks:
      filter_server_spans: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;For historical data&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To run metrics queries on historical data, you must configure the local-blocks processor to flush RF1 blocks to object storage:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;metrics_generator:
  processor:
    local_blocks:
      flush_to_storage: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;transition-to-vparquet4&#34;&gt;Transition to vParquet4&lt;/h3&gt;
&lt;p&gt;vParquet4 format is now the default block format.
It&amp;rsquo;s production ready and we highly recommend switching to it for improved query performance. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3810&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3810&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Upgrading to Tempo 2.6 modifies the Parquet block format.
You don&amp;rsquo;t need to do anything with Parquet to go from 2.5 to 2.6.
If you used vParquet2 or vParquet3, all of your old blocks remain and can be read by Tempo 2.6.
Tempo 2.6 creates vParquet4 blocks by default, which enables the new TraceQL features.&lt;/p&gt;
&lt;p&gt;Although you can use Tempo 2.6 with vParquet2 or vParquet3, you can only use vParquet4 with Tempo 2.5 and later.
If you are using 2.5 with vParquet4, you&amp;rsquo;ll need to upgrade to Tempo 2.6 to use the new TraceQL features.&lt;/p&gt;
&lt;p&gt;You can also use the &lt;code&gt;tempo-cli analyse blocks&lt;/code&gt; command to query vParquet4 blocks. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3868&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3868&lt;/a&gt;].
Refer to the &lt;a href=&#34;/docs/tempo/next/operations/tempo_cli/#analyse-blocks&#34;&gt;Tempo CLI &lt;/a&gt;documentation for more information.&lt;/p&gt;
&lt;p&gt;For information on upgrading, refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;Upgrade to Tempo 2.6&lt;/a&gt; and 
    &lt;a href=&#34;/docs/tempo/v2.10.x/configuration/parquet/#choose-a-different-block-format&#34;&gt;Choose a different block format&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;updated-removed-or-renamed-configuration-parameters&#34;&gt;Updated, removed, or renamed configuration parameters&lt;/h3&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Parameter&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
   &lt;code&gt;storage:&lt;br /&gt;
  &amp;nbsp;&amp;nbsp;  azure:&lt;br /&gt;
  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use_v2_sdk: &lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Removed. Azure v2 is the only and primary Azure backend [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3875&#34;&gt;3875&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;autocomplete_filtering_enabled&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;The feature flag option has been removed. The feature is always enabled. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3729&#34;&gt;3729&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;completedfilepath&lt;/code&gt; and &lt;code&gt;blocksfilepath&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Removed unused WAL configuration options. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3911&#34;&gt;3911&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;compaction_disabled&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;New. Allow compaction disablement per-tenant. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3965&#34;&gt;3965&lt;/a&gt;, &lt;a href=&#34;https://grafana.com/docs/tempo/next/configuration/#overrides&#34;&gt;documentation&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;code&gt;
Storage:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;s3:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[enable_dual_stack: &amp;lt;bool&gt;]&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Boolean flag to activate or deactivate &lt;a href=&#34;https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html&#34;&gt;dualstack mode&lt;/a&gt; on the Storage block configuration for S3. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3721&#34;&gt;3721&lt;/a&gt;, &lt;a href=&#34;https://grafana.com/docs/tempo/&lt;TEMPO_VERSION&gt;/configuration/#standard-overrides&#34;&gt;documentation&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h3 id=&#34;other-breaking-changes&#34;&gt;Other breaking changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BREAKING CHANGE&lt;/strong&gt; &lt;code&gt;tempo-query&lt;/code&gt; is no longer a Jaeger instance with grpcPlugin. It&amp;rsquo;s now a standalone server. Serving a gRPC API for Jaeger on &lt;code&gt;0.0.0.0:7777&lt;/code&gt; by default. &lt;a href=&#34;https://github.com/grafana/tempo/issues/3840&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;[PR 3840]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bugfixes&#34;&gt;Bugfixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;261-1&#34;&gt;2.6.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bring back application-json content-type header. &lt;a href=&#34;https://github.com/grafana/tempo/pull/4123&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;[PR 4123]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;260-1&#34;&gt;2.6.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fix panic in certain metrics queries using &lt;code&gt;rate()&lt;/code&gt; with &lt;code&gt;by&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3847&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3847&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix metrics queries when grouping by attributes that may not exist. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3734&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3734&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix metrics query histograms and quantiles on &lt;code&gt;traceDuration&lt;/code&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3879&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3879&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix divide by 0 bug in query frontend exemplar calculations. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3936&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3936&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix autocomplete of a query using scoped instrinsics. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3865&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3865&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improved handling of complete blocks in the &lt;code&gt;localblocks&lt;/code&gt; processor after enabling flushing. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3805&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3805&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix double appending the primary iterator on second pass with event iterator. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3903&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3903&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix frontend parsing error on cached responses [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3759&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3759&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_global_traces_per_user&lt;/code&gt;: take into account &lt;code&gt;ingestion.tenant_shard_size&lt;/code&gt; when converting to local limit. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3618&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3618&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix HTTP connection reuse on GCP and AWS by reading &lt;code&gt;io.EOF&lt;/code&gt; through the &lt;code&gt;http&lt;/code&gt; body. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3760&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3760&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Handle out of boundaries spans kinds. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3861&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3861&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Maintain previous tenant blocklist on tenant errors. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3860&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3860&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix prefix handling in Azure backend &lt;code&gt;Find()&lt;/code&gt; call. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3875&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3875&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Correct block end time when the ingested traces are outside the ingestion slack. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3954&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3954&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fix race condition where a streaming response could be marshaled while being modified in the combiner resulting in a panic. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3961&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3961&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Pass search options to the backend for &lt;code&gt;SearchTagValuesBlocksV2&lt;/code&gt; requests. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3971&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3971&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.GoogleWill = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
&lt;!-- vale Grafana.Parentheses = YES --&gt;
]]></content><description>&lt;h1 id="version-26-release-notes">Version 2.6 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.6.&lt;/p></description></item><item><title>Version 2.5 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-5/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-5/</guid><content><![CDATA[&lt;h1 id=&#34;version-25-release-notes&#34;&gt;Version 2.5 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.5.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New features, including more TraceQL metrics, gRPC streaming endpoints, and new experimental vParquet4 block format&lt;/li&gt;
&lt;li&gt;TraceQL enhancements and performance improvements&lt;/li&gt;
&lt;li&gt;Performance and stability enhancements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As part of this release, we&amp;rsquo;ve updated ownership for &lt;code&gt;/var/tempo&lt;/code&gt; from &lt;code&gt;root:root&lt;/code&gt; to a new &lt;code&gt;tempo:tempo&lt;/code&gt; user with a UUID of &lt;code&gt;10001&lt;/code&gt;. Learn about this breaking change in Upgrade considerations.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&#34;/blog/2024/06/03/grafana-tempo-2.5-release-vparquet4-streaming-endpoints-and-more-metrics/&#34;&gt;Tempo 2.5 blog post&lt;/a&gt; for more examples and details about these improvements.&lt;/p&gt;
&lt;p&gt;These release notes highlight the most important features and bug fixes. For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/c4gW9fwkLhc&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;The most important features and enhancements in Tempo 2.5 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;additional-traceql-metrics-experimental&#34;&gt;Additional TraceQL metrics (experimental)&lt;/h3&gt;
&lt;p&gt;In this release, we&amp;rsquo;ve added several &lt;a href=&#34;/docs/tempo/latest/operations/traceql-metrics/&#34;&gt;TraceQL metrics&lt;/a&gt;. Tempo 2.4 introduced the &lt;code&gt;rate()&lt;/code&gt; function to view rates of spans. For this release, we&amp;rsquo;ve added &lt;code&gt;quantile_over_time&lt;/code&gt; and &lt;code&gt;histogram_over_time&lt;/code&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3605&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3605&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3633&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3633&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3644&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3644&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;You can use &lt;code&gt;quantiles_over_time&lt;/code&gt; allowing users to aggregate numerical values, such as the all-important span duration. Notice that you can specify multiple quantiles in the same query.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/traceql/traceql-quantile-over-time.png&#34;
  alt=&#34;Example quantile_over_time&#34; width=&#34;1999&#34;
     height=&#34;581&#34;/&gt;&lt;/p&gt;
&lt;p&gt;You can use &lt;code&gt;historgram_over_time&lt;/code&gt; to display the metrics as a heatmap.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/traceql/traceql-historgram-over-time.png&#34;
  alt=&#34;Example histogram_over_time&#34; width=&#34;1999&#34;
     height=&#34;1003&#34;/&gt;&lt;/p&gt;
&lt;p&gt;Note that using TraceQL metrics may require additional system resources.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&#34;/docs/tempo/latest/traceql/metrics-queries/&#34;&gt;TraceQL metrics queries&lt;/a&gt; and &lt;a href=&#34;/docs/tempo/latest/operations/traceql-metrics/&#34;&gt;Configure TraceQL metrics&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;grpc-streaming-endpoints-for-tempo-apis&#34;&gt;gRPC streaming endpoints for Tempo APIs&lt;/h3&gt;
&lt;p&gt;With this feature, you can now see partial query results as they come in, so you no longer have to wait for the whole query to finish.
This is perfect for big queries that take a long time to return a response.&lt;/p&gt;
&lt;p&gt;The Tempo API endpoints now support gRPC streaming for tag queries and metrics.
We&amp;rsquo;ve added new streaming endpoints for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SearchTags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SearchTagsV2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SearchTagValues&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SearchTagValuesV2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MetricsQueryRange&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These new streaming endpoints are not supported by Grafana yet. However, they are supported by the Tempo CLI tool.&lt;/p&gt;
&lt;p&gt;In the Tempo CLI, you can use the &lt;code&gt;--use-grpc&lt;/code&gt; option to enable GRPC streaming.&lt;/p&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&#34;/docs/tempo/latest/api_docs/#tempo-grpc-api&#34;&gt;Tempo gRPC API&lt;/a&gt; and &lt;a href=&#34;/docs/tempo/latest/operations/tempo_cli/#search&#34;&gt;Tempo CLI&lt;/a&gt; documentation. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3460&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3460&lt;/a&gt; [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3584&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR #3584&lt;/a&gt;]&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Streaming over HTTP requires the &lt;code&gt;stream_over_http_enabled&lt;/code&gt; flag to be set. For more information, refer to &lt;a href=&#34;/docs/tempo/latest/api_docs/#tempo-grpc-api&#34;&gt;Tempo GRPC API documentation&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;In addition, we&amp;rsquo;ve reduced memory consumption in the frontend for large traces. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3522&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3522&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;new-vparquet4-block-format-experimental&#34;&gt;New vParquet4 block format (experimental)&lt;/h3&gt;
&lt;p&gt;New in Tempo 2.5, the vParquet4 block format is required for querying links, events, and arrays and improves query performance relative to previous formats.
[&lt;a href=&#34;https://github.com/grafana/tempo/pull/3368&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3368&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;In addition, we&amp;rsquo;ve updated the OTLP schema to add attributes to instrumentation scope in vParquet4.[&lt;a href=&#34;https://github.com/grafana/tempo/pull/3649&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3649&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;While you can use vParquet4, keep in mind that it&amp;rsquo;s experimental. If you choose to use vParquet4 and then opt to revert to vParquet3, any vParquet4 blocks would not be readable by vParquet3.&lt;/p&gt;
&lt;p&gt;To try vParquet4, refer to &lt;a href=&#34;/docs/tempo/latest/configuration/parquet/#choose-a-different-block-format&#34;&gt;Choose a block format&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;traceql&#34;&gt;TraceQL&lt;/h3&gt;
&lt;p&gt;Unique to Tempo, TraceQL is a query language that lets you perform custom queries into your tracing data.
To learn more about the TraceQL syntax, see the &lt;a href=&#34;/docs/tempo/latest/traceql/&#34;&gt;TraceQL documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For information on planned future extensions to the TraceQL language, refer to &lt;a href=&#34;https://github.com/grafana/tempo/blob/main/docs/design-proposals/2023-11%20TraceQL%20Extensions.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;future work&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve made the following improvements to TraceQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add support for scoped intrinsics using a colon (&lt;code&gt;:&lt;/code&gt;). The available scoped intrinsics are trace:duration, trace:rootName, trace:rootService, span:duration, span:kind, span:name, span:status, span:statusMessage. [[PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3629&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3629&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Performance improvements on TraceQL and tag value search. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3650&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3650&lt;/a&gt;,&lt;a href=&#34;https://github.com/grafana/tempo/pull/3667&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3667&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;nestedSetLeft/Right/Parent&lt;/code&gt; intrinsics to TraceQL. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3497&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3497&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Reduce memory usage and improve performance when working with large datasets with many repeated strings. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3411&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3411&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add support querying by &lt;code&gt;trace:id&lt;/code&gt; and &lt;code&gt;span:id&lt;/code&gt; [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3670&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3670&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-enhancements-and-improvements&#34;&gt;Other enhancements and improvements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add TLS support for Memcached Client [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3585&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3585&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Remove hardcoded delay in distributor shutdown [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3687&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3687&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Surface new labels for uninstrumented services and systems [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3543&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3543&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add messaging-system latency histogram to service-graph [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3453&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3453&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Add support for sharded ingester queries [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3574&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3574&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Better compaction throughput and memory usage [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3579&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3579&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Return a less confusing error message to the client when refusing spans due to ingestion rates. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3485&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3485&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Clean Metrics Generator&amp;rsquo;s Prometheus WAL before creating instance [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3548&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3548&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Delete any remaining objects for empty tenants after a configurable duration, requires configuration enable &lt;a href=&#34;https://github.com/grafana/tempo/pull/3611&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3611&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.5, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;docker-image-runs-as-new-uid-10001&#34;&gt;Docker image runs as new UID 10001&lt;/h3&gt;
&lt;p&gt;The Tempo process in the &lt;a href=&#34;https://hub.docker.com/r/grafana/tempo/tags&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;official Docker image&lt;/a&gt; used to run as &lt;code&gt;root&lt;/code&gt;. The Tempo process now runs as UID &lt;code&gt;10001&lt;/code&gt; in the Docker image.&lt;/p&gt;
&lt;p&gt;Components such as ingesters and metrics generators that maintain files on disk won&amp;rsquo;t come up cleanly without intervention.
The new user &lt;code&gt;10001&lt;/code&gt; won&amp;rsquo;t have access to the old files created by &lt;code&gt;root&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The ownership of &lt;code&gt;/var/tempo&lt;/code&gt; changed from &lt;code&gt;root:root&lt;/code&gt; to &lt;code&gt;tempo:tempo&lt;/code&gt; with the UID/GID of &lt;code&gt;10001&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;ingester&lt;/code&gt; and &lt;code&gt;metrics-generator&lt;/code&gt; statefulsets may need to &lt;a href=&#34;https://opensource.com/article/19/8/linux-chown-command&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;run &lt;code&gt;chown&lt;/code&gt;&lt;/a&gt; to change ownership to start properly.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&#34;https://github.com/grafana/tempo/pull/2265&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2265&lt;/a&gt; to see a Jsonnet example of an &lt;code&gt;init&lt;/code&gt; container.&lt;/p&gt;
&lt;p&gt;This change doesn&amp;rsquo;t impact you if you used the Helm chart with the default security context set in the chart.
All data should be owned by the &lt;code&gt;tempo&lt;/code&gt; user already.
The UID won&amp;rsquo;t impact Helm chart users.&lt;/p&gt;
&lt;!-- vale Grafana.Spelling = NO --&gt;
&lt;h3 id=&#34;support-for-vparquet-format-removed&#34;&gt;Support for vParquet format removed&lt;/h3&gt;
&lt;p&gt;The original vParquet format &lt;a href=&#34;https://github.com/grafana/tempo/pull/3663&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;has been removed&lt;/a&gt; from Tempo 2.5.
Direct upgrades from Tempo 2.1 to Tempo 2.5 aren&amp;rsquo;t possible.
You will need to upgrade to an intermediate version and wait for the old vParquet blocks to fall out of retention before upgrading to 2.5. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3663&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3663&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;vParquet(1) won&amp;rsquo;t be recognized as a valid encoding and any remaining vParquet(1) blocks won&amp;rsquo;t be readable.
Installations running with historical defaults shouldn&amp;rsquo;t require any changes as the default has been migrated for several releases.
Installations with storage settings pinned to vParquet must run a previous release configured for vParquet2 or higher until all existing vParquet(1) blocks have expired and been deleted from the backend, or else will encounter read errors after upgrading to this release.&lt;/p&gt;
&lt;!-- vale Grafana.Spelling =YES --&gt;
&lt;h3 id=&#34;updated-removed-or-renamed-configuration-parameters&#34;&gt;&lt;strong&gt;Updated, removed, or renamed configuration parameters&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;tr&gt;
  &lt;td&gt;&lt;strong&gt;Parameter&lt;/strong&gt;
  &lt;/td&gt;
  &lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;`[hedge_requests_at: &amp;lt;duration&gt; | default = 2s ]`
&lt;p&gt;
`[hedge_requests_up_to: &amp;lt;int&gt; | default = 2 ]`
  &lt;/td&gt;
  &lt;td&gt;Removed options from the configuration. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3522&#34;&gt;#3522&lt;/a&gt;]
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;
&lt;h3 id=&#34;additional-considerations&#34;&gt;Additional considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updating to OTLP 1.3.0 removes the deprecated &lt;code&gt;InstrumentationLibrary&lt;/code&gt; and &lt;code&gt;InstrumentationLibrarySpan&lt;/code&gt; from the OTLP receivers. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3649&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3649&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Removes the addition of a tenant in multi-tenant trace id lookup. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3522&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3522&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bugfixes&#34;&gt;Bugfixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo changelog&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix handling of regex matchers in autocomplete endpoints &lt;a href=&#34;https://github.com/grafana/tempo/pull/3641&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3641&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Return unfiltered results when a bad TraceQL query is provided in autocomplete. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3426&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3426&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add support for dashes, quotes and spaces in attribute names in autocomplete &lt;a href=&#34;https://github.com/grafana/tempo/pull/3458&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3458&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix metrics query results when filtering and rating on the same attribute &lt;a href=&#34;https://github.com/grafana/tempo/issues/3428&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3428&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix metrics query results when series contain empty strings or nil values &lt;a href=&#34;https://github.com/grafana/tempo/issues/3429&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3429&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix metrics query duration check, add per-tenant override for max metrics query duration &lt;a href=&#34;https://github.com/grafana/tempo/issues/3479&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3479&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix metrics query panic &amp;ldquo;index out of range [-1]&amp;rdquo; when a trace has zero-length ID &lt;a href=&#34;https://github.com/grafana/tempo/pull/3668&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3668&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Correctly handle 429s in GRPC search streaming. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3469&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3469&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Correctly cancel GRPC and HTTP contexts in the frontend to prevent having to rely on http write timeout. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3443&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3443&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add spss and limit to the frontend cache key to prevent the return of incorrect results. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3557&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3557&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use OS path separator to split blocks path. &lt;a href=&#34;https://github.com/grafana/tempo/issues/3552&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3552&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Correctly parse TraceQL queries with &amp;gt; 1024 character attribute names or static values. &lt;a href=&#34;https://github.com/grafana/tempo/issues/3571&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3571&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix span-metrics&amp;rsquo; subprocessors bug that applied wrong configurations when running multiple tenants. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3612&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3612&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix panic in query-frontend when combining results &lt;a href=&#34;https://github.com/grafana/tempo/pull/3683&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3683&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix TraceQL queries involving non boolean operations between statics and attributes. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3698&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3698&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.GoogleWill = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
&lt;!-- vale Grafana.Parentheses = YES --&gt;
]]></content><description>&lt;h1 id="version-25-release-notes">Version 2.5 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.5.&lt;/p></description></item><item><title>Version 2.4 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-4/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-4/</guid><content><![CDATA[&lt;h1 id=&#34;version-24-release-notes&#34;&gt;Version 2.4 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.4.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New features, including multi-tenant queries and experimental TraceQL metrics queries&lt;/li&gt;
&lt;li&gt;Performance enhancements, thanks to the addition of new caching tiers&lt;/li&gt;
&lt;li&gt;Cost savings, thanks to polling improvements that reduce calls to object storage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As part of this release, vParquet3 has also been promoted to the new default storage format for traces. For more about why we&amp;rsquo;re so excited about vParquet3, refer to &lt;a href=&#34;/blog/2024/01/22/accelerate-traceql-queries-at-scale-with-dedicated-attribute-columns-in-grafana-tempo/&#34;&gt;Accelerate TraceQL queries at scale with dedicated attribute columns in Grafana Tempo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&#34;/blog/2024/02/29/grafana-tempo-2.4-release-traceql-metrics-tiered-caching-and-tco-improvements/&#34;&gt;Tempo 2.4 blog post&lt;/a&gt; for more examples and details about these improvements.&lt;/p&gt;
&lt;p&gt;These release notes highlight the most important features and bug fixes. For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases/tag/v2.4&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/EYUx2DkNRas&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;The most important features and enhancements in Tempo 2.4 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;multi-tenant-queries&#34;&gt;Multi-tenant queries&lt;/h3&gt;
&lt;p&gt;Tempo now allows you to query multiple tenants at once. We&amp;rsquo;ve made multi-tenant queries compatible with streaming (&lt;a href=&#34;../v2-2/#get-traceql-results-faster&#34;&gt;first released in v2.2&lt;/a&gt;) so you can get query results as fast as possible.
To learn more, refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/manage-advanced-systems/cross_tenant_query/&#34;&gt;Cross-tenant federation&lt;/a&gt; and 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/manage-advanced-systems/multitenancy/&#34;&gt;Enable multi-tenancy&lt;/a&gt;. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/3262&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3262&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3087&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3087&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;traceql-metrics-experimental&#34;&gt;TraceQL metrics (experimental)&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;re excited to announce the addition of metrics queries to the TraceQL language. Metric queries extend trace queries by applying a function to trace query results.
This powerful feature creates metrics from traces, much in the same way that LogQL metric queries create metrics from logs.&lt;/p&gt;
&lt;p&gt;In this case, we&amp;rsquo;re calculating the rate of the erroring spans coming from the service &lt;code&gt;foo&lt;/code&gt;. Rate is a &lt;code&gt;spans/sec&lt;/code&gt; quantity.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;traceql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-traceql&#34;&gt;{ resource.service.name = &amp;#34;foo&amp;#34; &amp;amp;&amp;amp; status = error } | rate()&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In addition, you can use Grafana Explore to &lt;a href=&#34;../../operations/traceql-metrics/&#34;&gt;query and visualize the metrics&lt;/a&gt; with the Tempo data source in Grafana or Grafana Cloud.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/metrics-explore-sample-2.4.png&#34;
  alt=&#34;Metrics visualization in Grafana&#34; width=&#34;1170&#34;
     height=&#34;766&#34;/&gt;&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&#34;../../operations/traceql-metrics/&#34;&gt;TraceQL metrics&lt;/a&gt; documentation. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/3227&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3227&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/3252&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3252&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3258&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3258&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;To learn more about the TraceQL syntax, see the &lt;a href=&#34;../../traceql/&#34;&gt;TraceQL documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;traceql-performance-improvements&#34;&gt;TraceQL performance improvements&lt;/h4&gt;
&lt;p&gt;We continue to make query performance improvements so you spend less time waiting on results to your TraceQL queries. Below are some notable PRs that made it into this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improve TraceQL regular expression performance in certain queries. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3139&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3139&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improve TraceQL performance in complex queries. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3113&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3113&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;TraceQL/Structural operators performance improvement. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3088&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3088&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.Spelling = NO --&gt;
&lt;h3 id=&#34;vparquet3-is-now-the-default-block-format&#34;&gt;vParquet3 is now the default block format&lt;/h3&gt;
&lt;p&gt;Tempo 2.4 makes &lt;a href=&#34;../../configuration/parquet/&#34;&gt;vParquet3&lt;/a&gt; the default storage format.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re excited about &lt;a href=&#34;../../configuration/parquet/&#34;&gt;vParquet3&lt;/a&gt; relative to prior formats because of its support for &lt;a href=&#34;../../operations/dedicated_columns/&#34;&gt;dedicated attribute columns&lt;/a&gt;, which help speed up queries on your largest and most queried attributes.
We&amp;rsquo;ve seen excellent performance improvements when running it ourselves, and by promoting it to the default, we&amp;rsquo;re signaling that it&amp;rsquo;s ready for broad adoption.&lt;/p&gt;
&lt;p&gt;Dedicated attribute columns, available using vParquet3, improve query performance by storing the largest and most frequently used attributes in their own columns, rather than in the generic attribute key-value list.
For more information, refer to
&lt;a href=&#34;/blog/2024/01/22/accelerate-traceql-queries-at-scale-with-dedicated-attribute-columns-in-grafana-tempo/&#34;&gt;Accelerate TraceQL queries at scale with dedicated attribute columns in Grafana Tempo&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2526&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2526&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If you had manually configured vParquet3, we recommend removing it to move forward with Tempo defaults.&lt;/p&gt;
&lt;p&gt;To read more about the design of vParquet3, refer to &lt;a href=&#34;https://github.com/grafana/tempo/blob/main/docs/design-proposals/2023-05%20vParquet3.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;the design proposal&lt;/a&gt;. For general information, refer to &lt;a href=&#34;../../operations/schema/&#34;&gt;the Apache Parquet schema&lt;/a&gt;.&lt;/p&gt;
&lt;!-- Grafana.Spelling = YES --&gt;
&lt;h3 id=&#34;additional-caching-layers&#34;&gt;Additional caching layers&lt;/h3&gt;
&lt;p&gt;Tempo has added two new caches to improve TraceQL query performance. The frontend-search cache handles job search caching.
The parquet-page cache handles page level caching.
Refer to the &lt;a href=&#34;../../configuration/#cache&#34;&gt;Cache section&lt;/a&gt; of the Configuration documentation for how to configure these new caching layers.&lt;/p&gt;
&lt;p&gt;As part of adding these new caching layers, we&amp;rsquo;ve refactored our caching interface.
This includes breaking changes described in Breaking Changes. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/3166&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3166&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3225&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3225&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3196&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3196&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;improved-polling-for-cost-reduction&#34;&gt;Improved polling for cost reduction&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ve improved how Tempo polls object storage, ensuring that we reuse previous results. This has dramatically reduced the number of requests Tempo makes to the object store. Not only does this reduce the load on your object store, for many, it will save you money (since most hosted object storage solutions charge per request).&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve also added the &lt;code&gt;list_blocks_concurrency&lt;/code&gt; parameter to allow you to tune the number of list calls Tempo makes in parallel to object storage so you can select the value that works best for your environment. We&amp;rsquo;ve set the default value to &lt;code&gt;3&lt;/code&gt;, which should work well for the average Tempo cluster. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2652&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2652&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;other-enhancements-and-improvements&#34;&gt;Other enhancements and improvements&lt;/h3&gt;
&lt;p&gt;In addition, the following improvements have been made in Tempo 2.4:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved Tempo error handling on writes, so that one erroring trace doesn&amp;rsquo;t result in an entire batch of traces being dropped. &lt;a href=&#34;https://github.com/grafana/tempo/pull/2571&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2571&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added per-tenant compaction window. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3129&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3129&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;--max-start-time&lt;/code&gt; and &lt;code&gt;--min-start-time&lt;/code&gt; flag to &lt;code&gt;tempo-cli&lt;/code&gt; command &lt;code&gt;analyse blocks&lt;/code&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3250&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3250&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added per-tenant configurable &lt;code&gt;remote_write&lt;/code&gt; headers to metrics-generator. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3175&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3175&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added variable expansion support to overrides configuration. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3175&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3175&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added HTML pages &lt;code&gt;/status/overrides&lt;/code&gt; and &lt;code&gt;/status/overrides/{tenant}&lt;/code&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3244&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3244&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/3332&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3332&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Precalculate and reuse the vParquet3 schema before opening blocks. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3367&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3367&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Made the trace ID label name configurable for remote written exemplars. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3074&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3074&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Performance improvements in span filtering. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3025&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Introduced &lt;code&gt;localblocks&lt;/code&gt; process configuration option to select only server spans. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3303&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3303&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.4, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;transition-to-vparquet-3&#34;&gt;Transition to vParquet 3&lt;/h3&gt;
&lt;p&gt;vParquet3 format is now the default block format. It&amp;rsquo;s production ready and we highly recommend switching to it for improved query performance and &lt;a href=&#34;../../operations/dedicated_columns/&#34;&gt;dedicated attribute columns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Upgrading to Tempo 2.4 modifies the Parquet block format. Although you can use Tempo 2.3 with vParquet2 or vParquet3, you can only use Tempo 2.4 with vParquet3.&lt;/p&gt;
&lt;p&gt;With this release, the first version of our Parquet backend, vParquet, is being deprecated. Tempo 2.4 still reads vParquet1 blocks. However, Tempo will exit with error if they&amp;rsquo;re manually configured. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3377/files#top&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3377&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;For information on upgrading, refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;Upgrade to Tempo 2.4&lt;/a&gt; and &lt;a href=&#34;../../configuration/parquet/#choose-a-different-block-format&#34;&gt;Choose a different block format&lt;/a&gt; .&lt;/p&gt;
&lt;h3 id=&#34;updated-removed-or-renamed-configuration-parameters&#34;&gt;Updated, removed, or renamed configuration parameters&lt;/h3&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;Parameter
   &lt;/td&gt;
   &lt;td&gt;Comments
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;autocomplete_filtering_enabled&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Set to &lt;code&gt;true&lt;/code&gt; by default [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3178&#34;&gt;3178&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;distributor.log_received_traces&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Use the &lt;code&gt;distributor.log_received_spans&lt;/code&gt; configuration block instead. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3008&#34;&gt;#3008&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;tempo_query_frontend_queries_total{op=&#34;searchtags|metrics&#34;}&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Removed deprecated frontend metrics configuration option
   &lt;/td&gt;
  &lt;/tr&gt;
    &lt;tr&gt;
   &lt;td&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage:
  trace:
    cache:
    search:
      cache_control:
    background_cache:
    memcached:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
   &lt;/td&gt;
   &lt;td&gt;These fields have been removed in favor of the new cache configuration. Refer to Cache configuration refactored.
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;The distributor now returns 200 for any batch containing only &lt;code&gt;trace_too_large&lt;/code&gt; and &lt;code&gt;max_live_traces&lt;/code&gt; errors. The number of discarded spans are still reflected in the &lt;code&gt;tempo_discarded_spans_total metrics&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;removed-experimental-websockets-support-for-search-streaming&#34;&gt;Removed experimental websockets support for search streaming&lt;/h3&gt;
&lt;p&gt;GPRC is now the supported method for streaming results.
Websockets support for search streaming has been removed.
Websocket support was initially added due to conflicts with GRPC, HTTP, and TLS.
Those issues were corrected &lt;a href=&#34;https://github.com/grafana/tempo/pull/3300&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;in PR 3300&lt;/a&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3307&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3307&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;cache-configuration-refactored&#34;&gt;Cache configuration refactored&lt;/h3&gt;
&lt;p&gt;The major cache refactor allows multiple role-based caches to be configured. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3166&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3166&lt;/a&gt;]
This change resulted in several fields being deprecated (refer to the old configuration).
These have all been migrated to a top level &lt;code&gt;cache:&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;For more information about the configuration, refer to the &lt;a href=&#34;../../configuration/#cache&#34;&gt;Cache&lt;/a&gt; section.&lt;/p&gt;
&lt;p&gt;The old configuration block looked like this:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage:
  trace:
    cache:
    search:
      cache_control:
    background_cache:
    memcached:
    redis:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With the new configuration, you create your list of caches with either &lt;code&gt;redis&lt;/code&gt; or &lt;code&gt;memcached&lt;/code&gt; cluster with your configuration, then define the types of data and roles.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;cache:
  caches:
    - memcached:
        host: &amp;lt;some memcached cluster&amp;gt;
      roles:
        - bloom
        - parquet-footer
    - memcached:
        host: &amp;lt;some memcached cluster&amp;gt;
      roles:
        - frontend-search&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;security-fixes&#34;&gt;Security fixes&lt;/h2&gt;
&lt;p&gt;This release addresses the following vulnerabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Addressed &lt;a href=&#34;https://github.com/advisories/GHSA-xw78-pcr6-wrg8&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2023-5363&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Updated the &lt;code&gt;memcached&lt;/code&gt; default image in Jsonnet for multiple CVEs. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3310&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3310&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update golang.org/x/net package to 0.24.0 to fix &lt;a href=&#34;https://github.com/advisories/GHSA-4v7x-pqxf-cx7m&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2023-45288&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/3613&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3613&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bugfixes&#34;&gt;Bugfixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;242&#34;&gt;2.4.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Update golang.org/x/net package to 0.24.0 to fix &lt;a href=&#34;https://github.com/advisories/GHSA-4v7x-pqxf-cx7m&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2023-45288&lt;/a&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3613&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3613&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;241&#34;&gt;2.4.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed compaction/retention in AWS S3 and GCS when a prefix is configured. &lt;a href=&#34;https://github.com/grafana/tempo/issues/3465&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3465&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;240&#34;&gt;2.4.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Prevent building parquet iterators that would loop forever. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3159&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3159&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sanitize name in mapped dimensions in span-metrics processor. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3171&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3171&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed an issue where cached footers were requested then ignored. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3196&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3196&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed a panic in autocomplete when the query condition had the wrong type. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3277&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3277&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed TLS when GRPC is enabled on HTTP. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3300&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3300&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Correctly return 400 when max limit is requested on search. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3340&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3340&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed autocomplete filters sometimes returning erroneous results. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3339&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3339&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed trace context propagation between query-frontend and querier. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3387&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3387&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed parsing of span.resource.xyz attributes in TraceQL. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3284&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3284&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Changed exit code if configuration is successfully verified. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3174&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3174&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;tempo-cli analyze blocks&lt;/code&gt; command no longer fails on compacted blocks. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3183&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3183&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Moved waitgroup handling for poller error condition. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3224&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3224&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed head block excessive locking in ingester search. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3328&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3328&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed an issue with ingester failed to write traces to disk after a crash or unclean restart. &lt;a href=&#34;https://github.com/grafana/tempo/issues/3346&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3346&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.GoogleWill = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
&lt;!-- vale Grafana.Parentheses = YES --&gt;
]]></content><description>&lt;h1 id="version-24-release-notes">Version 2.4 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.4.&lt;/p></description></item><item><title>Version 2.3 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-3/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-3/</guid><content><![CDATA[&lt;h1 id=&#34;version-23-release-notes&#34;&gt;Version 2.3 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.3.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;New &lt;a href=&#34;../../traceql/construct-traceql-queries/#experimental-structural&#34;&gt;structural operators&lt;/a&gt; in TraceQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ancestor (&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Parent (&lt;code&gt;&amp;lt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Not-child (&lt;code&gt;!&amp;gt;&lt;/code&gt;) (experimental)&lt;/li&gt;
&lt;li&gt;Not-descendant (&lt;code&gt;!&amp;gt;&amp;gt;&lt;/code&gt;) (experimental)&lt;/li&gt;
&lt;li&gt;Not-ancestor (&lt;code&gt;!&amp;lt;&amp;lt;&lt;/code&gt;) (experimental)&lt;/li&gt;
&lt;li&gt;Not-parent (&lt;code&gt;!&amp;lt;&lt;/code&gt;) (experimental)&lt;/li&gt;
&lt;li&gt;Not-siblings (&lt;code&gt;!~&lt;/code&gt;) (experimental)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TraceQL support for &lt;a href=&#34;../../traceql/construct-traceql-queries/#experimental-structural&#34;&gt;searching quoted attributes&lt;/a&gt; (for example, &lt;code&gt;{ span.&amp;quot;name with spaces&amp;quot; = &amp;quot;foo&amp;quot; }&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;../../operations/dedicated_columns/&#34;&gt;Dedicated attribute columns&lt;/a&gt; for improving query performance on your most frequently queried attributes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tempo 2.3 introduces &lt;a href=&#34;../../configuration/parquet/&#34;&gt;vParquet3&lt;/a&gt;, a Parquet version designed to be more compatible with other Parquet implementations, available as a production-ready option.
This block format improves query performance relative to previous formats.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&#34;/blog/2023/11/01/grafana-tempo-2.3-release-faster-trace-queries-traceql-upgrades/&#34;&gt;&lt;strong&gt;Tempo 2.3 blog post&lt;/strong&gt;&lt;/a&gt; for more examples and details about these improvements.&lt;/p&gt;
&lt;p&gt;These release notes highlight the most important features and bugfixes. For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#39;https://www.youtube.com/embed/2FWi9_dSBdM?rel=0&#39; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;The most important features and enhancements in Tempo 2.3 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;vparquet3-promoted-to-stable&#34;&gt;vParquet3 promoted to stable&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;../../configuration/parquet/&#34;&gt;vParquet3&lt;/a&gt;, an updated Parquet block format introduced in Tempo 2.2, has been promoted to stable and is production ready.
We&amp;rsquo;re excited about vParquet3 relative to prior formats because of its support for dedicated attribute columns, which help speed up queries on your largest and most queried attributes. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2649&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2649&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;To read more about the design of vParquet3, refer to &lt;a href=&#34;https://github.com/grafana/tempo/blob/main/docs/design-proposals/2023-05%20vParquet3.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;the design proposal&lt;/a&gt;.
For general information, refer to &lt;a href=&#34;../../operations/schema/&#34;&gt;the Apache Parquet schema&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;dedicated-attribute-columns&#34;&gt;Dedicated attribute columns&lt;/h4&gt;
&lt;p&gt;Dedicated attribute columns improve query performance by storing the largest and most frequently used attributes in their own columns, rather than in the generic attribute key-value list.&lt;/p&gt;
&lt;p&gt;Introduced with vParquet3, dedicated attribute columns are only available when using this storage format.&lt;/p&gt;
&lt;p&gt;To learn more about this new feature, refer to the &lt;a href=&#34;../../operations/dedicated_columns/&#34;&gt;Dedicated attribute columns&lt;/a&gt; documentation.&lt;/p&gt;
&lt;h3 id=&#34;traceql&#34;&gt;TraceQL&lt;/h3&gt;
&lt;p&gt;Unique to Tempo, TraceQL is a query language that lets you perform custom queries into your tracing data.
To learn more about the TraceQL syntax, see the &lt;a href=&#34;../../traceql/&#34;&gt;TraceQL documentation&lt;/a&gt;.
For information on planned future extensions to the TraceQL language, refer to &lt;a href=&#34;../../traceql/architecture/&#34;&gt;future work&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve made the following improvements to TraceQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added two structural operators, ancestor (&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;) and parent (&lt;code&gt;&amp;lt;&lt;/code&gt;) (&lt;a href=&#34;../../traceql/construct-traceql-queries/#experimental-structural&#34;&gt;documentation&lt;/a&gt;) [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2877&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2877&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added experimental not structural operators: &lt;code&gt;!&amp;gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;!&amp;gt;&lt;/code&gt;, &lt;code&gt;!&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;!&amp;lt;&lt;/code&gt;, and &lt;code&gt;!~&lt;/code&gt; (&lt;a href=&#34;../../traceql/construct-traceql-queries/#experimental-structural&#34;&gt;documentation&lt;/a&gt;) [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2993&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2993&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added quoted attribute syntax so you can search for attributes with spaces and other special characters in their names (&lt;a href=&#34;../../traceql/construct-traceql-queries/#experimental-structural&#34;&gt;documentation&lt;/a&gt;) [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3004&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3004&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved the performance of TraceQL &lt;a href=&#34;../../traceql/construct-traceql-queries/#select-spans&#34;&gt;&lt;code&gt;select()&lt;/code&gt; queries&lt;/a&gt;. Metrics-summary now also correctly handles missing attributes. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2765&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2765&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added support for searching by OpenTelemetry&amp;rsquo;s &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-proto/blob/afcd2aa7f728216d5891ffc0d83f09f0278a6611/opentelemetry/proto/trace/v1/trace.proto#L260&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;span status message &lt;/a&gt;using &lt;code&gt;statusMessage&lt;/code&gt; intrinsic attribute (&lt;a href=&#34;../../traceql/construct-traceql-queries/#intrinsic-fields&#34;&gt;documentation&lt;/a&gt;) [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2848&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2848&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed cases where an empty filter (&lt;code&gt;{}&lt;/code&gt;) didn&amp;rsquo;t return expected results [&lt;a href=&#34;https://github.com/grafana/tempo/issues/2498&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2498&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;metrics-generator&#34;&gt;Metrics-generator&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ve made the following improvements to metrics-generator:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a scope query parameter to &lt;code&gt;/api/overrides&lt;/code&gt; so users can choose between fetching the overrides stored by the API and the merged overrides (those actually used by Tempo) [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2915&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2915&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/3018&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#3018&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;TempoUserConfigurableOverridesReloadFailing&lt;/code&gt; alert [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2784&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2784&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added a metrics-generator configuration option to enable/disable X-Scope-OrgID headers on remote write to better support single-tenant setups. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2974&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2974&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Allowed metrics-generator ingestion slack to be configured on a per-tenant, rather than global, basis [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2589&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2589&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Added several metrics-generator fields to user-configurable overrides, including histogram buckets, collection-interval, and span metrics filter policies [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2906&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2906&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2711&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2711&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2928&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2928&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2899&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2899&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When upgrading to Tempo 2.3, be aware of these considerations and breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;transition-to-vparquet-3&#34;&gt;Transition to vParquet 3&lt;/h3&gt;
&lt;p&gt;Although the vParquet3 format isn&amp;rsquo;t yet the default, it&amp;rsquo;s production ready and we highly recommend switching to it for improved query performance and &lt;a href=&#34;../../operations/dedicated_columns/&#34;&gt;dedicated attribute columns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Upgrading to Tempo 2.3 doesn&amp;rsquo;t modify the Parquet block format. You can use Tempo 2.3 with vParquet2 or vParquet3. vParquet2 remains the default backend for Tempo 2.3; vParquet3 is available as a stable option.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Tempo 2.2 can&amp;rsquo;t read data stored in vParquet3.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;For information on upgrading, refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;Change the block format to vParquet3&lt;/a&gt; upgrade documentation.&lt;/p&gt;
&lt;h3 id=&#34;azure-sdk-v2&#34;&gt;Azure SDK v2&lt;/h3&gt;
&lt;p&gt;If you are using Azure storage, we recommend using the v2 SDK, &lt;a href=&#34;https://github.com/Azure/azure-sdk-for-go&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;azure-sdk-for-go&lt;/a&gt;.
You can use the &lt;code&gt;use_v2_sdk&lt;/code&gt; configure option for switching. For more information, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/configuration/#storage-block-configuration-example&#34;&gt;Storage block configuration example documentation&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/issues/2952&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2952&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;produce-debug-metrics-with-the-distributor&#34;&gt;Produce debug metrics with the distributor&lt;/h3&gt;
&lt;p&gt;You can now enable a new configuration block for the distributor to produce debug metrics. These metrics can be particularly useful when tracking down a process that&amp;rsquo;s creating an exceptional amount of spans. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/3008&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3008&lt;/a&gt;]&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;distributor:
  metric_received_spans:
    enabled: false
    root_only: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;changes-to-the-overrides-module-configuration&#34;&gt;Changes to the Overrides module configuration&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ve added a new &lt;code&gt;defaults&lt;/code&gt; block to the overrides module for configuring global or per-tenant settings. The Overrides change to indented syntax. For more information, read the &lt;a href=&#34;../../configuration/#overrides&#34;&gt;Overrides configuration documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can also use the Tempo CLI to migrate configurations. Refer to the &lt;a href=&#34;../../operations/tempo_cli/#migrate-overrides-config-command&#34;&gt;documentation&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2688&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2688&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;The old configuration block looked like this:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;overrides:
  ingestion_rate_strategy: local
  ingestion_rate_limit_bytes: 12345
  ingestion_burst_size_bytes: 67890
  max_search_duration: 17s
  forwarders: [&amp;#39;foo&amp;#39;]
  metrics_generator_processors: [service-graphs, span-metrics]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is an example of the new configuration block:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;overrides:
  defaults:
    ingestion:
      rate_strategy: local
      rate_limit_bytes: 12345
      burst_size_bytes: 67890
    read:
      max_search_duration: 17s
    forwarders: [&amp;#39;foo&amp;#39;]
    metrics_generator:
      processors: [service-graphs, span-metrics]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;removed-or-renamed-configuration-parameters&#34;&gt;Removed or renamed configuration parameters&lt;/h3&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Parameter&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;distributor.log_received_traces&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Use the &lt;code&gt;distributor.log_received_spans&lt;/code&gt; configuration block instead. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/3008&#34;&gt;#3008&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;code&gt;tempo_query_frontend_queries_total{op=&#34;searchtags|metrics&#34;}&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Removed deprecated frontend metrics configuration option
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h2 id=&#34;security-fixes&#34;&gt;Security fixes&lt;/h2&gt;
&lt;p&gt;The following vulnerabilities have been addressed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated Alpine image version to 3.18 to patch &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2022-48174&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2022-48174&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/3046&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3046&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Corrected a HTTP rapid reset issue vulnerability (&lt;a href=&#34;https://github.com/advisories/GHSA-4374-p667-p6c8&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2023-39325&lt;/a&gt;) &lt;a href=&#34;https://github.com/grafana/tempo/pull/3017&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3017&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bugfixes&#34;&gt;Bugfixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases/tag/v2.3.1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;231&#34;&gt;2.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Include statusMessage intrinsic attribute in tag search. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3084&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3084&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix compactor ignore configured S3 headers. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3154&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3149&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read session token to s3 credentials. &lt;a href=&#34;https://github.com/grafana/tempo/pull/3144&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3144&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;23&#34;&gt;2.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Loaded defaults for the internal server &lt;a href=&#34;https://github.com/grafana/tempo/pull/3041&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3041&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed pass-through to runtime overrides for FilterPolicies and TargetInfoExcludedDimensions &lt;a href=&#34;https://github.com/grafana/tempo/pull/3012&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3012&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a panic in metrics-summary API PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2738&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#2738&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a rare deadlock when uploading blocks to Azure Blob Storage &lt;a href=&#34;https://github.com/grafana/tempo/issues/2129&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2129&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Only search ingester blocks that fall within the request time range. &lt;a href=&#34;https://github.com/grafana/tempo/pull/2783&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2783&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aligned &lt;code&gt;tempo_query_frontend_queries_total&lt;/code&gt; and &lt;code&gt;tempo_query_frontend_queries_within_slo_total&lt;/code&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/pull/2840&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2840&lt;/a&gt;
This query now correctly tells you &lt;code&gt;%age&lt;/code&gt; of requests that are within SLO:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;traceql&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-traceql&#34;&gt;sum(rate(tempo_query_frontend_queries_within_slo_total{}[1m])) by (op)
/
sum(rate(tempo_query_frontend_queries_total{}[1m])) by (op)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed support for blob storage in Azure Stack Hub as a backend. &lt;a href=&#34;https://github.com/grafana/tempo/pull/2853&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2853&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Respected spss on GRPC streaming. &lt;a href=&#34;https://github.com/grafana/tempo/pull/2840&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2971&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Moved empty root span substitution from &lt;code&gt;querier&lt;/code&gt; to &lt;code&gt;query-frontend&lt;/code&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/issues/2671&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2671&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ingester errors correctly propagate on the query path &lt;a href=&#34;https://github.com/grafana/tempo/issues/2935&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2935&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed an issue where the ingester didn&amp;rsquo;t stop a query after timeout &lt;a href=&#34;https://github.com/grafana/tempo/pull/3031&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3031&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reordered the S3 credential chain and upgraded &lt;code&gt;minio-go&lt;/code&gt;. &lt;code&gt;native_aws_auth_enabled&lt;/code&gt; is deprecated &lt;a href=&#34;https://github.com/grafana/tempo/pull/3006&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3006&lt;/a&gt;&lt;/p&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.GoogleWill = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
&lt;!-- vale Grafana.Parentheses = YES --&gt;
&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="version-23-release-notes">Version 2.3 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.3.&lt;/p></description></item><item><title>Version 2.2 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-2/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-2/</guid><content><![CDATA[&lt;h1 id=&#34;version-22-release-notes&#34;&gt;Version 2.2 release notes&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.GoogleWill = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;!-- vale Grafana.Parentheses = NO --&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.2.&lt;/p&gt;
&lt;p&gt;This release gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Major additions to the TraceQL language: structural operators (descendant, child, sibling), results grouped by attribute (&lt;code&gt;by()&lt;/code&gt;), a &lt;code&gt;select&lt;/code&gt; operator, and 3 new intrinsic attributes.&lt;/li&gt;
&lt;li&gt;Faster TraceQL results, thanks to a streaming endpoint that returns partial results as the query executes as well as a multitude of performance-related improvements.&lt;/li&gt;
&lt;li&gt;An experimental metrics-summary API that returns RED metrics for recently received spans grouped by your attribute of choice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tempo 2.2 makes vParquet2, a Parquet version designed to be more compatible with other Parquet implementations, the default block format. This block format is required for using structural operators and improves query performance relative to previous formats.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&#34;/blog/2023/08/02/grafana-tempo-2.2-release-traceql-structural-operators-are-here/&#34;&gt;Tempo 2.2 blog post&lt;/a&gt; for more examples and details about these improvements.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;For a complete list of changes, enhancements, and bug fixes refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases/tag/v2.2.0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo 2.2 CHANGELOG&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;Some of the most important features and enhancements in Tempo 2.2 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;expanding-the-traceql-language&#34;&gt;Expanding the TraceQL language&lt;/h3&gt;
&lt;p&gt;With this release, we&amp;rsquo;ve added to the &lt;a href=&#34;../../traceql/&#34;&gt;TraceQL language&lt;/a&gt;.
TraceQL now offers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Structural operators: descendant (&amp;raquo;), child (&amp;gt;), and sibling (~) (&lt;a href=&#34;../../traceql/construct-traceql-queries/#structural&#34;&gt;documentation&lt;/a&gt;). Find relevant traces based on their structure and relationships among spans. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2625&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#2625&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/2660&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#2660&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;select()&lt;/code&gt; operation that allows you to specify arbitrary span attributes that you want included in the TraceQL response (&lt;a href=&#34;../../traceql/construct-traceql-queries/#selection&#34;&gt;documentation&lt;/a&gt;) [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2494&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2494&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;by()&lt;/code&gt; operation that groups span sets within a trace by an attribute of your choosing. This operation is not supported in the Grafana UI yet; you can only use &lt;code&gt;by()&lt;/code&gt; when querying the search API directly. [&lt;a href=&#34;../../traceql/construct-traceql-queries/#grouping&#34;&gt;documentation&lt;/a&gt; PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2490&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2490&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;New intrinsic attributes for use in TraceQL queries: &lt;code&gt;traceDuration&lt;/code&gt;, &lt;code&gt;rootName&lt;/code&gt;, and &lt;code&gt;rootServiceName&lt;/code&gt; (&lt;a href=&#34;../../traceql/&#34;&gt;documentation&lt;/a&gt;) [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2503&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#2503&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read the &lt;a href=&#34;/blog/2023/08/02/grafana-tempo-2.2-release-traceql-structural-operators-are-here/&#34;&gt;Tempo 2.2 blog post&lt;/a&gt; for examples of how to use these new language additions.&lt;/p&gt;
&lt;p&gt;To learn more about the TraceQL syntax, see the &lt;a href=&#34;../../traceql/construct-traceql-queries/&#34;&gt;TraceQL documentation&lt;/a&gt;.
For information on planned future extensions to the TraceQL language, refer to &lt;a href=&#34;../../traceql/architecture/&#34;&gt;future work&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;get-traceql-results-faster&#34;&gt;Get TraceQL results faster&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;re always trying to reduce the time you spend waiting to get results to your TraceQL queries, and we&amp;rsquo;ve made some nice progress on this front with this release.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve added a &lt;a href=&#34;https://grpc.io/docs/what-is-grpc/core-concepts/#bidirectional-streaming-rpc&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;gRPC streaming&lt;/a&gt; endpoint to the query frontend that allows a client to stream search results from Tempo. The Tempo CLI has been updated to use this new streaming endpoint [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2366&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#2366&lt;/a&gt;].
As of version 10.1, Grafana supports it as well, though you must first enable the &lt;code&gt;traceQLStreaming&lt;/code&gt; feature toggle [PR &lt;a href=&#34;https://github.com/grafana/grafana/pull/72288&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#72288&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;By streaming results to the client, you can start to look at traces matching your query before the entire query completes. This is particularly helpful for long-running queries; while the total time to complete the query is the same, you can start looking at your first matches before the full set of matched traces is returned.&lt;/p&gt;
&lt;p&gt;In addition to streaming partial results, we&amp;rsquo;ve merged a number of improvements to speed up TraceQL queries. Here are just a few:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add support for query batching between frontend and queriers to improve throughput [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2677&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2677&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Improve performance of TraceQL regular expressions [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2484&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2484&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fully skip over Parquet row groups with no matches in the column dictionaries [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2676&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2676&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Grafana.Spelling = NO --&gt;
&lt;ul&gt;
&lt;li&gt;New synchronous read mode for vParquet and vParquet2 [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/2165&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2165&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2535&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2535&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Grafana.Spelling = YES --&gt;
&lt;ul&gt;
&lt;li&gt;Improved TraceQL throughput by asynchronously creating jobs. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2530&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2530&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;metrics-summary-api-experimental&#34;&gt;Metrics summary API (experimental)&lt;/h3&gt;
&lt;p&gt;Tempo has added an experimental API that returns RED metrics (span count, erroring span count, and latency information) for spans of &lt;code&gt;kind=server&lt;/code&gt; sent in the last hour, grouped by an attribute of your choice.
For example, you could use this API to compare error rates of spans with different values of the &lt;code&gt;namespace&lt;/code&gt; attribute.
From here, you might see that spans from &lt;code&gt;namespace=A&lt;/code&gt; have a significantly higher error rate than those from &lt;code&gt;namespace=B&lt;/code&gt;.
As another example, you could use this API to compare latencies of your spans broken down by the &lt;code&gt;region&lt;/code&gt; attribute.
From here, you might notice that spans from &lt;code&gt;region=North-America&lt;/code&gt; have higher latencies than those from &lt;code&gt;region=Asia-Pacific&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This API is meant to enable as-needed analysis of your incoming spans; by segmenting your spans by attribute and looking for differences in RED metrics, you can more quickly isolate where problems like elevated error rates or higher latencies are coming from.&lt;/p&gt;
&lt;p&gt;Unlike RED metrics computed by the &lt;a href=&#34;../../metrics-generator/&#34;&gt;metrics-generator&lt;/a&gt;, the values returned by this API aren&amp;rsquo;t persisted as time series. This has the advantage that you don&amp;rsquo;t need to provide your own time series databases for storing and querying these metrics. It also allows you to compute RED metrics broken down by high cardinality attributes that would be too expensive to store in a time series database. Use the metrics generator if you want to store and visualize RED metrics over multi-hour or multi-day time ranges, or you want to alert on these metrics.&lt;/p&gt;
&lt;p&gt;To learn more about this API, refer to the &lt;a href=&#34;../../api_docs/metrics-summary/&#34;&gt;metrics summary API documentation.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This work is represented in multiple PRs: &lt;a href=&#34;https://github.com/grafana/tempo/pull/2368&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2368&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2418&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2418&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2424&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2424&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2442&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2442&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2480&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2480&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2481&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2481&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2501&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2501&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2579&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2579&lt;/a&gt;, and &lt;a href=&#34;https://github.com/grafana/tempo/pull/2582&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2582&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;other-enhancements&#34;&gt;Other enhancements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;../../api_docs/#search-tag-values&#34;&gt;tag values&lt;/a&gt; and &lt;a href=&#34;../../api_docs/#search-tags&#34;&gt;tag names&lt;/a&gt; APIs now support filtering [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2253&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2253&lt;/a&gt;]. This lets you retrieve all valid attribute values and names given certain criteria. For example, you can get a list of values for the attribute &lt;code&gt;namespace&lt;/code&gt; seen on spans with attribute &lt;code&gt;resource=A.&lt;/code&gt; This feature is off by default; to enable, configure &lt;code&gt;autocomplete_filtering_enabled&lt;/code&gt;. (
    &lt;a href=&#34;/docs/tempo/v2.10.x/api_docs/&#34;&gt;documentation&lt;/a&gt;). The autocomplete in Grafana can make use of this filtering capability to provide better suggestions starting in v10.2 &lt;a href=&#34;https://github.com/grafana/grafana/pull/67845&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR [67845]&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The metrics-generator now supports span filtering. Setting up filters allows you to compute metrics over the specific spans you care about, excluding others. It also can reduce the cardinality of generated metrics, and therefore the cost of storing those metrics in a Prometheus-compatible TSDB. (&lt;a href=&#34;../../metrics-generator/span_metrics/#filtering&#34;&gt;documentation&lt;/a&gt;) [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2274&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2274&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The metrics-generator can now detect virtual nodes (
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/service_graphs/#virtual-nodes&#34;&gt;documentation&lt;/a&gt;) [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2365&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2365&lt;/a&gt;]. As a result, you&amp;rsquo;ll now see these virtual nodes represented in your service graph.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.2, be aware of these breaking changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSonnet users only: We&amp;rsquo;ve converted the metrics-generator component from a k8s deployment to a k8s statefulset. Refer to the PR for seamless migration instructions. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/2533&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#2533&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2647&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#2467&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Removed or renamed configuration parameters (see section below)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While not a breaking change, upgrading to Tempo 2.2 will by default change the block format to vParquet2.
To stay on a previous block format, read the &lt;a href=&#34;../../configuration/parquet/#choose-a-different-block-format&#34;&gt;Parquet configuration documentation&lt;/a&gt;.
We strongly encourage upgrading to vParquet2 as soon as possible as this is required for using structural operators in your TraceQL queries and provides query performance improvements, in particular on queries using the &lt;code&gt;duration&lt;/code&gt; intrinsic.&lt;/p&gt;
&lt;h3 id=&#34;removed-or-renamed-configuration-parameters&#34;&gt;Removed or renamed configuration parameters&lt;/h3&gt;
&lt;p&gt;The following fields were removed or renamed.&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;Parameter
   &lt;/td&gt;
   &lt;td&gt;Comments
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;p&gt;
&lt;code&gt;  query_frontend:&lt;/code&gt;
&lt;p&gt;
&lt;code&gt;    tolerate_failed_blocks: &amp;lt;int&gt;&lt;/code&gt;
   &lt;/td&gt;
   &lt;td&gt;Remove support for `tolerant_failed_blocks` [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2416&#34;&gt;2416&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
&lt;p&gt;
&lt;code&gt;storage:&lt;/code&gt;
&lt;p&gt;
&lt;code&gt;  trace:&lt;/code&gt;
&lt;p&gt;
&lt;code&gt;    s3:&lt;/code&gt;
&lt;p&gt;
&lt;code&gt;      insecure_skip_verify: true   // renamed to tls_insecure_skip_verify&lt;/code&gt;
&lt;p&gt;
   &lt;/td&gt;
   &lt;td&gt;Renamed `insecure_skip_verify` to `tls_insecure_skip_verify` [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2407&#34;&gt;2407&lt;/a&gt;]
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h2 id=&#34;bug-fixes&#34;&gt;Bug fixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;224&#34;&gt;2.2.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated Alpine image version to 3.18 to patch &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2022-48174&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CVE-2022-48174&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/3046&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 3046&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bumped Jaeger query docker image to 1.50.0 &lt;a href=&#34;https://github.com/grafana/tempo/pull/2998&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2998&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;223&#34;&gt;2.2.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed S3 credentials providers configuration &lt;a href=&#34;https://github.com/grafana/tempo/pull/2889&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2889&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;222&#34;&gt;2.2.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed node role auth IDMSv1 &lt;a href=&#34;https://github.com/grafana/tempo/pull/2760&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2760&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;221&#34;&gt;2.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed incorrect metrics for index failures &lt;a href=&#34;https://github.com/grafana/tempo/pull/2781&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2781&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed a panic in the metrics-generator when using multiple tenants with default overrides &lt;a href=&#34;https://github.com/grafana/tempo/pull/2786&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2786&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Restored &lt;code&gt;tenant_header_key&lt;/code&gt; removed in &lt;a href=&#34;https://github.com/grafana/tempo/pull/2414&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2414&lt;/a&gt; &lt;a href=&#34;https://github.com/grafana/tempo/pull/2795&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2786&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Disabled streaming over HTTP by default &lt;a href=&#34;https://github.com/grafana/tempo/pull/2803&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2803&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;22&#34;&gt;2.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue in the metrics-generator that prevented scaling up parallelism when remote writing of metrics was lagging behind [PR &lt;a href=&#34;https://github.com/grafana/tempo/issues/2463&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2463&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed an issue where metrics-generator was setting wrong labels for &lt;code&gt;traces_target_info&lt;/code&gt; [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2546&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2546&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed an issue where matches and other spanset level attributes were not persisted to the TraceQL results. [PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2490&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2490&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Fixed an issue where ingester search could occasionally fail with &lt;code&gt;file does not exist&lt;/code&gt; error [PR &lt;a href=&#34;https://github.com/grafana/tempo/issues/2534&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2534&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.GoogleWill = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
&lt;!-- vale Grafana.Parentheses = YES --&gt;
]]></content><description>&lt;h1 id="version-22-release-notes">Version 2.2 release notes&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.GoogleWill = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;!-- vale Grafana.Parentheses = NO -->
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.2.&lt;/p></description></item><item><title>Version 2.1 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-1/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-1/</guid><content><![CDATA[&lt;h1 id=&#34;version-21-release-notes&#34;&gt;Version 2.1 release notes&lt;/h1&gt;
&lt;p&gt;The Tempo team is pleased to announce the release of Tempo 2.1.&lt;/p&gt;
&lt;p&gt;With this release, Tempo enhances TraceQL so you can select traces using features such as span kind, aribtrary arithmetic, and new aggregates min/max/sum. In addition, Tempo 2.1 introduces vParquet2, a new experimental Parquet version designed to be more compatible with other Parquet implementations.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: For a complete list of changes and enhancements, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo 2.1 changelog&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;Some of the most important features and enhancements in Tempo 2.1 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;enhancements-to-traceql&#34;&gt;Enhancements to TraceQL&lt;/h3&gt;
&lt;p&gt;Inspired by PromQL and LogQL, TraceQL is a query language designed for selecting traces in Tempo. TraceQL makes it possible to find traces that otherwise would have been difficult or even impossible to identify with Tempo’s 1.x search.&lt;/p&gt;
&lt;p&gt;With this release, we’ve expanded the TraceQL language. In Tempo 2.0, TraceQL allowed users to select traces based upon resource attributes, time, duration, and basic aggregates. In Tempo 2.1, users can also select traces based on the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable querying by &lt;code&gt;kind&lt;/code&gt;, an intrinsic attribute (PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2217&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2217&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{ kind = server }&lt;/code&gt;, &lt;code&gt;{ kind = client }&lt;/code&gt;, &lt;code&gt;{ kind = consumer }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{ kind = server &amp;amp;&amp;amp; duration &amp;gt; 1s }&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Support arithmetic expressions (PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2146&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2146&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{ span.bytesProcessed &amp;gt; 10 * 1024 * 1024 }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{ span.bytesProcessed / 1024 / 1024 &amp;gt; 10 }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{ span.jobs / span.bytes &amp;gt; 3 }&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enable min, max, and sum aggregate filters
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{} | min(duration) &amp;gt; 1s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{} | max(span.bytesProcessed) &amp;amp;lt; 1024 * 1024&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{} | sum(duration) &amp;gt; 1h&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Support for more numeric types: Compare floating point numbers and integers, allow floating point numbers for durations, and support negative numbers when doing aggregate filters. (PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2139&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2139&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2304&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2304&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2289&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2289&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{ 1 = 1.0 }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{ duration &amp;gt; 1.5s }&lt;/code&gt;, &lt;code&gt;{duration &amp;gt; 1s500ms }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{} | count() &amp;gt; -1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This update also includes major performance improvements to TraceQL query performance. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2119&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2119&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;To learn more about the TraceQL syntax, see the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/&#34;&gt;TraceQL documentation&lt;/a&gt;. For information on planned future extensions to the TraceQL language, see 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/architecture/&#34;&gt;future work&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;traceql-query-editor-improvements-experimental&#34;&gt;TraceQL query editor improvements (experimental)&lt;/h3&gt;
&lt;p&gt;Starting in Grafana 9.5, users have access to a Tempo Search tab powered by TraceQL. To enable this feature, use Grafana’s &lt;code&gt;traceqlSearch&lt;/code&gt; feature flag. The editor can autocomplete queries and has a streamlined interface.&lt;/p&gt;
&lt;p&gt;Grafana will soon include a new Search screen that can build a TraceQL query based upon options selected in drop-downs. Contact Support to enable this feature in Grafana Cloud.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/media/docs/tempo/traceql/screenshot-explore-traceql-search.png&#34;
  alt=&#34;A TraceQL search constructed by selecting options&#34; width=&#34;784&#34;
     height=&#34;512&#34;/&gt;&lt;/p&gt;
&lt;p&gt;For more information, refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/traceql/query-editor/&#34;&gt;TraceQL query editor documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;vparquet2-experimental&#34;&gt;vParquet2 (experimental)&lt;/h3&gt;
&lt;p&gt;Tempo 2.1 offers an experimental update to the Parquet backend: &lt;code&gt;vParquet2&lt;/code&gt;. Due to the dedicated span duration column, there is a performance gain for TraceQL queries containing duration. vParquet2 will also be a prerequisite for TraceQL&amp;rsquo;s structural operators, which will be introduced in a future release. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2244&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2244&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;You can select the block format Tempo uses by changing the block format version option. To use the new format, set the block format to &lt;code&gt;vParquet2&lt;/code&gt;. For more information, read the &lt;a href=&#34;../../configuration/parquet/#choose-a-different-block-format&#34;&gt;Parquet configuration documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The new encoding implements Parquet schema changes that are not compatible with &lt;code&gt;vParquet&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Renamed columns to make the schema more consistent and closer to names and terminologies used by OTEL&lt;/li&gt;
&lt;li&gt;Add a dedicated span column for duration&lt;/li&gt;
&lt;li&gt;Additional columns that will enable new TraceQL features, including hierarchical queries&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-enhancements-and-features&#34;&gt;Other enhancements and features&lt;/h3&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo 2.1 changelog&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2105&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2105&lt;/a&gt; Log when a trace is too large to compact. Traces are dropped when they exceed a certain limit set in the ingesters. Any dropped traces are now logged with the number of dropped spans and the trace ID.&lt;/li&gt;
&lt;li&gt;PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2195&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2195&lt;/a&gt; Add support for Azure Workload Identity authentication&lt;/li&gt;
&lt;li&gt;PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2130&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2130&lt;/a&gt; Add command to tempo-cli to migrate a tenant&lt;/li&gt;
&lt;li&gt;PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2093&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2093&lt;/a&gt; Add support for s3 session token in static configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.1, be aware of these breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;breaking-changes-to-metric-names-exposed-by-tempo&#34;&gt;Breaking changes to metric names exposed by Tempo&lt;/h3&gt;
&lt;p&gt;All Prometheus metrics exposed by Tempo on its &lt;code&gt;/metrics&lt;/code&gt; endpoint that were previously prefixed with &lt;code&gt;cortex_&lt;/code&gt; have now been renamed to be prefixed with &lt;code&gt;tempo_&lt;/code&gt; instead. (PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2204&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2204&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Tempo now includes SLO metrics to count where queries are returned within a configurable time range. (PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2008&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2008&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;query_frontend_result_metrics_inspected_bytes&lt;/code&gt; metric was removed in favor of &lt;code&gt;query_frontend_bytes_processed_per_second&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;remove-support-for-search-on-v2-blocks&#34;&gt;Remove support for Search on v2 blocks&lt;/h3&gt;
&lt;p&gt;Users can no longer search blocks in v2 format. Only vParquet and vParquet2 formats support search. The following search configuration options were removed from the overrides section:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;overrides:
  max_search_bytes_per_trace:
  search_tags_allow_list:
  search_tags_deny_list:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following metrics configuration was also removed:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;tempo_ingester_trace_search_bytes_discarded_total&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This change means that if you upgrade directly from 1.9 to 2.1, you will not be able to search your v2 blocks.
One way to avoid this is to upgrade to 2.0 first, since 2.0 supports searching both v2 and vParquet blocks.
You can let your old v2 blocks gradually age out while Tempo creates new vParquet blocks from incoming traces.
Once all of your v2 blocks have been deleted and you only have vParquet format-blocks, you can upgrade to Tempo 2.1.
All of your blocks will be searchable.&lt;/p&gt;
&lt;p&gt;Finally, parquet files are no longer cached when carrying out searches (&lt;a href=&#34;https://github.com/grafana/tempo/pull/2164&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2164&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&#34;bug-fixes&#34;&gt;Bug fixes&lt;/h2&gt;
&lt;p&gt;For a complete list, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo 2.1 changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;211&#34;&gt;2.1.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/issues/2400&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2400&lt;/a&gt; Fixed issue where Tempo sometimes flips booleans from false-&amp;gt;true at storage time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;21&#34;&gt;2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2220&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2220&lt;/a&gt; Correctly connect context during compaction&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2081&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2081&lt;/a&gt; Apply &lt;code&gt;rate()&lt;/code&gt; to the bytes/s panel in the tenant&amp;rsquo;s dashboard.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2111&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2111&lt;/a&gt; Retry copy operations during compaction in GCS backend.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2164&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2164&lt;/a&gt; Improve locking and search head block in SearchTagValuesV2&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2152&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2152&lt;/a&gt; Fix not closing WAL block file before attempting to delete the folder.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2219&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2219&lt;/a&gt; Stop searching for virtual tags if there are any hits. This prevents invalid values from showing up for intrinsics like &lt;code&gt;status&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2254&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2254&lt;/a&gt; Correctly return unique spans when &amp;amp;&amp;amp;ing and ||ing spansets.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="version-21-release-notes">Version 2.1 release notes&lt;/h1>
&lt;p>The Tempo team is pleased to announce the release of Tempo 2.1.&lt;/p>
&lt;p>With this release, Tempo enhances TraceQL so you can select traces using features such as span kind, aribtrary arithmetic, and new aggregates min/max/sum. In addition, Tempo 2.1 introduces vParquet2, a new experimental Parquet version designed to be more compatible with other Parquet implementations.&lt;/p></description></item><item><title>Version 2.0 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-0/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/v2-0/</guid><content><![CDATA[&lt;h1 id=&#34;version-20-release-notes&#34;&gt;Version 2.0 release notes&lt;/h1&gt;
&lt;p&gt;The Tempo team is pleased to announce the newest major release of Tempo: version 2.0!&lt;/p&gt;
&lt;p&gt;Tempo 2.0’s headline feature is the introduction of TraceQL. TraceQL is a query language modeled on PromQL and LogQL that allows you to interactively extract insights from your trace data. It provides a powerful, flexible way to pinpoint the traces you need to answer questions about your systems and analyze traces based on their structure.&lt;/p&gt;
&lt;p&gt;Continuing in the tradition of Tempo’s close integration with Grafana as a visualization layer, we’ve also added a TraceQL query editor to Grafana’s Tempo data source. The editor is available in Grafana Cloud and for open source users in Grafana 9.3.2. We encourage open source users to upgrade to Grafana 9.4 as soon as it is released to take advantage of some additional enhancements and bug fixes.&lt;/p&gt;
&lt;p&gt;In addition to TraceQL, Tempo 2.0 also marks the promotion of the Apache Parquet block format to the new default storage format. With this change, the Tempo maintainers are signaling that this new format has received enough testing to be ready for broad adoption.&lt;/p&gt;
&lt;p&gt;These two changes actually go hand-in-hand: without the increased search speed enabled by the Apache Parquet block format, it would be impossible to pull off the sophisticated queries made possible by TraceQL.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: For a complete list of changes and enhancements, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo 2.0 changelog&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;features-and-enhancements&#34;&gt;Features and enhancements&lt;/h2&gt;
&lt;p&gt;Some of the most important features and enhancements in Tempo 2.0 are highlighted below.&lt;/p&gt;
&lt;h3 id=&#34;traceql-the-trace-query-language&#34;&gt;TraceQL, the trace query language&lt;/h3&gt;
&lt;p&gt;Inspired by PromQL and LogQL, TraceQL is a query language designed for selecting traces in Tempo. TraceQL makes it possible to find traces that otherwise would have been difficult or even impossible to identify with Tempo&amp;rsquo;s existing search. It also makes it possible for you to understand the broad context for an event sequence.
To understand more about why we built TraceQL and the use cases we think it unlocks, see &lt;a href=&#34;/blog/2022/11/30/traceql-a-first-of-its-kind-query-language-to-accelerate-trace-analysis-in-tempo-2.0/&#34;&gt;our blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With this release, we’ve implemented a subset of the full TraceQL language we envision. Users can select traces based on the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Span and resource attributes, timing, and duration&lt;/li&gt;
&lt;li&gt;Basic aggregates: &lt;code&gt;count()&lt;/code&gt; and &lt;code&gt;avg()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more about the TraceQL syntax, see the &lt;a href=&#34;../../traceql/&#34;&gt;TraceQL documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can run a TraceQL query either by issuing it to Tempo’s &lt;code&gt;q&lt;/code&gt; parameter of the &lt;a href=&#34;../../api_docs/#search&#34;&gt;&lt;code&gt;search&lt;/code&gt; API endpoint&lt;/a&gt;, or, for those using Tempo in conjunction with Grafana, by using Grafana’s TraceQL query editor, described below.&lt;/p&gt;
&lt;p&gt;TraceQL requires Tempo’s Parquet columnar format, which is the default block format in Tempo 2.0. For more information, refer to the Tempo &lt;a href=&#34;../../configuration/parquet/&#34;&gt;Apache Parquet block format&lt;/a&gt; documentation.&lt;/p&gt;
&lt;h3 id=&#34;traceql-query-editor-in-grafana&#34;&gt;TraceQL query editor in Grafana&lt;/h3&gt;
&lt;p&gt;To make it easier to run and visualize the results of TraceQL queries, we’ve added a TraceQL query editor to Grafana’s Tempo data source. The editor is available in Grafana’s Explore interface starting in Grafana version 9.3.2.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;&lt;img src=&#34;../../traceql/assets/query-editor-results-span.png&#34; alt=&#34;Query editor showing span results&#34; /&gt;&lt;/p&gt;
&lt;p&gt;The query editor helps you learn TraceQL by offering autocomplete.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;&lt;img src=&#34;../../traceql/assets/query-editor-auto-complete.png&#34; alt=&#34;Query editor showing the auto-complete feature&#34; /&gt;&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&#34;../../traceql/query-editor/&#34;&gt;TraceQL query editor documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;apache-parquet-block-format-is-the-new-default&#34;&gt;Apache Parquet block format is the new default&lt;/h3&gt;
&lt;p&gt;The experimental Apache Parquet columnar block format introduced in Tempo v1.5 has been promoted to stable and is now the default trace storage for Tempo 2.0. We&amp;rsquo;re excited to switch to it because of the increased speed and efficiency it provides for search.&lt;/p&gt;
&lt;p&gt;With our previous block format, we&amp;rsquo;d seen our ability to search trace data cap out at a rate of ~40-50 GB per second. Since switching to Parquet, we&amp;rsquo;re now hitting search speeds of 300 GB/s on common queries and doing so with less compute. If we define the bytes processed as the total trace bytes that are scanned, then this example query resulted in ~1.2 TB/s:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;{ resource.cluster =&amp;#34;foo&amp;#34; }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and this query resulted in ~550 GB/s:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;{ span.foo =&amp;#34;bar&amp;#34; }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Another benefit of the Parquet block format relative to our previous format is that users can now leverage the large ecosystem of existing Parquet tools and libraries to process and transform their trace data. We look forward to see what downstream applications people create with this ability.&lt;/p&gt;
&lt;p&gt;The Parquet block format can be used as a drop-in replacement for Tempo’s existing block format. No data conversion or upgrade process is necessary. As soon as the Parquet format is enabled, Tempo starts writing data in that format, leaving existing data as-is.&lt;/p&gt;
&lt;p&gt;Tempo search will return results from both the legacy and Parquet block formats. However, search on legacy blocks has been marked as deprecated and will be removed in Tempo 2.1.&lt;/p&gt;
&lt;p&gt;TraceQL queries will only search trace data stored in Parquet blocks.
For more information, refer to the &lt;a href=&#34;../../configuration/parquet/&#34;&gt;Parquet documentation&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: There is a potential issue loading Tempo 1.5&amp;rsquo;s experimental Parquet storage blocks. You may see errors or even panics in the compactors. We have only been able to reproduce this with interim commits between 1.5 and 2.0, but if you experience any issues please &lt;a href=&#34;https://github.com/grafana/tempo/issues/new?assignees=&amp;amp;labels=&amp;amp;template=bug_report.md&amp;amp;title=&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;report them&lt;/a&gt; so we can isolate and fix this issue.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;search-and-metrics-generator-enabled-by-default&#34;&gt;Search and metrics-generator enabled by default&lt;/h3&gt;
&lt;p&gt;Search and &lt;a href=&#34;../../metrics-generator/&#34;&gt;metrics-generator&lt;/a&gt; are now enabled by default in Tempo 2.0, and their corresponding configuration parameters (&lt;code&gt;search_enabled&lt;/code&gt; and &lt;code&gt;metrics_generator_enabled&lt;/code&gt;) have been removed.&lt;/p&gt;
&lt;p&gt;We’ve been excited by the feedback we’ve gotten on both features and are satisfied with their stability so we want all newcomers to Tempo to have access to them from day 1.&lt;/p&gt;
&lt;p&gt;Although the metrics-generator component is now enabled by default, no actual metrics will be generated until certain tenant-specific configuration parameters have been set. For more information, refer to the &lt;a href=&#34;../../configuration/&#34;&gt;metrics-generator configuration documentation&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Grafana Cloud customers need to contact Grafana Support to enable metrics generation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As part of promoting the metrics-generator to default on, we&amp;rsquo;ve made the following improvements to it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The metrics-generator now handles collisions between user-defined and default dimensions. User-defined dimensions colliding with default dimensions will be prefixed with &lt;code&gt;__&lt;/code&gt;. &lt;a href=&#34;https://github.com/grafana/tempo/pull/1794&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1794&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The metrics-generator now makes intrinsic dimensions configurable and disables &lt;code&gt;status_message&lt;/code&gt; by default &lt;a href=&#34;https://github.com/grafana/tempo/pull/1960&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1960&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The metrics-generator now computes a metric that tells you the size (in bytes) of spans received broken down by team, service, or other relevant labels. Since span volume roughly correlates with the cost to operate Tempo, this metric is helpful for cost attribution and chargeback purposes. &lt;a href=&#34;https://github.com/grafana/tempo/pull/1662&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1662&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Older spans are now filtered out before metrics are aggregated. This is helpful since including these older span in metric computation can lead to misleading or incorrect results. &lt;a href=&#34;https://github.com/grafana/tempo/pull/1612&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1612&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Label names and values that exceed a configurable length are truncated. In this way, the Tempo metrics-generator sanitizes metrics before sending them to a receiving time-series-database (which usually has its own limits around maximum label length). &lt;a href=&#34;https://github.com/grafana/tempo/pull/1897&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1897&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;zone-aware-replication-for-ingesters&#34;&gt;Zone-aware replication for ingesters&lt;/h3&gt;
&lt;p&gt;Zone awareness is a feature that ensures data is replicated across failure domains (which we refer to as &amp;ldquo;zones&amp;rdquo;) to provide greater reliability. A failure domain is whatever you define it to be, but commonly may be an availability zone, data center, or server rack.&lt;/p&gt;
&lt;p&gt;When zone awareness is enabled for ingesters, incoming trace data is guaranteed to be replicated to ingesters in different zones. This allows the system to withstand the loss of one or more zones (depending on the replication factor).&lt;/p&gt;
&lt;p&gt;Thank you to community member manohar-koukuntla for making this contribution!&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;# use the following fields in _config field of jsonnet config, to enable zone aware ingesters.
multi_zone_ingester_enabled: false,
multi_zone_ingester_migration_enabled: false,
multi_zone_ingester_replicas: 0,
multi_zone_ingester_max_unavailable: 25,&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;upgrade-considerations&#34;&gt;Upgrade considerations&lt;/h2&gt;
&lt;p&gt;When 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;upgrading&lt;/a&gt; to Tempo 2.0, be aware of these breaking changes.&lt;/p&gt;
&lt;h3 id=&#34;defaults-updated&#34;&gt;Defaults updated&lt;/h3&gt;
&lt;p&gt;The following configuration parameters have been updated with new default values. These defaults were changed to work better with the new Parquet block format. &lt;a href=&#34;https://github.com/grafana/tempo/pull/1978&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1978&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are sticking with the &lt;code&gt;v2&lt;/code&gt; format you may prefer the old values.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;query_frontend:
  max_oustanding_per_tenant: 2000
  search:
    concurrent_jobs: 1000
    target_bytes_per_job: 104857600
    max_duration: 168h
    query_ingesters_until: 30m
  trace_by_id:
    query_shards: 50
querier:
  max_concurrent_queries: 20
  search:
    prefer_self: 10
ingester:
  concurrent_flushes: 4
  max_block_duration: 30m
  max_block_bytes: 524288000
storage:
  trace:
    pool:
      max_workers: 400
      queue_depth: 20000
    search:
      read_buffer_count: 32
      read_buffer_size_bytes: 1048576&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;removed-and-renamed-configuration-parameters&#34;&gt;Removed and renamed configuration parameters&lt;/h3&gt;
&lt;p&gt;The following tables describe the parameters that have been removed or renamed. (PR#1978)&lt;/p&gt;
&lt;h4 id=&#34;removed&#34;&gt;Removed&lt;/h4&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;pre&gt;query_frontend:&lt;br/&gt;  query_shards:&lt;/pre&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Replaced by &lt;code&gt;trace_by_id.query_shards&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;pre&gt;querier:&lt;br&gt;  query_timeout:&lt;/pre&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Replaced by two different settings: &lt;code&gt;search.query_timeout&lt;/code&gt; and &lt;code&gt;trace_by_id.query_timeout&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;pre&gt;ingester:&lt;br&gt;  use_flatbuffer_search:&lt;/pre&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Removed and automatically determined based on block format&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;search_enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Removed. Now defaults to true.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;metrics_generator_enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Removed. Now defaults to true.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;pre&gt;storage:&lt;br&gt;  wal:&lt;br&gt;    version:&lt;/pre&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Removed and pinned to &lt;code&gt;block.version&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h4 id=&#34;renamed&#34;&gt;Renamed&lt;/h4&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;query_frontend:&lt;br&gt;  query_shards:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed &lt;code&gt;query_frontend.trace_by_id.query_shards&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;querier:&lt;br&gt;  query_timeout:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed &lt;code&gt;querier.trace_by_id.query_timeout&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;The following &lt;code&gt;compactor&lt;/code&gt; configuration parameters were renamed.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;compaction:&lt;br&gt;  chunk_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_in_buffer_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;compaction:&lt;br&gt;  flush_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_out_buffer_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;compaction:&lt;br&gt;  iterator_buffer_size:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_prefetch_traces_count&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;The following &lt;code&gt;storage&lt;/code&gt; configuration parameters were renamed.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;wal:&lt;br&gt;  encoding:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_encoding&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  index_downsample_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_index_downsample_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  index_page_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_index_page_size_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  encoding:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_encoding&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  row_group_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;parquet_row_group_size_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;other-upgrade-considerations&#34;&gt;Other upgrade considerations&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1879&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1879&lt;/a&gt;. The Azure Storage configuration now uses snake case with underscores (&lt;code&gt;_&lt;/code&gt;) instead of dashes (&lt;code&gt;-&lt;/code&gt;)Use snake case on Azure Storage config. Here is an example of using snake case on Azure Storage config:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;# config.yaml
storage:
  trace:
    azure:
      storage_account_name:
      storage_account_key:
      container_name:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1678&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1678&lt;/a&gt;. Parquet is the new default block version. To continue using the v2 block format, see the &lt;a href=&#34;../../configuration/parquet/&#34;&gt;Parquet configuration documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1810&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1810&lt;/a&gt;. We&amp;rsquo;ve deleted the &lt;code&gt;TempoRequestErrors&lt;/code&gt; alert from mixin. Any Jsonnet users relying on this alert should copy this into their own environment.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1754&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1754&lt;/a&gt;. We&amp;rsquo;ve added TLS support to the vulture. Internal types are updated to use &lt;code&gt;scope&lt;/code&gt; instead of &lt;code&gt;instrumentation_library&lt;/code&gt;. This is a breaking change in &amp;ldquo;trace by ID&amp;rdquo; type queries if JSON is requested.&lt;/p&gt;
&lt;h2 id=&#34;bug-fixes&#34;&gt;Bug fixes&lt;/h2&gt;
&lt;h3 id=&#34;201&#34;&gt;2.0.1&lt;/h3&gt;
&lt;h4 id=&#34;enhancements&#34;&gt;Enhancements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/issues/2059&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2059&lt;/a&gt; No longer return &lt;code&gt;status.code&lt;/code&gt; from &lt;code&gt;/api/search/tags&lt;/code&gt; unless it is an attribute present in the data,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2062&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2062&lt;/a&gt; Pad leading zeroes in span id to always be 16 characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;bug-fixes-1&#34;&gt;Bug fixes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2058&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2058&lt;/a&gt; Suppress logspam in single binary mode when metrics generator is disabled.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2055&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2055&lt;/a&gt; Error more gracefully while reading some blocks written by an interim commit between 1.5 and 2.0.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2095&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2095&lt;/a&gt; Correctly coalesce trace level data when combining Parquet traces.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/issues/2114&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2114&lt;/a&gt; Unescape query parameters in AWS Lambda to allow TraceQL queries to work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;20-bug-fixes&#34;&gt;2.0 bug fixes&lt;/h3&gt;
&lt;p&gt;Version 2.0 includes the following fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1887&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1887&lt;/a&gt; Stop distributors on OTel receiver fatal error.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1700&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1700&lt;/a&gt; New wal file separator &lt;code&gt;&#43;&lt;/code&gt; for the NTFS filesystem and backward compatibility with the old separator &lt;code&gt;:&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1697&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1697&lt;/a&gt; Honor caching and buffering settings when finding traces by ID.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1723&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1723&lt;/a&gt; Correctly propagate errors from the iterator layer up through the queriers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1781&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1781&lt;/a&gt; Make multitenancy work with HTTP.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1799&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1799&lt;/a&gt; Fix parquet search bug fix on &lt;code&gt;http.status_code&lt;/code&gt; that may cause incorrect results to be returned.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1813&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1813&lt;/a&gt; Fix failing &lt;code&gt;SearchTagValues&lt;/code&gt; endpoint after startup.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/913&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1913&lt;/a&gt; tempo-mixin: tweak dashboards to support metrics without cluster label present.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1920&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1920&lt;/a&gt; Fix docker-compose examples not running on Apple M1 hardware.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1939&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1939&lt;/a&gt; Fix TraceQL parsing of most binary operations to not require spacing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1947&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1947&lt;/a&gt; Don&amp;rsquo;t persist tenants without blocks in the ingester.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1948&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1948&lt;/a&gt; TraceQL: span scope not working with ranges.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/1997&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 1997&lt;/a&gt; TraceQL: skip live traces search.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/pull/2003&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2003&lt;/a&gt; Return more consistent search results by combining partial traces.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="version-20-release-notes">Version 2.0 release notes&lt;/h1>
&lt;p>The Tempo team is pleased to announce the newest major release of Tempo: version 2.0!&lt;/p>
&lt;p>Tempo 2.0’s headline feature is the introduction of TraceQL. TraceQL is a query language modeled on PromQL and LogQL that allows you to interactively extract insights from your trace data. It provides a powerful, flexible way to pinpoint the traces you need to answer questions about your systems and analyze traces based on their structure.&lt;/p></description></item><item><title>Version 1 release notes</title><link>https://grafana.com/docs/tempo/v2.10.x/release-notes/version-1/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/release-notes/version-1/</guid><content><![CDATA[&lt;h1 id=&#34;version-1-release-notes&#34;&gt;Version 1 release notes&lt;/h1&gt;
&lt;p&gt;Release notes for Grafana Tempo version 1.x releases.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v2.10.x/release-notes/version-1/v1-5/&#34;&gt;Version 1.5 release notes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v2.10.x/release-notes/version-1/v1-4/&#34;&gt;Version 1.4 release notes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v2.10.x/release-notes/version-1/v1-3/&#34;&gt;Version 1.3 release notes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v2.10.x/release-notes/version-1/v1-2/&#34;&gt;Version 1.2 release notes&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
]]></content><description>&lt;h1 id="version-1-release-notes">Version 1 release notes&lt;/h1>
&lt;p>Release notes for Grafana Tempo version 1.x releases.&lt;/p>
&lt;ul>&lt;li>
&lt;a href="/docs/tempo/v2.10.x/release-notes/version-1/v1-5/">Version 1.5 release notes&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/tempo/v2.10.x/release-notes/version-1/v1-4/">Version 1.4 release notes&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/tempo/v2.10.x/release-notes/version-1/v1-3/">Version 1.3 release notes&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/tempo/v2.10.x/release-notes/version-1/v1-2/">Version 1.2 release notes&lt;/a>&lt;/li>&lt;/ul></description></item></channel></rss>