<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>article Enhanced Endpoints Guide in Troubleshooting</title>
    <link>https://community.dynatrace.com/t5/Troubleshooting/Enhanced-Endpoints-Guide/ta-p/297926</link>
    <description>&lt;DIV style="border-left: 4px solid #1496e2; background: #f1f8fd; padding: 12px 18px; margin: 16px 0; border-radius: 4px; font-family: inherit; color: #1d2c3a;"&gt;
&lt;DIV style="font-weight: 600; color: #1496e2; text-transform: uppercase; font-size: 12px; letter-spacing: 0.04em; margin-bottom: 6px;"&gt;Editor's note · May 20, 2026&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;This post has been &lt;STRONG&gt;fully rewritten&lt;/STRONG&gt; to reflect the current Enhanced Endpoint Guide. The structure, examples, screenshots, and rollout details have all changed since the previous version. If you've bookmarked an earlier paragraph or linked an old section, you may want to re-read top to bottom.&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;Changes are scheduled to start during the rollout of SaaS Cluster version 1.342, which is scheduled to begin on June 30th.&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="6e09a63eafaf" data-renderer-start-pos="1"&gt;How endpoint detection looks in Dynatrace depends on a few things: which app you're using (Classic or the new Services app), whether Enhanced Endpoints is enabled, whether your services run on Service Detection v1 or v2, and whether your applications emit &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; on their spans. Different combinations produce noticeably different pictures in the Services app, and the path forward from each one isn't the same.&lt;/P&gt;
&lt;P data-local-id="b8a4c317f6db" data-renderer-start-pos="418"&gt;This guide walks through those combinations one at a time. Read the sections in order if you want the full picture, or skip to the one that matches your situation.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="Classic-Services-and-Key-Requests" tabindex="-1" data-renderer-start-pos="584" data-local-id="c7713d430e99"&gt;Classic Services and Key Requests&lt;/H2&gt;
&lt;P data-local-id="133c68b032cc" data-renderer-start-pos="619"&gt;In Service Detection v1 (SDv1) on the Classic Services app, the way you get per-request detail is to &lt;STRONG data-renderer-mark="true"&gt;mark requests as Key Requests&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-local-id="448fd9e8592e" data-renderer-start-pos="752"&gt;You'd open a service, click &lt;EM data-renderer-mark="true"&gt;View all request details&lt;/EM&gt;, find the request you cared about (say, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;/orders/search&lt;/CODE&gt;), and pick &lt;EM data-renderer-mark="true"&gt;Mark as key request&lt;/EM&gt;. After that, Dynatrace tracked that request as its own row with golden-signal metrics, anomaly detection, and so on.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_0-1779285137396.png" style="width: 734px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33230i9F9848BE528915B8/image-dimensions/734x241?v=v2" width="734" height="241" role="button" title="mreider_0-1779285137396.png" alt="mreider_0-1779285137396.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG data-renderer-mark="true"&gt;What that looks like in Classic.&lt;/STRONG&gt;&lt;SPAN&gt; The service overview screen has a Key Requests / Endpoints panel listing your marked requests. Requests you didn't mark don't get their own row in Classic; their data folds into the service's aggregate metrics.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_1-1779285173130.png" style="width: 744px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33231i7838BA12E0CCCDFF/image-dimensions/744x292?v=v2" width="744" height="292" role="button" title="mreider_1-1779285173130.png" alt="mreider_1-1779285173130.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG data-renderer-mark="true"&gt;What that looks like in the new Services app.&lt;/STRONG&gt;&lt;SPAN&gt; Same data, new vocabulary. The new app uses the word &lt;/SPAN&gt;&lt;EM data-renderer-mark="true"&gt;endpoint&lt;/EM&gt;&lt;SPAN&gt; and surfaces the same Key Request as a row in the Endpoints tab. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_2-1779285238582.png" style="width: 800px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33232iD9600BC5CFC2E994/image-dimensions/800x272?v=v2" width="800" height="272" role="button" title="mreider_2-1779285238582.png" alt="mreider_2-1779285238582.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="905ee42d902e" data-renderer-start-pos="1439"&gt;&lt;STRONG data-renderer-mark="true"&gt;What that looks like in DQL.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-local-id="22e4a5462f16" data-renderer-start-pos="1470"&gt;Anything you didn't mark is bucketed into a catchall row labeled &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;NON_KEY_REQUESTS&lt;/CODE&gt;. That catchall row is a Latest-app concept; it doesn't appear in Classic.&lt;/P&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-wrapper ak-renderer-flex-center-wrapper css-l5clsc"&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-inner fabric-editor-breakout-mark fabric-editor-block-mark css-ozd7xs" data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;DIV class="css-1sws8jd"&gt;
&lt;DIV class="css-1u47mc9"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV&gt;&lt;SPAN&gt;timeseries count = sum(dt.service.request.count,&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;PRE class="code-block css-1l9rc3g" data-local-id="92180a5b5cbe"&gt;filter: dt.entity.service == "&amp;lt;SERVICE-ID&amp;gt;"),
by:{endpoint.name}, from: now()-5m
| sort arrayLast(count) desc&lt;/PRE&gt;
&lt;DIV class="code-block css-1l9rc3g" data-local-id="92180a5b5cbe"&gt;&lt;SPAN class="prismjs _11c819w5 _2rko12b0 _1dqoglyw _1e0c1txw _vwz4gktf _1reo1wug _o572qvpr _1eimjvyg _bfhk187e _syazi7uo _1ozdn7od _7xinn7od _t7aun7od _r28du2gc _tajqu2gc _1ohiu2gc _m802u2gc _i6ntu2gc _1w2xu2gc _1hmyegat _vblregat _vbulegat _196q1xv3 _1vbw1xv3 _1v9c1xv3 _1srnt0uh _18r6myb0 _vyvc1n1a _1d4j1y44 _1f8gstnw _1pzyb3bt _ra6gsb9t _13cdh2mm _1pp0126e _zvy9f705 _qcxof705 _qzn01a66 _j0l11wug _1weckb7n _1na21hna _vsnzgrf3 _x7c815vq _lh0y15vq _1m3815vq _qk1e15vq _12l6ysn8 _uga3ysn8 _mx8b7mnp _1kr87mnp _xo19t94y _1bemt94y _nalpstnw _151dstnw _1exb1q9c _1hgu1q9c _1mgnt94y _nhket94y _h909i8nm _scgayz1z _ipl81e17 _40uk1l04 _i81p1a66 _1gx21e5h _1ls01ule _vm2c1rh5 _12ok1rh5 _rude1ule _1q16glyw _1io6glyw _juomusic _lcwuusic _pyovu2gc _ccm6u2gc _1ascu2gc _1yuau2gc _xr0w1a66 _4io21a66 _euyxusvi _cahfusvi _zhnuidpf _1amdidpf _mbgc124n _bu7z124n _131n1giz _gy101giz _1wfuwrk5 _16kzwrk5 _9kk3wu06 _cjus1w1g _9k2r1m30 _nhmw1m30 _yl021m30 _eihtd5cb _t9zbd5cb _mqok1w1g _3hsg1w1g _i7ngn7od _9wu1fb2s _1xcoh55r _1t36i7uo _137bh55r _1k7di7uo _97li16jw _12nh9lu1 _1g0517qg _i2igqmo9 _326zi7uo _113p1rpy _1n6t16jw _tgu817qg _1k4716jw _g0lxi7uo _ys4e1rpy _7gp8h55r _1yvqqmo9 _1vwwqmo9 _1rjuqmo9 _1v0lh55r _wmyy17qg _748n17qg _1mfn17qg _1d7e17qg _p2vr17qg _19o6qmo9 _kxov17qg _1np517qg _m2f517qg _1b9t16jw _1tq616jw _1rd216jw _1pbk16jw _k3li16jw _13zt1rpy _2g12fb2s _k86bqmo9 _b5iy1rpy _gti31rpy _1f0g16jw _9d3e17qg _qdia16jw _72uv16jw _13dgkb7n _1707efft _1i3h1txw _16noidpf _h4fuidpf _pp6yidpf _1g4tidpf _11wmidpf _1bx8idpf" data-testid="renderer-code-block" data-ds--code--code-block="" data-code-lang=""&gt;&lt;CODE class="language-"&gt;&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="b49418086245" data-renderer-start-pos="1787"&gt;You'll see two rows: the Key Request and the catchall.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_3-1779285310400.png" style="width: 788px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33233i197BE5FA2F821EA7/image-dimensions/788x339?v=v2" width="788" height="339" role="button" title="mreider_3-1779285310400.png" alt="mreider_3-1779285310400.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The friction with Key Requests in Classic is that you had to mark each request by hand. If you cared about a hundred URL paths across fifty services, that was five thousand clicks.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 id="What-Enhanced-Endpoints-changes" tabindex="-1" data-renderer-start-pos="2029" data-local-id="905d2299aa1e"&gt;What Enhanced Endpoints changes&lt;/H2&gt;
&lt;P data-local-id="03db55e9bee3" data-renderer-start-pos="2062"&gt;&lt;STRONG data-renderer-mark="true"&gt;Enhanced Endpoints for SDv1&lt;/STRONG&gt; is the setting that removes the manual marking step. Once you enable it on a namespace (Settings → Process and Contextualize → Services → Enhanced endpoints for SDv1), Dynatrace auto-detects an endpoint for every request that has a stable name available. You still get the same per-row metrics, anomaly detection, and dashboard support, just without the Key Request step.&lt;/P&gt;
&lt;P data-local-id="051a1a856003" data-renderer-start-pos="2463"&gt;&lt;STRONG data-renderer-mark="true"&gt;What changes:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="58ad2bbaa5bc"&gt;
&lt;LI&gt;
&lt;P data-local-id="c78f70d4b910" data-renderer-start-pos="2480"&gt;&lt;STRONG data-renderer-mark="true"&gt;Classic doesn't change.&lt;/STRONG&gt; It still shows only the requests you marked. Classic is the manual-only world.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="e1e9d9ac12bd" data-renderer-start-pos="2586"&gt;&lt;STRONG data-renderer-mark="true"&gt;The Latest Services app fills in.&lt;/STRONG&gt; Every request that arrives with an http.route attribute becomes its own endpoint row. Spring Boot, Express, FastAPI, ASP.NET Core, .NET , Django, and Flask all set http.route for you. Anything you've configured with Request Naming Rules also surfaces as a named endpoint row (depending on which placeholders the rule uses).&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_4-1779285409674.png" style="width: 727px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33234i2FB9660434D806F6/image-dimensions/727x389?v=v2" width="727" height="389" role="button" title="mreider_4-1779285409674.png" alt="mreider_4-1779285409674.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="1e82ad9302e8" data-renderer-start-pos="2951"&gt;The DQL query from the previous section still works, but the result now it has two named endpoints, instead of one for search, and &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;NON_KEY_REQUESTS&lt;/CODE&gt; since we never marked submit as a key request. With Enhanced Endpoints on we didn’t have to.&lt;/P&gt;
&lt;P data-local-id="13ea30e20733" data-renderer-start-pos="3193"&gt;Enhanced Endpoints turns "requests you marked by hand" into "every request Dynatrace can identify".&lt;/P&gt;
&lt;P data-local-id="bae0e7b07645" data-renderer-start-pos="3295"&gt;The next two steps are about what happens when Dynatrace &lt;EM data-renderer-mark="true"&gt;can't&lt;/EM&gt; identify a request, and what you can do about it.&lt;/P&gt;
&lt;H2 id="When-http.route-is-missing:-the-over-collapse-problem" tabindex="-1" data-renderer-start-pos="3410" data-local-id="a122f6a91fd6"&gt;When &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; is missing: the over-collapse problem&lt;/H2&gt;
&lt;P data-local-id="c12b25695c5f" data-renderer-start-pos="3465"&gt;Most application frameworks set &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; for you, but &lt;STRONG data-renderer-mark="true"&gt;most reverse proxies and gateways don't&lt;/STRONG&gt;. Nginx, Apache, Kong, IIS, and many ingress controllers route requests without ever stamping the original URL template back onto the span. If any of your monitored services fall into that category, this section applies to you.&lt;/P&gt;
&lt;P data-local-id="7dc7d296b3d5" data-renderer-start-pos="3789"&gt;When a request lacks &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt;, Enhanced Endpoints has nothing to grab onto. In our first release of Enhanced Endpoints, the default rule that fired next collapsed every method-matched request into one bucket per HTTP method: &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;POST /*&lt;/CODE&gt;. Later in this guide you’ll read how to solve this problem, and also learn about a new endpoint-naming heuristic coming in the next few weeks to detect certain patterns automatically.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_0-1779285502964.png" style="width: 842px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33235i76762F5557CA7166/image-dimensions/842x400?v=v2" width="842" height="400" role="button" title="mreider_0-1779285502964.png" alt="mreider_0-1779285502964.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="52ffbe02ca14" data-renderer-start-pos="4220"&gt;The URL path is still on the span, so the data isn't lost; only the grouping is bad. You can confirm that yourself:&lt;/P&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-wrapper ak-renderer-flex-center-wrapper css-l5clsc"&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-inner fabric-editor-breakout-mark fabric-editor-block-mark css-ozd7xs" data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;DIV class="css-1sws8jd"&gt;
&lt;DIV class="css-1u47mc9"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV&gt;&lt;SPAN&gt;fetch spans, from: now()-15m&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;PRE class="code-block css-1l9rc3g" data-local-id="0e9f123095e4"&gt;| filter dt.entity.service == "&amp;lt;the over-collapsed service&amp;gt;"
| filter endpoint.name == "GET /*"
| fields timestamp, http.request.method, url.path
| limit 30&lt;/PRE&gt;
&lt;DIV class="code-block css-1l9rc3g" data-local-id="0e9f123095e4"&gt;&lt;SPAN class="prismjs _11c819w5 _2rko12b0 _1dqoglyw _1e0c1txw _vwz4gktf _1reo1wug _o572qvpr _1eimjvyg _bfhk187e _syazi7uo _1ozdn7od _7xinn7od _t7aun7od _r28du2gc _tajqu2gc _1ohiu2gc _m802u2gc _i6ntu2gc _1w2xu2gc _1hmyegat _vblregat _vbulegat _196q1xv3 _1vbw1xv3 _1v9c1xv3 _1srnt0uh _18r6myb0 _vyvc1n1a _1d4j1y44 _1f8gstnw _1pzyb3bt _ra6gsb9t _13cdh2mm _1pp0126e _zvy9f705 _qcxof705 _qzn01a66 _j0l11wug _1weckb7n _1na21hna _vsnzgrf3 _x7c815vq _lh0y15vq _1m3815vq _qk1e15vq _12l6ysn8 _uga3ysn8 _mx8b7mnp _1kr87mnp _xo19t94y _1bemt94y _nalpstnw _151dstnw _1exb1q9c _1hgu1q9c _1mgnt94y _nhket94y _h909i8nm _scgayz1z _ipl81e17 _40uk1l04 _i81p1a66 _1gx21e5h _1ls01ule _vm2c1rh5 _12ok1rh5 _rude1ule _1q16glyw _1io6glyw _juomusic _lcwuusic _pyovu2gc _ccm6u2gc _1ascu2gc _1yuau2gc _xr0w1a66 _4io21a66 _euyxusvi _cahfusvi _zhnuidpf _1amdidpf _mbgc124n _bu7z124n _131n1giz _gy101giz _1wfuwrk5 _16kzwrk5 _9kk3wu06 _cjus1w1g _9k2r1m30 _nhmw1m30 _yl021m30 _eihtd5cb _t9zbd5cb _mqok1w1g _3hsg1w1g _i7ngn7od _9wu1fb2s _1xcoh55r _1t36i7uo _137bh55r _1k7di7uo _97li16jw _12nh9lu1 _1g0517qg _i2igqmo9 _326zi7uo _113p1rpy _1n6t16jw _tgu817qg _1k4716jw _g0lxi7uo _ys4e1rpy _7gp8h55r _1yvqqmo9 _1vwwqmo9 _1rjuqmo9 _1v0lh55r _wmyy17qg _748n17qg _1mfn17qg _1d7e17qg _p2vr17qg _19o6qmo9 _kxov17qg _1np517qg _m2f517qg _1b9t16jw _1tq616jw _1rd216jw _1pbk16jw _k3li16jw _13zt1rpy _2g12fb2s _k86bqmo9 _b5iy1rpy _gti31rpy _1f0g16jw _9d3e17qg _qdia16jw _72uv16jw _13dgkb7n _1707efft _1i3h1txw _16noidpf _h4fuidpf _pp6yidpf _1g4tidpf _11wmidpf _1bx8idpf" data-testid="renderer-code-block" data-ds--code--code-block="" data-code-lang=""&gt;&lt;CODE class="language-"&gt;&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="72bd32075182" data-renderer-start-pos="4525"&gt;You'll see thirty different URLs all stamped with &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;endpoint.name = GET /*&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_1-1779285602920.png" style="width: 793px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33236i3C0B0FDF8513C6A4/image-dimensions/793x830?v=v2" width="793" height="830" role="button" title="mreider_1-1779285602920.png" alt="mreider_1-1779285602920.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="7d6e56af3fec" data-renderer-start-pos="4603"&gt;To summarize: Enhanced Endpoints, with no &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; and no rules means everything collapsing to &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt;. The data is fine; the grouping is bad.&lt;/P&gt;
&lt;P data-local-id="34cb947d87c2" data-renderer-start-pos="4748"&gt;To find where this is happening across your own tenant:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;PRE data-local-id="f10137d48e8a"&gt;timeseries c = sum(dt.service.request.count),
  by:{dt.entity.service, endpoint.name}, from: now()-1h
| filter endpoint.name == "GET /*" or endpoint.name == "POST /*"
| summarize total = sum(arrayLast(c)), by:{dt.entity.service}
| sort total desc | limit 20
&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="a9376677ed34" data-renderer-start-pos="5065"&gt;That will give you the top-twenty over-collapse offenders.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="Fixing-over-collapse-today:-rules" tabindex="-1" data-renderer-start-pos="5126" data-local-id="77c023c920d7"&gt;Fixing over-collapse today: rules&lt;/H2&gt;
&lt;P data-local-id="a494244b9203" data-renderer-start-pos="5161"&gt;As mentioned, Dynatrace will be releasing a better endpoint heuristic in the coming weeks, but you don't have to wait for anything to fix the over-collapse on a service. Two rule-based mechanisms are available right now.&lt;/P&gt;
&lt;H3 id="Request-Naming-Rules-with-{URL:Path-Clean}-(SDv1)" tabindex="-1" data-renderer-start-pos="5383" data-local-id="a17bd959a87a"&gt;Request Naming Rules with &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt; (SDv1)&lt;/H3&gt;
&lt;P data-local-id="0739dbe0ff7c" data-renderer-start-pos="5434"&gt;For SDv1 services, write a Request Naming Rule (Settings → Service Detection → Request Naming Rules) with the pattern &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt;. Dynatrace will use the request URL but replace volatile-looking segments with stable markers.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_2-1779285669454.png" style="width: 810px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33237i9D4A15C06911EB9B/image-dimensions/810x498?v=v2" width="810" height="498" role="button" title="mreider_2-1779285669454.png" alt="mreider_2-1779285669454.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_3-1779285689926.png" style="width: 851px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33238iABFE5950DBED34F3/image-dimensions/851x515?v=v2" width="851" height="515" role="button" title="mreider_3-1779285689926.png" alt="mreider_3-1779285689926.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="fd58007a2bfd" data-renderer-start-pos="5671"&gt;&lt;STRONG data-renderer-mark="true"&gt;What Path-Clean catches:&lt;/STRONG&gt; four specific patterns, each replaced with a stable token: UUIDs (so &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;e4674467-1e9a-42cf-…&lt;/CODE&gt; becomes &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[UUID]&lt;/CODE&gt;), IPv4 addresses (&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[IPv4]&lt;/CODE&gt;), IPv6 addresses (&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[IPv6]&lt;/CODE&gt;), and IBANs (&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[IBAN]&lt;/CODE&gt;). Any clean-up URL rules you've configured on the service (for example, to strip &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;jsessionid&lt;/CODE&gt; from the URL) are always applied as well, regardless of whether Path-Clean is in the naming pattern.&lt;/P&gt;
&lt;P data-local-id="fc9c740d2a9d" data-renderer-start-pos="6065"&gt;&lt;STRONG data-renderer-mark="true"&gt;What Path-Clean leaves alone:&lt;/STRONG&gt; short mixed-case alphanumeric IDs like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;0erepyo9&lt;/CODE&gt; or &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;abc123&lt;/CODE&gt;. The detector doesn't recognize those as volatile, so they stay literal, meaning each unique value becomes its own endpoint row.&lt;/P&gt;
&lt;P data-local-id="3e97abf27d7f" data-renderer-start-pos="6283"&gt;If your IDs look like that, Path-Clean alone won't be enough. You'd combine it with a &lt;STRONG data-renderer-mark="true"&gt;custom placeholder&lt;/STRONG&gt; that strips or templates the volatile portion explicitly.&lt;/P&gt;
&lt;P data-local-id="56cafd141ea8" data-renderer-start-pos="6447"&gt;A custom placeholder is a user-defined transformation that wraps one of the same volatile attributes the built-in placeholders use (for example, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;URL_PATH&lt;/CODE&gt;, the source attribute behind &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt;) and applies an extraction step on top: a delimiter split, a regex capture, and so on. The result becomes a named token you can reference in your Request Naming Rule pattern. The example below configures one such placeholder, named &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;ItemPath&lt;/CODE&gt;, defined as a regex extraction &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;^(/shop/[^/]++)&lt;/CODE&gt; against &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;URL_PATH&lt;/CODE&gt;. The intent is to keep only the first two segments of any &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;/shop/...&lt;/CODE&gt; URL path, dropping everything after.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_4-1779285719890.png" style="width: 821px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33239iC215DE1544940628/image-dimensions/821x753?v=v2" width="821" height="753" role="button" title="mreider_4-1779285719890.png" alt="mreider_4-1779285719890.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="9c55cf116be7" data-renderer-start-pos="7061"&gt;There's a subtlety worth knowing in advance. The SDv1 naming-behavior changes shipping in cluster version 1.341 (the endpoint-naming heuristic, the custom-placeholder resolution described next, and the related URL-path handling) are bundled behind one per-tenant feature flag. Until that flag is on for your tenant, &lt;STRONG data-renderer-mark="true"&gt;custom placeholders that wrap a URL-path attribute do not resolve at the endpoint-name level&lt;/STRONG&gt;. They render as the literal placeholder string (for example, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;endpoint.name = {ItemPath}&lt;/CODE&gt;) because the current SDv1 default-name code path treats URL-path attributes as too volatile to substitute directly.&amp;nbsp;&lt;/P&gt;
&lt;P data-local-id="9c55cf116be7" data-renderer-start-pos="7061"&gt;&lt;SPAN&gt;After the flag is on, the same rule starts resolving as expected, alongside the heuristic-derived names. The flag does not make raw volatile URL-path values resolve on their own. Those still won't. What it enables is your custom placeholder's transformation taking effect, so the wrapped URL-path attribute resolves only because your extraction step (regex, delimiter split, and so on) has rendered it non-volatile.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-local-id="85d115597a7d" data-renderer-start-pos="7780"&gt;&lt;STRONG data-renderer-mark="true"&gt;Built-in placeholders are not affected.&amp;nbsp;&lt;/STRONG&gt;This flag only gates the resolution of custom placeholders that wrap a&amp;nbsp;volatile URL-path attribute. A built-in placeholder like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt; always resolves regardless of the flag's state because Dynatrace deems its output non-volatile. That's the goal of &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt;: it cleans the path, so the result is stable. A rule like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt; is therefore safe to use today and will keep producing the same endpoint name before and after the flag flips.&lt;/P&gt;
&lt;P data-local-id="81d1cfb526f6" data-renderer-start-pos="8188"&gt;Here’s what it looks like before the feature flag:&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_5-1779285747180.png" style="width: 811px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33240iF936A0066EE9955E/image-dimensions/811x292?v=v2" width="811" height="292" role="button" title="mreider_5-1779285747180.png" alt="mreider_5-1779285747180.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;And here’s what it looks like afterwards:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_6-1779285776933.png" style="width: 798px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33241i4F7FF46D243CC5F5/image-dimensions/798x350?v=v2" width="798" height="350" role="button" title="mreider_6-1779285776933.png" alt="mreider_6-1779285776933.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="b14c196ad4ff" data-renderer-start-pos="8289"&gt;You can see the result in a Notebook as follows:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;PRE data-local-id="44e78cef7f4f"&gt;timeseries count = sum(dt.service.request.count,
filter: dt.entity.service == "&amp;lt;service-id&amp;gt;"),
by:{endpoint.name}, from: now()-5m
| sort arrayLast(count) desc&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_0-1779285863099.png" style="width: 846px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33242i8F8A63DC2795E67D/image-dimensions/846x353?v=v2" width="846" height="353" role="button" title="mreider_0-1779285863099.png" alt="mreider_0-1779285863099.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H3 id="URL-path-pattern-matching-(SDv2)" tabindex="-1" data-renderer-start-pos="8502" data-local-id="4f5221391c70"&gt;URL path pattern matching (SDv2)&lt;/H3&gt;
&lt;P data-local-id="2f7716c06859" data-renderer-start-pos="8536"&gt;On SDv2, the equivalent customer-facing rule is &lt;STRONG data-renderer-mark="true"&gt;URL path pattern matching&lt;/STRONG&gt; (Settings → Service Detection → URL path pattern matching, or &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;builtin:url-path-pattern-matching-rules&lt;/CODE&gt; in the API). You describe your URL shapes directly:&lt;/P&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-wrapper ak-renderer-flex-center-wrapper css-l5clsc"&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-inner fabric-editor-breakout-mark fabric-editor-block-mark css-ozd7xs" data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;DIV class="css-1sws8jd"&gt;
&lt;DIV class="css-1u47mc9"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV&gt;&lt;SPAN&gt;/shop/products/{id}&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;PRE class="code-block css-1l9rc3g" data-local-id="0228f18d3850"&gt;/shop/carts/{cartId}/items/{itemId}
/shop/orders/{id}
/shop/checkout&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_1-1779285910443.png" style="width: 809px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33243i78C77E6775EB1176/image-dimensions/809x639?v=v2" width="809" height="639" role="button" title="mreider_1-1779285910443.png" alt="mreider_1-1779285910443.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_2-1779285928376.png" style="width: 842px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33244iE9DE4AA49794016E/image-dimensions/842x342?v=v2" width="842" height="342" role="button" title="mreider_2-1779285928376.png" alt="mreider_2-1779285928376.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="7dd90d8e354b" data-renderer-start-pos="8861"&gt;This is the same Nginx workload, but now you see what matters instead of a single &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt;. Rules let you template your URLs by hand. They work today. They do take some maintenance, especially across many services, which brings us to a description of the heuristic in the next section.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="The-endpoint-naming-heuristic-that's-coming" tabindex="-1" data-renderer-start-pos="9147" data-local-id="f5dee3781042"&gt;The endpoint-naming heuristic that's coming&lt;/H2&gt;
&lt;P data-local-id="bc6778598dbe" data-renderer-start-pos="9192"&gt;&lt;STRONG data-renderer-mark="true"&gt;The endpoint-naming heuristic&lt;/STRONG&gt; does what those rules do, but automatically.&lt;/P&gt;
&lt;P data-local-id="899c13f56003" data-renderer-start-pos="9268"&gt;&lt;SPAN&gt;When &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt;&amp;nbsp;is missing on the ingested data, the heuristic looks at the raw URL path, identifies the volatile segments (the same kinds of patterns Path-Clean catches, plus some more), and produces a &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt;&amp;nbsp;attribute based on that URL path. The already existing rule: &lt;STRONG&gt;[Built-in] HTTP request method and route&lt;/STRONG&gt; will now trigger and produce a stable endpoint name. No rule authoring required.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-local-id="a17e39a4dbac" data-renderer-start-pos="9532"&gt;After the heuristic activates, the same Nginx service that was showing &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt; shows &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /shop/products&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /shop/carts&lt;/CODE&gt;, and so on. The catch-all collapses into one endpoint per real URL shape.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_3-1779285956725.png" style="width: 829px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33245i2B19301970AEE3B2/image-dimensions/829x259?v=v2" width="829" height="259" role="button" title="mreider_3-1779285956725.png" alt="mreider_3-1779285956725.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H3 id="When-and-how-it-ships" tabindex="-1" data-renderer-start-pos="9730" data-local-id="6494bc9ebd2f"&gt;When it ships&lt;/H3&gt;
&lt;DIV style="border-left: 4px solid #1496e2; background: #f1f8fd; padding: 12px 18px; margin: 16px 0; border-radius: 4px; font-family: inherit; color: #1d2c3a;"&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&lt;SPAN&gt;The following rollouts, for SDv1 and SDv2, are scheduled to start in SaaS cluster 1.342 on June 30th. &lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&lt;SPAN&gt;The rollout puts all the code in place but changes nothing on its own. The new naming takes effect only when&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;you&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;choose to make it, by flipping the SDv1 feature flag and disabling the SDv2 built-in rule. &lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&lt;SPAN&gt;These are two independent switches you control on your own timeline: either order, or both at once.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="3767174b0fa4" data-renderer-start-pos="10525"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv1 rollout: a per-tenant feature flag.&lt;/STRONG&gt; One flag (the SDv1 naming flag) gates the whole SDv1 bundle. When it's on, heuristic-derived names plus the related naming behavior land together; until then, none of them do.&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="f179d1df2fe0"&gt;
&lt;LI&gt;
&lt;P data-local-id="e16ba7e18529" data-renderer-start-pos="10754"&gt;&lt;STRONG data-renderer-mark="true"&gt;If you don't have Enhanced Endpoints turned on yet,&lt;/STRONG&gt; when you enable it any time from 1.341 onward, the new SDv1 naming behavior comes with it, on by default. You go straight from "Key Requests only" to "clean endpoint names" with no intermediate &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt; phase.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="8043d5ff2866" data-renderer-start-pos="11017"&gt;&lt;STRONG data-renderer-mark="true"&gt;If you already enabled Enhanced Endpoints,&lt;/STRONG&gt; the SDv1 naming flag is off by default for you, on purpose, because some of your existing dashboards, SLOs, and alerts may bind to current endpoint names like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt; and turning the flag on changes those names. The guardrail gives you time to audit. When you are ready, get in touch with your Dynatrace account team to enable to feature flag: &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;sdv1-url-and-http-route-naming&lt;/CODE&gt;.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-local-id="2c6a98d66820" data-renderer-start-pos="11438"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv2 rollout: a built-in opt-out rule and heuristic.&amp;nbsp;&lt;/STRONG&gt;On every existing tenant, Dynatrace pre-provisions a built-in endpoint-detection rule in &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;builtin:endpoint-detection-rules&lt;/CODE&gt;. New tenants created after this point don't get the rule provisioned, so they get the new SDv2 behavior from the start. Existing tenants keep producing GET /* until someone disables that built-in rule. Nothing flips on its own.&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="c888f855255c"&gt;
&lt;LI&gt;
&lt;P data-local-id="045ea0b23fad" data-renderer-start-pos="11796"&gt;&lt;STRONG data-renderer-mark="true"&gt;Name template:&lt;/STRONG&gt; &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{http.request.method} /*&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="625275b0b807" data-renderer-start-pos="11839"&gt;&lt;STRONG data-renderer-mark="true"&gt;Condition:&lt;/STRONG&gt; &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;isNotNull(http.request.method) and isNotNull(http.route) and supportability.is_http_route_derived == true&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="5f7f5d70a67f" data-renderer-start-pos="11959"&gt;&lt;STRONG data-renderer-mark="true"&gt;Status:&lt;/STRONG&gt; enabled by default on every existing tenant. This is a built-in rule that Dynatrace provisions on those tenants. Customers can't manually create it, only enable or disable it.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-local-id="7f67cd9bbd76" data-renderer-start-pos="14104"&gt;To see whether the SDv2 heuristic is producing results on a span:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="code-line" dir="auto" data-line="76"&gt;fetch spans, from: now()-15m
| filter dt.entity.service == "&amp;lt;a service that used to over-collapse&amp;gt;"
| fieldsAdd derived = `supportability.is_http_route_derived`
| fields span.name, url.path, http.route, derived, endpoint.name
| limit 20&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;SPAN&gt;When &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; is populated and &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;supportability.is_http_route_derived&lt;/CODE&gt; is &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;true&lt;/CODE&gt;, the SDv2 heuristic is active. The route was derived by the heuristic rather than emitted by your app. Until then, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; is empty (or app-supplied) and the flag is &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;false&lt;/CODE&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV id="content" class="highlighter-context page view" data-testid="page-content-only" data-inline-comments-target="true"&gt;
&lt;DIV class="_19itglyw _vchhusvi _r06hglyw _19pkidpf _2hwx1wug _otyr1epz _18u01wug _1bsb1osq"&gt;
&lt;DIV&gt;
&lt;DIV id="main-content" class="wiki-content css-th923b e5xcnr80" data-test-appearance="full-width" data-vc="pageContentRendererTestId" data-testid="pageContentRendererTestId"&gt;
&lt;DIV class="renderer-overrides"&gt;
&lt;DIV class="css-3qfej8"&gt;
&lt;DIV class="ak-renderer-wrapper is-full-width css-pw7jst"&gt;
&lt;DIV class="css-1msdwtb" role="none"&gt;
&lt;DIV class="ak-renderer-document"&gt;
&lt;H2 id="A-note-on-service-display-names" tabindex="-1" data-renderer-start-pos="14660" data-local-id="7ba9aa00397d"&gt;A note on service display names&lt;/H2&gt;
&lt;P data-local-id="326ba811ecd6" data-renderer-start-pos="14693"&gt;As described in the &lt;A href="https://community.dynatrace.com/t5/Heads-up-from-Dynatrace/Service-Naming-What-s-Changing-and-What-to-Do/tac-p/296213" target="_blank" rel="noopener"&gt;community post a out Service Naming rule changes&lt;/A&gt;, ff your SDv1 Nginx (or similar non-Java) service shows up in the Services list as just &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;:8080&lt;/CODE&gt;, that's the SDv1 detected name. Legacy Service Naming Rules used to fix this, but they're being retired: they only changed the UI display, never flowed into your spans, metrics, logs, or DQL.&lt;/P&gt;
&lt;P data-local-id="adc0748c66fe" data-renderer-start-pos="14979"&gt;&lt;STRONG data-renderer-mark="true"&gt;The new approach is to set &lt;/STRONG&gt;&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;OTEL_SERVICE_NAME&lt;/CODE&gt;&lt;STRONG data-renderer-mark="true"&gt; as an environment variable on the process&lt;/STRONG&gt; (works with OneAgent, no OTel SDK required):&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;PRE data-local-id="8a6d3c9cb82c"&gt;env:
  - name: OTEL_SERVICE_NAME
    value: my-checkout-service
&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="4a5fdbfae33b" data-renderer-start-pos="15178"&gt;That value lands as &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;service.name&lt;/CODE&gt; on every span, which flows through to metrics, dashboards, SLOs, and alerting automatically.&lt;/P&gt;
&lt;P data-local-id="39554687c2a8" data-renderer-start-pos="15305"&gt;What's coming:&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="7a5576f34de9"&gt;
&lt;LI&gt;
&lt;P data-local-id="87a79f6b2cb9" data-renderer-start-pos="15323"&gt;&lt;STRONG data-renderer-mark="true"&gt;Primary Fields and Primary Tags&lt;/STRONG&gt; will appear as dimensions on service metrics in June 2026, so you can filter and sort the Services list by &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;k8s.namespace.name&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;team&lt;/CODE&gt;, region, environment, etc. without packing that context into the service name.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="0b26e239f06d" data-renderer-start-pos="15569"&gt;&lt;STRONG data-renderer-mark="true"&gt;A short-term display fix&lt;/STRONG&gt; under discussion combines &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;service.name&lt;/CODE&gt; with the detected name: &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;my-app (WebRequestService)&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;my-app (BackgroundWorker)&lt;/CODE&gt;. Useful when one process hosts multiple SDv1 services.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="967822fbff6a" data-renderer-start-pos="15769"&gt;&lt;STRONG data-renderer-mark="true"&gt;Server-side renaming via OpenPipeline&lt;/STRONG&gt; is being explored: a processing rule that sets or overrides &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;service.name&lt;/CODE&gt; based on resource attributes, no deployment changes required.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-local-id="c5ffab9aa801" data-renderer-start-pos="15945"&gt;For now, set &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;OTEL_SERVICE_NAME&lt;/CODE&gt; where you can, and your services will be queryable by the right name even if the Services list display catches up later.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV data-vc="eop-recommendations-wrapper"&gt;
&lt;DIV data-hydration-shield="nhVSK:z8NN7:qz-Pe:OP-5u"&gt;
&lt;DIV data-loadable-boundary-content="nhVSK:z8NN7:qz-Pe:OP-5u"&gt;
&lt;DIV class="end-of-page-rec-wrapper" data-vc="end-of-page-recommendation" data-testid="end-page-rec-wrapper"&gt;
&lt;DIV class="css-thp8s8" data-vc="end-of-page-recommendation-component" data-testid="test-rec"&gt;
&lt;DIV class=""&gt;
&lt;DIV class="css-10do7z4" role="list"&gt;
&lt;DIV class="()=&amp;gt;(e=&amp;gt;{let t;switch(e){case 1:case 2:case 4:t=[eu];break;default:t=[em]}return t.push(ep),t})(s.length) css-6cu6fo" role="listitem"&gt;
&lt;DIV class="css-7k23k6"&gt;
&lt;DIV class="_19itia51 _2rko1mok _kqswh2mm _bfhkvuon _14iyidpf _1qamtlke _1pjhtlke _d0altlke _17zqt94y _km9nt94y _1soat94y _180dt7xp _1u6lt7xp _1dbzt7xp _1yt4u2gc _1e0c1txw _4t3i12am _4cvr1h6o" data-testid="page-card-card-container"&gt;
&lt;DIV class="css-xa6x6v" data-testid="page-card-end-of-page-view"&gt;
&lt;DIV class="css-vg4d5j"&gt;
&lt;DIV class="css-z923o7"&gt;
&lt;DIV class="_1reo15vq _18m915vq _1e0ccj1k _1yyjcs5v _sudp1e54 _1bto1l2s"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
    <pubDate>Wed, 03 Jun 2026 14:34:19 GMT</pubDate>
    <dc:creator>mreider</dc:creator>
    <dc:date>2026-06-03T14:34:19Z</dc:date>
    <item>
      <title>Enhanced Endpoints Guide</title>
      <link>https://community.dynatrace.com/t5/Troubleshooting/Enhanced-Endpoints-Guide/ta-p/297926</link>
      <description>&lt;DIV style="border-left: 4px solid #1496e2; background: #f1f8fd; padding: 12px 18px; margin: 16px 0; border-radius: 4px; font-family: inherit; color: #1d2c3a;"&gt;
&lt;DIV style="font-weight: 600; color: #1496e2; text-transform: uppercase; font-size: 12px; letter-spacing: 0.04em; margin-bottom: 6px;"&gt;Editor's note · May 20, 2026&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;This post has been &lt;STRONG&gt;fully rewritten&lt;/STRONG&gt; to reflect the current Enhanced Endpoint Guide. The structure, examples, screenshots, and rollout details have all changed since the previous version. If you've bookmarked an earlier paragraph or linked an old section, you may want to re-read top to bottom.&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;Changes are scheduled to start during the rollout of SaaS Cluster version 1.342, which is scheduled to begin on June 30th.&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="6e09a63eafaf" data-renderer-start-pos="1"&gt;How endpoint detection looks in Dynatrace depends on a few things: which app you're using (Classic or the new Services app), whether Enhanced Endpoints is enabled, whether your services run on Service Detection v1 or v2, and whether your applications emit &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; on their spans. Different combinations produce noticeably different pictures in the Services app, and the path forward from each one isn't the same.&lt;/P&gt;
&lt;P data-local-id="b8a4c317f6db" data-renderer-start-pos="418"&gt;This guide walks through those combinations one at a time. Read the sections in order if you want the full picture, or skip to the one that matches your situation.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="Classic-Services-and-Key-Requests" tabindex="-1" data-renderer-start-pos="584" data-local-id="c7713d430e99"&gt;Classic Services and Key Requests&lt;/H2&gt;
&lt;P data-local-id="133c68b032cc" data-renderer-start-pos="619"&gt;In Service Detection v1 (SDv1) on the Classic Services app, the way you get per-request detail is to &lt;STRONG data-renderer-mark="true"&gt;mark requests as Key Requests&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-local-id="448fd9e8592e" data-renderer-start-pos="752"&gt;You'd open a service, click &lt;EM data-renderer-mark="true"&gt;View all request details&lt;/EM&gt;, find the request you cared about (say, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;/orders/search&lt;/CODE&gt;), and pick &lt;EM data-renderer-mark="true"&gt;Mark as key request&lt;/EM&gt;. After that, Dynatrace tracked that request as its own row with golden-signal metrics, anomaly detection, and so on.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_0-1779285137396.png" style="width: 734px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33230i9F9848BE528915B8/image-dimensions/734x241?v=v2" width="734" height="241" role="button" title="mreider_0-1779285137396.png" alt="mreider_0-1779285137396.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG data-renderer-mark="true"&gt;What that looks like in Classic.&lt;/STRONG&gt;&lt;SPAN&gt; The service overview screen has a Key Requests / Endpoints panel listing your marked requests. Requests you didn't mark don't get their own row in Classic; their data folds into the service's aggregate metrics.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_1-1779285173130.png" style="width: 744px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33231i7838BA12E0CCCDFF/image-dimensions/744x292?v=v2" width="744" height="292" role="button" title="mreider_1-1779285173130.png" alt="mreider_1-1779285173130.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG data-renderer-mark="true"&gt;What that looks like in the new Services app.&lt;/STRONG&gt;&lt;SPAN&gt; Same data, new vocabulary. The new app uses the word &lt;/SPAN&gt;&lt;EM data-renderer-mark="true"&gt;endpoint&lt;/EM&gt;&lt;SPAN&gt; and surfaces the same Key Request as a row in the Endpoints tab. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_2-1779285238582.png" style="width: 800px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33232iD9600BC5CFC2E994/image-dimensions/800x272?v=v2" width="800" height="272" role="button" title="mreider_2-1779285238582.png" alt="mreider_2-1779285238582.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="905ee42d902e" data-renderer-start-pos="1439"&gt;&lt;STRONG data-renderer-mark="true"&gt;What that looks like in DQL.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-local-id="22e4a5462f16" data-renderer-start-pos="1470"&gt;Anything you didn't mark is bucketed into a catchall row labeled &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;NON_KEY_REQUESTS&lt;/CODE&gt;. That catchall row is a Latest-app concept; it doesn't appear in Classic.&lt;/P&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-wrapper ak-renderer-flex-center-wrapper css-l5clsc"&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-inner fabric-editor-breakout-mark fabric-editor-block-mark css-ozd7xs" data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;DIV class="css-1sws8jd"&gt;
&lt;DIV class="css-1u47mc9"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV&gt;&lt;SPAN&gt;timeseries count = sum(dt.service.request.count,&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;PRE class="code-block css-1l9rc3g" data-local-id="92180a5b5cbe"&gt;filter: dt.entity.service == "&amp;lt;SERVICE-ID&amp;gt;"),
by:{endpoint.name}, from: now()-5m
| sort arrayLast(count) desc&lt;/PRE&gt;
&lt;DIV class="code-block css-1l9rc3g" data-local-id="92180a5b5cbe"&gt;&lt;SPAN class="prismjs _11c819w5 _2rko12b0 _1dqoglyw _1e0c1txw _vwz4gktf _1reo1wug _o572qvpr _1eimjvyg _bfhk187e _syazi7uo _1ozdn7od _7xinn7od _t7aun7od _r28du2gc _tajqu2gc _1ohiu2gc _m802u2gc _i6ntu2gc _1w2xu2gc _1hmyegat _vblregat _vbulegat _196q1xv3 _1vbw1xv3 _1v9c1xv3 _1srnt0uh _18r6myb0 _vyvc1n1a _1d4j1y44 _1f8gstnw _1pzyb3bt _ra6gsb9t _13cdh2mm _1pp0126e _zvy9f705 _qcxof705 _qzn01a66 _j0l11wug _1weckb7n _1na21hna _vsnzgrf3 _x7c815vq _lh0y15vq _1m3815vq _qk1e15vq _12l6ysn8 _uga3ysn8 _mx8b7mnp _1kr87mnp _xo19t94y _1bemt94y _nalpstnw _151dstnw _1exb1q9c _1hgu1q9c _1mgnt94y _nhket94y _h909i8nm _scgayz1z _ipl81e17 _40uk1l04 _i81p1a66 _1gx21e5h _1ls01ule _vm2c1rh5 _12ok1rh5 _rude1ule _1q16glyw _1io6glyw _juomusic _lcwuusic _pyovu2gc _ccm6u2gc _1ascu2gc _1yuau2gc _xr0w1a66 _4io21a66 _euyxusvi _cahfusvi _zhnuidpf _1amdidpf _mbgc124n _bu7z124n _131n1giz _gy101giz _1wfuwrk5 _16kzwrk5 _9kk3wu06 _cjus1w1g _9k2r1m30 _nhmw1m30 _yl021m30 _eihtd5cb _t9zbd5cb _mqok1w1g _3hsg1w1g _i7ngn7od _9wu1fb2s _1xcoh55r _1t36i7uo _137bh55r _1k7di7uo _97li16jw _12nh9lu1 _1g0517qg _i2igqmo9 _326zi7uo _113p1rpy _1n6t16jw _tgu817qg _1k4716jw _g0lxi7uo _ys4e1rpy _7gp8h55r _1yvqqmo9 _1vwwqmo9 _1rjuqmo9 _1v0lh55r _wmyy17qg _748n17qg _1mfn17qg _1d7e17qg _p2vr17qg _19o6qmo9 _kxov17qg _1np517qg _m2f517qg _1b9t16jw _1tq616jw _1rd216jw _1pbk16jw _k3li16jw _13zt1rpy _2g12fb2s _k86bqmo9 _b5iy1rpy _gti31rpy _1f0g16jw _9d3e17qg _qdia16jw _72uv16jw _13dgkb7n _1707efft _1i3h1txw _16noidpf _h4fuidpf _pp6yidpf _1g4tidpf _11wmidpf _1bx8idpf" data-testid="renderer-code-block" data-ds--code--code-block="" data-code-lang=""&gt;&lt;CODE class="language-"&gt;&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="b49418086245" data-renderer-start-pos="1787"&gt;You'll see two rows: the Key Request and the catchall.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_3-1779285310400.png" style="width: 788px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33233i197BE5FA2F821EA7/image-dimensions/788x339?v=v2" width="788" height="339" role="button" title="mreider_3-1779285310400.png" alt="mreider_3-1779285310400.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The friction with Key Requests in Classic is that you had to mark each request by hand. If you cared about a hundred URL paths across fifty services, that was five thousand clicks.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 id="What-Enhanced-Endpoints-changes" tabindex="-1" data-renderer-start-pos="2029" data-local-id="905d2299aa1e"&gt;What Enhanced Endpoints changes&lt;/H2&gt;
&lt;P data-local-id="03db55e9bee3" data-renderer-start-pos="2062"&gt;&lt;STRONG data-renderer-mark="true"&gt;Enhanced Endpoints for SDv1&lt;/STRONG&gt; is the setting that removes the manual marking step. Once you enable it on a namespace (Settings → Process and Contextualize → Services → Enhanced endpoints for SDv1), Dynatrace auto-detects an endpoint for every request that has a stable name available. You still get the same per-row metrics, anomaly detection, and dashboard support, just without the Key Request step.&lt;/P&gt;
&lt;P data-local-id="051a1a856003" data-renderer-start-pos="2463"&gt;&lt;STRONG data-renderer-mark="true"&gt;What changes:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="58ad2bbaa5bc"&gt;
&lt;LI&gt;
&lt;P data-local-id="c78f70d4b910" data-renderer-start-pos="2480"&gt;&lt;STRONG data-renderer-mark="true"&gt;Classic doesn't change.&lt;/STRONG&gt; It still shows only the requests you marked. Classic is the manual-only world.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="e1e9d9ac12bd" data-renderer-start-pos="2586"&gt;&lt;STRONG data-renderer-mark="true"&gt;The Latest Services app fills in.&lt;/STRONG&gt; Every request that arrives with an http.route attribute becomes its own endpoint row. Spring Boot, Express, FastAPI, ASP.NET Core, .NET , Django, and Flask all set http.route for you. Anything you've configured with Request Naming Rules also surfaces as a named endpoint row (depending on which placeholders the rule uses).&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_4-1779285409674.png" style="width: 727px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33234i2FB9660434D806F6/image-dimensions/727x389?v=v2" width="727" height="389" role="button" title="mreider_4-1779285409674.png" alt="mreider_4-1779285409674.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="1e82ad9302e8" data-renderer-start-pos="2951"&gt;The DQL query from the previous section still works, but the result now it has two named endpoints, instead of one for search, and &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;NON_KEY_REQUESTS&lt;/CODE&gt; since we never marked submit as a key request. With Enhanced Endpoints on we didn’t have to.&lt;/P&gt;
&lt;P data-local-id="13ea30e20733" data-renderer-start-pos="3193"&gt;Enhanced Endpoints turns "requests you marked by hand" into "every request Dynatrace can identify".&lt;/P&gt;
&lt;P data-local-id="bae0e7b07645" data-renderer-start-pos="3295"&gt;The next two steps are about what happens when Dynatrace &lt;EM data-renderer-mark="true"&gt;can't&lt;/EM&gt; identify a request, and what you can do about it.&lt;/P&gt;
&lt;H2 id="When-http.route-is-missing:-the-over-collapse-problem" tabindex="-1" data-renderer-start-pos="3410" data-local-id="a122f6a91fd6"&gt;When &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; is missing: the over-collapse problem&lt;/H2&gt;
&lt;P data-local-id="c12b25695c5f" data-renderer-start-pos="3465"&gt;Most application frameworks set &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; for you, but &lt;STRONG data-renderer-mark="true"&gt;most reverse proxies and gateways don't&lt;/STRONG&gt;. Nginx, Apache, Kong, IIS, and many ingress controllers route requests without ever stamping the original URL template back onto the span. If any of your monitored services fall into that category, this section applies to you.&lt;/P&gt;
&lt;P data-local-id="7dc7d296b3d5" data-renderer-start-pos="3789"&gt;When a request lacks &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt;, Enhanced Endpoints has nothing to grab onto. In our first release of Enhanced Endpoints, the default rule that fired next collapsed every method-matched request into one bucket per HTTP method: &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;POST /*&lt;/CODE&gt;. Later in this guide you’ll read how to solve this problem, and also learn about a new endpoint-naming heuristic coming in the next few weeks to detect certain patterns automatically.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_0-1779285502964.png" style="width: 842px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33235i76762F5557CA7166/image-dimensions/842x400?v=v2" width="842" height="400" role="button" title="mreider_0-1779285502964.png" alt="mreider_0-1779285502964.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="52ffbe02ca14" data-renderer-start-pos="4220"&gt;The URL path is still on the span, so the data isn't lost; only the grouping is bad. You can confirm that yourself:&lt;/P&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-wrapper ak-renderer-flex-center-wrapper css-l5clsc"&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-inner fabric-editor-breakout-mark fabric-editor-block-mark css-ozd7xs" data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;DIV class="css-1sws8jd"&gt;
&lt;DIV class="css-1u47mc9"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV&gt;&lt;SPAN&gt;fetch spans, from: now()-15m&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;PRE class="code-block css-1l9rc3g" data-local-id="0e9f123095e4"&gt;| filter dt.entity.service == "&amp;lt;the over-collapsed service&amp;gt;"
| filter endpoint.name == "GET /*"
| fields timestamp, http.request.method, url.path
| limit 30&lt;/PRE&gt;
&lt;DIV class="code-block css-1l9rc3g" data-local-id="0e9f123095e4"&gt;&lt;SPAN class="prismjs _11c819w5 _2rko12b0 _1dqoglyw _1e0c1txw _vwz4gktf _1reo1wug _o572qvpr _1eimjvyg _bfhk187e _syazi7uo _1ozdn7od _7xinn7od _t7aun7od _r28du2gc _tajqu2gc _1ohiu2gc _m802u2gc _i6ntu2gc _1w2xu2gc _1hmyegat _vblregat _vbulegat _196q1xv3 _1vbw1xv3 _1v9c1xv3 _1srnt0uh _18r6myb0 _vyvc1n1a _1d4j1y44 _1f8gstnw _1pzyb3bt _ra6gsb9t _13cdh2mm _1pp0126e _zvy9f705 _qcxof705 _qzn01a66 _j0l11wug _1weckb7n _1na21hna _vsnzgrf3 _x7c815vq _lh0y15vq _1m3815vq _qk1e15vq _12l6ysn8 _uga3ysn8 _mx8b7mnp _1kr87mnp _xo19t94y _1bemt94y _nalpstnw _151dstnw _1exb1q9c _1hgu1q9c _1mgnt94y _nhket94y _h909i8nm _scgayz1z _ipl81e17 _40uk1l04 _i81p1a66 _1gx21e5h _1ls01ule _vm2c1rh5 _12ok1rh5 _rude1ule _1q16glyw _1io6glyw _juomusic _lcwuusic _pyovu2gc _ccm6u2gc _1ascu2gc _1yuau2gc _xr0w1a66 _4io21a66 _euyxusvi _cahfusvi _zhnuidpf _1amdidpf _mbgc124n _bu7z124n _131n1giz _gy101giz _1wfuwrk5 _16kzwrk5 _9kk3wu06 _cjus1w1g _9k2r1m30 _nhmw1m30 _yl021m30 _eihtd5cb _t9zbd5cb _mqok1w1g _3hsg1w1g _i7ngn7od _9wu1fb2s _1xcoh55r _1t36i7uo _137bh55r _1k7di7uo _97li16jw _12nh9lu1 _1g0517qg _i2igqmo9 _326zi7uo _113p1rpy _1n6t16jw _tgu817qg _1k4716jw _g0lxi7uo _ys4e1rpy _7gp8h55r _1yvqqmo9 _1vwwqmo9 _1rjuqmo9 _1v0lh55r _wmyy17qg _748n17qg _1mfn17qg _1d7e17qg _p2vr17qg _19o6qmo9 _kxov17qg _1np517qg _m2f517qg _1b9t16jw _1tq616jw _1rd216jw _1pbk16jw _k3li16jw _13zt1rpy _2g12fb2s _k86bqmo9 _b5iy1rpy _gti31rpy _1f0g16jw _9d3e17qg _qdia16jw _72uv16jw _13dgkb7n _1707efft _1i3h1txw _16noidpf _h4fuidpf _pp6yidpf _1g4tidpf _11wmidpf _1bx8idpf" data-testid="renderer-code-block" data-ds--code--code-block="" data-code-lang=""&gt;&lt;CODE class="language-"&gt;&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="72bd32075182" data-renderer-start-pos="4525"&gt;You'll see thirty different URLs all stamped with &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;endpoint.name = GET /*&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_1-1779285602920.png" style="width: 793px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33236i3C0B0FDF8513C6A4/image-dimensions/793x830?v=v2" width="793" height="830" role="button" title="mreider_1-1779285602920.png" alt="mreider_1-1779285602920.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="7d6e56af3fec" data-renderer-start-pos="4603"&gt;To summarize: Enhanced Endpoints, with no &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; and no rules means everything collapsing to &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt;. The data is fine; the grouping is bad.&lt;/P&gt;
&lt;P data-local-id="34cb947d87c2" data-renderer-start-pos="4748"&gt;To find where this is happening across your own tenant:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;PRE data-local-id="f10137d48e8a"&gt;timeseries c = sum(dt.service.request.count),
  by:{dt.entity.service, endpoint.name}, from: now()-1h
| filter endpoint.name == "GET /*" or endpoint.name == "POST /*"
| summarize total = sum(arrayLast(c)), by:{dt.entity.service}
| sort total desc | limit 20
&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="a9376677ed34" data-renderer-start-pos="5065"&gt;That will give you the top-twenty over-collapse offenders.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="Fixing-over-collapse-today:-rules" tabindex="-1" data-renderer-start-pos="5126" data-local-id="77c023c920d7"&gt;Fixing over-collapse today: rules&lt;/H2&gt;
&lt;P data-local-id="a494244b9203" data-renderer-start-pos="5161"&gt;As mentioned, Dynatrace will be releasing a better endpoint heuristic in the coming weeks, but you don't have to wait for anything to fix the over-collapse on a service. Two rule-based mechanisms are available right now.&lt;/P&gt;
&lt;H3 id="Request-Naming-Rules-with-{URL:Path-Clean}-(SDv1)" tabindex="-1" data-renderer-start-pos="5383" data-local-id="a17bd959a87a"&gt;Request Naming Rules with &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt; (SDv1)&lt;/H3&gt;
&lt;P data-local-id="0739dbe0ff7c" data-renderer-start-pos="5434"&gt;For SDv1 services, write a Request Naming Rule (Settings → Service Detection → Request Naming Rules) with the pattern &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt;. Dynatrace will use the request URL but replace volatile-looking segments with stable markers.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_2-1779285669454.png" style="width: 810px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33237i9D4A15C06911EB9B/image-dimensions/810x498?v=v2" width="810" height="498" role="button" title="mreider_2-1779285669454.png" alt="mreider_2-1779285669454.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_3-1779285689926.png" style="width: 851px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33238iABFE5950DBED34F3/image-dimensions/851x515?v=v2" width="851" height="515" role="button" title="mreider_3-1779285689926.png" alt="mreider_3-1779285689926.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="fd58007a2bfd" data-renderer-start-pos="5671"&gt;&lt;STRONG data-renderer-mark="true"&gt;What Path-Clean catches:&lt;/STRONG&gt; four specific patterns, each replaced with a stable token: UUIDs (so &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;e4674467-1e9a-42cf-…&lt;/CODE&gt; becomes &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[UUID]&lt;/CODE&gt;), IPv4 addresses (&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[IPv4]&lt;/CODE&gt;), IPv6 addresses (&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[IPv6]&lt;/CODE&gt;), and IBANs (&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;[IBAN]&lt;/CODE&gt;). Any clean-up URL rules you've configured on the service (for example, to strip &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;jsessionid&lt;/CODE&gt; from the URL) are always applied as well, regardless of whether Path-Clean is in the naming pattern.&lt;/P&gt;
&lt;P data-local-id="fc9c740d2a9d" data-renderer-start-pos="6065"&gt;&lt;STRONG data-renderer-mark="true"&gt;What Path-Clean leaves alone:&lt;/STRONG&gt; short mixed-case alphanumeric IDs like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;0erepyo9&lt;/CODE&gt; or &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;abc123&lt;/CODE&gt;. The detector doesn't recognize those as volatile, so they stay literal, meaning each unique value becomes its own endpoint row.&lt;/P&gt;
&lt;P data-local-id="3e97abf27d7f" data-renderer-start-pos="6283"&gt;If your IDs look like that, Path-Clean alone won't be enough. You'd combine it with a &lt;STRONG data-renderer-mark="true"&gt;custom placeholder&lt;/STRONG&gt; that strips or templates the volatile portion explicitly.&lt;/P&gt;
&lt;P data-local-id="56cafd141ea8" data-renderer-start-pos="6447"&gt;A custom placeholder is a user-defined transformation that wraps one of the same volatile attributes the built-in placeholders use (for example, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;URL_PATH&lt;/CODE&gt;, the source attribute behind &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt;) and applies an extraction step on top: a delimiter split, a regex capture, and so on. The result becomes a named token you can reference in your Request Naming Rule pattern. The example below configures one such placeholder, named &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;ItemPath&lt;/CODE&gt;, defined as a regex extraction &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;^(/shop/[^/]++)&lt;/CODE&gt; against &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;URL_PATH&lt;/CODE&gt;. The intent is to keep only the first two segments of any &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;/shop/...&lt;/CODE&gt; URL path, dropping everything after.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_4-1779285719890.png" style="width: 821px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33239iC215DE1544940628/image-dimensions/821x753?v=v2" width="821" height="753" role="button" title="mreider_4-1779285719890.png" alt="mreider_4-1779285719890.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="9c55cf116be7" data-renderer-start-pos="7061"&gt;There's a subtlety worth knowing in advance. The SDv1 naming-behavior changes shipping in cluster version 1.341 (the endpoint-naming heuristic, the custom-placeholder resolution described next, and the related URL-path handling) are bundled behind one per-tenant feature flag. Until that flag is on for your tenant, &lt;STRONG data-renderer-mark="true"&gt;custom placeholders that wrap a URL-path attribute do not resolve at the endpoint-name level&lt;/STRONG&gt;. They render as the literal placeholder string (for example, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;endpoint.name = {ItemPath}&lt;/CODE&gt;) because the current SDv1 default-name code path treats URL-path attributes as too volatile to substitute directly.&amp;nbsp;&lt;/P&gt;
&lt;P data-local-id="9c55cf116be7" data-renderer-start-pos="7061"&gt;&lt;SPAN&gt;After the flag is on, the same rule starts resolving as expected, alongside the heuristic-derived names. The flag does not make raw volatile URL-path values resolve on their own. Those still won't. What it enables is your custom placeholder's transformation taking effect, so the wrapped URL-path attribute resolves only because your extraction step (regex, delimiter split, and so on) has rendered it non-volatile.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-local-id="85d115597a7d" data-renderer-start-pos="7780"&gt;&lt;STRONG data-renderer-mark="true"&gt;Built-in placeholders are not affected.&amp;nbsp;&lt;/STRONG&gt;This flag only gates the resolution of custom placeholders that wrap a&amp;nbsp;volatile URL-path attribute. A built-in placeholder like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt; always resolves regardless of the flag's state because Dynatrace deems its output non-volatile. That's the goal of &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt;: it cleans the path, so the result is stable. A rule like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{URL:Path-Clean}&lt;/CODE&gt; is therefore safe to use today and will keep producing the same endpoint name before and after the flag flips.&lt;/P&gt;
&lt;P data-local-id="81d1cfb526f6" data-renderer-start-pos="8188"&gt;Here’s what it looks like before the feature flag:&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_5-1779285747180.png" style="width: 811px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33240iF936A0066EE9955E/image-dimensions/811x292?v=v2" width="811" height="292" role="button" title="mreider_5-1779285747180.png" alt="mreider_5-1779285747180.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;And here’s what it looks like afterwards:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_6-1779285776933.png" style="width: 798px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33241i4F7FF46D243CC5F5/image-dimensions/798x350?v=v2" width="798" height="350" role="button" title="mreider_6-1779285776933.png" alt="mreider_6-1779285776933.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="b14c196ad4ff" data-renderer-start-pos="8289"&gt;You can see the result in a Notebook as follows:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;PRE data-local-id="44e78cef7f4f"&gt;timeseries count = sum(dt.service.request.count,
filter: dt.entity.service == "&amp;lt;service-id&amp;gt;"),
by:{endpoint.name}, from: now()-5m
| sort arrayLast(count) desc&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_0-1779285863099.png" style="width: 846px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33242i8F8A63DC2795E67D/image-dimensions/846x353?v=v2" width="846" height="353" role="button" title="mreider_0-1779285863099.png" alt="mreider_0-1779285863099.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H3 id="URL-path-pattern-matching-(SDv2)" tabindex="-1" data-renderer-start-pos="8502" data-local-id="4f5221391c70"&gt;URL path pattern matching (SDv2)&lt;/H3&gt;
&lt;P data-local-id="2f7716c06859" data-renderer-start-pos="8536"&gt;On SDv2, the equivalent customer-facing rule is &lt;STRONG data-renderer-mark="true"&gt;URL path pattern matching&lt;/STRONG&gt; (Settings → Service Detection → URL path pattern matching, or &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;builtin:url-path-pattern-matching-rules&lt;/CODE&gt; in the API). You describe your URL shapes directly:&lt;/P&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-wrapper ak-renderer-flex-center-wrapper css-l5clsc"&gt;
&lt;DIV class="ak-renderer-sticky-safe-breakout-inner fabric-editor-breakout-mark fabric-editor-block-mark css-ozd7xs" data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;DIV class="css-1sws8jd"&gt;
&lt;DIV class="css-1u47mc9"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV&gt;&lt;SPAN&gt;/shop/products/{id}&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;PRE class="code-block css-1l9rc3g" data-local-id="0228f18d3850"&gt;/shop/carts/{cartId}/items/{itemId}
/shop/orders/{id}
/shop/checkout&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_1-1779285910443.png" style="width: 809px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33243i78C77E6775EB1176/image-dimensions/809x639?v=v2" width="809" height="639" role="button" title="mreider_1-1779285910443.png" alt="mreider_1-1779285910443.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_2-1779285928376.png" style="width: 842px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33244iE9DE4AA49794016E/image-dimensions/842x342?v=v2" width="842" height="342" role="button" title="mreider_2-1779285928376.png" alt="mreider_2-1779285928376.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-local-id="7dd90d8e354b" data-renderer-start-pos="8861"&gt;This is the same Nginx workload, but now you see what matters instead of a single &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt;. Rules let you template your URLs by hand. They work today. They do take some maintenance, especially across many services, which brings us to a description of the heuristic in the next section.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="The-endpoint-naming-heuristic-that's-coming" tabindex="-1" data-renderer-start-pos="9147" data-local-id="f5dee3781042"&gt;The endpoint-naming heuristic that's coming&lt;/H2&gt;
&lt;P data-local-id="bc6778598dbe" data-renderer-start-pos="9192"&gt;&lt;STRONG data-renderer-mark="true"&gt;The endpoint-naming heuristic&lt;/STRONG&gt; does what those rules do, but automatically.&lt;/P&gt;
&lt;P data-local-id="899c13f56003" data-renderer-start-pos="9268"&gt;&lt;SPAN&gt;When &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt;&amp;nbsp;is missing on the ingested data, the heuristic looks at the raw URL path, identifies the volatile segments (the same kinds of patterns Path-Clean catches, plus some more), and produces a &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt;&amp;nbsp;attribute based on that URL path. The already existing rule: &lt;STRONG&gt;[Built-in] HTTP request method and route&lt;/STRONG&gt; will now trigger and produce a stable endpoint name. No rule authoring required.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-local-id="a17e39a4dbac" data-renderer-start-pos="9532"&gt;After the heuristic activates, the same Nginx service that was showing &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt; shows &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /shop/products&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /shop/carts&lt;/CODE&gt;, and so on. The catch-all collapses into one endpoint per real URL shape.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mreider_3-1779285956725.png" style="width: 829px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/33245i2B19301970AEE3B2/image-dimensions/829x259?v=v2" width="829" height="259" role="button" title="mreider_3-1779285956725.png" alt="mreider_3-1779285956725.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H3 id="When-and-how-it-ships" tabindex="-1" data-renderer-start-pos="9730" data-local-id="6494bc9ebd2f"&gt;When it ships&lt;/H3&gt;
&lt;DIV style="border-left: 4px solid #1496e2; background: #f1f8fd; padding: 12px 18px; margin: 16px 0; border-radius: 4px; font-family: inherit; color: #1d2c3a;"&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&lt;SPAN&gt;The following rollouts, for SDv1 and SDv2, are scheduled to start in SaaS cluster 1.342 on June 30th. &lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&lt;SPAN&gt;The rollout puts all the code in place but changes nothing on its own. The new naming takes effect only when&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;you&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;choose to make it, by flipping the SDv1 feature flag and disabling the SDv2 built-in rule. &lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style="font-size: 15px; line-height: 1.5;"&gt;&lt;SPAN&gt;These are two independent switches you control on your own timeline: either order, or both at once.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="3767174b0fa4" data-renderer-start-pos="10525"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv1 rollout: a per-tenant feature flag.&lt;/STRONG&gt; One flag (the SDv1 naming flag) gates the whole SDv1 bundle. When it's on, heuristic-derived names plus the related naming behavior land together; until then, none of them do.&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="f179d1df2fe0"&gt;
&lt;LI&gt;
&lt;P data-local-id="e16ba7e18529" data-renderer-start-pos="10754"&gt;&lt;STRONG data-renderer-mark="true"&gt;If you don't have Enhanced Endpoints turned on yet,&lt;/STRONG&gt; when you enable it any time from 1.341 onward, the new SDv1 naming behavior comes with it, on by default. You go straight from "Key Requests only" to "clean endpoint names" with no intermediate &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt; phase.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="8043d5ff2866" data-renderer-start-pos="11017"&gt;&lt;STRONG data-renderer-mark="true"&gt;If you already enabled Enhanced Endpoints,&lt;/STRONG&gt; the SDv1 naming flag is off by default for you, on purpose, because some of your existing dashboards, SLOs, and alerts may bind to current endpoint names like &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;GET /*&lt;/CODE&gt; and turning the flag on changes those names. The guardrail gives you time to audit. When you are ready, get in touch with your Dynatrace account team to enable to feature flag: &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;sdv1-url-and-http-route-naming&lt;/CODE&gt;.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-local-id="2c6a98d66820" data-renderer-start-pos="11438"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv2 rollout: a built-in opt-out rule and heuristic.&amp;nbsp;&lt;/STRONG&gt;On every existing tenant, Dynatrace pre-provisions a built-in endpoint-detection rule in &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;builtin:endpoint-detection-rules&lt;/CODE&gt;. New tenants created after this point don't get the rule provisioned, so they get the new SDv2 behavior from the start. Existing tenants keep producing GET /* until someone disables that built-in rule. Nothing flips on its own.&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="c888f855255c"&gt;
&lt;LI&gt;
&lt;P data-local-id="045ea0b23fad" data-renderer-start-pos="11796"&gt;&lt;STRONG data-renderer-mark="true"&gt;Name template:&lt;/STRONG&gt; &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;{http.request.method} /*&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="625275b0b807" data-renderer-start-pos="11839"&gt;&lt;STRONG data-renderer-mark="true"&gt;Condition:&lt;/STRONG&gt; &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;isNotNull(http.request.method) and isNotNull(http.route) and supportability.is_http_route_derived == true&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="5f7f5d70a67f" data-renderer-start-pos="11959"&gt;&lt;STRONG data-renderer-mark="true"&gt;Status:&lt;/STRONG&gt; enabled by default on every existing tenant. This is a built-in rule that Dynatrace provisions on those tenants. Customers can't manually create it, only enable or disable it.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-local-id="7f67cd9bbd76" data-renderer-start-pos="14104"&gt;To see whether the SDv2 heuristic is producing results on a span:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="code-line" dir="auto" data-line="76"&gt;fetch spans, from: now()-15m
| filter dt.entity.service == "&amp;lt;a service that used to over-collapse&amp;gt;"
| fieldsAdd derived = `supportability.is_http_route_derived`
| fields span.name, url.path, http.route, derived, endpoint.name
| limit 20&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;SPAN&gt;When &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; is populated and &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;supportability.is_http_route_derived&lt;/CODE&gt; is &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;true&lt;/CODE&gt;, the SDv2 heuristic is active. The route was derived by the heuristic rather than emitted by your app. Until then, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;http.route&lt;/CODE&gt; is empty (or app-supplied) and the flag is &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;false&lt;/CODE&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV id="content" class="highlighter-context page view" data-testid="page-content-only" data-inline-comments-target="true"&gt;
&lt;DIV class="_19itglyw _vchhusvi _r06hglyw _19pkidpf _2hwx1wug _otyr1epz _18u01wug _1bsb1osq"&gt;
&lt;DIV&gt;
&lt;DIV id="main-content" class="wiki-content css-th923b e5xcnr80" data-test-appearance="full-width" data-vc="pageContentRendererTestId" data-testid="pageContentRendererTestId"&gt;
&lt;DIV class="renderer-overrides"&gt;
&lt;DIV class="css-3qfej8"&gt;
&lt;DIV class="ak-renderer-wrapper is-full-width css-pw7jst"&gt;
&lt;DIV class="css-1msdwtb" role="none"&gt;
&lt;DIV class="ak-renderer-document"&gt;
&lt;H2 id="A-note-on-service-display-names" tabindex="-1" data-renderer-start-pos="14660" data-local-id="7ba9aa00397d"&gt;A note on service display names&lt;/H2&gt;
&lt;P data-local-id="326ba811ecd6" data-renderer-start-pos="14693"&gt;As described in the &lt;A href="https://community.dynatrace.com/t5/Heads-up-from-Dynatrace/Service-Naming-What-s-Changing-and-What-to-Do/tac-p/296213" target="_blank" rel="noopener"&gt;community post a out Service Naming rule changes&lt;/A&gt;, ff your SDv1 Nginx (or similar non-Java) service shows up in the Services list as just &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;:8080&lt;/CODE&gt;, that's the SDv1 detected name. Legacy Service Naming Rules used to fix this, but they're being retired: they only changed the UI display, never flowed into your spans, metrics, logs, or DQL.&lt;/P&gt;
&lt;P data-local-id="adc0748c66fe" data-renderer-start-pos="14979"&gt;&lt;STRONG data-renderer-mark="true"&gt;The new approach is to set &lt;/STRONG&gt;&lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;OTEL_SERVICE_NAME&lt;/CODE&gt;&lt;STRONG data-renderer-mark="true"&gt; as an environment variable on the process&lt;/STRONG&gt; (works with OneAgent, no OTel SDK required):&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV data-width="760" data-has-width="true" data-mode="wide"&gt;
&lt;PRE data-local-id="8a6d3c9cb82c"&gt;env:
  - name: OTEL_SERVICE_NAME
    value: my-checkout-service
&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-local-id="4a5fdbfae33b" data-renderer-start-pos="15178"&gt;That value lands as &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;service.name&lt;/CODE&gt; on every span, which flows through to metrics, dashboards, SLOs, and alerting automatically.&lt;/P&gt;
&lt;P data-local-id="39554687c2a8" data-renderer-start-pos="15305"&gt;What's coming:&lt;/P&gt;
&lt;UL class="ak-ul" data-indent-level="1" data-local-id="7a5576f34de9"&gt;
&lt;LI&gt;
&lt;P data-local-id="87a79f6b2cb9" data-renderer-start-pos="15323"&gt;&lt;STRONG data-renderer-mark="true"&gt;Primary Fields and Primary Tags&lt;/STRONG&gt; will appear as dimensions on service metrics in June 2026, so you can filter and sort the Services list by &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;k8s.namespace.name&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;team&lt;/CODE&gt;, region, environment, etc. without packing that context into the service name.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="0b26e239f06d" data-renderer-start-pos="15569"&gt;&lt;STRONG data-renderer-mark="true"&gt;A short-term display fix&lt;/STRONG&gt; under discussion combines &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;service.name&lt;/CODE&gt; with the detected name: &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;my-app (WebRequestService)&lt;/CODE&gt;, &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;my-app (BackgroundWorker)&lt;/CODE&gt;. Useful when one process hosts multiple SDv1 services.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-local-id="967822fbff6a" data-renderer-start-pos="15769"&gt;&lt;STRONG data-renderer-mark="true"&gt;Server-side renaming via OpenPipeline&lt;/STRONG&gt; is being explored: a processing rule that sets or overrides &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;service.name&lt;/CODE&gt; based on resource attributes, no deployment changes required.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-local-id="c5ffab9aa801" data-renderer-start-pos="15945"&gt;For now, set &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;OTEL_SERVICE_NAME&lt;/CODE&gt; where you can, and your services will be queryable by the right name even if the Services list display catches up later.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV data-vc="eop-recommendations-wrapper"&gt;
&lt;DIV data-hydration-shield="nhVSK:z8NN7:qz-Pe:OP-5u"&gt;
&lt;DIV data-loadable-boundary-content="nhVSK:z8NN7:qz-Pe:OP-5u"&gt;
&lt;DIV class="end-of-page-rec-wrapper" data-vc="end-of-page-recommendation" data-testid="end-page-rec-wrapper"&gt;
&lt;DIV class="css-thp8s8" data-vc="end-of-page-recommendation-component" data-testid="test-rec"&gt;
&lt;DIV class=""&gt;
&lt;DIV class="css-10do7z4" role="list"&gt;
&lt;DIV class="()=&amp;gt;(e=&amp;gt;{let t;switch(e){case 1:case 2:case 4:t=[eu];break;default:t=[em]}return t.push(ep),t})(s.length) css-6cu6fo" role="listitem"&gt;
&lt;DIV class="css-7k23k6"&gt;
&lt;DIV class="_19itia51 _2rko1mok _kqswh2mm _bfhkvuon _14iyidpf _1qamtlke _1pjhtlke _d0altlke _17zqt94y _km9nt94y _1soat94y _180dt7xp _1u6lt7xp _1dbzt7xp _1yt4u2gc _1e0c1txw _4t3i12am _4cvr1h6o" data-testid="page-card-card-container"&gt;
&lt;DIV class="css-xa6x6v" data-testid="page-card-end-of-page-view"&gt;
&lt;DIV class="css-vg4d5j"&gt;
&lt;DIV class="css-z923o7"&gt;
&lt;DIV class="_1reo15vq _18m915vq _1e0ccj1k _1yyjcs5v _sudp1e54 _1bto1l2s"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Wed, 03 Jun 2026 14:34:19 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Troubleshooting/Enhanced-Endpoints-Guide/ta-p/297926</guid>
      <dc:creator>mreider</dc:creator>
      <dc:date>2026-06-03T14:34:19Z</dc:date>
    </item>
  </channel>
</rss>

