<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Correlate signals on Grafana Labs</title><link>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/</link><description>Recent content in Correlate signals on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/learning-hub/labeling-strategy/05-correlate-signals/index.xml" rel="self" type="application/rss+xml"/><item><title>Put detail on the right signal</title><link>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/21-put-detail-on-the-right-signal/</link><pubDate>Thu, 06 Aug 2026 10:05:27 -0400</pubDate><guid>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/21-put-detail-on-the-right-signal/</guid><content><![CDATA[&lt;h2 id=&#34;put-detail-on-the-right-signal&#34;&gt;Put detail on the right signal&lt;/h2&gt;
&lt;p&gt;Sometimes you genuinely need a high-cardinality value, like a request ID, when you&amp;rsquo;re debugging. The answer isn&amp;rsquo;t to delete it, and it isn&amp;rsquo;t to put it on a metric label. It&amp;rsquo;s to put the value on the signal designed to hold it, and correlate across signals when you investigate.&lt;/p&gt;
&lt;h2 id=&#34;the-pattern&#34;&gt;The pattern&lt;/h2&gt;
&lt;p&gt;When a high-cardinality value is attached to a metric label, every unique value multiplies your active series. The same value attached to a log costs a fraction of that, because Loki doesn&amp;rsquo;t index log content. Here&amp;rsquo;s how to use structured metadata to keep your metrics low-cardinality and by leveraging logs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep the metric low-cardinality.&lt;/strong&gt; The metric answers &amp;ldquo;how many&amp;rdquo; and &amp;ldquo;how fast&amp;rdquo; per bounded dimension, such as &lt;code&gt;service&lt;/code&gt; and &lt;code&gt;status&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Put the high-cardinality detail on the correlated log.&lt;/strong&gt; Attach it as structured metadata, or leave it in the log line. The log answers &amp;ldquo;which exact request&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correlate at query time.&lt;/strong&gt; Shared bounded labels, such as &lt;code&gt;service&lt;/code&gt; and &lt;code&gt;env&lt;/code&gt;, connect the metric that alerted you to the logs that explain it.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h2 id="put-detail-on-the-right-signal">Put detail on the right signal&lt;/h2>
&lt;p>Sometimes you genuinely need a high-cardinality value, like a request ID, when you&amp;rsquo;re debugging. The answer isn&amp;rsquo;t to delete it, and it isn&amp;rsquo;t to put it on a metric label. It&amp;rsquo;s to put the value on the signal designed to hold it, and correlate across signals when you investigate.&lt;/p></description></item><item><title>A working example</title><link>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/22-a-working-example/</link><pubDate>Thu, 06 Aug 2026 10:05:27 -0400</pubDate><guid>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/22-a-working-example/</guid><content><![CDATA[&lt;h2 id=&#34;a-working-example&#34;&gt;A working example&lt;/h2&gt;
&lt;p&gt;Suppose you track request latency and want to find slow requests for specific users.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instead of&lt;/strong&gt; &lt;code&gt;http_request_duration_seconds{user_id=&amp;quot;u-48221&amp;quot;, ...}&lt;/code&gt;, which creates a series per user per label combination,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;keep the metric as&lt;/strong&gt; &lt;code&gt;http_request_duration_seconds{service=&amp;quot;checkout&amp;quot;, env=&amp;quot;prod&amp;quot;}&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;and log each request&lt;/strong&gt; with &lt;code&gt;user_id&lt;/code&gt; and &lt;code&gt;request_id&lt;/code&gt; attached as structured metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When latency spikes, the metric tells you where and when. Then you query the logs for that service and window, filtering by structured metadata: &lt;code&gt;{app=&amp;quot;checkout&amp;quot;} | user_id=&amp;quot;u-48221&amp;quot;&lt;/code&gt;. You keep full debugging detail without paying for it on every series.&lt;/p&gt;
]]></content><description>&lt;h2 id="a-working-example">A working example&lt;/h2>
&lt;p>Suppose you track request latency and want to find slow requests for specific users.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Instead of&lt;/strong> &lt;code>http_request_duration_seconds{user_id=&amp;quot;u-48221&amp;quot;, ...}&lt;/code>, which creates a series per user per label combination,&lt;/li>
&lt;li>&lt;strong>keep the metric as&lt;/strong> &lt;code>http_request_duration_seconds{service=&amp;quot;checkout&amp;quot;, env=&amp;quot;prod&amp;quot;}&lt;/code>,&lt;/li>
&lt;li>&lt;strong>and log each request&lt;/strong> with &lt;code>user_id&lt;/code> and &lt;code>request_id&lt;/code> attached as structured metadata.&lt;/li>
&lt;/ul>
&lt;p>When latency spikes, the metric tells you where and when. Then you query the logs for that service and window, filtering by structured metadata: &lt;code>{app=&amp;quot;checkout&amp;quot;} | user_id=&amp;quot;u-48221&amp;quot;&lt;/code>. You keep full debugging detail without paying for it on every series.&lt;/p></description></item><item><title>Take it further with traces</title><link>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/23-take-it-further-with-traces/</link><pubDate>Thu, 06 Aug 2026 10:05:27 -0400</pubDate><guid>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/23-take-it-further-with-traces/</guid><content><![CDATA[&lt;h2 id=&#34;take-it-further-with-traces&#34;&gt;Take it further with traces&lt;/h2&gt;
&lt;p&gt;If you also collect traces, the same pattern extends to a third signal using &lt;a href=&#34;/docs/grafana/latest/fundamentals/exemplars/&#34;&gt;exemplars&lt;/a&gt;. An &lt;strong&gt;exemplar&lt;/strong&gt; is a trace ID attached alongside a metric sample, not as a label, so the metric stays low-cardinality while a latency spike becomes one click away from the exact slow trace.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attach the trace ID to the metric as an exemplar&lt;/strong&gt;, not a label.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep the trace ID on logs as structured metadata&lt;/strong&gt;, so logs link to the same trace.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exemplars require a tracing backend such as Tempo, and exemplar support enabled on your metrics data source.&lt;/p&gt;
]]></content><description>&lt;h2 id="take-it-further-with-traces">Take it further with traces&lt;/h2>
&lt;p>If you also collect traces, the same pattern extends to a third signal using &lt;a href="/docs/grafana/latest/fundamentals/exemplars/">exemplars&lt;/a>. An &lt;strong>exemplar&lt;/strong> is a trace ID attached alongside a metric sample, not as a label, so the metric stays low-cardinality while a latency spike becomes one click away from the exact slow trace.&lt;/p></description></item><item><title>Why this works</title><link>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/24-why-this-works/</link><pubDate>Thu, 06 Aug 2026 10:05:27 -0400</pubDate><guid>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/24-why-this-works/</guid><content><![CDATA[&lt;h2 id=&#34;why-this-works&#34;&gt;Why this works&lt;/h2&gt;
&lt;p&gt;Each signal is priced and indexed for a different job. Metrics are cheap per series but multiply by label combinations. Logs carry arbitrary detail, and structured metadata makes high-cardinality fields queryable without indexing them. Traces hold per-request detail natively, and exemplars link them to your metrics without adding labels. Putting each value where it belongs is what a labeling strategy actually is; not fewer data points, just the right home for each one.&lt;/p&gt;
&lt;h2 id=&#34;what-youve-done&#34;&gt;What you&amp;rsquo;ve done&lt;/h2&gt;
&lt;p&gt;Throughout this journey, you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learned how label combinations multiply into unique active series and log streams, and that this is what you&amp;rsquo;re billed for&lt;/li&gt;
&lt;li&gt;Explored your own stack&amp;rsquo;s cardinality with the Cardinality tab in the Cost Management and Billing app&lt;/li&gt;
&lt;li&gt;Learned the rules for metric labels: bounded values only, added only when queried, and audited at ingestion setup&lt;/li&gt;
&lt;li&gt;Reviewed Adaptive Metrics recommendations to reduce cardinality you already have&lt;/li&gt;
&lt;li&gt;Applied the logs decision framework: labels for origin, structured metadata for high-cardinality fields, filter expressions for the rest&lt;/li&gt;
&lt;li&gt;Learned to correlate signals so high-cardinality detail lives on logs and traces, not metric labels&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;two-questions-to-keep-asking&#34;&gt;Two questions to keep asking&lt;/h2&gt;
&lt;p&gt;Keep the two questions from this journey in your team&amp;rsquo;s review habits: &lt;em&gt;Is this label value bounded?&lt;/em&gt; and &lt;em&gt;Will anyone query by it?&lt;/em&gt; Most cardinality problems never happen when someone asks those questions at instrumentation time.&lt;/p&gt;
]]></content><description>&lt;h2 id="why-this-works">Why this works&lt;/h2>
&lt;p>Each signal is priced and indexed for a different job. Metrics are cheap per series but multiply by label combinations. Logs carry arbitrary detail, and structured metadata makes high-cardinality fields queryable without indexing them. Traces hold per-request detail natively, and exemplars link them to your metrics without adding labels. Putting each value where it belongs is what a labeling strategy actually is; not fewer data points, just the right home for each one.&lt;/p></description></item><item><title>Resources</title><link>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/25-resources/</link><pubDate>Thu, 06 Aug 2026 10:05:27 -0400</pubDate><guid>https://grafana.com/docs/learning-hub/labeling-strategy/05-correlate-signals/25-resources/</guid><content><![CDATA[&lt;h2 id=&#34;documentation&#34;&gt;Documentation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/docs/loki/latest/get-started/labels/structured-metadata/&#34;&gt;What is structured metadata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/docs/grafana-cloud/telemetry-signals/use-signals-together/key-concepts/&#34;&gt;Use telemetry signals together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/docs/grafana/latest/fundamentals/exemplars/&#34;&gt;Introduction to exemplars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/docs/learning-paths/adaptive-logs/&#34;&gt;Optimize logs with Adaptive Logs learning path&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;community&#34;&gt;Community&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.grafana.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Community Forums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://slack.grafana.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Slack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h2 id="documentation">Documentation&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="/docs/loki/latest/get-started/labels/structured-metadata/">What is structured metadata&lt;/a>&lt;/li>
&lt;li>&lt;a href="/docs/grafana-cloud/telemetry-signals/use-signals-together/key-concepts/">Use telemetry signals together&lt;/a>&lt;/li>
&lt;li>&lt;a href="/docs/grafana/latest/fundamentals/exemplars/">Introduction to exemplars&lt;/a>&lt;/li>
&lt;li>&lt;a href="/docs/learning-paths/adaptive-logs/">Optimize logs with Adaptive Logs learning path&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="community">Community&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://community.grafana.com/" target="_blank" rel="noopener noreferrer">Grafana Community Forums&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://slack.grafana.com/" target="_blank" rel="noopener noreferrer">Grafana Slack&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>