@@ -9,10 +9,7 @@ import {useApiQuery} from 'sentry/utils/queryClient';
99import useOrganization from 'sentry/utils/useOrganization' ;
1010import usePageFilters from 'sentry/utils/usePageFilters' ;
1111import { SpanIndexedField } from 'sentry/views/insights/types' ;
12- import {
13- useSpanFieldStaticTags ,
14- useSpanFieldSupportedTags ,
15- } from 'sentry/views/performance/utils/useSpanFieldSupportedTags' ;
12+ import { useSpanFieldCustomTags } from 'sentry/views/performance/utils/useSpanFieldSupportedTags' ;
1613
1714type TypedSpanTags = {
1815 number : TagCollection ;
@@ -27,22 +24,9 @@ interface SpanTagsProviderProps {
2724}
2825
2926export function SpanTagsProvider ( { children, dataset} : SpanTagsProviderProps ) {
30- const numericSpanFields : Set < string > = useMemo ( ( ) => {
31- return new Set ( [
32- SpanIndexedField . SPAN_DURATION ,
33- SpanIndexedField . SPAN_SELF_TIME ,
34- SpanIndexedField . INP ,
35- SpanIndexedField . INP_SCORE ,
36- SpanIndexedField . INP_SCORE_WEIGHT ,
37- SpanIndexedField . TOTAL_SCORE ,
38- SpanIndexedField . CACHE_ITEM_SIZE ,
39- SpanIndexedField . MESSAGING_MESSAGE_BODY_SIZE ,
40- SpanIndexedField . MESSAGING_MESSAGE_RECEIVE_LATENCY ,
41- SpanIndexedField . MESSAGING_MESSAGE_RETRY_COUNT ,
42- ] ) ;
43- } , [ ] ) ;
44-
45- const supportedTags = useSpanFieldSupportedTags ( ) ;
27+ const { data : indexedTags } = useSpanFieldCustomTags ( {
28+ enabled : dataset === DiscoverDatasets . SPANS_INDEXED ,
29+ } ) ;
4630
4731 const numberTags : TagCollection = useTypedSpanTags ( {
4832 enabled : dataset === DiscoverDatasets . SPANS_EAP ,
@@ -54,42 +38,92 @@ export function SpanTagsProvider({children, dataset}: SpanTagsProviderProps) {
5438 type : 'string' ,
5539 } ) ;
5640
57- const staticTags = useSpanFieldStaticTags ( ) ;
58-
5941 const allNumberTags = useMemo ( ( ) => {
42+ const measurements = [
43+ SpanIndexedField . SPAN_DURATION ,
44+ SpanIndexedField . SPAN_SELF_TIME ,
45+ ] . map ( measurement => [
46+ measurement ,
47+ {
48+ key : measurement ,
49+ name : measurement ,
50+ kind : FieldKind . MEASUREMENT ,
51+ } ,
52+ ] ) ;
53+
6054 if ( dataset === DiscoverDatasets . SPANS_INDEXED ) {
61- return { } ;
55+ return {
56+ ...Object . fromEntries ( measurements ) ,
57+ } ;
6258 }
6359
6460 return {
6561 ...numberTags ,
66- ...Object . fromEntries (
67- Object . entries ( staticTags )
68- . filter ( ( [ key , _ ] ) => numericSpanFields . has ( key ) )
69- . map ( ( [ key , tag ] ) => [ key , { ...tag , kind : FieldKind . MEASUREMENT } ] )
70- ) ,
62+ ...Object . fromEntries ( measurements ) ,
7163 } ;
72- } , [ dataset , numberTags , numericSpanFields , staticTags ] ) ;
64+ } , [ dataset , numberTags ] ) ;
7365
7466 const allStringTags = useMemo ( ( ) => {
67+ const tags = [
68+ // NOTE: intentionally choose to not expose transaction id
69+ // as we're moving toward span ids
70+
71+ 'id' , // SpanIndexedField.SPAN_OP is actually `span_id`
72+ SpanIndexedField . BROWSER_NAME ,
73+ SpanIndexedField . ENVIRONMENT ,
74+ SpanIndexedField . ORIGIN_TRANSACTION ,
75+ SpanIndexedField . PROJECT ,
76+ SpanIndexedField . RAW_DOMAIN ,
77+ SpanIndexedField . RELEASE ,
78+ SpanIndexedField . SDK_NAME ,
79+ SpanIndexedField . SDK_VERSION ,
80+ SpanIndexedField . SPAN_ACTION ,
81+ SpanIndexedField . SPAN_CATEGORY ,
82+ SpanIndexedField . SPAN_DESCRIPTION ,
83+ SpanIndexedField . SPAN_DOMAIN ,
84+ SpanIndexedField . SPAN_GROUP ,
85+ SpanIndexedField . SPAN_MODULE ,
86+ SpanIndexedField . SPAN_OP ,
87+ SpanIndexedField . SPAN_STATUS ,
88+ SpanIndexedField . TIMESTAMP ,
89+ SpanIndexedField . TRACE ,
90+ SpanIndexedField . TRANSACTION ,
91+ SpanIndexedField . TRANSACTION_METHOD ,
92+ SpanIndexedField . TRANSACTION_OP ,
93+ SpanIndexedField . USER ,
94+ SpanIndexedField . USER_EMAIL ,
95+ SpanIndexedField . USER_GEO_SUBREGION ,
96+ SpanIndexedField . USER_ID ,
97+ SpanIndexedField . USER_IP ,
98+ SpanIndexedField . USER_USERNAME ,
99+ ] . map ( tag => [
100+ tag ,
101+ {
102+ key : tag ,
103+ name : tag ,
104+ kind : FieldKind . TAG ,
105+ } ,
106+ ] ) ;
107+
75108 if ( dataset === DiscoverDatasets . SPANS_INDEXED ) {
76- return supportedTags . data ;
109+ return {
110+ ...indexedTags ,
111+ ...Object . fromEntries ( tags ) ,
112+ } ;
77113 }
78114
79115 return {
80116 ...stringTags ,
81- ...Object . fromEntries (
82- Object . entries ( staticTags )
83- . filter ( ( [ key , _ ] ) => ! numericSpanFields . has ( key ) )
84- . map ( ( [ key , tag ] ) => [ key , { ...tag , kind : FieldKind . TAG } ] )
85- ) ,
117+ ...Object . fromEntries ( tags ) ,
86118 } ;
87- } , [ dataset , supportedTags , stringTags , staticTags , numericSpanFields ] ) ;
119+ } , [ dataset , indexedTags , stringTags ] ) ;
88120
89- const tags = {
90- number : allNumberTags ,
91- string : allStringTags ,
92- } ;
121+ const tags = useMemo ( ( ) => {
122+ return {
123+ number : allNumberTags ,
124+ string : allStringTags ,
125+ } ;
126+ } , [ allNumberTags , allStringTags ] ) ;
93127
94128 return < SpanTagsContext . Provider value = { tags } > { children } </ SpanTagsContext . Provider > ;
95129}
@@ -131,6 +165,7 @@ function useTypedSpanTags({
131165 environment : selection . environments ,
132166 ...normalizeDateTimeParams ( selection . datetime ) ,
133167 dataset : 'spans' ,
168+ process : 1 ,
134169 type,
135170 } ,
136171 } ;
@@ -149,20 +184,22 @@ function useTypedSpanTags({
149184 // For now, skip all the sentry. prefixed tags as they
150185 // should be covered by the static tags that will be
151186 // merged with these results.
152- if ( tag . key . startsWith ( 'sentry.' ) ) {
187+ if ( tag . key . startsWith ( 'sentry.' ) || tag . key . startsWith ( 'tags[sentry.' ) ) {
153188 continue ;
154189 }
155190
156191 // EAP spans contain tags with illegal characters
157- if ( ! / ^ [ a - z A - Z 0 - 9 _ . : - ] + $ / . test ( tag . key ) ) {
192+ // SnQL forbids `-` but is allowed in RPC. So add it back later
193+ if (
194+ ! / ^ [ a - z A - Z 0 - 9 _ . : ] + $ / . test ( tag . key ) &&
195+ ! / ^ t a g s \[ [ a - z A - Z 0 - 9 _ . : ] + , n u m b e r \] $ / . test ( tag . key )
196+ ) {
158197 continue ;
159198 }
160199
161- const key = type === 'number' ? `tags[${ tag . key } ,number]` : tag . key ;
162-
163- allTags [ key ] = {
164- key,
165- name : tag . key ,
200+ allTags [ tag . key ] = {
201+ key : tag . key ,
202+ name : tag . name ,
166203 kind : type === 'number' ? FieldKind . MEASUREMENT : FieldKind . TAG ,
167204 } ;
168205 }
0 commit comments