<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Grafana Labs blog on Grafana Labs</title>
<link>https://grafana.com/blog/</link>
<description>Recent content in Grafana Labs blog</description>
<atom:link href="/blog/index.xml" rel="self" type="application/rss+xml"/><item>
<title>Get observability in your pocket with the Grafana mobile app</title>
<link>https://grafana.com/blog/get-observability-in-your-pocket-with-the-grafana-mobile-app/</link>
<pubDate>Thu, 15 Oct 2026 22:39:33 +0000</pubDate>
<author>Ksenia Yadav</author>
<guid>https://grafana.com/blog/get-observability-in-your-pocket-with-the-grafana-mobile-app/</guid>
<description>
&lt;p&gt;When you’re on the go, your phone is often the only observability tool you have. And what you can do with it in the first few minutes matters. &lt;/p&gt;&lt;p&gt;With the incredible innovation that has gone into mobile CPUs, GPUs and displays, a phone is a powerful device where you can immediately see what’s happening and start acting on it. And the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/platform/mobile-app/&quot;&gt;Grafana mobile app&lt;/a&gt;&lt;/u&gt; now allows you to both see and act. &lt;/p&gt;&lt;p&gt;The app (available for &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.grafana.oncall.prod&amp;hl=en_US&quot;&gt;Android&lt;/a&gt; and &lt;a href=&quot;https://apps.apple.com/us/app/grafana/id1669759048&quot;&gt;iOS&lt;/a&gt;) has always been good at notifying you of what&#39;s happening—alerts, incidents, and on-call schedules, previously under the Grafana IRM name. Now you can also ask questions in natural language, view your dashboards, and take actions across your stack. It is not a smaller, more cramped version of your computer, but a powerful starting point for the first few minutes of an incident. &lt;/p&gt;&lt;h2&gt;Grafana Assistant on your phone&lt;/h2&gt;&lt;p&gt;&lt;u&gt;&lt;a href=&quot;https://grafana.com/products/cloud/ai-assistant/&quot;&gt;Grafana Assistant&lt;/a&gt;&lt;/u&gt; is a context-aware agent that can answer questions and take action across your stack. It already lives where you work: as a sidebar chat in the Grafana web UI, in &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/platform/grafana-assistant/platform/workspace/&quot;&gt;Workspace&lt;/a&gt;&lt;/u&gt; if you prefer a conversation-focused experience for Grafana, in &lt;a href=&quot;https://grafana.com/docs/grafana-cloud/platform/grafana-assistant/configure/slack/&quot;&gt;Slack&lt;/a&gt; or &lt;a href=&quot;https://grafana.com/whats-new/2026-07-31-grafana-assistant-for-microsoft-teams-is-now-in-private-preview/&quot;&gt;Microsoft Teams&lt;/a&gt;, or through &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/as-code/observability-as-code/grafana-cli/gcx/&quot;&gt;gcx&lt;/a&gt;&lt;/u&gt; on the command line. It now runs on your phone, too, with the same conversations and the same abilities. &lt;/p&gt;&lt;p&gt;What makes Assistant useful is that it never starts from zero. It knows which stack you&#39;re in, which dashboard or alert you&#39;re looking at, and how your data is shaped. &lt;/p&gt;&lt;p&gt;With Assistant on your phone, you can:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understand alerts and incidents: &lt;/strong&gt;Catch up on what’s happened, explore what changed, and check whether a problem has occurred before.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Find relevant dashboards:&lt;/strong&gt; Ask which dashboards can help you understand an issue and open them right from the conversation.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check your on-call schedule:&lt;/strong&gt; Find out when you’re on rotation without hunting through schedules.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Launch an investigation:&lt;/strong&gt; Get Assistant working on a complex issue before you reach your laptop.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pick up where you left off:&lt;/strong&gt; Continue the same conversation on your computer, with the context intact.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Getting started takes just a question. For example, when an alert fires, you can open Assistant directly from it. The alert context is automatically included in the conversation, so you can immediately ask: &lt;/p&gt;&lt;p&gt;Incidents work the same way, with the conversation pre-seeded with the incident context:&lt;/p&gt;&lt;p&gt;Follow-up questions stay in the same context, so you can narrow down without repeating yourself: &lt;/p&gt;&lt;p&gt;Assistant can recommend an existing dashboard based on the conversation, allowing you to see it right away. Or you can easily ask:&lt;/p&gt;&lt;p&gt;And when you get back to your computer, you can continue the same conversation without losing any context:&lt;/p&gt;&lt;h2&gt;Incident response on the go&lt;/h2&gt;&lt;p&gt;Incident response is core to how effective engineering teams work. The app allows you to see alert groups, incidents, and on-call schedules:&lt;/p&gt;&lt;p&gt;You can also see the timeline of an incident, who was paged, and any other details:&lt;/p&gt;&lt;p&gt;If you use several devices, you can choose which of them gets paged in the notifications settings:&lt;/p&gt;&lt;p&gt;The app can answer less pressing questions, too. If you’re thinking about a weekend away at the end of the month and want to know whether you’re on the rotation before you commit, that’s a question Assistant can easily answer:&lt;/p&gt;&lt;p&gt;And when the issue seems complex, you can ask Assistant to kick off an investigation right from your phone. By the time you get to your laptop, there&#39;s a report waiting: the hypotheses it pursued, how each one was validated or ruled out, and where that trail led. &lt;/p&gt;&lt;h2&gt;Your dashboards, wherever you are&lt;/h2&gt;&lt;p&gt;Dashboards are the workhorses of Grafana. They&#39;re what most people open first in the morning, what&#39;s on the screen mounted on the office wall, and what a team builds over years as it learns what actually matters about its systems. Those same dashboards now open on your phone. They reflow to fit a small screen, and the ones you&#39;ve starred come first:&lt;/p&gt;&lt;p&gt;Most dashboard use is a glance. You may have shipped a deploy, and on the train ride home you need to check that the error rate is flat. That&#39;s a perfect use case for a phone:&lt;/p&gt;&lt;p&gt;Have a key metric that you want to check regularly? You can add any panel to the app’s home tab showing your preferred data and time frame right after opening the app:&lt;/p&gt;&lt;h2&gt;A different way of working, not a smaller one&lt;/h2&gt;&lt;p&gt;None of this makes the phone a replacement for a real workstation. If you&#39;re trying to correlate five signals across three services to track down a root cause, you want a big screen, a keyboard, and four tabs open. That&#39;s not changing, and it shouldn&#39;t. &lt;/p&gt;&lt;p&gt;But the Grafana mobile app gives us a different way of working. Your first question gets asked in a queue for coffee. An investigation is launched from the back of a taxi. More context to understand an issue is gathered while you wait for a train. And the resulting conversations, investigations, dashboards, or acknowledgements are waiting in the Grafana web UI when you finally reach your computer, so that you could continue rather than opening it cold. &lt;/p&gt;&lt;p&gt;The rename from Grafana IRM to the Grafana app is a statement of direction. In addition to integrating Assistant and dashboards, more of Grafana is on the way as the app grows beyond its IRM roots. What we&#39;re building toward is a real window into your stack that happens to live in your pocket.&lt;/p&gt;
</description></item><item>
<title>Coverage-first or cost-first: two ways to automatically apply Adaptive Metrics&#39; recommendations </title>
<link>https://grafana.com/blog/coverage-first-or-cost-first-two-ways-to-automatically-apply-adaptive-metrics-recommendations/</link>
<pubDate>Thu, 15 Oct 2026 13:50:51 +0000</pubDate>
<author>Arun Ulagappan</author>
<guid>https://grafana.com/blog/coverage-first-or-cost-first-two-ways-to-automatically-apply-adaptive-metrics-recommendations/</guid>
<description>
&lt;p&gt;&lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/adaptive-telemetry/adaptive-metrics/introduction/&quot;&gt;Adaptive Metrics&lt;/a&gt;&lt;/u&gt; , which is part of the Adaptive Telemetry suite, looks at how your metrics are actually used and recommends how much detail you should keep for each metric. This helps you cut costs while still retaining the data you actually need. &lt;/p&gt;&lt;p&gt;Last year we added auto-apply capabilities that let you implement those recommendations automatically, but only with &lt;strong&gt;coverage-first&lt;/strong&gt; behavior, maximizing coverage of whatever you&#39;re querying. If your team wanted anything different, the only option was to review and apply recommendations by hand. &lt;/p&gt;&lt;p&gt;But now, with the &lt;u&gt;&lt;a href=&quot;https://grafana.com/whats-new/2026-09-25-auto-apply-is-generally-available-in-grafana-cloud/&quot;&gt;General Availability&lt;/a&gt;&lt;/u&gt; release of auto-apply, we&#39;ve added a second mode: &lt;strong&gt;cost-first&lt;/strong&gt;, a built-in safeguard that only applies recommendations that won&#39;t increase your total active series—ensuring optimization never turns into a cost spike. &lt;/p&gt;&lt;p&gt;Auto-Apply continuously applies recommendations in either mode with no human intervention, while your existing dashboards, alerts, and queries keep working unchanged.&lt;/p&gt;&lt;h2&gt;How cost-first mode decides what to apply&lt;/h2&gt;&lt;p&gt;Every recommendation Adaptive Metrics generates comes with a projected change to your series count—some recommendations decrease it, others increase it. Cost-first mode can now take those projected changes into account, much like a careful manual review would, in three steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Series-reducing recommendations always apply.&lt;/strong&gt; Anything that lowers your projected series count goes through immediately, including brand-new recommendations.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Series-increasing recommendations get ranked.&lt;/strong&gt; Anything that would raise your projected series count is sorted from least impactful to most impactful.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adaptive Metrics stops at your current total.&lt;/strong&gt; It works down that ranked list, applying recommendations until the next one would push your projected series count above where it started the cycle.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;How coverage-first mode decides what to apply&lt;/h2&gt;&lt;p&gt;Coverage-first works more simply than cost-first does: every recommendation gets applied as soon as it&#39;s generated, whether it lowers your series count or raises it.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Every recommendation applies, no ranking required.&lt;/strong&gt; Coverage-first doesn&#39;t weigh one recommendation against another or check a budget. It just applies what Adaptive Metrics finds.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Increases go through immediately.&lt;/strong&gt; If a query comes in for data that&#39;s already been aggregated away, the recommendation to restore it at full resolution applies right away, because someone clearly needs that data.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your metrics stay in lockstep with usage.&lt;/strong&gt; As what you query shifts week to week, coverage-first adjusts automatically, so nothing you actually use ever falls out of resolution.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The tradeoff is the one cost-first exists to solve: because every increasing recommendation applies too, a spike in queries against previously-aggregated data shows up as a spike in series count.&lt;/p&gt;&lt;p&gt;A simplified example makes this concrete. Say a cycle generates three recommendations:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 92px;&quot;&gt;&lt;p&gt;&lt;strong&gt;Effect on series count&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Cost-first applied?&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Coverage-first applied?&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 92px;&quot;&gt;&lt;p&gt;-10&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #12E72F;&quot;&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #12E72F;&quot;&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Decreases series count&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 92px;&quot;&gt;&lt;p&gt;+5&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #12E72F;&quot;&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #12E72F;&quot;&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Running total still at or below where it started&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 92px;&quot;&gt;&lt;p&gt;+10&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #E7DA12;&quot;&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #12E72F;&quot;&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Would push the running total above where it started&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The net effect is that your series count stays flat or drops. It never rises above where you started the cycle, which is the guarantee cost-first mode is built around.&lt;/p&gt;&lt;h2&gt;Cost-first vs. coverage-first: when to apply each one&lt;/h2&gt;&lt;p&gt;Adaptive Metrics&#39; original auto-apply behavior, coverage-first, maximizes coverage of whatever you&#39;re actually querying. It&#39;s still there, and it&#39;s still the better fit for some of your data. If a dataset is business critical and your team knows exactly what it&#39;s querying and why, you want nothing standing between a real query and the raw data behind it. That&#39;s the mode we at Grafana Labs use internally for our own critical telemetry.&lt;/p&gt;&lt;p&gt;Cost-first mode is the better fit where cost matters more than guaranteed full coverage. For example, it would be well suited for a PromptQL query that asks for more than the person writing it realized, or an agent issuing queries on your behalf with no visibility into the cost impact downstream. That&#39;s increasingly common as less experienced users get access to larger datasets without realizing the potential impact of their queries. In those cases, you&#39;d rather have Adaptive Metrics hold the line on cost and let you review and restore specific data later than have it de-aggregate automatically every time something gets queried unintentionally.&lt;/p&gt;&lt;p&gt;You also don&#39;t have to pick one mode for all of your data. Adaptive Metrics&#39; &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/adaptive-telemetry/adaptive-metrics/additional-configuration/adaptive-metrics-rule-segmentation/&quot;&gt;segments&lt;/a&gt;&lt;/u&gt; feature lets you partition your telemetry along a dimension you choose (e.g., by team, environment, or cluster) and set a different mode on each segment independently. Keep coverage-first on the segments your experts own, and turn on cost-first mode for the segments where cost predictability matters more. It&#39;s the same underlying system; you&#39;re just telling it which guarantee you want and where.&lt;/p&gt;&lt;h2&gt;Try auto-apply in Adaptive Metrics&lt;/h2&gt;&lt;p&gt;If you&#39;re already using Adaptive Metrics in Grafana Cloud, both versions of auto-apply are available today, no extra setup required. Head to your Adaptive Metrics configuration, pick a segment, and turn it on to see your chosen mode applied on your next recommendation cycle.&lt;/p&gt;&lt;p&gt;For the full mechanics and configuration options, see the auto-apply &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/adaptive-telemetry/adaptive-metrics/additional-configuration/auto-apply/&quot;&gt;documentation&lt;/a&gt;&lt;/u&gt;. It’s worth creating &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/adaptive-telemetry/adaptive-metrics/create-exemptions/&quot;&gt;exemptions&lt;/a&gt;&lt;/u&gt; first for anything you can&#39;t afford to lose, and you&#39;ll need the Admin &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/adaptive-telemetry/adaptive-metrics/additional-configuration/adaptive-metrics-rbac/&quot;&gt;role&lt;/a&gt;&lt;/u&gt; to make the change. &lt;/p&gt;&lt;p&gt;You can also check your Adaptive Telemetry &lt;u&gt;&lt;a href=&quot;https://grafana.com/whats-new/2026-08-13-see-your-adaptive-telemetry-cost-savings/&quot;&gt;savings&lt;/a&gt;&lt;/u&gt; to see the impact on your Grafana Cloud bill.&lt;/p&gt;&lt;p&gt;New to auto-apply? Walk through the full learning journey in our docs: &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/learning-hub/adaptive-metrics-auto-apply/&quot;&gt;Enable auto-apply in Grafana Adaptive Metrics.&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
</description></item><item>
<title>Go from alert to post-incident review with Grafana Cloud IRM and AI</title>
<link>https://grafana.com/blog/go-from-alert-to-post-incident-review-with-grafana-cloud-irm-and-ai/</link>
<pubDate>Wed, 14 Oct 2026 17:39:29 +0000</pubDate>
<author>Ashley Somerville</author>
<guid>https://grafana.com/blog/go-from-alert-to-post-incident-review-with-grafana-cloud-irm-and-ai/</guid>
<description>
&lt;p&gt;You’ve got 10 minutes before your next meeting when your phone starts ringing. You’re being paged because the frontend is erroring with failed API requests.&lt;/p&gt;&lt;p&gt;You open one tool to see what fired, then another to figure out what’s going on. You message a teammate in Slack to see if they’re noticing the same thing.&lt;/p&gt;&lt;p&gt;That’s a lot of context switching, and it’s still how a lot of teams&#39; incident response works today. Opening another tool and catching someone up takes time. Details can get lost when you manually copy context from one place to another.&lt;/p&gt;&lt;p&gt;It doesn’t have to be this way. With &lt;a href=&quot;https://grafana.com/products/cloud/irm/&quot;&gt;Grafana Cloud IRM&lt;/a&gt;, you get on-call support, incident management, chatops in Slack or Microsoft Teams, investigations, and the &lt;a href=&quot;https://grafana.com/docs/grafana-cloud/platform/mobile-app/&quot;&gt;Grafana mobile app&lt;/a&gt;, all connected through the incident record. Let’s follow the frontend incident from the first page through the response and post-incident review to illustrate how your team can start improving their processes today.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;The page already has context&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;When you get paged, you need to understand how serious the problem is and what to check first. With IRM, you’re starting with more than an alert name.&lt;/p&gt;&lt;p&gt;When you open the alert group, it shows the affected service, the dashboard panel tied to the alert, its history, and how many individual alerts were folded into the page.&lt;/p&gt;&lt;p&gt;Imagine the difference between “the frontend is exposing API errors&quot; and “the frontend is exposing HTTP 500 errors from the adService, the issue has already flapped twice in 24 hours, and three related alerts are firing in the same alert group.”&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Figuring out what else is affected&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Next, you need to figure out whether the frontend errors are isolated or part of something bigger, and whether the platform team is getting paged, too.&lt;/p&gt;&lt;p&gt;A lot of teams will do this by bouncing between dashboards, service maps, observability data, and Slack or Teams.&lt;/p&gt;&lt;p&gt;From the Slack thread, you ask &lt;a href=&quot;https://grafana.com/products/cloud/ai-assistant/&quot;&gt;Grafana Assistant&lt;/a&gt;, “What else is firing, and how is it related?”&lt;/p&gt;&lt;p&gt;It uses the same alert context you’re looking at and posts the answer back in the same thread.&lt;/p&gt;&lt;p&gt;Click &lt;strong&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/respond-to-incidents/integrations/chat-and-collaboration/slack/#ask-grafana-assistant&quot;&gt;Investigate this alert&lt;/a&gt;&lt;/strong&gt; in the Slack message to get a quick summary of what’s firing and suggestions for what to check next.&lt;/p&gt;&lt;p&gt;Everyone in the thread can see what Assistant found, including teammates who join the response later. If someone has a follow-up, they can ask @Grafana in the thread.&lt;/p&gt;&lt;p&gt;You can ask it to help write a query to check the frontend’s error rate or find the dashboard you need. You can also give Assistant a service-specific playbook through &lt;a href=&quot;https://grafana.com/docs/grafana-cloud/platform/grafana-assistant/platform/skills/&quot;&gt;Skills&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Declaring the incident&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Once it’s clear this needs a coordinated response, you declare an incident in IRM.&lt;/p&gt;&lt;p&gt;As soon as you do so, IRM handles a number of automated actions for you, removing the need for manual creation every time. You immediately have a dedicated Slack channel, a Zoom call, and an AI investigation that starts looking for the root cause.&lt;/p&gt;&lt;p&gt;You don’t need to worry about the team remembering to create these components. The system does it for you.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Keeping the messy stuff&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;A lot of the useful information shows up in Slack before anyone knows if it matters.&lt;/p&gt;&lt;p&gt;A teammate remembers a deployment from earlier and suggests it might explain the frontend errors. Someone else has a hypothesis about a dependency. Another person spots something weird on a dashboard.&lt;/p&gt;&lt;p&gt;Usually some of that makes it into the incident record and the rest dies in Slack history.&lt;/p&gt;&lt;p&gt;In IRM, a teammate can react to a Slack message with the robot emoji and drop it onto the incident timeline. The original message, author, and timestamp come with it.&lt;/p&gt;&lt;p&gt;It doesn’t have to be a proven theory. The point is to retain potentially useful context while everyone is still figuring things out.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Managing the incident from Slack&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Once the response is underway, the incident commander is juggling roles, tasks, comms, other teams, and the actual investigation.&lt;/p&gt;&lt;p&gt;That can happen in the incident channel without leaving Slack. You can &lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/respond-to-incidents/integrations/chat-and-collaboration/slack/#buttons-in-incident-channels&quot;&gt;assign roles&lt;/a&gt;, &lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/respond-to-incidents/manage-incidents/collaborate/manage-tasks/&quot;&gt;create tasks&lt;/a&gt; with quick actions, and sync those tasks to &lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/respond-to-incidents/manage-incidents/collaborate/manage-tasks/#integrate-with-external-systems&quot;&gt;Jira or GitHub&lt;/a&gt; so they still exist after the incident is closed.&lt;/p&gt;&lt;p&gt;If another team needs to get involved, you can page them from the same place instead of hunting down their on-call schedule. Even better, enter &quot;@Grafana assistant - who is on call?&quot;&lt;/p&gt;&lt;p&gt;The incident owners post status updates that are shared in Slack and pushed to the mobile app so stakeholders can follow along.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;An investigation you can actually inspect&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;The AI investigation starts automatically when you declare the incident.&lt;/p&gt;&lt;p&gt;It takes the context that’s already there (alert data, linked dashboard panels, the timeline, and anything people added from Slack), combines it with your actual data, and starts forming hypotheses about what caused the problem.&lt;/p&gt;&lt;p&gt;The &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/platform/grafana-assistant/platform/workspace/&quot;&gt;Assistant Workspace&lt;/a&gt;&lt;/u&gt; feature provides a collaborative environment for you to work alongside the agent and track what it&#39;s doing, finding, and thinking. &lt;/p&gt;&lt;p&gt;You can add a hypothesis, reopen one that got dismissed, mark something disproven, or ask the investigation a question. You can also see the sources behind its conclusions.&lt;/p&gt;&lt;p&gt;A root-cause suggestion is a lot more useful when you can see the evidence, rather than having to decide whether to simply trust a black box. The investigation points to errors from the ad service reaching the frontend as 500 responses. The investigation can also correlate information from outside Grafana through MCP integrations. For example, it checks the earlier deployment hypothesis by checking GitHub directly and finds no evidence linking it to the errors.&lt;/p&gt;&lt;p&gt;It doesn’t matter that it started as a random Slack message. Once it’s in the incident context, it gets evaluated with everything else.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Turning the root cause into the incident record&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Once you’ve reviewed the evidence for the leading hypothesis, the findings are added to the incident timeline and shared in Slack as well as pushed to the mobile app. That skips the usual cleanup job of taking what engineering figured out and rewriting it somewhere else so people outside the incident can follow it.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Resolving the incident: mobile app FTW!&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;You’ve found the root cause with help from the AI investigation and applied a fix to mitigate the issue. You know you still need to write up a post-incident review (PIR), but it’s easy to forget once everyone is back to their normal work.&lt;/p&gt;&lt;p&gt;Thankfully, with the Grafana mobile app, you can keep working from your phone, whether you’re responding to an incident or sorting out your next on-call shift.&lt;/p&gt;&lt;p&gt;So even if you can&#39;t get to the PIR immediately and some of the details become fuzzy in your memory, the incident record, timeline, investigation, hypotheses, and sources are all available in the mobile app. &lt;/p&gt;&lt;p&gt;Simply open the investigation on your phone and ask Assistant to create the post-incident review and send it to Confluence. The review is generated from the same history and evidence the team already used during the response. You’re not reconstructing the timeline from memory.&lt;/p&gt;&lt;p&gt;While you’re there, you even check when your next on-call shift starts.&lt;/p&gt;&lt;p&gt;And if you want to see the entire mobile workflow, check out the video below for all the details.&lt;/p&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Your team still works in Slack, joins calls, and writes reviews in the tools it already uses. The incident record keeps that work connected. Check out &lt;a href=&quot;https://grafana.com/products/cloud/irm/&quot;&gt;Grafana Cloud IRM&lt;/a&gt; today to see how it looks against your own alerts&lt;/p&gt;
</description></item><item>
<title>Take Grafana Labs&#39; 5th annual Observability Survey</title>
<link>https://grafana.com/blog/take-grafana-labs-5th-annual-observability-survey/</link>
<pubDate>Thu, 08 Oct 2026 17:00:28 +0000</pubDate>
<author>Trevor Jones</author>
<guid>https://grafana.com/blog/take-grafana-labs-5th-annual-observability-survey/</guid>
<description>
&lt;p&gt;Over the past year, &quot;agentic&quot; has gone from an emerging buzzword to an integral part of worklife for many engineers—and that&#39;s just scratching the surface on all that&#39;s changed. With so much upheaval, there&#39;s never been a better time to capture the pulse of the industry, which is why we want you to take &lt;u&gt;&lt;a href=&quot;https://grafana.com/observability-survey&quot;&gt;Grafana Labs&#39; fifth annual Observability Survey&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;p&gt;We&#39;re asking the questions you&#39;re probably already arguing about in Slack: Do you trust an agent to ship without review? Are your dashboards still the front door, or has that become a chat window? How many observability tools are too many? And of course, the more things change, the more they stay the same, so we&#39;ll continue to track year-over-year trends around cost, tooling, open source, and maturity. &lt;/p&gt;&lt;p&gt;Available in Brazilian Portuguese, English, Japanese, and Spanish, this is the largest community-driven survey on the state of observability (last year more than 1,350 industry leaders and practitioners participated), and your answers directly shape the free report we&#39;ll publish early next year. It also helps you see how you compare to your peers, so please take five to 10 minutes to complete it today.&lt;/p&gt;&lt;h2&gt;Enter to win some swag&lt;/h2&gt;&lt;p&gt;Of course, it wouldn&#39;t be an Observability Survey without the chance to win some cool swag. Every month, we&#39;ll randomly select two participants and send them a special Grafana hoodie. And if you see the QR code for the survey at &lt;u&gt;&lt;a href=&quot;https://grafana.com/events/observabilitycon/&quot;&gt;ObservabilityCON&lt;/a&gt;&lt;/u&gt;, &lt;u&gt;&lt;a href=&quot;https://grafana.com/events/observabilitycon-on-the-road/&quot;&gt;ObservabilityCON on the Road&lt;/a&gt;&lt;/u&gt;, or a Grafana Labs booth during one of the many events we&#39;ll be at between now and Jan. 1, you might even get some special giveaways just for participating. &lt;/p&gt;&lt;p&gt;And if you don&#39;t want to enter to win, that&#39;s OK, too. All responses will be kept anonymous; we just want to hear what the community has to say about the state of observability today and where you want it to go in the future.&lt;/p&gt;
</description></item><item>
<title>Manage your OpenTelemetry Collectors with Fleet Management in Grafana Cloud</title>
<link>https://grafana.com/blog/manage-your-opentelemetry-collectors-with-fleet-management-in-grafana-cloud/</link>
<pubDate>Thu, 08 Oct 2026 14:04:56 +0000</pubDate>
<author>Marko Bachvarovski</author>
<guid>https://grafana.com/blog/manage-your-opentelemetry-collectors-with-fleet-management-in-grafana-cloud/</guid>
<description>
&lt;p&gt;If you’ve built your telemetry pipelines around OpenTelemetry Collectors, you’ve already invested in a collector distribution, YAML configuration, and a deployment model that fits your infrastructure. As that deployment grows, managing it means keeping shared configuration consistent, accommodating different workloads, and understanding whether your collectors are healthy.&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/send-data/fleet-management/&quot;&gt;Fleet Management&lt;/a&gt;&lt;/u&gt; in Grafana Cloud brings those tasks together in one place. With support for the Open Agent Management Protocol (&lt;u&gt;&lt;a href=&quot;https://opentelemetry.io/docs/specs/opamp/&quot;&gt;OpAMP&lt;/a&gt;&lt;/u&gt;) now generally available, you can bring supported OpenTelemetry Collector distributions into Fleet Management while continuing to use the OTel configuration language and components you already know.&lt;/p&gt;&lt;p&gt;We started with Grafana Alloy, Grafana’s distribution of the OpenTelemetry Collector. OpAMP support extends that management workflow to organizations running upstream OTel Collector distributions, so you can adopt centralized management without first migrating to Alloy.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Keep your OTel configuration, manage it across your fleet&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;For a platform team supporting multiple services or environments, collector configuration often includes both shared policies and workload-specific requirements. You might apply common processing across your fleet while enabling additional collection pipelines only for particular teams, services, or environments.&lt;/p&gt;&lt;p&gt;Fleet Management lets you define those pipelines in OTel YAML and match them to the collectors that should run them. You can update a shared pipeline centrally and apply it across the matching collectors, reducing the work of maintaining configuration separately for each deployment.&lt;/p&gt;&lt;p&gt;For teams using infrastructure as code, Terraform support brings this workflow into your existing processes. You can create pipelines with YAML configuration and register active collectors with Fleet Management, making configuration and enrollment part of a &lt;a href=&quot;https://grafana.com/blog/fleet-management-and-terraform-use-cases-and-best-practices-for-managing-collectors-in-grafana-cloud/&quot;&gt;repeatable, version-controlled workflow&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;You also get visibility into the collectors running those pipelines. When you enroll an OTel Collector, Fleet Management automatically configures it to send self-monitoring metrics, logs, and traces to Grafana Cloud, regardless of its operating system or deployment mode. For collectors running outside Kubernetes, we also attach a host monitoring pipeline so you can investigate the underlying infrastructure alongside the collector.&lt;/p&gt;&lt;p&gt;These monitoring pipelines remain under your control. Like any other pipeline, you can modify them, turn them off, or send their data to a different backend.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Making OTel configuration work across multiple pipelines&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Managing OTel Collectors centrally requires more than accepting YAML. A collector may receive several Fleet Management pipelines alongside its local configuration, and those pieces need to work together as one effective configuration.&lt;/p&gt;&lt;p&gt;This differs from how Alloy handles configuration. Alloy components are defined in blocks and connected by references to their exports. OTel Collectors define components at the top level of the configuration and reference them from one or more telemetry pipelines.&lt;/p&gt;&lt;p&gt;Alloy also keeps local and remote configuration separate. OTel Collectors combine local and remote configuration into one effective configuration. When multiple sources define a component with the same name, one definition can override another, changing how the resulting pipelines behave.&lt;/p&gt;&lt;p&gt;That creates a practical challenge for reusable configuration. Two independently written pipelines might use the same component name, even though each expects that component to behave differently. Teams shouldn’t have to coordinate every component name across all their Fleet Management pipelines to use them together.&lt;/p&gt;&lt;p&gt;To address this, Fleet Management post-processes the remote configuration with a merge algorithm. It adds the Fleet Management pipeline name to OTel pipeline and component identifiers and updates their references accordingly. When multiple sources define components with the same type and configuration, it deduplicates them.&lt;/p&gt;&lt;p&gt;This lets you manage remote pipelines as separate, reusable pieces while Fleet Management handles combining them for the collector. You can organize configuration around what each pipeline does and where it belongs, without manually assembling a separate configuration file for every combination of pipelines.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Use the deployment pattern that fits your infrastructure&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Configuration is only one part of managing an OTel deployment. Where you run your collectors, and how telemetry flows, also affects how you apply shared processing and maintain your fleet.&lt;/p&gt;&lt;p&gt;Fleet Management works across collector deployment patterns. For organizations managing a large or mixed fleet, one option worth considering is the gateway pattern.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Separate local collection from shared processing&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The gateway pattern separates collection into two layers. Edge collectors gather telemetry from services, pods, and nodes, then send it to gateway collectors. The gateways apply shared processing before forwarding telemetry to a backend.&lt;/p&gt;&lt;p&gt;For example, you might add team labels to metrics, tail-sample traces, or filter logs at the gateway. Keeping these policies in the gateway layer means you can manage shared processing without putting the same logic on every edge collector.&lt;/p&gt;&lt;p&gt;Fleet Management lets you target configuration to each collector’s role: collection pipelines for the edge and shared processing pipelines for the gateways. This gives you a way to manage both layers centrally while keeping their responsibilities distinct.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Introduce OTel gateways into a mixed fleet&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Your edge agents and gateways don’t have to use the same software. If you already run software such as Fluent Bit or Telegraf, you can keep those agents at the edge and send telemetry to OTel gateways using compatible protocols.&lt;/p&gt;&lt;p&gt;You can then use Fleet Management to manage the supported OTel gateways and their shared processing configuration. This provides an adoption path for teams that want to introduce OpenTelemetry without replacing every existing agent at once.&lt;/p&gt;&lt;p&gt;The gateway pattern isn’t required for Fleet Management. Whether your collectors send directly to a backend or process telemetry through a gateway layer, OpAMP support lets you bring supported OTel Collectors into a common management workflow.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Bring your OTel fleet into Fleet Management&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;You can adopt centralized collector management while retaining your OTel distributions, YAML pipelines, and deployment model. Fleet Management brings configuration targeting and collector health into Grafana Cloud, with Terraform support for teams that want to manage the workflow as code.&lt;/p&gt;&lt;p&gt;To get started, enroll an OTel Collector, assign it a YAML pipeline, and view its health. From there, you can extend the same workflow across the collectors and environments you already operate.&lt;/p&gt;
</description></item><item>
<title>Manage synthetic checks at scale: Introducing folders in Grafana Cloud Synthetic Monitoring</title>
<link>https://grafana.com/blog/manage-synthetic-checks-at-scale-introducing-folders-in-grafana-cloud-synthetic-monitoring/</link>
<pubDate>Wed, 07 Oct 2026 15:00:41 +0000</pubDate>
<author>Virginia Cepeda</author>
<guid>https://grafana.com/blog/manage-synthetic-checks-at-scale-introducing-folders-in-grafana-cloud-synthetic-monitoring/</guid>
<description>
&lt;p&gt;As your use of &lt;u&gt;&lt;a href=&quot;https://grafana.com/products/cloud/synthetic-monitoring/&quot;&gt;Grafana Cloud Synthetic Monitoring&lt;/a&gt;&lt;/u&gt; grows, so does the number of checks you need to manage across services, environments, and teams. Eventually, a single flat list of checks becomes difficult to navigate, and even simple questions get harder to answer: Which checks belong to the payments team? Can I disable everything in staging during a maintenance window? Who should be able to edit the checks for this service?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/testing/synthetic-monitoring/create-checks/organize-checks-in-folders/&quot;&gt;Synthetic Monitoring folders&lt;/a&gt;, now generally available, help solve this challenge. You can organize checks into the same Grafana Cloud folders you already use for dashboards and alert rules, making it easier to group checks by team, service, or environment, manage multiple checks at once, and control who can edit them.&lt;/p&gt;&lt;h2&gt;The benefits of folders in Synthetic Monitoring&lt;/h2&gt;&lt;p&gt;Grafana Cloud Synthetic Monitoring is a black box monitoring solution that lets you proactively assess system reliability and performance by running checks from probe locations around the world. You can set up different &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/testing/synthetic-monitoring/create-checks/checks/#choose-a-check-type&quot;&gt;types of checks&lt;/a&gt;&lt;/u&gt;, including ping checks, browser checks, scripted checks, DNS checks, and HTTP checks, to verify system performance at various network levels.&lt;/p&gt;&lt;p&gt;But as your Synthetic Monitoring setup grows, the process of managing checks one at a time doesn’t scale. You could have dozens of checks for the same service, separate sets for production and staging, or hundreds of checks owned by different teams. Without a way to group them, finding the right checks, making changes across them, and keeping ownership clear all require more manual work.&lt;/p&gt;&lt;p&gt;Folders give you a way to manage checks in a way that aligns with how your organization already works. Group checks by team, service, environment, or another structure that makes sense for you, then use that grouping to navigate your checks, take action across them, and control access. Because Synthetic Monitoring uses standard Grafana Cloud folders, the same organizational structure you use for dashboards and alert rules can now extend to your synthetic checks.&lt;/p&gt;&lt;p&gt;Folders bring three key benefits to your Synthetic Monitoring setup:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Find the checks you need faster&lt;/strong&gt;: Browse checks grouped by folder instead of scanning a flat list, and expand only the folders you care about.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manage related checks as a group&lt;/strong&gt;: Enable, disable, move, or delete every check in a folder in a single operation. This is ideal for managing checks during maintenance windows or environment cleanups.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Give teams clearer ownership&lt;/strong&gt;: Combine Grafana Cloud folder permissions with Synthetic Monitoring roles so each team manages the checks in their own folder.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;How folders work&lt;/h2&gt;&lt;p&gt;A Synthetic Monitoring check can live in any Grafana Cloud folder you can edit, such as your team&#39;s folder, a service folder, or anywhere else in your folder tree. When you create a check in the Synthetic Monitoring app, the default Synthetic Monitoring folder is preselected, and you can change it to any other folder by searching or browsing your folder tree. Checks created without a folder through the API or Terraform are stored in the default folder.&lt;/p&gt;&lt;p&gt;If a folder containing checks is deleted from Grafana Cloud, its checks are automatically moved to the default Synthetic Monitoring folder and keep running without interruption.&lt;/p&gt;&lt;h3&gt;Assign checks to folders&lt;/h3&gt;&lt;p&gt;When you create or edit a check, use the &lt;strong&gt;Folder&lt;/strong&gt; field to select where it should live. You can also create a new folder right from the check editor.&lt;/p&gt;&lt;p&gt;To organize existing checks, select multiple checks in the check list and use &lt;strong&gt;Move to folder&lt;/strong&gt; to move them all in one operation.&lt;/p&gt;&lt;p&gt;You can also assign checks to folders using the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/as-code/observability-as-code/grafana-cli/gcx/&quot;&gt;gcx CLI&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;h3&gt;Browse and act on groups of checks&lt;/h3&gt;&lt;p&gt;The check list offers a folder view in addition to the card and list views. Checks are grouped under their folders, so you can expand only what you need.&lt;/p&gt;&lt;p&gt;From a folder&#39;s actions, you can operate on all its checks at once:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable or disable&lt;/strong&gt; all checks in the folder (for example, to silence an entire environment during a planned maintenance window).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Move&lt;/strong&gt; all checks to another folder.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delete&lt;/strong&gt; all checks in the folder.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Move&lt;/strong&gt; the folder itself to another location in your folder tree.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These actions apply to the checks you&#39;ve selected in the folder or, when nothing is selected, to every check in it, including checks in nested subfolders. Deleting checks never deletes the folder itself.&lt;/p&gt;&lt;h3&gt;Manage team access with folder permissions&lt;/h3&gt;&lt;p&gt;This is where folders go beyond organization. Folder permissions work together with &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/testing/synthetic-monitoring/user-and-team-management/#user-roles-and-permissions&quot;&gt;Synthetic Monitoring roles&lt;/a&gt;&lt;/u&gt;, so you can control which folders each user or team can manage. For example, the payments team could have edit permissions on the payments folder, while everyone else in the org only gets view access.&lt;/p&gt;&lt;p&gt;For more information on how to set up access permissions, refer to our &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/testing/synthetic-monitoring/create-checks/organize-checks-in-folders/#manage-check-access-with-folder-permissions&quot;&gt;documentation&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;h3&gt;Provision folders as code&lt;/h3&gt;&lt;p&gt;If you manage your synthetic checks through automation, folders are supported there, too. Options include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Synthetic Monitoring API&lt;/strong&gt;: checks accept a &lt;code&gt;folderUid&lt;/code&gt; field on create and update.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Terraform&lt;/strong&gt;: the &lt;code&gt;grafana_synthetic_monitoring_check&lt;/code&gt; resource accepts a &lt;code&gt;folder_uid&lt;/code&gt; attribute (Grafana Terraform provider v4.37.0 or later). Terraform remains the source of truth for the checks it manages: if someone moves a Terraform-managed check to a different folder in the UI, the next &lt;code&gt;terraform plan&lt;/code&gt; reports the change as drift, and applying moves the check back to the folder defined in your configuration (or to the default folder, if none is set).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Wrapping up&lt;/h2&gt;&lt;p&gt;Folders make it easier to scale your Synthetic Monitoring setup, giving you a consistent way to organize and manage checks. And because folders work across the UI, API, and Terraform, you can bring that same structure to both manual and automated workflows.&lt;/p&gt;&lt;p&gt;To learn more and get started, refer to our documentation for &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/testing/synthetic-monitoring/create-checks/organize-checks-in-folders/&quot;&gt;organizing checks in folders&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Grafana Cloud is the easiest way to get started with synthetic monitoring. We have a generous forever-free tier that includes 100k test executions per month and more. &lt;/em&gt;&lt;u&gt;&lt;em&gt;&lt;a href=&quot;https://grafana.com/auth/sign-up/create-user&quot;&gt;Sign up for free now&lt;/a&gt;&lt;/em&gt;&lt;/u&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;
</description></item><item>
<title>Tempo 3.1 release: new features for Kafka, TraceQL metrics updates, trace redaction, and more</title>
<link>https://grafana.com/blog/tempo-3-1-release-all-the-latest-features/</link>
<pubDate>Wed, 30 Sep 2026 19:03:30 +0000</pubDate>
<author>Tiffany Jernigan</author>
<guid>https://grafana.com/blog/tempo-3-1-release-all-the-latest-features/</guid>
<description>
&lt;p&gt;Building on &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/tempo-3-0-release-all-the-latest-features&quot;&gt;the major release of Tempo 3.0&lt;/a&gt;&lt;/u&gt;, Tempo 3.1 is here, delivering community-contributed Kafka client improvements, query-based trace redaction, sampling-aware TraceQL metrics, and more. &lt;/p&gt;&lt;p&gt;Together, the updates in 3.1 make it easier to operate Tempo, get accurate insights from your trace data, and investigate issues more efficiently. You can continue reading and check out the video below to learn more about the latest features. The &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/release-notes/&quot;&gt;Tempo 3.1 release notes&lt;/a&gt;&lt;/u&gt; and &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/releases#release-v3.1.0&quot;&gt;changelog&lt;/a&gt;&lt;/u&gt; provide more in-depth details and include all changes in this release. &lt;/p&gt;&lt;h2&gt;Kafka client improvements from the community&lt;/h2&gt;&lt;p&gt;Tempo 3.1 adds several community-contributed improvements to Kafka-based ingestion, with new options to secure connections, reduce data transfer costs, and support more Kafka-compatible backends. &lt;/p&gt;&lt;h3&gt;TLS and more SASL mechanisms&lt;/h3&gt;&lt;p&gt;Tempo 3.0 &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/tempo-3-0-release-all-the-latest-features/#splitting-the-read-and-write-path&quot;&gt;moved microservices-mode ingestion onto Kafka&lt;/a&gt;&lt;/u&gt;, and the client it shipped with could authenticate, but only with SASL &lt;code&gt;PLAIN&lt;/code&gt; and only over an unencrypted connection. It had no TLS settings, so a broker that requires TLS would refuse the connection. Tempo 3.1 adds TLS and four more mechanisms: &lt;code&gt;SCRAM-SHA-256&lt;/code&gt;, &lt;code&gt;SCRAM-SHA-512&lt;/code&gt;, &lt;code&gt;OAUTHBEARER&lt;/code&gt;, and &lt;code&gt;AWS_MSK_IAM&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ingest:&#xA;  kafka:&#xA;    address: kafka.example.com:9093&#xA;    topic: tempo-traces&#xA;    sasl_mechanism: SCRAM-SHA-512&#xA;    sasl_username: ${KAFKA_USERNAME}&#xA;    sasl_password: ${KAFKA_PASSWORD}&#xA;    tls_enabled: true&#xA;    tls_ca_path: /etc/tempo/kafka-ca.pem&#xA;    tls_cert_path: /etc/tempo/kafka-client.crt   # optional, for mTLS&#xA;    tls_key_path: /etc/tempo/kafka-client.key    # optional, for mTLS&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pass &lt;code&gt;-config.expand-env=true&lt;/code&gt; to expand the environment variables.&lt;/p&gt;&lt;p&gt;Thanks to &lt;u&gt;&lt;a href=&quot;https://github.com/heytrav&quot;&gt;@heytrav&lt;/a&gt;&lt;/u&gt; for this contribution. To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7586&quot;&gt;PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/set-up-for-tracing/setup-tempo/configure-kafka/#configure-authentication-and-tls&quot;&gt;Configure authentication and TLS&lt;/a&gt;&lt;/u&gt; docs.&lt;/p&gt;&lt;h3&gt;Rack-aware fetching&lt;/h3&gt;&lt;p&gt;Tempo always fetched from the partition leader, wherever it happened to live. When the leader sits in another availability zone, every trace you read crosses a zone boundary, and your cloud provider bills you for the transfer.&lt;/p&gt;&lt;p&gt;The new &lt;code&gt;client_rack&lt;/code&gt; option helps reduce those costs by enabling rack-aware fetching (KIP-392), so consumers can read from a replica in their own zone:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ingest:&#xA;  kafka:&#xA;    client_rack: us-east-1a&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is a read-side setting, so it applies to block-builders, live-stores, and metrics-generators, not to the distributor writing records into Kafka. Your brokers need rack IDs configured for it to take effect.&lt;/p&gt;&lt;p&gt;Thanks to &lt;u&gt;&lt;a href=&quot;https://github.com/KyriosGN0&quot;&gt;@KyriosGN0&lt;/a&gt;&lt;/u&gt; for this contribution. To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7594&quot;&gt;PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/configuration/#ingest&quot;&gt;ingest configuration&lt;/a&gt;&lt;/u&gt; docs.&lt;/p&gt;&lt;h3&gt;Configurable producer compression&lt;/h3&gt;&lt;p&gt;Tempo&#39;s distributor compresses every batch it writes to Kafka, and until 3.1, the codec wasn&#39;t configurable. That&#39;s fine unless your backend accepts only one codec: for example, Azure Event Hubs supports the Kafka protocol but accepts only &lt;code&gt;gzip&lt;/code&gt;, which ruled it out as a Tempo backend.&lt;/p&gt;&lt;p&gt;The new &lt;code&gt;producer_compression&lt;/code&gt; option lets you pick from &lt;code&gt;none&lt;/code&gt;, &lt;code&gt;gzip&lt;/code&gt;, &lt;code&gt;snappy&lt;/code&gt;, &lt;code&gt;lz4&lt;/code&gt;, or &lt;code&gt;zstd&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ingest:&#xA;  kafka:&#xA;    producer_compression: gzip&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Together with the TLS support above, this option makes Event Hubs a usable Kafka backend for Tempo. If you leave &lt;code&gt;producer_compression&lt;/code&gt; unset, the Kafka client uses &lt;code&gt;snappy&lt;/code&gt; by default. If your backend doesn’t support &lt;code&gt;snappy&lt;/code&gt;, set &lt;code&gt;producer_compression&lt;/code&gt; to a supported algorithm, or set it to &lt;code&gt;none&lt;/code&gt; to disable compression.&lt;/p&gt;&lt;p&gt;Thanks to &lt;u&gt;&lt;a href=&quot;https://github.com/fleighton&quot;&gt;@fleighton&lt;/a&gt;&lt;/u&gt; for this contribution. To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7691&quot;&gt;PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/configuration/#ingest&quot;&gt;ingest configuration&lt;/a&gt;&lt;/u&gt; docs.&lt;/p&gt;&lt;h2&gt;Protect sensitive data: redact traces with a TraceQL query&lt;/h2&gt;&lt;p&gt;In Tempo 3.0, &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/tempo-3-0-release-all-the-latest-features/#trace-redaction-to-protect-sensitive-data&quot;&gt;we added trace redaction&lt;/a&gt;&lt;/u&gt;, allowing you to permanently remove sensitive data, such as an email address, an auth token, or an account number that ended up in a span attribute, from your trace data without waiting for retention to expire. But &lt;code&gt;tempo-cli redact&lt;/code&gt; only accepted trace IDs, so you had to enumerate every affected trace. Sensitive data usually lands in whatever traffic hits a given code path, which can be more traces than you can practically list. Any trace you miss is data still sitting in object storage, and potentially queryable.&lt;/p&gt;&lt;p&gt;Now, with Tempo 3.1, you can redact using a TraceQL query instead:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;tempo-cli redact \&#xA;  --tenant=&lt;TENANT_ID&gt; \&#xA;  --query &#39;{span.attribute = &quot;&lt;leaked PII&gt;&quot;}&#39; \&#xA;  --dry-run \&#xA;  &lt;SCHEDULER_ADDRESS&gt;:&lt;GRPC_PORT&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Start with &lt;code&gt;--dry-run&lt;/code&gt;, as shown above. Tempo evaluates the query and counts what it would remove without modifying any blocks. The command prints the batch ID and the number of jobs created. Job counts and how many traces were matched or removed are per-tenant metrics that can be seen on the Redaction row of the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/operations/monitor/&quot;&gt;Backend Work dashboard&lt;/a&gt;&lt;/u&gt;, which ships with Tempo&#39;s monitoring mixin. Once the count matches what you expect, run the same command without &lt;code&gt;--dry-run&lt;/code&gt; to rewrite the blocks. This cannot be undone.&lt;/p&gt;&lt;p&gt;Because a wrong query permanently deletes data you didn&#39;t mean to remove, we&#39;re deliberately keeping the accepted syntax small for now: a single spanset filter with equality comparisons against &lt;code&gt;resource.*&lt;/code&gt; and &lt;code&gt;span.*&lt;/code&gt; attributes, combined using &lt;code&gt;&amp;&amp;&lt;/code&gt; and &lt;code&gt;||&lt;/code&gt;. Anything outside that is rejected when you submit the job. We are continuing to improve this functionality.&lt;/p&gt;&lt;p&gt;If you know the time range where data needs to be redacted, you can use it to run the job faster and more efficiently. This is important in high-volume installs because Tempo holds compaction off for a tenant while a redaction is applying. Use &lt;code&gt;--start&lt;/code&gt; and &lt;code&gt;--end&lt;/code&gt;, which accept &lt;code&gt;now&lt;/code&gt;, a relative offset like &lt;code&gt;now-7d&lt;/code&gt;, or an RFC3339 timestamp. Compaction catches up between runs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;Only use &lt;code&gt;--start&lt;/code&gt; and &lt;code&gt;--end&lt;/code&gt; once every scheduler and worker in your cell is running at least Tempo 3.1. An older worker ignores the window and removes every query match in each block it is given, regardless of timestamp, with no error and no way to recover the data.&lt;/p&gt;&lt;p&gt;To learn more, see the query selector &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7663&quot;&gt;PR&lt;/a&gt;&lt;/u&gt;, the time range &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7702&quot;&gt;PR&lt;/a&gt;&lt;/u&gt;, and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/operations/tempo_cli/#redact-traces&quot;&gt;Redact traces&lt;/a&gt;&lt;/u&gt; docs for the full query syntax and constraints.&lt;/p&gt;&lt;h2&gt;Query trace metrics with greater accuracy, flexibility, and speed: updates to TraceQL metrics&lt;/h2&gt;&lt;p&gt;In Tempo 3.0, &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/tempo-3-0-release-all-the-latest-features/#deeper-insights-trace-ql-metrics-is-now-ga&quot;&gt;TraceQL metrics became generally available&lt;/a&gt;&lt;/u&gt;, letting you query ad-hoc metrics directly from trace data. This makes it easier to answer questions about performance, error rates, and service behavior across distributed systems.&lt;/p&gt;&lt;p&gt;With the 3.1 release, we’re rolling out several updates that make TraceQL metrics more flexible and efficient, and more accurate when working with sampled trace data. &lt;/p&gt;&lt;h3&gt;Sampling-aware metrics queries&lt;/h3&gt;&lt;p&gt;Let’s say you &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/send-data/traces/configure/sampling/&quot;&gt;sample&lt;/a&gt;&lt;/u&gt; 50% of your traces before they reach Tempo. If you ran a &lt;code&gt;rate()&lt;/code&gt; query against a service, you would get half the traffic it actually served, because Tempo counts only the spans that made it through sampling.&lt;/p&gt;&lt;p&gt;This is especially useful with &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/adaptive-telemetry/adaptive-traces/&quot;&gt;Adaptive Traces&lt;/a&gt;&lt;/u&gt; and other &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/capture-high-value-traces-without-managing-a-pipeline-tail-sampling-with-adaptive-traces/&quot;&gt;tail sampling&lt;/a&gt;&lt;/u&gt; setups, where sampling rates can vary across services. With sampling-aware queries, TraceQL metrics can account for those differences and more accurately reflect the underlying traffic.&lt;/p&gt;&lt;p&gt;With Tempo 3.1, you can correct for sampling at query time with the new experimental &lt;code&gt;with(extrapolate=true)&lt;/code&gt; hint:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;{ } | rate() with(extrapolate=true)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Samplers that implement OpenTelemetry&#39;s &lt;u&gt;&lt;a href=&quot;https://opentelemetry.io/docs/specs/otel/trace/tracestate-probability-sampling/&quot;&gt;probability sampling specification&lt;/a&gt;&lt;/u&gt;, which is still in development and not supported in every language yet, stamp the rate they sampled at onto the span, in a field called &lt;code&gt;tracestate&lt;/code&gt;. The hint reads that rate back and scales the span accordingly. At 50% sampling, each stored span counts as two, so a query that matches 1,000 spans reports 2,000. Spans that arrive with no sampling rate recorded count as one, which means partial adoption is safe: if only two of your services sample, the other services&#39; numbers don&#39;t change.&lt;/p&gt;&lt;p&gt;Nothing new is written to your blocks. &lt;code&gt;tracestate&lt;/code&gt; is already stored with every span, and queries that don&#39;t use the hint don&#39;t read it. If you already correct for sampling in the metrics-generator by setting &lt;code&gt;enable_tracestate_span_multiplier&lt;/code&gt;, which we &lt;a href=&quot;https://github.com/grafana/tempo/pull/6684&quot;&gt;added&lt;/a&gt; in Tempo 3.0, the query path reads the rate the same way, so an ad-hoc query and your pre-aggregated &lt;code&gt;tempo_spanmetrics_*&lt;/code&gt; series agree.&lt;/p&gt;&lt;p&gt;Extrapolation applies to &lt;code&gt;rate&lt;/code&gt;, &lt;code&gt;count_over_time&lt;/code&gt;, &lt;code&gt;sum_over_time&lt;/code&gt;, &lt;code&gt;avg_over_time&lt;/code&gt;, &lt;code&gt;histogram_over_time&lt;/code&gt;, &lt;code&gt;quantile_over_time&lt;/code&gt;, and &lt;code&gt;compare&lt;/code&gt;. It doesn&#39;t apply to &lt;code&gt;min_over_time&lt;/code&gt; or &lt;code&gt;max_over_time&lt;/code&gt;, because sampling doesn&#39;t change the smallest or largest value you actually observed.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;This hint is experimental and requires vParquet4 blocks or later.&lt;/p&gt;&lt;p&gt;To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7452&quot;&gt;PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/metrics-from-traces/metrics-queries/functions/#extrapolation-from-ingest-time-sampling-withextrapolatetrue-experimental&quot;&gt;TraceQL metrics functions&lt;/a&gt;&lt;/u&gt; docs.&lt;/p&gt;&lt;h3&gt;Combine metrics queries with arithmetic&lt;/h3&gt;&lt;p&gt;Many of the metrics you want to derive from traces require combining two metrics queries rather than running just one. A common example is error rate. Traditionally, TraceQL could measure errors and total traffic separately but couldn&#39;t divide one by the other, so you’d have to run two queries and divide them with a math expression in Grafana.&lt;/p&gt;&lt;p&gt;With Tempo 3.1, you can write the division in TraceQL itself. The operators &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, and &lt;code&gt;/&lt;/code&gt; work between two metrics queries, so an error rate is one query:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;({ status = error } | rate() by (resource.service.name)) / ({ } | rate() by (resource.service.name))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Each sub-query needs its own parentheses. A scalar can go on either side of the operator:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# Calculate error percent in range of 0 .. 100&#xA;100 * ({status=error} | rate()) / ({ } | rate())&#xA;&#xA;# Calculate p95 in milliseconds&#xA;({} | quantile_over_time(duration, 0.95)) * 1000&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you group your queries, two series combine only when their label sets match exactly, and a side with no labels is broadcast across every series on the other side. &lt;/p&gt;&lt;p&gt;You can combine &lt;code&gt;with(extrapolate=true)&lt;/code&gt; and arithmetic. One hint at the end of the expression applies to both sub-queries:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;({ status = error } | rate()) / ({ } | rate()) with(extrapolate=true)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The hint has to go at the end. Putting &lt;code&gt;with(...)&lt;/code&gt; inside a sub-query is a syntax error.&lt;/p&gt;&lt;p&gt;To learn more, see the arithmetic &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/6866&quot;&gt;PR&lt;/a&gt;&lt;/u&gt;, the scalars &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7199&quot;&gt;PR&lt;/a&gt;&lt;/u&gt;, and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/metrics-from-traces/metrics-queries/functions/#arithmetic-expressions&quot;&gt;arithmetic expressions&lt;/a&gt;&lt;/u&gt; docs, and the &lt;u&gt;&lt;a href=&quot;https://www.youtube.com/live/n9mBEd00D1s?si=Kzdrc8VHhA9jgQ_O&quot;&gt;July Community Call&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;h3&gt;Faster metrics queries by default&lt;/h3&gt;&lt;p&gt;Metrics queries are also faster: we&#39;ve seen simple ones run close to twice as fast. The span-only fetch path we introduced as experimental in Tempo 3.0 is now on by default for vParquet5 blocks, which is what Tempo 3.1 writes. &lt;/p&gt;&lt;p&gt;Queries that don&#39;t need the full trace structure now process individual spans instead of whole traces, which reduces latency and memory use. In one warmed-up test, &lt;code&gt;{ } |&lt;/code&gt; &lt;code&gt;rate()&lt;/code&gt; with span-only fetch enabled completed in slightly over half the time it took with span-only fetch disabled. You don&#39;t have to change your queries to use it, and you can opt out per tenant or per query if needed.&lt;/p&gt;&lt;p&gt;To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7179&quot;&gt;PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/metrics-from-traces/metrics-queries/#faster-read-path&quot;&gt;faster read path&lt;/a&gt;&lt;/u&gt; docs.&lt;/p&gt;&lt;h2&gt;Enhancements to the metrics-generator&lt;/h2&gt;&lt;p&gt;&lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/metrics-from-traces/metrics-generator/&quot;&gt;Metrics-generator&lt;/a&gt;&lt;/u&gt; is an optional Tempo component that derives metrics from ingested spans, giving you both RED (Rate/Error/Duration) metrics and service graphs, which show the relationships between your services. Here we cover a few of the improvements to metrics-generator included in Tempo 3.1,  but please refer to the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/releases#release-v3.1.0&quot;&gt;changelog&lt;/a&gt;&lt;/u&gt; and &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/release-notes/v3-1/&quot;&gt;release notes&lt;/a&gt;&lt;/u&gt; for the complete list.&lt;/p&gt;&lt;h3&gt;See why your service map is missing edges&lt;/h3&gt;&lt;p&gt;Tempo builds a service graph edge by pairing the client and server spans for a connection. When one side never arrives, the edge expires and leaves a hole in your map, and you can&#39;t tell a connection that doesn&#39;t exist from one Tempo couldn&#39;t match.&lt;/p&gt;&lt;p&gt;In Tempo 3.1, we added an &lt;code&gt;unmatched_span_kind&lt;/code&gt; label to the expired edges counter, so you can see which side went missing. A lot of expired edges labeled &lt;code&gt;SPAN_KIND_SERVER&lt;/code&gt;, for example, point to server-to-server instrumentation that will never resolve into a node.&lt;/p&gt;&lt;p&gt;To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7709&quot;&gt;PR&lt;/a&gt;&lt;/u&gt;, the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/metrics-from-traces/service_graphs/&quot;&gt;service graphs&lt;/a&gt;&lt;/u&gt; docs, and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/troubleshooting/metrics-generator/#expired-edges&quot;&gt;expired edges&lt;/a&gt;&lt;/u&gt; troubleshooting docs.&lt;/p&gt;&lt;h3&gt;Recognize &lt;code&gt;db.system.name &lt;/code&gt;from updated OTel semantic conventions&lt;/h3&gt;&lt;p&gt;OpenTelemetry &lt;u&gt;&lt;a href=&quot;https://opentelemetry.io/docs/specs/otel/semantic-conventions/&quot;&gt;semantic conventions&lt;/a&gt;&lt;/u&gt; v1.30.0 renamed the &lt;code&gt;db.system&lt;/code&gt; attribute to &lt;code&gt;db.system.name&lt;/code&gt;. Instrumentation that emits only the new name stopped being recognized as a database call, so those nodes disappeared from your service map after an SDK upgrade, with no error to tell you.&lt;/p&gt;&lt;p&gt;Tempo 3.1 accepts both attributes for identifying database requests and for naming virtual nodes. When a span carries both, &lt;code&gt;db.system&lt;/code&gt; takes precedence, so upgrading your SDKs won&#39;t rename the nodes your dashboards and alerts already point at.&lt;/p&gt;&lt;p&gt;Thanks to &lt;u&gt;&lt;a href=&quot;https://github.com/iamrajiv&quot;&gt;@iamrajiv&lt;/a&gt;&lt;/u&gt; for this contribution. To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7697&quot;&gt;PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/metrics-from-traces/service_graphs/#database-name-attributes&quot;&gt;database name attributes&lt;/a&gt;&lt;/u&gt; docs.&lt;/p&gt;&lt;h3&gt;Cut per-span metrics-generator costs&lt;/h3&gt;&lt;p&gt;The generator processes every span you ingest, so per-span work sets the floor on what it costs to run. Building label sets accounted for a significant share of that work.&lt;/p&gt;&lt;p&gt;The span-metrics and service-graphs processors now borrow pooled label buffers from the registry instead of allocating new ones each time, and our steady-state service-graphs benchmarks report zero allocations per operation. Metric names, labels, and values are unchanged, so you won&#39;t see a difference in your dashboards, just generator CPU and memory you no longer have to provision.&lt;/p&gt;&lt;p&gt;To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7498&quot;&gt;span metrics PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7587&quot;&gt;service graph PR&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;h2&gt;Make large traces easier to read with span pruning&lt;/h2&gt;&lt;p&gt;A single user request can produce many spans. If your application runs 100 nearly identical database queries behind that request, each one becomes its own span, and you end up with 1 root span and 100 database spans that all look the same. A trace like that is harder to read, and the more queries the request makes, the worse it gets.&lt;/p&gt;&lt;p&gt;With Tempo 3.1, the trace-by-ID v2 endpoint collapses each group of similar leaf spans into a single summary span, which carries &lt;code&gt;aggregation.span_count&lt;/code&gt; and the minimum, maximum, average, and total duration of the spans it replaced. In the example above, you get back 2 spans instead of 101, in a correspondingly smaller response. Spans only group when their name, kind, status, and parent name match, so an error is never folded in with successes. This happens at read time, so nothing leaves storage.&lt;/p&gt;&lt;p&gt;Ask for it per query:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;GET /api/v2/traces/&lt;traceID&gt;?span_pruning=true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Set &lt;code&gt;span_pruning_enabled_by_default&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in your Tempo configuration, and you won’t need to pass &lt;code&gt;span_pruning&lt;/code&gt; on each request:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;query_frontend:&#xA;  trace_by_id:&#xA;    span_pruning_enabled_by_default: true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That also covers the Grafana UI and the Tempo MCP server&#39;s &lt;code&gt;get-trace&lt;/code&gt; tool, neither of which sends the parameter yet. An explicit &lt;code&gt;span_pruning&lt;/code&gt; in a request still takes precedence, so a caller that needs the complete trace can always ask for it. You can also set that default per tenant.&lt;/p&gt;&lt;p&gt;We also added TraceQL filter support to the trace-by-ID v2 endpoint. It takes a single spanset filter on the &lt;code&gt;q&lt;/code&gt; parameter, so you can fetch one trace and get back only the spans that match instead of all of them. Those spans come back on their own by default; add &lt;code&gt;keep_hierarchy=true&lt;/code&gt;, and you get each match&#39;s ancestor path to the root too.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;GET /api/v2/traces/&lt;traceID&gt;?q={ span.http.status_code = 500 }&amp;keep_hierarchy=true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;gcx&lt;/code&gt; CLI &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/gcx/pull/1250&quot;&gt;is being updated to expose&lt;/a&gt;&lt;/u&gt; both on &lt;code&gt;gcx traces get&lt;/code&gt;: &lt;code&gt;--prune&lt;/code&gt; for pruning and &lt;code&gt;--filter&lt;/code&gt; for the query.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Span pruning is experimental. The &lt;code&gt;span_pruning&lt;/code&gt; parameters, their behavior, and the response format may change in future releases.&lt;/p&gt;&lt;p&gt;To learn more, see the trace pruning&lt;a href=&quot;https://github.com/grafana/tempo/pull/7566&quot;&gt; &lt;/a&gt;&lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7566&quot;&gt;PR&lt;/a&gt;&lt;/u&gt;, the filter &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7483&quot;&gt;PR&lt;/a&gt;&lt;/u&gt;, the&lt;a href=&quot;https://grafana.com/docs/tempo/latest/api_docs/#query-v2&quot;&gt; &lt;/a&gt;&lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/api_docs/#query-v2&quot;&gt;Query V2&lt;/a&gt;&lt;/u&gt; API docs for the request parameters, the&lt;a href=&quot;https://grafana.com/docs/tempo/latest/configuration/#query-frontend&quot;&gt; &lt;/a&gt;&lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/configuration/#query-frontend&quot;&gt;query-frontend&lt;/a&gt;&lt;/u&gt; configuration docs, and the &lt;u&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FGpuZ4ul2hQ&amp;list=PLDGkOdUX1Ujqe8WZ8T1h2pNjpll0t-KLw&amp;index=1&quot;&gt;August community call&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;h2&gt;Make trace comparisons faster and more efficient for AI&lt;strong&gt; &lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Sometimes you want to compare two traces: an endpoint got slower after a deploy, and you have one trace from before and one from after, or the same request succeeds for one caller and fails for another. Either way, comparing them by hand means scrolling through two traces looking for the span that changed, appeared, or disappeared.&lt;/p&gt;&lt;p&gt;With Tempo 3.1, you can use traces diff to send two trace IDs to the query-frontend and get back what changed, instead of pulling both traces and comparing them yourself. This creates a much smaller context window for an LLM, too, which makes AI-driven investigations faster and cheaper:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;POST /api/v2/traces/diff&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;{&#xA;  &quot;base&quot;: { &quot;traceId&quot;: &quot;&lt;BASE_TRACE_ID&gt;&quot; },&#xA;  &quot;compare&quot;: { &quot;traceId&quot;: &quot;&lt;COMPARE_TRACE_ID&gt;&quot; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;By default, you get a span-level patch listing every span that was added, removed, or modified. Partial traces are rejected, since spans missing from an incomplete trace would look like spans that were removed.&lt;/p&gt;&lt;p&gt;You can also ask for a summary instead of the patch. It reports whether trace latency, errors, and span count went up or down, whether the structure changed, and which services were involved, with a millisecond delta for the ones that moved. It tells you which direction each number moved, not whether that&#39;s a regression. A trace that got faster might just be failing earlier.&lt;/p&gt;&lt;p&gt;The summary also catches drift that the patch filters out. When every span in a service is slightly slower, no single span clears the per-span tolerance, but the service&#39;s summed span duration does, so the service still shows up as changed.&lt;/p&gt;&lt;p&gt;There are multiple tools you can use to get the traces diff. The &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/gcx&quot;&gt;gcx CLI&lt;/a&gt;&lt;/u&gt; wraps the API in an experimental &lt;code&gt;gcx traces diff&lt;/code&gt;, so you can compare two IDs from the terminal without fetching either trace yourself:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;gcx traces diff --context prod -d &lt;DATASOURCE_UID&gt; &lt;BASE_TRACE_ID&gt; &lt;COMPARE_TRACE_ID&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;tempo-cli experimental traces-diff&lt;/code&gt; diffs two local trace JSON files instead, which is handy when you&#39;ve already exported them. It emits the patch by default, and you can get the summary with &lt;code&gt;--format&lt;/code&gt;. The &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/grafana-tempo-2-9-release-mcp-server-support-traceql-metrics-sampling-and-more/#analyze-tracing-data-with-llms-mcp-server-support&quot;&gt;Tempo MCP server we added in 2.9&lt;/a&gt;&lt;/u&gt; now includes a &lt;code&gt;traces-diff&lt;/code&gt; tool that returns the summary first, so an AI assistant connected to Tempo gets a usable answer without always pulling back a large patch.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;This endpoint is experimental. The request and response formats may change in future releases.&lt;/p&gt;&lt;p&gt;To learn more, see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7523&quot;&gt;API PR&lt;/a&gt;&lt;/u&gt;, the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7468&quot;&gt;CLI PR&lt;/a&gt;&lt;/u&gt;, the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7785&quot;&gt;MCP PR&lt;/a&gt;&lt;/u&gt;, the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/api_docs/#traces-diff&quot;&gt;traces diff&lt;/a&gt;&lt;/u&gt; API docs, the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/operations/tempo_cli/#experimental-traces-diff&quot;&gt;experimental traces diff&lt;/a&gt;&lt;/u&gt; Tempo CLI docs, the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/gcx/blob/main/docs/reference/cli/gcx_traces_diff.md&quot;&gt;gcx traces diff&lt;/a&gt;&lt;/u&gt; reference, and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/api_docs/mcp-server/#compare-traces&quot;&gt;Compare traces&lt;/a&gt;&lt;/u&gt; Tempo MCP docs.&lt;/p&gt;&lt;h2&gt;Improved query performance and lower memory usage:  vParquet5 is now the default block format&lt;/h2&gt;&lt;p&gt;Tempo stores traces in the Apache Parquet columnar block format, and continues to iterate on the layout for better performance and efficiency. We &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/tempo-2-10-release-all-the-latest-features/#v-parquet5-brings-new-features-to-tempo&quot;&gt;introduced&lt;/a&gt;&lt;/u&gt; vParquet5 as an opt-in format in Tempo 2.10, and in 3.1, it becomes the default.&lt;/p&gt;&lt;p&gt;The faster metrics read path mentioned earlier in this post is one payoff of the new default. It&#39;s implemented for vParquet5 only, and Tempo falls back to the standard path for blocks in older formats, so your metrics queries get faster as new blocks accumulate. Another payoff is that newly written blocks support the &lt;code&gt;span:childCount&lt;/code&gt; intrinsic. We added it in 2.10, but only vParquet5 supports it, so previously you had to opt into vParquet5 to use it.&lt;/p&gt;&lt;p&gt;vParquet5 also offers more customization for the way the Parquet columns are configured.  You can now have twice as many dedicated columns for strings, support for integers, and very long or high-cardinality strings (known as &quot;blobs&quot;), at each of resource, span, and event levels. The best way to take advantage of this is to use the new &lt;code&gt;tempo-cli&lt;/code&gt; command &lt;code&gt;suggest columns&lt;/code&gt;.  It will analyze your data and tell you the optimal layout, and make it easy to copy and paste the output into your Tempo configuration. &lt;/p&gt;&lt;p&gt;To learn more about the features vParquet5 brings, see the docs for &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/operations/dedicated_columns/&quot;&gt;dedicated columns&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/tempo-2-10-release-all-the-latest-features/#v-parquet5-brings-new-features-to-tempo&quot;&gt;vParquet5 section&lt;/a&gt;&lt;/u&gt; of the Tempo 2.10 release blog post. You can also see the &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/pull/7775&quot;&gt;PR&lt;/a&gt;&lt;/u&gt; and the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/configuration/parquet/&quot;&gt;Apache Parquet block format&lt;/a&gt;&lt;/u&gt; docs.&lt;/p&gt;&lt;h2&gt;How to learn more&lt;/h2&gt;&lt;p&gt;To see the full list of improvements, bug fixes, and breaking changes in Tempo 3.1, please refer to the &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/release-notes/v3-1/&quot;&gt;release notes&lt;/a&gt;&lt;/u&gt; and &lt;u&gt;&lt;a href=&quot;https://github.com/grafana/tempo/releases#release-v3.1.0&quot;&gt;changelog&lt;/a&gt;&lt;/u&gt;. Before you upgrade, please review &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/tempo/latest/set-up-for-tracing/setup-tempo/upgrade/&quot;&gt;Upgrade your Tempo installation&lt;/a&gt;&lt;/u&gt; for the changes that need action.&lt;/p&gt;&lt;p&gt;If you are interested in hearing more about Tempo news, please join us on the &lt;u&gt;&lt;a href=&quot;https://slack.grafana.com/&quot;&gt;Grafana Labs Community Slack&lt;/a&gt;&lt;/u&gt; channel #tempo, post a question in our &lt;u&gt;&lt;a href=&quot;https://community.grafana.com/c/grafana-tempo/&quot;&gt;community forums&lt;/a&gt;&lt;/u&gt;, or join our monthly &lt;u&gt;&lt;a href=&quot;https://docs.google.com/document/d/1yGsI6ywU-PxZBjmq3p3vAXr9g5yBXSDk4NU8LGo8qeY/edit#&quot;&gt;Tempo community call&lt;/a&gt;&lt;/u&gt;. See you there!&lt;/p&gt;
</description></item><item>
<title>What if your agent&#39;s hallucinations had a budget? How to start using SLOs for agent behavior</title>
<link>https://grafana.com/blog/what-if-your-agent-s-hallucinations-had-a-budget-how-to-start-using-slos-for-agent-behavior/</link>
<pubDate>Thu, 24 Sep 2026 17:14:13 +0000</pubDate>
<author>Ivana Huckova</author>
<guid>https://grafana.com/blog/what-if-your-agent-s-hallucinations-had-a-budget-how-to-start-using-slos-for-agent-behavior/</guid>
<description>
&lt;p&gt;At Grafana Labs, observability is what we do. So as we started building AI agents, we naturally reached for the same instincts we bring to every system: measure it, set targets, and make reliability something you can reason about instead of hope for.&lt;/p&gt;&lt;p&gt;That instinct led us somewhere unexpectedly useful. It turns out one of the oldest ideas in reliability engineering, the error budget, maps beautifully onto one of the newest problems in software: how do you know if an AI agent is actually any good?&lt;/p&gt;&lt;p&gt;This is what we discovered when we pointed our observability toolkit at agent behavior. We think it&#39;s a genuinely clean way to think about agent quality, and we want to share it with you.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;The part of the agent you can&#39;t see&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;You can have every usual signal in place: latency, token counts, error rates, traces of every tool call. And none of them answer the question that matters most for an agent:&lt;em&gt; Is it good?&lt;/em&gt; &lt;/p&gt;&lt;p&gt;A response can come back in 800 milliseconds, cost almost nothing, throw zero errors,&lt;strong&gt; and still be confidently, fluently wrong&lt;/strong&gt;. &lt;/p&gt;&lt;p&gt;That gap matters because every change to your agent is a small gamble when you can&#39;t measure quality. Tweak a prompt and hope; swap a model and cross your fingers; ship it and wait for someone to complain. These are the exact blind spot observability exists to remove.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Turn behavior into a number with evaluations&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;So we measure behavior directly using evaluations; the same way we once turned &quot;Is the site up?&quot; into a simple percentage.&lt;/p&gt;&lt;p&gt;That&#39;s really all an &lt;u&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents&quot;&gt;evaluation&lt;/a&gt;&lt;/u&gt; is, after all. You ask a judge—often another language model—to read a conversation, or a single message, or one tool call, and score it. &lt;/p&gt;&lt;p&gt;Was it grounded in the context it was given, or did it make things up? Did it actually do what the user asked? Was it toxic? Did it leak personal information? Did it fall for a prompt injection? The judge hands back a verdict, pass or fail, or a rating on a scale, and suddenly the thing you couldn&#39;t see has a value you can look at.&lt;/p&gt;&lt;p&gt;Some of these you don&#39;t even need a model for. A humble regex knows perfectly well whether a response leaked an API key or name-dropped a competitor. In Grafana Cloud&#39;s &lt;u&gt;&lt;a href=&quot;https://grafana.com/products/cloud/agent-observability&quot;&gt;Agent Observability&lt;/a&gt;&lt;/u&gt;, the cheap deterministic checks and the fancier model-based judges sit happily side by side.&lt;/p&gt;&lt;p&gt;One thing worth saying early: quality isn&#39;t a single number. &quot;Good&quot; is really a handful of separate behaviors, and they fail independently. An agent can be perfectly grounded and still be slow. It can be helpful and still occasionally toxic. It can nail the answer and quietly cost three times as much as it should to get there. &lt;/p&gt;&lt;p&gt;So instead of chasing one blended accuracy score that averages all of that away, it helps to pick the few behaviors that actually matter for your agent and give each its own measurement. Groundedness. Fulfillment. Toxicity. Latency. Cost. Each becomes a number in its own right, and each can get its own budget.&lt;/p&gt;&lt;p&gt;You can calibrate the judge to score  based on your desired behavior. Sometimes a plain pass or fail is enough. Other times a rating is more informative, and that&#39;s perfectly fine. For example, if you score groundedness on a one-to-five scale, just draw a line to turn it into a target: say anything four and above counts as a pass. Either way, what you end up with is a rate you can hold a target against—the fraction of conversations that cleared the bar.&lt;/p&gt;&lt;p&gt;The point is that behavior, the thing that felt too fuzzy to pin down, is now a metric. You&#39;ve made agent quality measurable, and the moment you do, it&#39;s finally in view and ready to act on.&lt;/p&gt;&lt;p&gt;And getting there in Grafana Cloud can start with a simple ask: have &lt;a href=&quot;https://grafana.com/products/cloud/ai-assistant/&quot;&gt;Grafana Assistant&lt;/a&gt; create an evaluation for a behavior you care about.&lt;/p&gt;&lt;p&gt;As it runs on real conversations, you&#39;ll start to see how often your agent clears the bar.&lt;/p&gt;&lt;p&gt;From there, Assistant creates and enables evaluation rules that are specific to each agent. &lt;/p&gt;&lt;h2&gt;&lt;strong&gt;A number alone isn&#39;t enough&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Here&#39;s the part where observability experience pays off, because we&#39;ve seen this trap before. &lt;/p&gt;&lt;p&gt;A quality score sitting alone on a dashboard leads to a predictable problem. Maybe you start reacting to every little dip, or you cry wolf a few too many times. Before you know it, everyone quietly learns to ignore the graph. We&#39;ve all got that Slack channel full of warnings nobody reads. A shiny new agent metric can easily become another one.&lt;/p&gt;&lt;p&gt;What the number is missing is a decision. That&#39;s exactly what a service level objective, or SLO, adds.&lt;/p&gt;&lt;p&gt;The idea is simpler than the acronym. You take your measurement and you commit to a target for it. In this case, let&#39;s say you want to measure the fraction of conversations a judge marks as fulfilled, so you set it at 95% fulfilled over 30 days. The interesting part is what&#39;s left over. If you&#39;re aiming for 95%, the other 5% isn&#39;t a failure. It&#39;s a budget.&lt;/p&gt;&lt;p&gt;That small shift changes how the whole thing feels. Unreliability, up to a point, stops being something to stamp out and becomes something to spend.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;The budget is permission, not pressure&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;The best part of this idea isn&#39;t math; it&#39;s permission.&lt;/p&gt;&lt;p&gt;When you have the remaining budget, the message is clear: go for it. Try the ambitious prompt, test the new model, or take the swing, because you planned for a little failure. When the budget runs low, it flips just as clearly: ease off the new features, quality needs some love. Red light, green light, except the light is your own data instead of a gut feeling in a meeting.&lt;/p&gt;&lt;p&gt;There&#39;s a lovely bit from an &lt;a href=&quot;https://grafana.com/blog/service-level-objectives-how-slos-have-changed-the-business-of-observability/&quot;&gt;episode of &quot;Grafana&#39;s Big Tent&quot; podcast&lt;/a&gt; where an SRE calls the error budget a fail-safe. Nobody thinks about it all day, he says, but it brings you back to reality when you mess up. That&#39;s the vibe we want on an agent team: not fear, not slamming the brakes the second a judge scores wobbles, just a quiet &quot;it&#39;s OK, go build things,&quot; with a number that taps you on the shoulder when it&#39;s time to slow down.&lt;/p&gt;&lt;p&gt;And the budget cuts both ways. Before you ship a new prompt or model, you can replay it against conversations you already know and confirm it still lands inside your targets, so a change that quietly breaks one behavior never reaches users. Agents need that safety net more than most software, because the pressure to move fast is intense, and it&#39;s so tempting to just ship on vibes.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;The quiet drift is the one to worry about&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Once you start thinking about budgets, your attention shifts. You stop fixating on the shape of any single graph and start watching how fast you&#39;re spending. That shift matters a lot for agents specifically.&lt;/p&gt;&lt;p&gt;A sharp spike from a rough afternoon of bad conversations is loud and tends to get noticed. And against a 30-day budget it might barely leave a mark, which is genuinely useful to know, because it saves you from panicking over something you&#39;ll survive.&lt;/p&gt;&lt;p&gt;The one to actually keep an eye on is the opposite: the slow, quiet burn. A tiny, steady decline where no single conversation looks alarming, but a little quality drains away each day. Maybe a prompt has slowly gone stale. Maybe a model upgrade was subtly worse for your use case. Maybe your users are gradually asking for different things. Agents are almost designed to hide this, because their answers stay fluent and plausible even when they&#39;re drifting, and no simple threshold will catch it. But a budget will, because it measures the accumulation rather than any one moment.&lt;/p&gt;&lt;p&gt;That&#39;s also why budget-based alerts are worth trusting. When they fire, something is usually really wrong, and it&#39;s worth looking at. In a world already tired of noisy alerts, that peace of mind counts for a lot.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;But what target do you even pick?&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;This is usually the next honest question: what number do you aim for? Is 85%  fulfillment good? Is 95% unrealistic? It&#39;s genuinely harder than picking an uptime target because there&#39;s less gut feel for what&#39;s achievable with an agent.&lt;/p&gt;&lt;p&gt;You don&#39;t have to pluck it from the air. Once your evaluations have been running long enough to build up a useful sample, ask Assistant to recommend SLO targets based on their scores. In your own Grafana Cloud environment, that gives you a starting point grounded in how your agent actually behaves. You can then ask Assistant to create the SLOs, turning those measurements into targets and budgets.&lt;/p&gt;&lt;p&gt;From there it&#39;s your call. Nudge the target up if you can afford to be stricter, or down if you need more room. A young agent racing into a new space might happily accept a coin-flip chance of missing its target, while an agent in front of paying customers might want only a 5% chance of a slip. The point is choosing with your eyes open.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;We don&#39;t have to reinvent this part&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;The striking thing, when you zoom out, is how little of this is actually new. Agent teams are facing a question reliability folks chewed on for years: how do you move fast, take real risks, and still keep people&#39;s trust? The answer was always to make what you care about measurable, pick a target, and treat the gap as a budget to spend. And that same answer travels surprisingly well to today. The only new piece is the measurement, and evaluations give us that.&lt;/p&gt;&lt;p&gt;So the pieces link up cleanly. Evaluations turn behavior into a number, the number gets a target, and the gap becomes a budget: permission to experiment, an early warning for regressions, and a shared language a PM and an on-call engineer can both speak. None of it asks you to invent a new philosophy of software, just to point out the one observability already given us at your agent.&lt;/p&gt;&lt;p&gt;So give your agent&#39;s behavior a number, give that number a budget, and then, inside that budget, build a little more freely. We&#39;d genuinely love to hear how it goes.&lt;/p&gt;&lt;h2&gt;From behavior to budgets, with a little assistance&lt;/h2&gt;&lt;p&gt;Everything we’ve described sounds useful, but it also sounds like work. Decide what behaviors matter. Create evaluations for them. Watch the results. Pick sensible targets. Turn those targets into SLOs.&lt;/p&gt;&lt;p&gt;As we’ve seen along the way, Assistant can help you put those pieces together. You can simply ask it to create evaluations for one of your agents, or all of them. Let those evaluations run for a while and build up a useful sample of real data. Then ask Assistant to recommend targets and create SLOs based on what it’s seeing.&lt;/p&gt;&lt;p&gt;You choose what matters for your agents, and Assistant helps with the setup. From your first evaluation to targets and budgets grounded in real conversations, you can get started just by asking.&lt;/p&gt;&lt;p&gt;Turns out, even your agents can use a little help from an agent.&lt;/p&gt;
</description></item><item>
<title>Grafana Alerting: Scale alert routing without scaling complexity using multiple notification policies</title>
<link>https://grafana.com/blog/grafana-alerting-scale-alert-routing-without-scaling-complexity-using-multiple-notification-policies/</link>
<pubDate>Mon, 21 Sep 2026 18:45:23 +0000</pubDate>
<author>Matt Jacobson</author>
<guid>https://grafana.com/blog/grafana-alerting-scale-alert-routing-without-scaling-complexity-using-multiple-notification-policies/</guid>
<description>
&lt;p&gt;Alert routing often starts simple. A team creates a few contact points, adds some label matchers, and builds a notification policy tree that sends each alert to the right destination.&lt;/p&gt;&lt;p&gt;But alerting configurations rarely stay simple.&lt;/p&gt;&lt;p&gt;As an organization grows, its notification policy tree must accommodate more teams, services, and routing requirements. Changes for one team still require editing a global configuration, making ownership less clear and independent provisioning harder. Over time, even small updates can require navigating an increasingly complex routing tree.&lt;/p&gt;&lt;p&gt;With &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/grafana-13-2-release-all-the-latest-features/&quot;&gt;Grafana 13.2&lt;/a&gt;&lt;/u&gt;, multiple notification policies are now generally available in Grafana-managed alerting. You can create named notification policy trees, assign alert rules to a specific policy, and manage each policy independently.&lt;/p&gt;&lt;p&gt;Existing alert rules continue to use the default notification policy unless you assign them to a named policy, so you can adopt the feature incrementally without migrating every rule at once.&lt;/p&gt;&lt;h2&gt;What multiple notification policies enable&lt;/h2&gt;&lt;p&gt;Multiple notification policies provide clearer boundaries for organizing, managing, and securing alert routing. With them, you can:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Split routing logic into smaller, named trees organized around a team, service, domain, or other ownership boundary&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Assign alert rules directly to the policy that should handle their alerts&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Provision and manage each policy independently through the Grafana &lt;a href=&quot;https://grafana.com/docs/grafana/latest/alerting/configure-notifications/create-notification-policy/#manage-multiple-notification-policies&quot;&gt;UI&lt;/a&gt;, &lt;a href=&quot;https://play.grafana.org/swagger?api=notifications.alerting.grafana.app-v1beta1#/RoutingTree&quot;&gt;API&lt;/a&gt;, or &lt;a href=&quot;https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/apps_notifications_routingtree_v1beta1&quot;&gt;Terraform&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Control access using policy-level role-based access control&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Update one policy without affecting the routing configuration or notification state of alerts assigned to another policy&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;h2&gt;&lt;strong&gt;The limits of one global notification policy tree&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Grafana Alerting’s notification routing model builds on Prometheus Alertmanager, where routing is represented as a single global notification policy tree with a top-level route and nested child routes. &lt;/p&gt;&lt;p&gt;Within that tree, alert labels are matched against routes that determine how alerts are grouped, when notifications are sent, and which contact points receive them.&lt;/p&gt;&lt;p&gt;This model works well when a routing configuration is small or centrally managed. But it introduces challenges as more teams begin sharing the same Grafana stack:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Every team’s routing logic must fit within the same hierarchy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Provisioning or updating policies means operating on the entire tree&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Teams need broad access to a shared configuration, even when they own only a small part of it&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Large policy trees become harder to understand, review, and safely change&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A common strategy as organizations scale is to create a top-level branch for each team, service, or domain. For example, a global tree might have separate branches for payments, platform, and security alerts.&lt;/p&gt;&lt;p&gt;This provides some logical organization, but the branches are still part of one shared configuration. They have the same lifecycle, the same provisioning boundary, and the same permissions boundary. Updating one team’s branch still means modifying the global tree that contains every other team’s branch.&lt;/p&gt;&lt;p&gt;With multiple notification policies, each team or service can have its own named policy instead of existing only as a branch within the global tree. Each policy can then be provisioned, secured, and managed independently.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;The same familiar routing model, with better boundaries&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Multiple notification policies let you split that global routing configuration into smaller, named policy trees.&lt;/p&gt;&lt;p&gt;Each named policy has its own root policy and child routes. Within the selected tree, routing continues to work as it always has: alert labels are matched against routes, and those routes control grouping, notification timings, and contact point selection.&lt;/p&gt;&lt;p&gt;The main difference is that an alert rule can now select which policy tree should handle its alerts.&lt;/p&gt;&lt;p&gt;For example, an alert rule owned by the payments team can select a policy named “payments.” Alerts produced by that rule are then routed only through the payments tree.&lt;/p&gt;&lt;p&gt;The policy selector is part of the alert rule configuration. Rules that do not explicitly select a named policy continue to use the default notification policy, preserving the behavior of existing alerting configurations.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;This means you can adopt multiple notification policies incrementally&lt;/strong&gt;. You can keep the existing tree as your default and introduce additional policies as teams or services are ready to manage their routing independently.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Independently manage and provision each policy&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;With a single global tree, provisioning was effectively all or nothing. Updating one team’s routes meant submitting or replacing a configuration that also contained every other team’s routing logic.&lt;/p&gt;&lt;p&gt;Named notification policies are individual resources. You can create, retrieve, update, delete, export, and provision one policy without replacing the others.&lt;/p&gt;&lt;p&gt;That makes it possible to align the lifecycle of a policy with the team or service that owns it. A platform team can deploy changes to its “platform” policy without also deploying the “payments” or “security” policies.&lt;/p&gt;&lt;p&gt;Policies are also isolated from one another. Changes to one policy’s routing tree do not alter the routing configuration or notification state of alerts assigned to another policy. Updating the “platform” policy, for example, doesn’t modify or disrupt the alerts being routed through the  “payments” policy.&lt;/p&gt;&lt;p&gt;For teams managing alerting as code, this provides a much safer deployment boundary. A Terraform workspace or automation pipeline can own a single named policy instead of requiring ownership of the organization’s complete routing configuration.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Organize routing around how your organization works&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;There is no single correct way to divide notification policies. The right boundary depends on how your organization owns and operates its systems.&lt;/p&gt;&lt;p&gt;Policies can be organized by:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Team&lt;/strong&gt;, such as “payments,” “security,” or “platform”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service&lt;/strong&gt;, such as “checkout-api” or “identity”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt;, such as “infrastructure,” “customer-facing,” or “data-platform”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Environment&lt;/strong&gt;, when different environments require substantially different routing and ownership&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The goal is not necessarily to create a policy for every alert rule. Instead, policies should represent meaningful ownership or lifecycle boundaries.&lt;/p&gt;&lt;p&gt;Smaller trees are easier to review because each one contains only the routing decisions relevant to its purpose. A team can understand its default contact point, escalation paths, grouping configuration, and timing behavior without navigating unrelated routes owned by the rest of the organization.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Delegate ownership with more granular access control&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Named policies also provide a natural boundary for more granular role-based access control.&lt;/p&gt;&lt;p&gt;Instead of granting users permission to modify the entire global notification policy tree, administrators can control who is allowed to view, create, update, or delete individual policies. This makes it easier to delegate alert routing to the teams closest to a service while retaining central control over shared or sensitive policies.&lt;/p&gt;&lt;p&gt;Policy-level permissions can be managed directly through the Grafana UI. Administrators can grant teams access to the policies they own without granting broad access to the rest of the organization’s notification routing configuration.&lt;/p&gt;&lt;p&gt;For example, the payments team can manage the “payments” policy without ever receiving permission to change, or even view, the “security” policy. A central observability team can retain control of the default policy and organization-wide fallbacks.&lt;/p&gt;&lt;p&gt;This helps organizations distribute alerting ownership without distributing unrestricted access to the complete notification configuration.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Manage policies through the UI, API, or Terraform&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;You can &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/alerting/configure-notifications/create-notification-policy/#manage-multiple-notification-policies&quot;&gt;create and manage named notification policies&lt;/a&gt;&lt;/u&gt; from the Grafana UI. Navigate to:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Alerts &amp; IRM&lt;/strong&gt; → &lt;strong&gt;Alerting&lt;/strong&gt; → &lt;strong&gt;Notification configuration&lt;/strong&gt; → &lt;strong&gt;Notification policies&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;From there, create a new policy or select an existing policy to manage its routing tree. When configuring an alert rule, select the notification policy that should receive alerts from that rule.&lt;/p&gt;&lt;p&gt;Named policies are also available through the &lt;u&gt;&lt;a href=&quot;https://play.grafana.org/swagger?api=notifications.alerting.grafana.app-v1beta1#/RoutingTree&quot;&gt;Grafana Alerting API&lt;/a&gt;&lt;/u&gt;, allowing automation systems to manage each routing tree as an individual resource.&lt;/p&gt;&lt;p&gt;For Terraform users, the &lt;u&gt;&lt;a href=&quot;https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/apps_notifications_routingtree_v1beta1&quot;&gt;grafana_apps_notifications_routingtree_v1beta1&lt;/a&gt;&lt;/u&gt; resource manages named routing trees. The name is supplied through the resource metadata, so separate Terraform resources can own separate policies.&lt;/p&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;resource &quot;grafana_apps_notifications_routingtree_v1beta1&quot; &quot;payments&quot; {&#xA;  metadata {&#xA;    uid = &quot;payments&quot;&#xA;  }&#xA;&#xA;  spec {&#xA;    defaults {&#xA;      receiver        = &quot;payments-slack&quot;&#xA;      group_by        = [&quot;alertname&quot;, &quot;cluster&quot;]&#xA;      group_wait      = &quot;30s&quot;&#xA;      group_interval  = &quot;5m&quot;&#xA;      repeat_interval = &quot;4h&quot;&#xA;    }&#xA;&#xA;    routes {&#xA;      receiver = &quot;payments-oncall&quot;&#xA;&#xA;      matchers = [&#xA;        {&#xA;          label = &quot;severity&quot;&#xA;          type  = &quot;=&quot;&#xA;          value = &quot;critical&quot;&#xA;        }&#xA;      ]&#xA;    }&#xA;&#xA;    routes {&#xA;      receiver = &quot;payments-slack&quot;&#xA;&#xA;      matchers = [&#xA;        {&#xA;          label = &quot;severity&quot;&#xA;          type  = &quot;=&quot;&#xA;          value = &quot;warn&quot;&#xA;        }&#xA;      ]&#xA;    }&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Each resource can be managed by the workspace or repository responsible for that policy. The Terraform resource supports nested routes, matchers, grouping, notification timing options, and provenance controls that determine whether the policy remains editable outside Terraform.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Adopt multiple policies incrementally&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Multiple notification policies were introduced in Grafana 13.1 behind the &lt;code&gt;alertingMultiplePolicies&lt;/code&gt; feature toggle, and they became generally available in Grafana 13.2.&lt;/p&gt;&lt;p&gt;Existing configurations continue to work through the default notification policy, and there is no requirement to immediately divide an existing tree or update every alert rule.&lt;/p&gt;&lt;p&gt;A practical adoption path is:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Create a named policy for a team, service, or domain.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reproduce the relevant routing behavior in the new policy.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Assign that team’s alert rules to the policy.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Validate the resulting notification behavior.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Move management of the policy to the owning team or automation workflow.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Other rules can remain on the default policy until there is a reason to move them.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Alert routing that scales with your organization&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;A single notification policy tree is simple when an alerting setup is small. At scale, however, it can become a shared configuration bottleneck that is difficult to own, provision, and safely change.&lt;/p&gt;&lt;p&gt;Multiple notification policies preserve Grafana Alerting’s familiar label-based routing model while introducing clearer lifecycle and ownership boundaries. Teams can work with smaller trees, provision policies independently, limit the scope of changes, and apply more granular access controls.&lt;/p&gt;&lt;p&gt;Whether you organize policies by team, service, or domain, the result is alert routing that more closely reflects how your organization actually operates.&lt;/p&gt;
</description></item><item>
<title>Digital Experience Monitoring with Grafana Cloud: Session Replay, synthetic checks, and faster investigations</title>
<link>https://grafana.com/blog/digital-experience-monitoring-with-grafana-cloud-session-replay-synthetic-checks-and-faster-investigations/</link>
<pubDate>Mon, 14 Sep 2026 18:02:58 +0000</pubDate>
<author>Bukola Ayodele</author>
<guid>https://grafana.com/blog/digital-experience-monitoring-with-grafana-cloud-session-replay-synthetic-checks-and-faster-investigations/</guid>
<description>
&lt;p&gt;When something breaks in production, the questions that matter most are also the toughest to answer from metrics alone: who was affected, what did they actually see, and is this worth waking someone up for? Answering those questions requires a fuller picture of the issue and its impact on your users. &lt;/p&gt;&lt;p&gt;That’s where &lt;u&gt;&lt;a href=&quot;https://grafana.com/solutions/digital-experience-monitoring/&quot;&gt;Digital Experience Monitoring&lt;/a&gt;&lt;/u&gt; (DEM) in Grafana Cloud comes in. By combining &lt;u&gt;&lt;a href=&quot;https://grafana.com/products/cloud/frontend-observability/&quot;&gt;Frontend Observability&lt;/a&gt;&lt;/u&gt; and &lt;u&gt;&lt;a href=&quot;https://grafana.com/products/cloud/synthetic-monitoring/&quot;&gt;Synthetic Monitoring&lt;/a&gt;&lt;/u&gt;, DEM connects real user experiences with proactive testing, helping engineering teams understand the scope of an issue, investigate its cause, and resolve it faster, all within Grafana Cloud.&lt;/p&gt;&lt;p&gt;In this blog post, we&#39;ll walk through some of the latest DEM updates in Grafana Cloud, and how to get started. You can also learn more by watching the video below.&lt;/p&gt;&lt;h2&gt;First, what is Digital Experience Monitoring?&lt;/h2&gt;&lt;p&gt;Digital Experience Monitoring in Grafana Cloud gives you a complete picture of how users experience your web applications, from real user data to proactive synthetic checks. &lt;/p&gt;&lt;p&gt;DEM helps your team achieve:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real user visibility&lt;/strong&gt;: know how users truly experience your web application, not just what your backend metrics suggest.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proactive detection&lt;/strong&gt;: catch problems before your users do, using automated checks against your critical user journeys.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;End-to-end correlation&lt;/strong&gt;: connect a frontend signal to the backend trace behind it.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster resolution&lt;/strong&gt;: cut your mean time to recovery from hours to minutes.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Session Replay: see exactly what your users saw&lt;/h2&gt;&lt;p&gt;&lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/visual-playback-of-the-user-journey-introducing-session-replay-in-grafana-cloud-frontend-observability/&quot;&gt;Session Replay in Grafana Cloud Frontend Observability&lt;/a&gt;&lt;/u&gt; lets you visually replay what a user saw and did inside your web application. Your team can watch exactly what users experienced and correlate it with real user monitoring signals like &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/how-to-analyze-core-web-vitals-in-grafana-cloud-frontend-observability/?pg=actionable-insights-into-the-end-user-experience-an-overview-of-grafana-cloud-frontend-observability-dashboards&amp;plcmt=in-text&quot;&gt;Core Web Vitals&lt;/a&gt;&lt;/u&gt;, user actions, and traces, which makes it a powerful tool for investigating bugs and running root cause analysis.&lt;/p&gt;&lt;p&gt;Session Replay is powered by &lt;u&gt;&lt;a href=&quot;https://grafana.com/oss/faro/&quot;&gt;Faro&lt;/a&gt;&lt;/u&gt;, Grafana&#39;s open source JavaScript instrumentation library for collecting real user monitoring data. Let&#39;s walk through how to set it up.&lt;/p&gt;&lt;h3&gt;Step 1: Add the Replay instrumentation to Faro&lt;/h3&gt;&lt;p&gt;We start by adding the Faro web SDK to our web application. When we initialize Faro, we add the Replay instrumentation alongside the standard Faro web instrumentations:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;import { getWebInstrumentations, initializeFaro } from &#39;@grafana/faro-web-sdk&#39;;&#xA;import { ReplayInstrumentation } from &#39;@grafana/faro-instrumentation-replay&#39;;&#xA;&#xA;initializeFaro({&#xA;  url: &#39;https://your-faro-endpoint.com&#39;,&#xA;  instrumentations: [&#xA;    // Standard Faro instrumentations: errors, web vitals, user actions, and more&#xA;    ...getWebInstrumentations(),&#xA;    // Enables session recording&#xA;    new ReplayInstrumentation(),&#xA;  ],&#xA;});&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;During initialization, the default configuration is “privacy first,” but you can further tweak the masking, privacy, and sampling options that fit your needs. For example, you can mask specific input types or record replays for only a percentage of sessions.&lt;/p&gt;&lt;h3&gt;Step 2: Generate some session data&lt;/h3&gt;&lt;p&gt;Once the web application is instrumented, we can see it in action. For this example, we&#39;ll use&lt;a href=&quot;https://github.com/grafana/quickpizza&quot;&gt; &lt;/a&gt;&lt;u&gt;&lt;a href=&quot;https://github.com/grafana/quickpizza&quot;&gt;QuickPizza&lt;/a&gt;&lt;/u&gt;, our demo web app that lets you create pizza combinations. On the website, we&#39;ll click a few buttons and experiment with the app, the same way a real user would. All of that activity is recorded and sent to Frontend Observability.&lt;/p&gt;&lt;h3&gt;Step 3: Find your session recordings&lt;/h3&gt;&lt;p&gt;Next, we&#39;ll head into the Frontend Observability app, open &lt;strong&gt;Sessions&lt;/strong&gt;, and scroll down to find our session recordings. &lt;/p&gt;&lt;h3&gt;Step 4: Explore the replay&lt;/h3&gt;&lt;p&gt;Our sessions are populated and we can select one to replay. Private information is masked client-side, which means it is never sent to Grafana Cloud, but you can still clearly follow mouse movements and DOM actions. To view session recordings, you have two options: you can open a session directly from the session details page, or click the green button to open the player in a new tab. We recommend the second option, as it lets you watch the recording side-by-side with the full user journey that always stays synchronized with the player&#39;s state.&lt;/p&gt;&lt;p&gt;The replay player gives you full control over playback:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Playback controls&lt;/strong&gt;: play, pause, and skip ten seconds forward or backward&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adjustable speed&lt;/strong&gt;: from 0.25x all the way up to 16x, which makes it easy to scan longer sessions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Skip inactivity&lt;/strong&gt;: jump past the quiet parts of the recording, so you stay focused on what matters&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Share button&lt;/strong&gt;: copies a link to a specific moment in the replay, so you can send a teammate the exact second an issue happens&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On the side, you can see the user journey with timestamps, showing what both the user and the browser were experiencing. You can also see errors from this view, skip straight to them, and filter and sort by errors.&lt;/p&gt;&lt;p&gt;This is where Session Replay gets really powerful. Because replays are correlated with your existing Faro telemetry, you can jump from a frontend error in your dashboard directly into the replay for that session, watch exactly what the user was doing when the error occurred, and then dig even further into the correlated traces.&lt;/p&gt;&lt;p&gt;To learn more about Session Replay in Frontend Observability, please check out &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/visual-playback-of-the-user-journey-introducing-session-replay-in-grafana-cloud-frontend-observability/&quot;&gt;this blog post&lt;/a&gt;&lt;/u&gt; and our &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/observe-and-act/monitor-applications/session-replay/&quot;&gt;technical docs&lt;/a&gt;&lt;/u&gt;. &lt;/p&gt;&lt;h2&gt;Synthetic Monitoring and Frontend Observability: better together&lt;/h2&gt;&lt;p&gt;Grafana Cloud Synthetic Monitoring runs automated checks against your critical user journeys, so you catch issues before your real users ever see them, while Grafana Cloud Frontend Observability captures what your real users are actually experiencing, turning your frontend performance into something you can measure and act on. Together, they &lt;u&gt;&lt;a href=&quot;https://grafana.com/blog/from-failed-check-to-real-user-impact-pairing-synthetic-monitoring-and-frontend-observability-in-grafana-cloud/&quot;&gt;form the foundation of Digital Experience Monitoring in Grafana Cloud&lt;/a&gt;&lt;/u&gt;, giving you both a proactive and real-world view of your users’ digital experience. &lt;/p&gt;&lt;p&gt;We recently made it easier to move between Synthetic Monitoring and Frontend Observability when investigating an issue, enabling end-to-end correlation from a synthetic check through the frontend experience and into the traces behind it. &lt;/p&gt;&lt;p&gt;Every time a Synthetic Monitoring browser check runs, it passively creates a matching Frontend Observability session, and that session is a fully controlled, repeatable run of a real user journey. From inside a check, you can now pull up Frontend Observability data right there as context and jump straight into the exact session that run created. Once you&#39;re in that session, you have access to the session replay, the user journey, and traces.&lt;/p&gt;&lt;p&gt;Your synthetic browser checks are no longer just a pass or a fail. You get feedback from every run, so when a check fails, you can see exactly what happened. That means you can finally answer the question every on-call engineer asks: is this failing check a real user problem, and how many users were impacted?&lt;/p&gt;&lt;h3&gt;Walking through a failing check&lt;/h3&gt;&lt;p&gt;Let&#39;s jump into Synthetic Monitoring to see the integration in action. We&#39;ve already set up a browser check that mimics a typical QuickPizza user flow, and we just got an alert that this check is failing.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open the check dashboard.&lt;/strong&gt; Right away, we can see the failing check.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Find the failed execution.&lt;/strong&gt; Down in the timepoint explorer, we can see each individual execution, including the failed ones. We&#39;ll select one.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;View the frontend session.&lt;/strong&gt; When we scroll down, we see a button that says &lt;strong&gt;View Frontend Session&lt;/strong&gt;. With one click, it opens the Frontend Observability session for this exact run.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This view has everything we need to investigate: the session replay, which is a step-by-step visual replay of every action the check performed; the user experience metrics from the run; the full user journey; and the traces behind it. In just a few clicks, we went from an alert, to a failed execution, to watching exactly what happened during the check.&lt;/p&gt;&lt;h2&gt;Learn more&lt;/h2&gt;&lt;p&gt;To learn more, visit our &lt;u&gt;&lt;a href=&quot;https://grafana.com/solutions/digital-experience-monitoring/&quot;&gt;Digital Experience Monitoring solutions page&lt;/a&gt;&lt;/u&gt;, or explore each tool in greater depth by checking out our technical docs for &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/&quot;&gt;Frontend Observability&lt;/a&gt;&lt;/u&gt; and &lt;u&gt;&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/&quot;&gt;Synthetic Monitoring&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Grafana Cloud is the easiest way to get started with Digital Experience Monitoring. We have a generous free tier that includes 100k test executions per month and more. &lt;/em&gt;&lt;u&gt;&lt;em&gt;&lt;a href=&quot;https://grafana.com/auth/sign-up/create-user&quot;&gt;Sign up for free now!&lt;/a&gt;&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;
</description></item></channel></rss>