<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Jenny Pavlova - Elastic Observability Labs]]></title>
    <description><![CDATA[Trusted security news & research from the team at Elastic.]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Jenny Pavlova - Elastic Observability Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltad972c1c27dbefc6/6a88d9782904ea5e8511d473/observability-labs-thumbnail.png</url>
      <link>https://www.elastic.co/observability-labs/author/jenny-pavlova</link>
    </image>
    <link>https://www.elastic.co/observability-labs/author/jenny-pavlova</link>
    <atom:link href="https://www.elastic.co/observability-labs/rss/author/jenny-pavlova.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[en]]></language>
    <lastBuildDate>Sat, 26 Sep 2026 05:42:17 GMT</lastBuildDate>
  <item>
    <title><![CDATA[LLM tracing in Elastic APM: prompts, responses, and token counts in the span view]]></title>
    <description><![CDATA[In a twenty-call agentic trace, you can see which span is using the most tokens and read the prompt that caused it. Both live in Elastic APM, so there is no second tool to run.]]></description>
    <content:encoded><![CDATA[<p>Elastic APM now does LLM tracing in the trace view. The GenAI tab in the span flyout has the whole conversation, so you can read the system prompt, the user messages and the model response, and copy any of them. Every GenAI span row in the waterfall shows input and output token counts, so in an agentic trace with twenty LLM calls you can find the span using the most tokens without opening any of them. Your LLM calls are now in the same waterfall as your database queries and HTTP spans.</p>
<p>Both features follow the <a href="https://github.com/open-telemetry/semantic-conventions-genai/tree/main/docs/gen-ai">OTel GenAI semantic conventions</a> and work with any OTel-instrumented provider. If your framework already emits OTel GenAI span attributes, there is nothing to change.</p>
<h2 id="howotelgenaispansarestructured">How OTel GenAI spans are structured</h2>
<p>A GenAI span stores everything as span attributes. A typical chat span includes:</p>
<ul>
<li><code>gen_ai.provider.name</code>: the provider (<code>openai</code>, <code>anthropic</code>, <code>aws.bedrock</code>, etc.); <code>gen_ai.system</code> is supported as a fallback for older instrumentation.</li>
<li><code>gen_ai.operation.name</code>: the operation type (<code>chat</code>, <code>embeddings</code>, etc.).</li>
<li><code>gen_ai.request.model</code>: the model being called.</li>
<li><code>gen_ai.usage.input_tokens</code>: tokens consumed by the prompt.</li>
<li><code>gen_ai.usage.output_tokens</code>: tokens generated in the response.</li>
<li><code>gen_ai.input.messages</code>, <code>gen_ai.output.messages</code>: conversation messages.</li>
<li><code>gen_ai.system_instructions</code>: the system prompt.</li>
</ul>
<p>Both features read from these attributes:</p>
<p>| Feature | What it shows | Where it appears | Attributes it reads |
| --- | --- | --- | --- |
| <strong>GenAI tab</strong> | Details (operation type, request model, provider, input and output token counts, response model, response ID) and Conversation (system prompt, user messages, model response) | Span flyout in the APM trace view, and the span flyout in Discover | Appears with any <code>gen_ai.*</code> attribute. Conversation needs <code>gen_ai.system_instructions</code>, <code>gen_ai.input.messages</code>, and <code>gen_ai.output.messages</code> |
| <strong>Token count badges</strong> | Input and output token counts for each GenAI span | Every GenAI span row in the trace waterfall | <code>gen_ai.usage.input_tokens</code>, <code>gen_ai.usage.output_tokens</code> |</p>
<h2 id="howtoreadllmpromptsandresponsesinthegenaitab">How to read LLM prompts and responses in the GenAI tab</h2>
<p>When any <code>gen_ai.*</code> attribute is present on a span, the span flyout shows a dedicated <strong>GenAI</strong> tab next to <strong>Metadata</strong>.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaeedbb89fd9c6871/6a968cd2144a15728fde3efd/genai-tab-span-details.png" alt="GenAI tab in span details flyout" /></p>
<p>The Details section shows model metadata from the span attributes: operation type, request model, provider, input and output token counts, response model, and response ID. The Conversation section shows the full exchange, populated from <code>gen_ai.system_instructions</code> (system prompt), <code>gen_ai.input.messages</code> (user messages), and <code>gen_ai.output.messages</code> (model response), each with a copy button so you can pull the exact prompt or response out of the trace without scraping text from a formatted table.</p>
<p>All raw span attributes remain accessible on the <strong>Metadata</strong> tab.</p>
<p>The <strong>GenAI</strong> tab is also available in the span flyout in <strong>Discover</strong>, so you can inspect LLM prompts and responses directly alongside your log and trace data without switching to the APM view.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd1ccc4e30c48f8ed/6a968ced36a7416fdf27288b/genai-tab-discover.png" alt="GenAI tab in Discover span flyout" /></p>
<h2 id="whatinstrumentationdoesllmtracingrequire">What instrumentation does LLM tracing require?</h2>
<p>No Kibana-side configuration is needed. The GenAI tab appears automatically when any <code>gen_ai.*</code> attribute is present on a span. Full Conversation support requires the <a href="https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/gen-ai-spans.md">OTel GenAI v1.37.0 span-attribute model</a>: <code>gen_ai.input.messages</code>, <code>gen_ai.output.messages</code>, and <code>gen_ai.system_instructions</code>.</p>
<p>Frameworks that emit the older span-events model (<code>gen_ai.user.message</code>, <code>gen_ai.assistant.message</code>, <code>gen_ai.choice</code>) will show the Details metadata section but will not populate the Conversation section. For a current list of compatible instrumentations, see the <a href="https://github.com/open-telemetry/opentelemetry-python-genai/#released-instrumentations">OTel GenAI semantic conventions</a>.</p>
<p>To verify, open the span in Discover, check that <code>gen_ai.input.messages</code> and <code>gen_ai.output.messages</code> are present, and confirm the Conversation section renders.</p>
<p>If your application already sends APM data to Elastic from a GenAI workload, open any GenAI span in the trace view and check for the GenAI tab.</p>
<h2 id="llmtokenusageinthetracewaterfall">LLM token usage in the trace waterfall</h2>
<p>Token count badges now appear on each GenAI span row in the waterfall, so you can scan the full trace without drilling in. In agentic traces with ten or twenty LLM calls, this lets you identify which span is driving token consumption before opening any span.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d47691c65ef8799/6a968d055f9db7338e560d85/genai-waterfall-tokens.png" alt="Trace waterfall with token counts on GenAI spans" /></p>
<p>Each row shows input and output token count badges sourced from <code>gen_ai.usage.input_tokens</code> and <code>gen_ai.usage.output_tokens</code>. The row label is the span name, which instrumentation frameworks typically set to something like <code>chat gpt-4o-mini</code>.</p>
<p>Waterfall-level token counts are most useful in agentic traces where a chain of LLM calls uses different models or the same model with varying context sizes.</p>
<h2 id="whichllmprovidersdoeselasticapmsupportforgenaitracing">Which LLM providers does Elastic APM support for GenAI tracing?</h2>
<p>Elastic APM's LLM tracing works with any OTel-instrumented provider: the GenAI tab and waterfall token counts use the same OTel attribute schema regardless of which provider your application uses. Provider is read from <code>gen_ai.provider.name</code>, falling back to <code>gen_ai.system</code> for older instrumentation.</p>
<p>The <a href="https://github.com/open-telemetry/semantic-conventions-genai/tree/main/docs/gen-ai">OTel GenAI semantic conventions</a> that enable this provider detection are currently in a <code>Development</code> lifecycle. Check the <a href="https://github.com/open-telemetry/semantic-conventions-genai/releases">release notes</a> before upgrading instrumentation.</p>
<h2 id="howtoenablellmtracinginelasticapm">How to enable LLM tracing in Elastic APM</h2>
<blockquote>
  <p><strong>Availability:</strong> Both features are available as a Technical Preview on Elastic Serverless and will be available as a Technical Preview in Elastic Stack 9.6.</p>
</blockquote>
<p>To try these features:</p>
<ol>
<li>Instrument your GenAI application with an OTel SDK that follows the <a href="https://github.com/open-telemetry/semantic-conventions-genai/tree/main/docs/gen-ai">OTel GenAI semantic conventions</a> (v1.37.0 or later for full Conversation support).</li>
<li>Send traces to <a href="https://www.elastic.co/observability">Elastic Observability</a> using OTLP, the Elastic APM agent, or an EDOT SDK.</li>
<li>Open the <strong>APM</strong> section in Kibana, navigate to a service that makes LLM calls, and open the trace waterfall for any transaction.</li>
</ol>
<p>The GenAI tab appears on any span with at least one <code>gen_ai.*</code> attribute set; token count badges appear when <code>gen_ai.usage.input_tokens</code> or <code>gen_ai.usage.output_tokens</code> are present.</p>
<p>If you don't have a GenAI application to test with, the <a href="https://github.com/jennypavlova/otel-genai-chat-app">otel-genai-chat-app</a> repository is a minimal OpenAI chat app pre-instrumented with EDOT. Set <code>OPENAI_API_KEY</code> and follow the EDOT commands in the <a href="https://github.com/jennypavlova/otel-genai-chat-app#otel-genai-chat-app">README</a> to send traces to Elastic and see both features in action.</p>
<h2 id="whatsnextforllmobservabilityinelasticapm">What's next for LLM observability in Elastic APM</h2>
<p>We're exploring cost estimation per span (estimated spend based on model pricing and token counts, surfaced in the waterfall) and tool call rendering (structured display of tool/function call inputs and outputs for agentic spans).</p>
<p>If you are building GenAI applications and want early access or to share feedback, reach out through the <a href="https://discuss.elastic.co/c/observability">Elastic community forums</a> or open an issue in the <a href="https://github.com/elastic/kibana/issues">kibana repository</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/observability-labs/blog/llm-tracing-elastic-apm-genai-spans</link>
    <guid isPermaLink="false">llm-tracing-elastic-apm-genai-spans</guid>
    <category><![CDATA[AI]]></category>
    <category><![CDATA[APM]]></category>
    <category><![CDATA[OpenTelemetry]]></category>
    <category><![CDATA[What's New]]></category>
    <dc:creator><![CDATA[Jenny Pavlova,Miriam Aparicio,Costas Pipilas]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7b5da648bcacf4aa/6a968bfc5c312610fa43eee4/header.png" length="0" type="image/png"/>
    <pubDate>Tue, 01 Sep 2026 15:22:01 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[6x faster at 500 services: how we rebuilt the Kibana APM service map from canvas to React DOM]]></title>
    <description><![CDATA[Each service node shows alert, SLO and anomaly health so you can filter to breaching services only and embed the result on any Kibana dashboard, with full keyboard navigation across the topology.]]></description>
    <content:encoded><![CDATA[<p>We rebuilt the Kibana <a href="https://www.elastic.co/docs/solutions/observability/apm/service-map">APM service map in Elastic Observability</a> on <a href="https://reactflow.dev/">React Flow</a>. At 500 services it renders in 64ms, roughly 6x faster than the previous Cytoscape.js implementation, and ships 60% less JavaScript (69 KiB vs 172 KiB). Service nodes now show alert, <a href="https://www.elastic.co/docs/solutions/observability/incident-management/service-level-objectives-slos">SLO</a>, and anomaly health so you can filter to breaching services only and embed the result on any Kibana dashboard, with full keyboard navigation across the topology. <a href="https://www.elastic.co/observability-labs/blog/service-map-apm-dependency-analysis">From alert to failing dependency in four clicks: Elastic APM's embedded service map</a> covers the alert panel, SLO badges, and dashboard embedding in more depth.</p>
<p>Here's the map before this rebuild, and after:</p>
<p>| Before | After |
|---|---|
| <img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1133c510816a5d38/6a7f02ccde2315758afd7718/before.png" alt="Service map before this rebuild" /> | <img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcb0fcb2a3c84c7bc/6a7f02cffc63ab34e164c804/after.png" alt="Service map after this rebuild" /> |</p>
<h2 id="whytheapmservicemapmovedfromcytoscapejstoreactflowgraphvisualization">Why the APM service map moved from Cytoscape.js to React Flow graph visualization</h2>
<p>The payoff is concrete: <a href="https://reactflow.dev">React Flow</a> renders nodes as real React components instead of a canvas draw loop, so panning and zooming stay smooth on large topologies, our Elastic UI (EUI) nodes and badges render natively (no more re-rendering the full canvas on every update), and DOM-based rendering makes nodes naturally visible to screen readers, unlike canvas-based rendering.</p>
<p>It's lighter, too: the graph library dropped from 172.4 KiB (<code>cytoscape.js</code>) to 69 KiB (<code>@xyflow/react</code>), about 103 KiB less JavaScript to ship, <a href="https://github.com/elastic/kibana/issues/248470">#248470</a>.</p>
<h3 id="howmuchfasteristheapmservicemapwithreactflow">How much faster is the APM service map with React Flow?</h3>
<p>Before committing to the APM service map migration from Cytoscape.js to React Flow, we benchmarked both libraries at 100, 200, and 500 services (a synthetic chain topology, measured via Lighthouse and component-level timings averaged over multiple runs, <a href="https://github.com/elastic/kibana/issues/248470">#248470</a>):</p>
<p>| Services | Cytoscape.js render | React Flow render | Faster by |
|---|---|---|---|
| 100 | 61.6 ms | 15.0 ms | ~76% |
| 200 | 102.5 ms | 28.1 ms | ~73% |
| 500 | 392.5 ms | 64.1 ms | ~84% |</p>
<p>At 500 services, React Flow draws the map in ~64 ms versus Cytoscape.js's ~393 ms, roughly <strong>6x faster</strong>.
The underlying graph layout step alone got ~70-78% faster.
Total main-thread blocking time dropped ~20%, and peak memory was slightly lower despite rendering everything as real DOM. Those results and more are available in the <a href="https://github.com/elastic/kibana/issues/248470#issuecomment-3744191001">benchmark results comment</a>.</p>
<h3 id="keyboardnavigationandaccessibilityintheapmservicemap">Keyboard navigation and accessibility in the APM service map</h3>
<p>The map now announces your position in the topology as you navigate, with live screen-reader context for every interaction (<a href="https://github.com/elastic/kibana/pull/251444">#251444</a>).</p>
<ul>
<li><p><strong>Spatial arrow-key navigation:</strong> arrow keys navigate based on visual proximity rather than logical document order.
Focus moves to the nearest service in the visual direction you press, even through complex serpentine folds.</p></li>
<li><p><strong>Direct shortcuts:</strong> launch flyouts with Enter or Space, and dismiss them with Escape.</p></li>
<li><p><strong>Live announcements:</strong> every interaction is backed by a screen-reader announcement, such as "Selected connection from A to B."</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2ee3cef26ace23b2/6a7f02d31967ea0aa13302c0/sm_a11y_nav.gif" alt="Keyboard navigation inside service map" /></p></li>
</ul>
<h2 id="howtheapmservicemaplayoutalgorithmworks">How the APM service map layout algorithm works</h2>
<p>The APM service map uses Dagre for hierarchical graph layout, then applies serpentine folding to prevent long dependency chains from producing unreadable high-aspect-ratio strips:</p>
<ol>
<li><p><strong>Dagre hierarchical layout:</strong> we use <a href="https://github.com/dagrejs/dagre">Dagre</a>, a graph layout engine, with a direction toggle between horizontal and vertical that you can change from the options panel.
If Dagre fails to compute a layout, the map falls back to a deterministic grid so it stays interactive and error-free.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5d7ab1ff062a077/6a7f02d6227b1c8484598184/layout_d.gif" alt="Layout switching using Dagre" /></p></li>
<li><p><strong>Serpentine folding for long chains:</strong> long dependency pipelines produce thin, unreadable strips that require heavy zooming.
When the aspect ratio becomes too extreme, we wrap ranks into stacked bands that snake back and forth, so "fit view" can zoom in much tighter on the actual services.
If the topology is already compact or has too many cross-band edges, we skip folding.
(<a href="https://github.com/elastic/kibana/pull/272900">#272900</a>).</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7721116f45ff8890/6a7f02da05b7b564d518b4bb/serpentine.png" alt="Serpentine-folded layout for a long dependency chain" /></p></li>
</ol>
<h2 id="servicedependencymappingandkibanadashboardembeddingunderthehood">Service dependency mapping and Kibana dashboard embedding under the hood</h2>
<p>The visual refresh is the easy part to see. Some of the architecture changes that underpin the rebuilt map are:</p>
<h3 id="unifiedresourcenodesforcleanerservicedependencymapping">Unified resource nodes for cleaner service dependency mapping</h3>
<p>We now group external dependencies into unified resource nodes, reducing visual noise.
We also fixed message-queue span grouping so those patterns no longer create orphaned nodes (<a href="https://github.com/elastic/kibana/pull/252713">#252713</a>).</p>
<h3 id="servicemapflyoutchartspoweredbyesqlandlens">Service map flyout charts powered by ES|QL and Lens</h3>
<p>The service flyout's infrastructure and <a href="https://www.elastic.co/docs/solutions/observability/apm/metrics">RED metrics</a> use <a href="https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql">ES|QL</a> and Kibana's core <a href="https://www.elastic.co/docs/explore-analyze/visualize/lens">Lens</a> visualization engine, giving the map the same charting experience used across Kibana (<a href="https://github.com/elastic/kibana/pull/273713">#273713</a>).</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0d3bb963b1a7677e/6a7f02dc63e959297c73d937/sm_flyout.png" alt="The service flyout in APM service map" /></p>
<h3 id="embeddingtheservicemaponanykibanadashboard">Embedding the service map on any Kibana dashboard</h3>
<p>Adding a service map to a dashboard takes one click.
Open the "Copy to dashboard" menu from any map view in APM, and the panel carries your current environment, service filter, KQL query, and filter chips directly across.
Relative time ranges like <code>now-15m</code> transfer as-is rather than freezing to an absolute timestamp, so the panel stays live on the dashboard (<a href="https://github.com/elastic/kibana/pull/272277">#272277</a>).</p>
<p>Once embedded, the panel adapts to where it lives.
It shows or hides controls based on view mode, and respects global time settings without overwriting your relative ranges (<a href="https://github.com/elastic/kibana/pull/274551">#274551</a>).</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfcaec905ec3f3339/6a7f02e1b437707cfd4d6863/dashboard_embed.gif" alt="Adding a service map to a dashboard from APM and navigating in full-screen mode" /></p>
<h2 id="whatsnextfortheapmservicemap">What's next for the APM service map</h2>
<p>The service map rebuild is a foundation, not a finish line.
Beyond what's available in 9.5, some of what's coming next is already on the <a href="https://github.com/orgs/elastic/projects/2066/views/2?sliceBy%5Bvalue%5D=APM+%2F+RUM">APM service map roadmap</a>.</p>
<h3 id="contributors">Contributors</h3>
<p>I led this migration and built these features alongside a great team.
Thanks to Samuel Brito, Gonçalo Rica Pais da Silva, Irene Blanco Fabregat, Carlos Crespo, Miriam Aparicio Garcia, Sandra G, and Nathan Smith for the engineering, and to Karolina Kurstak and Roshan Gonsalkorale for the design and product work.</p>]]></content:encoded>
    <link>https://www.elastic.co/observability-labs/blog/apm-service-map-react-flow-migration</link>
    <guid isPermaLink="false">apm-service-map-react-flow-migration</guid>
    <category><![CDATA[APM]]></category>
    <dc:creator><![CDATA[Jenny Pavlova]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt594f6736c6660717/6a7f02e46693f80e62663b2f/header.png" length="0" type="image/png"/>
    <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[From alert to failing dependency in four clicks: Elastic APM's embedded service map]]></title>
    <description><![CDATA[The APM service map is now embedded on alert pages with filters, connection metrics and a service fly-out so you can analyse dependencies and find the root cause without leaving the alert.]]></description>
    <content:encoded><![CDATA[<p>Elastic APM 9.5 embeds the <a href="https://www.elastic.co/docs/solutions/observability/apm/service-map">service map</a> on every alert detail page, in the APM UI and on Kibana dashboards.
Open a <a href="https://www.elastic.co/docs/solutions/observability/apm/metrics">RED metric</a> alert and start dependency analysis without leaving the page.
The map now includes text search, health filters, connection RED metrics with drill-through to Traces in Discover, and a service fly-out that previews any node's health right from the map.
This walkthrough uses the <a href="https://github.com/elastic/opentelemetry-demo">OpenTelemetry Demo</a> (Astronomy Shop) to go from a RED metric alert on a checkout service to a failing shipping dependency in four steps.</p>
<div>
    
</div>
<p><em>From a checkout RED metric alert to a failing shipping dependency on the APM service map (OpenTelemetry Demo).</em></p>
<h2 id="wheretheapmservicemapisavailable">Where the APM service map is available</h2>
<p>This is available in Elastic Observability serverless today and is coming to Elastic Cloud Hosted and self-managed deployments in 9.5.</p>
<h2 id="prerequisitesforapmservicemapdependencyanalysis">Prerequisites for APM service map dependency analysis</h2>
<p>You need trace data from services instrumented with any method <a href="https://www.elastic.co/docs/solutions/observability/apm/ingest">Elastic APM supports</a>.</p>
<ul>
<li><strong>Application instrumentation:</strong> one of the following:</li>
<li><strong><a href="https://www.elastic.co/docs/solutions/observability/apm/apm-agents">Elastic APM agents</a></strong> for Java, .NET, Node.js, Python, PHP, Ruby, Go, and other supported languages</li>
<li><strong><a href="https://www.elastic.co/docs/reference/opentelemetry">Elastic Distributions of OpenTelemetry (EDOT)</a></strong> language SDKs</li>
<li><strong><a href="https://www.elastic.co/docs/solutions/observability/apm/opentelemetry">OpenTelemetry SDKs</a></strong> sending OTLP via the EDOT Collector, Elastic Agent, APM Server, or the Managed OTLP endpoint.
If you run a custom upstream Collector pipeline, include both the <a href="https://www.elastic.co/docs/reference/edot-collector/components/elasticapmconnector"><code>elasticapm</code> connector</a> and the <a href="https://www.elastic.co/docs/reference/edot-collector/components/elasticapmprocessor"><code>elasticapm</code> processor</a>.
Those components ship with the EDOT Collector (or a custom EDOT-like build); they are not part of the standard OpenTelemetry Collector Contrib distribution.
For wiring details, see the <a href="https://www.elastic.co/docs/solutions/observability/get-started/opentelemetry/use-cases/upstream-collector">upstream collector setup</a>.</li>
<li><strong>Service map data:</strong> distributed traces that link the services in your architecture. The map draws connections from span parent-child relationships across instrumented services.</li>
<li><strong>Backend:</strong> Elastic Observability serverless today, or Elastic Stack 9.5 on Elastic Cloud Hosted and self-managed when 9.5 releases.</li>
</ul>
<h2 id="dependencyanalysiswalkthroughfromapmalerttoshippingdependency">Dependency analysis walkthrough: from APM alert to shipping dependency</h2>
<h3 id="step1apmservicemaponthealertdetailpage">Step 1: APM service map on the alert detail page</h3>
<p>When you receive a notification for a <a href="https://www.elastic.co/docs/solutions/observability/apm/create-apm-rules-alerts">RED metric threshold breach</a> on the checkout service, open the alert detail page.</p>
<p>The upgraded <a href="https://www.elastic.co/docs/solutions/observability/apm/service-map">service map</a> is embedded on the page, so you can start analysing dependencies the moment you land on the alert. You see checkout in context with its upstream and downstream connections without navigating away.</p>
<p>In our example, failed transactions have increased on checkout. The map is already scoped to the alert time range:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt38b23ac64f528167/6a7f1a956693f8002f664383/depedencies-walkthrough-1.gif" alt="RED metric alert for checkout with embedded service map" /></p>
<h3 id="step2spottingafailingdependencyontheservicemap">Step 2: Spotting a failing dependency on the service map</h3>
<p>When we scan through the downstream dependencies, we can see some indicators that there is a problem with the <strong>checkout</strong> and <strong>shipping</strong> services. When we open the shipping service fly-out to view more details, we can see the transactions for <code>/get-quote</code> have an elevated failure rate:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte13f5353240dc962/6a7f1a99e88c65206c00bb04/depedencies-walkthrough-2.gif" alt="Identifying shipping as the failing downstream dependency on the service map" /></p>
<h3 id="step3drillingintofailingtransactionstoidentifyredmetricdrivers">Step 3: Drilling into failing transactions to identify RED metric drivers</h3>
<p>Click on the <code>/get-quote</code> transaction to drill into these transactions. We can see a release marker for version <code>2.3.0</code> that seems to correlate to increase in failures. To validate this is the main contributing factor, we want to analyse these transactions and check a few dimensions to isolate the behaviour to the release:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfa07c9992b1e7ba0/6a7f1a9cea068d80f9f0a2d1/depedencies-walkthrough-3.gif" alt="Service fly-out preview for shipping with RED metrics and transaction breakdown" /></p>
<h3 id="step4comparingredmetricsbydimensionintracesindiscover">Step 4: Comparing RED metrics by dimension in Traces in Discover</h3>
<p>Using Traces in Discover, we can use the <strong>breakdown</strong> feature to compare various attributes to confirm the RED metric change is due to the release. As we break down by <code>service.version</code>, <code>k8s.deployment.name</code> and <code>k8s.pod.name</code>, we can see the failure rate is highly elevated for just this Kubernetes deployment.</p>
<p>These field names match the OpenTelemetry semantic conventions used by the demo (EDOT / OTel instrumentation). If you instrument with classic Elastic APM agents, use the ECS-style <code>kubernetes.*</code> equivalents instead (see <a href="https://www.elastic.co/docs/reference/ecs/ecs-otel-alignment-details">ECS ↔ OTel field alignment</a>).</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0de3780b0fc2841b/6a7f1aa03cab1cd5d60e4ca1/depedencies-walkthrough-4.gif" alt="Service fly-out preview for shipping with RED metrics and transaction breakdown" /></p>
<p>Given we have clear indicators that this problem is almost certainly due to a problem caused by this Kubernetes deployment, we would next investigate the changes this deployment made so we can identify a mitigation strategy to return the system to a healthy status, most likely a rollback of the Kubernetes deployment.</p>
<h2 id="dependencyanalysiswiththeservicemaponcustomdashboards">Dependency analysis with the service map on custom dashboards</h2>
<p>The APM service map can also be added as a panel to custom Kibana dashboards.
If you have a custom Dashboard you would like to surface for a debugging problem with your service, you can <a href="https://www.elastic.co/docs/solutions/observability/incident-management/create-manage-rules#observability-create-manage-rules-add-investigation-resources">attach it to your alert rule</a> so users can use this to complement the default alert detail view.</p>
<p>When you receive the notification and land on the alert detail page, you can click <strong>Related Dashboards</strong> and open your custom dashboard. From here, you can use the same Service Map panel to quickly analyse dependencies just like the alert detail page:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltab1edeb5a3eadb02/6a7f1aa3de231529c6fd80a1/depedencies-variant-dashboards.gif" alt="Related dashboard with service map panel" /></p>
<h2 id="whatsnewintheapmservicemap">What's new in the APM service map</h2>
<p>Below is a list of the upgrades to the service map:</p>
<h3 id="servicemapembeddedonapmalertpagesanddashboards">Service map embedded on APM alert pages and dashboards</h3>
<ul>
<li>All APM alert detail pages will have the service map embedded to facilitate faster dependency analysis.</li>
<li>There is a new <strong>Service Map</strong> Dashboard panel that you can add to any Dashboard.</li>
</ul>
<h3 id="fullscreenservicemapforlargearchitectures">Full-screen service map for large architectures</h3>
<p>Open the map in full screen from the APM UI or from a dashboard panel. Full screen gives you more room on large architectures and works the same whether you opened the map from an alert, a service, or a dashboard.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcad0dd14b294d020/6a7f1aa72f00b21ad9efef29/depedencies-fullscreen.gif" alt="Full screen service map mode" /></p>
<h3 id="servicemapcontrolssearchfiltersandorientation">Service map controls: search, filters, and orientation</h3>
<p>On the service map in the APM UI and on dashboard embeds, the map toolbar adds controls to move faster on busy environments:</p>
<ul>
<li><strong>Search</strong> — find services by text string</li>
</ul>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt22ba0bee13abadc2/6a7f1aaab4377067e84d710a/depedencies-quickfilter.gif" alt="Service map search, orientation, and filter controls" /></p>
<ul>
<li><strong>Orientation</strong> — switch layout direction when dense graphs are hard to read</li>
</ul>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a5aae3c8b2aa685/6a7f1aad42a1179b7495c30b/depedencies-orientation.gif" alt="Service map search, orientation, and filter controls" /></p>
<ul>
<li><strong>Filters</strong> — narrow the map by alert status, whether a service has dependencies, anomaly status, and SLO status</li>
</ul>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7a696138886669a/6a7f1ab1c2cc0937d52499be/depedencies-quickfilters.gif" alt="Service map search, orientation, and filter controls" /></p>
<h3 id="servicemaplegendnodeshapesconnectionsandanomalyscores">Service map legend: node shapes, connections, and anomaly scores</h3>
<p>A built-in legend explains node shapes, connection styles, and health indicators on the map. You spend less time decoding colours and icons when you are triaging under pressure.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1a46daf232cc305b/6a7f1ab5ea068d282bf0a2d5/depedencies-legend.png" alt="Service map with legend open" /></p>
<p>The legend covers node shapes (instrumented services, databases and messaging, grouped resources), connection styles (one-way and two-way requests), and anomaly score colour rings from low through critical:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6430ac89390b5e54/6a7f1ab805b7b5b71e18bd49/depedencies-legend-detail.png" alt="Service map legend detail: node shapes, connections, and anomaly scores" /></p>
<h3 id="minimapfornavigatinglargeservicemaps">Minimap for navigating large service maps</h3>
<p>A minimap helps you orient yourself on large maps. It also highlights anomalous services at a glance, so you can spot outliers without panning across the full graph.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8711d8dc8fa6ac00/6a7f1abc6693f8048e664389/depedencies-minimap.gif" alt="Service map minimap showing anomalous services" /></p>
<h3 id="redmetricsonconnectionswithdrillthroughtotracesindiscover">RED metrics on connections with drill-through to Traces in Discover</h3>
<p>Select a connection between two services to view <a href="https://www.elastic.co/docs/solutions/observability/apm/metrics">RED metrics</a> for the requests between them: rate, errors, and duration for that specific dependency edge.</p>
<p>From there, open <strong>Traces in Discover</strong> in one click to analyse those requests with full query flexibility. That is how we confirmed shipping was failing the requests checkout sent to it in the walkthrough above.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1997328c2e5e1f37/6a7f1abf1967ea8534330b80/depedencies-edgeanalysis.gif" alt="Connection RED metrics with one-click to Traces in Discover" /></p>
<h3 id="addingtheservicemaptoadashboardfromtheapmui">Adding the service map to a dashboard from the APM UI</h3>
<p>From the service map in the APM UI, add the current map view to a dashboard in one click. You do not need to rebuild filters or time range settings manually when you want the same map on a team dashboard.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1c6854adfac03760/6a7f1ac33cab1c1f090e4ca7/depedencies-add-to-dashboard.gif" alt="One-click add service map to dashboard from APM UI" /></p>
<h2 id="serviceflyoutpreviewredmetricsanomaliesandslosfromthemap">Service fly-out: preview RED metrics, anomalies and SLOs from the map</h2>
<p>Wherever you view the service map in Kibana, you can open a service fly-out to preview a service without leaving the map.</p>
<p>The fly-out shows:</p>
<ul>
<li><strong>RED metrics</strong> for the service</li>
<li><strong>Anomaly status</strong> — whether machine learning has flagged unusual behaviour</li>
<li><strong>SLO status</strong> — whether the service is meeting its objectives</li>
<li><strong>Transaction breakdown</strong> — how rate, errors, and duration split across transaction types</li>
</ul>
<p>Use it to sanity-check a node before you open the full service page or follow a connection into <strong>Traces in Discover</strong>.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd1844d9ad0008151/6a7f1ac6ead8ec2693baac5a/depedencies-fly-out.gif" alt="Service fly-out with RED metrics, anomaly and SLO status, and transaction breakdown" /></p>
<h2 id="summaryfromapmalerttorootcausewiththeservicemap">Summary: From APM alert to root cause with the service map</h2>
<p>From a RED metric alert on checkout, the embedded service map showed shipping as the failing downstream dependency. Map controls, connection RED metrics, dashboard embeds, and the service fly-out are available on every map view in Kibana, so you can start dependency analysis wherever you already work.</p>
<h2 id="furtherreading">Further Reading</h2>
<p>You can see how we implemented these changes in the following post from Jenny Pavlova, who led the technical implementation:</p>
<p><a href="https://ela.st/9-5-apm-service-map-update">6x faster at 500 services: how we rebuilt the Kibana APM service map from canvas to React DOM</a></p>
<h3 id="relatedposts">Related Posts</h3>
<p>See other recent improvements we've made for observing instrumented services in the blogs below:</p>
<ul>
<li><a href="https://ela.st/9-5-infrastructure-metric-analysis-instrumented-services">Four clicks from alert to root cause: how Elastic Observability links APM services to Kubernetes infrastructure</a></li>
<li><a href="https://ela.st/9-5-faster-slo-burn-rate-analysis-instrumented-services">Your SLO is on fire; here's how to find the arsonist in Elastic Observability</a></li>
<li><a href="https://ela.st/9-5-analyse-red-metric-drivers">Three clicks from alert to error log: breaking down RED metrics by any span attribute in Elastic Observability</a></li>
</ul>]]></content:encoded>
    <link>https://www.elastic.co/observability-labs/blog/service-map-apm-dependency-analysis</link>
    <guid isPermaLink="false">service-map-apm-dependency-analysis</guid>
    <category><![CDATA[APM]]></category>
    <category><![CDATA[OpenTelemetry]]></category>
    <dc:creator><![CDATA[Roshan Gonsalkorale,Jenny Pavlova,Karolina Kurstak]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcb9c625d49e1272d/6a7f1ac9e88c656f9800bb0c/depedencies-header.png" length="0" type="image/png"/>
    <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>