This release focuses on three things: faster hydration of long-span traces, alert-storm suppression, and a better natural-language query, plus fixes and known issues.
Previously, opening a trace with over a thousand spans could take seconds or even tens of seconds to hydrate — that is, to assemble the span data into a call tree by parent-child relationships. For an on-call engineer staring at a red dashboard, those seconds feel like forever, and they add up across a team during an incident. The slowness came from the old logic, which fetched spans one at a time and then assembled the tree in memory, so the cost grew linearly with span count.
This release rewrites the hydration logic to use bulk loading instead of per-span queries:
The change is transparent to callers — the trace_id query API signature is unchanged, so no client updates are required. Under the hood, the new path issues a single indexed range query for all spans of a trace instead of one query per span, which is why the improvement is most visible on traces with thousands of spans.
A single flaky upstream service can trigger dozens of alerts and flood the on-call channel, burying the one alert that actually matters. v2.4.0 adds inhibition rules to keep the noise down:
Example configuration:
alerting:
inhibition:
- source_match: {service: "db-master"}
target_match: {service: ".*-consumer"}
equal: [alertname]
silence:
- matcher: {env: "staging"}
starts_at: "2026-10-07T02:00:00Z"
ends_at: "2026-10-07T04:00:00Z"
Inhibition reduces alert fatigue, which matters because an on-call engineer who has been woken up by noise five times stops trusting the pager. Note that inhibition is different from deduplication: deduplication collapses identical alerts, while inhibition suppresses downstream alerts whose root cause is already being reported, so the channel shows the cause rather than the symptoms.
The natural-language-to-query feature (NL2Query) improves on two fronts this release:
You: Anything wrong with the payment service in the last hour?
Assistant: Generated a query showing the ERROR and WARN distribution for the last hour.
SQL: SELECT level, count(*) FROM logs
WHERE service='pay-service' AND ts > now()-1h
GROUP BY level
Showing the SQL is a deliberate choice: the model proposes, you dispose. If the generated query is wrong, you see exactly why and fix it in place, rather than wondering why the results look off. NL2Query works in both Chinese and English, and it confirms with you before running anything expensive — a broad time range or an unconstrained full-text scan — so a casual question can't accidentally trigger a heavyweight query. For teams whose day-to-day operations run in Chinese, the dual-language support means everyone can use it, not just those comfortable composing queries by hand.
Fixes
GROUP BY aggregationKnown issues
equal matcher in alert inhibition does not support regular expressions yetUpgrade notes
Upgrading from v2.3.x requires no data migration; the hydration rewrite is backward-compatible with existing stored spans. Alert inhibition rules are additive and disabled by default, so existing alerting behavior is unchanged until you opt in.
See the release page for the full changelog, and back up your configuration before upgrading.