[], location: ReturnType
attributes: {
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.remix',
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
+ ...(source === 'route' && { 'url.template': name }),
},
};
@@ -182,6 +184,9 @@ export function withSentry, R extends React.Co
if (transaction) {
transaction.updateName(name);
transaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);
+ if (source === 'route') {
+ transaction.setAttribute('url.template', name);
+ }
}
}
}
diff --git a/packages/solid/src/solidrouter.ts b/packages/solid/src/solidrouter.ts
index 0424183aea18..874d6820db99 100644
--- a/packages/solid/src/solidrouter.ts
+++ b/packages/solid/src/solidrouter.ts
@@ -105,6 +105,7 @@ function withSentryRouterRoot(Root: Component): Component(
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.solid.tanstack_router',
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',
+ ...(routeMatch && { 'url.template': routeMatch.routeId }),
...routeMatchToParamSpanAttributes(routeMatch),
},
});
@@ -75,6 +76,7 @@ export function tanstackRouterBrowserTracingIntegration(
if (resolvedMatch && resolvedMatch.routeId !== routeMatch?.routeId) {
pageloadSpan.updateName(resolvedMatch.routeId);
pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
+ pageloadSpan.setAttribute('url.template', resolvedMatch.routeId);
pageloadSpan.setAttributes(routeMatchToParamSpanAttributes(resolvedMatch));
}
});
@@ -94,6 +96,9 @@ export function tanstackRouterBrowserTracingIntegration(
): void => {
span.updateName(match ? match.routeId : fallbackName);
span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, match ? 'route' : 'url');
+ if (match) {
+ span.setAttribute('url.template', match.routeId);
+ }
span.setAttributes(routeMatchToParamSpanAttributes(match));
};
@@ -124,6 +129,7 @@ export function tanstackRouterBrowserTracingIntegration(
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.solid.tanstack_router',
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',
+ ...(routeMatch && { 'url.template': routeMatch.routeId }),
...routeMatchToParamSpanAttributes(routeMatch),
},
});
diff --git a/packages/sveltekit/src/client/browserTracingIntegration.ts b/packages/sveltekit/src/client/browserTracingIntegration.ts
index 22539045cfb2..4ffc4038597c 100644
--- a/packages/sveltekit/src/client/browserTracingIntegration.ts
+++ b/packages/sveltekit/src/client/browserTracingIntegration.ts
@@ -67,6 +67,7 @@ function _instrumentPageload(client: Client): void {
if (routeId) {
pageloadSpan.updateName(routeId);
pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
+ pageloadSpan.setAttribute('url.template', routeId);
getCurrentScope().setTransactionName(routeId);
}
});
@@ -133,6 +134,7 @@ function _instrumentNavigations(client: Client): void {
attributes: {
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.sveltekit',
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: parameterizedRouteDestination ? 'route' : 'url',
+ ...(parameterizedRouteDestination && { 'url.template': parameterizedRouteDestination }),
...navigationInfo,
},
});
diff --git a/packages/vue/src/router.ts b/packages/vue/src/router.ts
index 8d4100e9b6c8..4e6c91cf8aa7 100644
--- a/packages/vue/src/router.ts
+++ b/packages/vue/src/router.ts
@@ -94,6 +94,10 @@ export function instrumentVueRouter(
transactionSource = 'route';
}
+ if (transactionSource === 'route') {
+ attributes['url.template'] = spanName;
+ }
+
getCurrentScope().setTransactionName(spanName);
// Update the existing page load span with parametrized route information
diff --git a/packages/vue/src/tanstackrouter.ts b/packages/vue/src/tanstackrouter.ts
index 6b2700db0bb2..de86832a3812 100644
--- a/packages/vue/src/tanstackrouter.ts
+++ b/packages/vue/src/tanstackrouter.ts
@@ -66,6 +66,7 @@ export function tanstackRouterBrowserTracingIntegration(
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.vue.tanstack_router',
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',
+ ...(routeMatch && { 'url.template': routeMatch.routeId }),
...routeMatchToParamSpanAttributes(routeMatch),
},
});
@@ -83,6 +84,7 @@ export function tanstackRouterBrowserTracingIntegration(
if (resolvedMatch && resolvedMatch.routeId !== routeMatch?.routeId) {
pageloadSpan.updateName(resolvedMatch.routeId);
pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
+ pageloadSpan.setAttribute('url.template', resolvedMatch.routeId);
pageloadSpan.setAttributes(routeMatchToParamSpanAttributes(resolvedMatch));
}
});
@@ -102,6 +104,9 @@ export function tanstackRouterBrowserTracingIntegration(
): void => {
span.updateName(match ? match.routeId : fallbackName);
span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, match ? 'route' : 'url');
+ if (match) {
+ span.setAttribute('url.template', match.routeId);
+ }
span.setAttributes(routeMatchToParamSpanAttributes(match));
};
@@ -129,6 +134,7 @@ export function tanstackRouterBrowserTracingIntegration(
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.vue.tanstack_router',
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',
+ ...(routeMatch && { 'url.template': routeMatch.routeId }),
...routeMatchToParamSpanAttributes(routeMatch),
},
});