<?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 SDv1 Endpoints in Services App in Troubleshooting</title>
    <link>https://community.dynatrace.com/t5/Troubleshooting/SDv1-Endpoints-in-Services-App/ta-p/297926</link>
    <description>&lt;P data-renderer-start-pos="1"&gt;&lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/enhanced-endpoints-sdv1" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/enhanced-endpoints-sdv1" target="_blank" rel="noopener" data-renderer-mark="true"&gt;Enhanced endpoints for SDv1&lt;/A&gt; gives every service automatic endpoint visibility without manual key request configuration. For services where the web framework provides &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;, this works well - clean 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 /api/orders&lt;/CODE&gt; with no setup.&lt;/P&gt;
&lt;P data-renderer-start-pos="255"&gt;But for services where the framework doesn't provide &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; - Nginx, Kong, Apache, IIS, WebSphere Liberty, and others - endpoints fall to generic 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; 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;POST /*&lt;/CODE&gt;. This affects traces and service calls too, not just the endpoint list. For a large portion of enterprise HTTP workloads, the result was reduced visibility rather than improved visibility.&lt;/P&gt;
&lt;H2 id="What's-changing:-automatic-URL-normalization" tabindex="-1" data-renderer-start-pos="624"&gt;What's changing: automatic URL normalization&lt;/H2&gt;
&lt;P data-renderer-start-pos="670"&gt;We're shipping a change that derives endpoint names directly from the URL path 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; isn't available. Your URL paths already contain the route information - they just have volatile segments (IDs, UUIDs, tokens) mixed in. We apply heuristic rules to identify those volatile segments and truncate the path at the first one, producing a stable, low-cardinality endpoint name.&lt;/P&gt;
&lt;P data-renderer-start-pos="1054"&gt;Examples:&lt;/P&gt;
&lt;DIV class="pm-table-container with-shadow-observer" data-testid="table-container" data-layout="default"&gt;
&lt;DIV class="pm-table-wrapper" data-vc="table-node-wrapper" data-table-local-id="" data-autosize="false" data-layout="default" data-number-column="false"&gt;
&lt;DIV class="sentinel-left"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;TABLE data-layout="default" data-table-width="760" data-number-column="false" data-testid="renderer-table"&gt;&lt;COLGROUP&gt;&lt;/COLGROUP&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="1068"&gt;URL path&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="1080"&gt;Endpoint name&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1099"&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;/api/orders/12345/items/abc-def-ghi&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1138"&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 /api/orders&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1159"&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;/users/5f2b9a3c/profile&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1186"&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 /users&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1202"&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;/v1/payments/validate&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1227"&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 /v1/payments/validate&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1259"&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;/checkout/cart&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1277"&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 /checkout/cart&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;DIV class="sentinel-right"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-renderer-start-pos="1301"&gt;The rules identify volatile segments by recognizing patterns common in IDs and tokens: segments with multiple digits, hex values, base64-style mixed-case strings, and all-uppercase tokens. When a volatile segment is found, the path is truncated before it. Paths with no volatile segments pass through untouched. We validated these rules against hundreds of thousands of real URL paths across multiple enterprise environments. They produce meaningful endpoint names for roughly 70-75% of paths that lack &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;.&lt;/P&gt;
&lt;P data-renderer-start-pos="1817"&gt;The derived route is written 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;http.route&lt;/CODE&gt; on the span, so it flows through your existing endpoint detection rules, metrics, and traces consistently. A marker on the span distinguishes framework-provided routes from derived ones, so you always know which is which.&lt;/P&gt;
&lt;H2 id="How-normalization-works-with-your-existing-rules" tabindex="-1" data-renderer-start-pos="2083"&gt;How normalization works with your existing rules&lt;/H2&gt;
&lt;P data-renderer-start-pos="2133"&gt;Normalization and manual rules are not alternatives - they layer. Here's how endpoint names are resolved, in priority order:&lt;/P&gt;
&lt;DIV class="pm-table-container with-shadow-observer" data-testid="table-container" data-layout="default"&gt;
&lt;DIV class="pm-table-wrapper" data-vc="table-node-wrapper" data-table-local-id="" data-autosize="false" data-layout="default" data-number-column="false"&gt;
&lt;DIV class="sentinel-left"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;TABLE data-layout="default" data-table-width="760" data-number-column="false" data-testid="renderer-table"&gt;&lt;COLGROUP&gt;&lt;/COLGROUP&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2262"&gt;Priority&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2274"&gt;Source&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2284"&gt;What it does&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2300"&gt;Config needed&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2319"&gt;1&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2324"&gt;Framework &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;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2348"&gt;Best endpoint names - provided by your web framework&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2404"&gt;None&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2414"&gt;2&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2419"&gt;Your manual rules&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2440"&gt;Exact endpoint names where you want them&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2484"&gt;Per-service&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2501"&gt;3&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2506"&gt;Normalization heuristics&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2534"&gt;Good-enough defaults for everything else&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2578"&gt;None&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2588"&gt;4&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2593"&gt;Fallback &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;/*&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2608"&gt;What you're trying to avoid&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2639"&gt;-&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;DIV class="sentinel-right"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-renderer-start-pos="2645"&gt;&lt;STRONG data-renderer-mark="true"&gt;Your existing rules take precedence.&lt;/STRONG&gt; If you've already created &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" target="_blank" rel="noopener" data-renderer-mark="true"&gt;request naming rules&lt;/A&gt; (SDv1) or &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" target="_blank" rel="noopener" data-renderer-mark="true"&gt;URL path pattern matching rules&lt;/A&gt; (SDv2), those rules continue to produce the exact endpoint names you defined. Normalization only applies to requests that don't already have a name from a higher-priority source.&lt;/P&gt;
&lt;P data-renderer-start-pos="2951"&gt;This means you don't have to choose. Normalization handles the bulk automatically - the 70-75% where the heuristic produces a good-enough grouping. For the remaining endpoints where you want exact control over the grouping, you write rules for those specific services. Instead of writing hundreds of rules to cover every service, you write a handful for the ones where precision matters.&lt;/P&gt;
&lt;P data-renderer-start-pos="3340"&gt;The two approaches fall through cleanly. When a URL path pattern matching rule matches a request, it produces the endpoint name and normalization is skipped entirely. When no rule matches, normalization kicks in. So you can write patterns for your most important services and let the heuristic handle the long tail - there's no conflict between them.&lt;/P&gt;
&lt;H2 id="Why-some-endpoints-show-as-METHOD-/*" tabindex="-1" data-renderer-start-pos="3692"&gt;Why some endpoints show as METHOD /*&lt;/H2&gt;
&lt;P data-renderer-start-pos="3730"&gt;Enhanced endpoints uses &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; when it's available. When it's missing, the endpoint falls back 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;{method} /*&lt;/CODE&gt;.&lt;/P&gt;
&lt;P data-renderer-start-pos="3846"&gt;The confusing part is that this can happen inconsistently within a single service - some requests have &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 produce clean endpoints, while others on the same service don't and fall 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;/*&lt;/CODE&gt;. This reflects inconsistent instrumentation coverage, which varies by framework, request path, and configuration. It isn't a bug.&lt;/P&gt;
&lt;P data-renderer-start-pos="4174"&gt;Most modern application frameworks - Spring Boot, Express.js, ASP.NET Core, Django, Flask, FastAPI - provide &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; automatically. Web servers and reverse proxies generally don't. If your service sits behind Nginx, Apache, IIS, or a similar gateway, the gateway's spans typically lack &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; even though the backend framework's spans have it.&lt;/P&gt;
&lt;P data-renderer-start-pos="4526"&gt;&lt;STRONG data-renderer-mark="true"&gt;The URL data is always there.&lt;/STRONG&gt; Even when an endpoint shows 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;GET /*&lt;/CODE&gt;, the full URL path is captured on every span. You can see it through the View URLs button on any endpoint, or query it directly in notebooks and dashboards. Normalization improves the default grouping, but you always have access to the underlying URLs.&lt;/P&gt;
&lt;H2 id="How-it-rolls-out" tabindex="-1" data-renderer-start-pos="4848"&gt;How it rolls out&lt;/H2&gt;
&lt;P data-renderer-start-pos="4866"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv1&lt;/STRONG&gt;: Normalization applies when enhanced endpoints is enabled. If you already have enhanced endpoints on, we'll reach out individually before enabling the improvement, since it changes your endpoint names. New tenants get it automatically.&lt;/P&gt;
&lt;P data-renderer-start-pos="5108"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv2&lt;/STRONG&gt;: Normalization is built into endpoint detection for new tenants. Existing SDv2 customers get a new opt-in checkbox in the endpoint detection settings.&lt;/P&gt;
&lt;H2 id="If-you-need-exact-endpoint-names-today" tabindex="-1" data-renderer-start-pos="5265"&gt;If you need exact endpoint names today&lt;/H2&gt;
&lt;P data-renderer-start-pos="5305"&gt;If you can't wait for normalization and need specific endpoint names now, you can create rules manually. These rules will continue to work alongside normalization when it ships - they take precedence, so nothing breaks.&lt;/P&gt;
&lt;P data-renderer-start-pos="5526"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv1 services&lt;/STRONG&gt;: Create &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" target="_blank" rel="noopener" data-renderer-mark="true"&gt;request naming rules&lt;/A&gt; to define endpoint names based on URL conditions. Go to the service in the Services app, open the Endpoints section, and select &lt;STRONG data-renderer-mark="true"&gt;Configure request naming&lt;/STRONG&gt; from the actions menu. Define a naming pattern using non-volatile placeholders (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;{HTTP-Method}&lt;/CODE&gt;) combined with fixed path segments.&lt;/P&gt;
&lt;P data-renderer-start-pos="5858"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv2 services&lt;/STRONG&gt;: Configure &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" target="_blank" rel="noopener" data-renderer-mark="true"&gt;URL path pattern matching rules&lt;/A&gt; to derive stable endpoint names from raw URL paths.&lt;/P&gt;
&lt;P data-renderer-start-pos="5968"&gt;The key to good manual rules: use non-volatile placeholders and fixed path segments. Avoid volatile placeholders 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}&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;{URL:Path}&lt;/CODE&gt; - they contain high-cardinality values that create a new endpoint for every unique URL.&lt;/P&gt;
&lt;H2 id="Bug-fix:-OneAgent-~1.338" tabindex="-1" data-renderer-start-pos="6195"&gt;Bug fix: OneAgent ~1.339&lt;/H2&gt;
&lt;P data-renderer-start-pos="6221"&gt;Separately from the normalization work, we found and fixed an issue where spans that did have &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; were sometimes still being generalized 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;/*&lt;/CODE&gt;. If you're seeing this behavior, updating OneAgent to version 1.339 or later will resolve it.&lt;/P&gt;
&lt;H2 id="What's-next" tabindex="-1" data-renderer-start-pos="6466"&gt;What's next&lt;/H2&gt;
&lt;P data-renderer-start-pos="6479"&gt;We're looking at K8s Gateway API, Envoy, and ingress gateway patterns specifically. Getting &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; right for these is a priority, since they're common in modern setups and have historically been a source of endpoint cardinality issues.&lt;/P&gt;
&lt;P data-renderer-start-pos="6720"&gt;We're also planning to remove consumer span endpoint detection for SDv2. Today, message consumption spans are treated as endpoints alongside your HTTP server spans. This mixes message processing data into endpoint metrics like response time and throughput, making it harder to isolate the health of your service's actual entry points. Message consumption is already tracked separately in dedicated &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;dt.service.messaging.*&lt;/CODE&gt; metrics, so removing consumer spans from endpoint detection gives you cleaner, more meaningful endpoint data. This change will apply to new tenants first; existing tenants keep their current behavior.&lt;/P&gt;
&lt;P data-renderer-start-pos="7343"&gt;Beyond the heuristic rules, we're exploring more adaptive approaches to endpoint grouping - similar in concept to the pattern detection capabilities we're building for logs, where the system automatically identifies meaningful groups in unstructured data. No timeline to share, but endpoint quality is a continuous improvement area for us.&lt;/P&gt;
&lt;P data-renderer-start-pos="7684"&gt;When these changes ship, release notes will explain what improved and why. We'll update this post as well.&lt;/P&gt;
&lt;P data-renderer-start-pos="7792"&gt;Questions, feedback, or specific endpoint cases that aren't working well for you? Share them in this thread - it directly helps us prioritize.&lt;/P&gt;</description>
    <pubDate>Mon, 04 May 2026 11:13:03 GMT</pubDate>
    <dc:creator>mreider</dc:creator>
    <dc:date>2026-05-04T11:13:03Z</dc:date>
    <item>
      <title>SDv1 Endpoints in Services App</title>
      <link>https://community.dynatrace.com/t5/Troubleshooting/SDv1-Endpoints-in-Services-App/ta-p/297926</link>
      <description>&lt;P data-renderer-start-pos="1"&gt;&lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/enhanced-endpoints-sdv1" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/enhanced-endpoints-sdv1" target="_blank" rel="noopener" data-renderer-mark="true"&gt;Enhanced endpoints for SDv1&lt;/A&gt; gives every service automatic endpoint visibility without manual key request configuration. For services where the web framework provides &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;, this works well - clean 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 /api/orders&lt;/CODE&gt; with no setup.&lt;/P&gt;
&lt;P data-renderer-start-pos="255"&gt;But for services where the framework doesn't provide &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; - Nginx, Kong, Apache, IIS, WebSphere Liberty, and others - endpoints fall to generic 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; 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;POST /*&lt;/CODE&gt;. This affects traces and service calls too, not just the endpoint list. For a large portion of enterprise HTTP workloads, the result was reduced visibility rather than improved visibility.&lt;/P&gt;
&lt;H2 id="What's-changing:-automatic-URL-normalization" tabindex="-1" data-renderer-start-pos="624"&gt;What's changing: automatic URL normalization&lt;/H2&gt;
&lt;P data-renderer-start-pos="670"&gt;We're shipping a change that derives endpoint names directly from the URL path 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; isn't available. Your URL paths already contain the route information - they just have volatile segments (IDs, UUIDs, tokens) mixed in. We apply heuristic rules to identify those volatile segments and truncate the path at the first one, producing a stable, low-cardinality endpoint name.&lt;/P&gt;
&lt;P data-renderer-start-pos="1054"&gt;Examples:&lt;/P&gt;
&lt;DIV class="pm-table-container with-shadow-observer" data-testid="table-container" data-layout="default"&gt;
&lt;DIV class="pm-table-wrapper" data-vc="table-node-wrapper" data-table-local-id="" data-autosize="false" data-layout="default" data-number-column="false"&gt;
&lt;DIV class="sentinel-left"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;TABLE data-layout="default" data-table-width="760" data-number-column="false" data-testid="renderer-table"&gt;&lt;COLGROUP&gt;&lt;/COLGROUP&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="1068"&gt;URL path&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="1080"&gt;Endpoint name&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1099"&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;/api/orders/12345/items/abc-def-ghi&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1138"&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 /api/orders&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1159"&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;/users/5f2b9a3c/profile&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1186"&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 /users&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1202"&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;/v1/payments/validate&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1227"&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 /v1/payments/validate&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1259"&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;/checkout/cart&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="1277"&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 /checkout/cart&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;DIV class="sentinel-right"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-renderer-start-pos="1301"&gt;The rules identify volatile segments by recognizing patterns common in IDs and tokens: segments with multiple digits, hex values, base64-style mixed-case strings, and all-uppercase tokens. When a volatile segment is found, the path is truncated before it. Paths with no volatile segments pass through untouched. We validated these rules against hundreds of thousands of real URL paths across multiple enterprise environments. They produce meaningful endpoint names for roughly 70-75% of paths that lack &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;.&lt;/P&gt;
&lt;P data-renderer-start-pos="1817"&gt;The derived route is written 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;http.route&lt;/CODE&gt; on the span, so it flows through your existing endpoint detection rules, metrics, and traces consistently. A marker on the span distinguishes framework-provided routes from derived ones, so you always know which is which.&lt;/P&gt;
&lt;H2 id="How-normalization-works-with-your-existing-rules" tabindex="-1" data-renderer-start-pos="2083"&gt;How normalization works with your existing rules&lt;/H2&gt;
&lt;P data-renderer-start-pos="2133"&gt;Normalization and manual rules are not alternatives - they layer. Here's how endpoint names are resolved, in priority order:&lt;/P&gt;
&lt;DIV class="pm-table-container with-shadow-observer" data-testid="table-container" data-layout="default"&gt;
&lt;DIV class="pm-table-wrapper" data-vc="table-node-wrapper" data-table-local-id="" data-autosize="false" data-layout="default" data-number-column="false"&gt;
&lt;DIV class="sentinel-left"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;TABLE data-layout="default" data-table-width="760" data-number-column="false" data-testid="renderer-table"&gt;&lt;COLGROUP&gt;&lt;/COLGROUP&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2262"&gt;Priority&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2274"&gt;Source&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2284"&gt;What it does&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;TH class="ak-renderer-tableHeader-sortable-column__wrapper" colspan="1" rowspan="1" aria-sort="none"&gt;
&lt;DIV class="ak-renderer-tableHeader-sortable-column"&gt;
&lt;P data-renderer-start-pos="2300"&gt;Config needed&lt;/P&gt;
&lt;FIGURE class="ak-renderer-tableHeader-sorting-icon__wrapper ak-renderer-tableHeader-sorting-icon__no-order"&gt;
&lt;DIV role="presentation"&gt;
&lt;DIV class="ak-renderer-tableHeader-sorting-icon css-7smbrx" tabindex="0" role="button" aria-hidden="false" aria-disabled="false" aria-label="No sort applied to the column"&gt;
&lt;DIV class="sorting-icon-svg__no_order ak-renderer-tableHeader-sorting-icon-inactive css-1asrlx7"&gt;
&lt;DIV class="css-162lfpq"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;/DIV&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2319"&gt;1&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2324"&gt;Framework &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;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2348"&gt;Best endpoint names - provided by your web framework&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2404"&gt;None&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2414"&gt;2&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2419"&gt;Your manual rules&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2440"&gt;Exact endpoint names where you want them&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2484"&gt;Per-service&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2501"&gt;3&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2506"&gt;Normalization heuristics&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2534"&gt;Good-enough defaults for everything else&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2578"&gt;None&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2588"&gt;4&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2593"&gt;Fallback &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;/*&lt;/CODE&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2608"&gt;What you're trying to avoid&lt;/P&gt;
&lt;/TD&gt;
&lt;TD colspan="1" rowspan="1"&gt;
&lt;P data-renderer-start-pos="2639"&gt;-&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;DIV class="sentinel-right"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-renderer-start-pos="2645"&gt;&lt;STRONG data-renderer-mark="true"&gt;Your existing rules take precedence.&lt;/STRONG&gt; If you've already created &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" target="_blank" rel="noopener" data-renderer-mark="true"&gt;request naming rules&lt;/A&gt; (SDv1) or &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" target="_blank" rel="noopener" data-renderer-mark="true"&gt;URL path pattern matching rules&lt;/A&gt; (SDv2), those rules continue to produce the exact endpoint names you defined. Normalization only applies to requests that don't already have a name from a higher-priority source.&lt;/P&gt;
&lt;P data-renderer-start-pos="2951"&gt;This means you don't have to choose. Normalization handles the bulk automatically - the 70-75% where the heuristic produces a good-enough grouping. For the remaining endpoints where you want exact control over the grouping, you write rules for those specific services. Instead of writing hundreds of rules to cover every service, you write a handful for the ones where precision matters.&lt;/P&gt;
&lt;P data-renderer-start-pos="3340"&gt;The two approaches fall through cleanly. When a URL path pattern matching rule matches a request, it produces the endpoint name and normalization is skipped entirely. When no rule matches, normalization kicks in. So you can write patterns for your most important services and let the heuristic handle the long tail - there's no conflict between them.&lt;/P&gt;
&lt;H2 id="Why-some-endpoints-show-as-METHOD-/*" tabindex="-1" data-renderer-start-pos="3692"&gt;Why some endpoints show as METHOD /*&lt;/H2&gt;
&lt;P data-renderer-start-pos="3730"&gt;Enhanced endpoints uses &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; when it's available. When it's missing, the endpoint falls back 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;{method} /*&lt;/CODE&gt;.&lt;/P&gt;
&lt;P data-renderer-start-pos="3846"&gt;The confusing part is that this can happen inconsistently within a single service - some requests have &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 produce clean endpoints, while others on the same service don't and fall 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;/*&lt;/CODE&gt;. This reflects inconsistent instrumentation coverage, which varies by framework, request path, and configuration. It isn't a bug.&lt;/P&gt;
&lt;P data-renderer-start-pos="4174"&gt;Most modern application frameworks - Spring Boot, Express.js, ASP.NET Core, Django, Flask, FastAPI - provide &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; automatically. Web servers and reverse proxies generally don't. If your service sits behind Nginx, Apache, IIS, or a similar gateway, the gateway's spans typically lack &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; even though the backend framework's spans have it.&lt;/P&gt;
&lt;P data-renderer-start-pos="4526"&gt;&lt;STRONG data-renderer-mark="true"&gt;The URL data is always there.&lt;/STRONG&gt; Even when an endpoint shows 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;GET /*&lt;/CODE&gt;, the full URL path is captured on every span. You can see it through the View URLs button on any endpoint, or query it directly in notebooks and dashboards. Normalization improves the default grouping, but you always have access to the underlying URLs.&lt;/P&gt;
&lt;H2 id="How-it-rolls-out" tabindex="-1" data-renderer-start-pos="4848"&gt;How it rolls out&lt;/H2&gt;
&lt;P data-renderer-start-pos="4866"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv1&lt;/STRONG&gt;: Normalization applies when enhanced endpoints is enabled. If you already have enhanced endpoints on, we'll reach out individually before enabling the improvement, since it changes your endpoint names. New tenants get it automatically.&lt;/P&gt;
&lt;P data-renderer-start-pos="5108"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv2&lt;/STRONG&gt;: Normalization is built into endpoint detection for new tenants. Existing SDv2 customers get a new opt-in checkbox in the endpoint detection settings.&lt;/P&gt;
&lt;H2 id="If-you-need-exact-endpoint-names-today" tabindex="-1" data-renderer-start-pos="5265"&gt;If you need exact endpoint names today&lt;/H2&gt;
&lt;P data-renderer-start-pos="5305"&gt;If you can't wait for normalization and need specific endpoint names now, you can create rules manually. These rules will continue to work alongside normalization when it ships - they take precedence, so nothing breaks.&lt;/P&gt;
&lt;P data-renderer-start-pos="5526"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv1 services&lt;/STRONG&gt;: Create &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v1/set-up-request-naming" target="_blank" rel="noopener" data-renderer-mark="true"&gt;request naming rules&lt;/A&gt; to define endpoint names based on URL conditions. Go to the service in the Services app, open the Endpoints section, and select &lt;STRONG data-renderer-mark="true"&gt;Configure request naming&lt;/STRONG&gt; from the actions menu. Define a naming pattern using non-volatile placeholders (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;{HTTP-Method}&lt;/CODE&gt;) combined with fixed path segments.&lt;/P&gt;
&lt;P data-renderer-start-pos="5858"&gt;&lt;STRONG data-renderer-mark="true"&gt;SDv2 services&lt;/STRONG&gt;: Configure &lt;A class="_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1" title="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" href="https://docs.dynatrace.com/docs/observe/application-observability/services/service-detection/service-detection-v2/url-pattern-matching-v2" target="_blank" rel="noopener" data-renderer-mark="true"&gt;URL path pattern matching rules&lt;/A&gt; to derive stable endpoint names from raw URL paths.&lt;/P&gt;
&lt;P data-renderer-start-pos="5968"&gt;The key to good manual rules: use non-volatile placeholders and fixed path segments. Avoid volatile placeholders 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}&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;{URL:Path}&lt;/CODE&gt; - they contain high-cardinality values that create a new endpoint for every unique URL.&lt;/P&gt;
&lt;H2 id="Bug-fix:-OneAgent-~1.338" tabindex="-1" data-renderer-start-pos="6195"&gt;Bug fix: OneAgent ~1.339&lt;/H2&gt;
&lt;P data-renderer-start-pos="6221"&gt;Separately from the normalization work, we found and fixed an issue where spans that did have &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; were sometimes still being generalized 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;/*&lt;/CODE&gt;. If you're seeing this behavior, updating OneAgent to version 1.339 or later will resolve it.&lt;/P&gt;
&lt;H2 id="What's-next" tabindex="-1" data-renderer-start-pos="6466"&gt;What's next&lt;/H2&gt;
&lt;P data-renderer-start-pos="6479"&gt;We're looking at K8s Gateway API, Envoy, and ingress gateway patterns specifically. Getting &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; right for these is a priority, since they're common in modern setups and have historically been a source of endpoint cardinality issues.&lt;/P&gt;
&lt;P data-renderer-start-pos="6720"&gt;We're also planning to remove consumer span endpoint detection for SDv2. Today, message consumption spans are treated as endpoints alongside your HTTP server spans. This mixes message processing data into endpoint metrics like response time and throughput, making it harder to isolate the health of your service's actual entry points. Message consumption is already tracked separately in dedicated &lt;CODE class="_ca0qyh40 _u5f3m5ip _n3tdyh40 _19bvm5ip _2rkofajl _11c819w5 _1reo1wug _18m91wug _1dqoglyw _1e0c1nu9 _bfhk187e _16d9qvcn _syazi7uo _vwz41kw7 _1i4q1hna _o5721jtm" data-renderer-mark="true"&gt;dt.service.messaging.*&lt;/CODE&gt; metrics, so removing consumer spans from endpoint detection gives you cleaner, more meaningful endpoint data. This change will apply to new tenants first; existing tenants keep their current behavior.&lt;/P&gt;
&lt;P data-renderer-start-pos="7343"&gt;Beyond the heuristic rules, we're exploring more adaptive approaches to endpoint grouping - similar in concept to the pattern detection capabilities we're building for logs, where the system automatically identifies meaningful groups in unstructured data. No timeline to share, but endpoint quality is a continuous improvement area for us.&lt;/P&gt;
&lt;P data-renderer-start-pos="7684"&gt;When these changes ship, release notes will explain what improved and why. We'll update this post as well.&lt;/P&gt;
&lt;P data-renderer-start-pos="7792"&gt;Questions, feedback, or specific endpoint cases that aren't working well for you? Share them in this thread - it directly helps us prioritize.&lt;/P&gt;</description>
      <pubDate>Mon, 04 May 2026 11:13:03 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Troubleshooting/SDv1-Endpoints-in-Services-App/ta-p/297926</guid>
      <dc:creator>mreider</dc:creator>
      <dc:date>2026-05-04T11:13:03Z</dc:date>
    </item>
  </channel>
</rss>

